1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_chartcontroller.hxx"
26
27 #include "DrawCommandDispatch.hxx"
28 #include "DrawCommandDispatch.hrc"
29 #include "ChartController.hxx"
30 #include "DrawViewWrapper.hxx"
31 #include "chartview/DrawModelWrapper.hxx"
32 #include "macros.hxx"
33
34 #include <vos/mutex.hxx>
35 #include <vcl/svapp.hxx>
36 #include <svl/itempool.hxx>
37 #include <editeng/adjitem.hxx>
38 #include <svx/dialogs.hrc>
39 #include <svx/dialmgr.hxx>
40 #include <svx/fmmodel.hxx>
41 #include <svx/gallery.hxx>
42 #include <svx/svdoashp.hxx>
43 #include <svx/svdocapt.hxx>
44 #include <svx/svdopath.hxx>
45 #include <svx/svdpage.hxx>
46 #include <svx/unoapi.hxx>
47 #include <svx/xlnedit.hxx>
48 #include <svx/xlnedwit.hxx>
49 #include <svx/xlnwtit.hxx>
50 #include <svx/xtable.hxx>
51 #include <basegfx/polygon/b2dpolygon.hxx>
52
53 #include <boost/bind.hpp>
54
55 using namespace ::com::sun::star;
56 using namespace ::com::sun::star::frame;
57
58 using ::com::sun::star::uno::Reference;
59 using ::com::sun::star::uno::Sequence;
60
61
62 //.............................................................................
63 namespace
64 {
65 //.............................................................................
66
67 // comparing two PropertyValue instances
68 struct PropertyValueCompare : public ::std::binary_function< beans::PropertyValue, ::rtl::OUString, bool >
69 {
operator ()__anon600a372e0111::PropertyValueCompare70 bool operator() ( const beans::PropertyValue& rPropValue, const ::rtl::OUString& rName ) const
71 {
72 return rPropValue.Name.equals( rName );
73 }
operator ()__anon600a372e0111::PropertyValueCompare74 bool operator() ( const ::rtl::OUString& rName, const beans::PropertyValue& rPropValue ) const
75 {
76 return rName.equals( rPropValue.Name );
77 }
78 };
79
80 //.............................................................................
81 } // anonymous namespace
82 //.............................................................................
83
84
85 //.............................................................................
86 namespace chart
87 {
88 //.............................................................................
89
DrawCommandDispatch(const Reference<uno::XComponentContext> & rxContext,ChartController * pController)90 DrawCommandDispatch::DrawCommandDispatch( const Reference< uno::XComponentContext >& rxContext,
91 ChartController* pController )
92 :FeatureCommandDispatchBase( rxContext )
93 ,m_pChartController( pController )
94 {
95 }
96
~DrawCommandDispatch()97 DrawCommandDispatch::~DrawCommandDispatch()
98 {
99 }
100
initialize()101 void DrawCommandDispatch::initialize()
102 {
103 FeatureCommandDispatchBase::initialize();
104 }
105
isFeatureSupported(const::rtl::OUString & rCommandURL)106 bool DrawCommandDispatch::isFeatureSupported( const ::rtl::OUString& rCommandURL )
107 {
108 sal_uInt16 nFeatureId = 0;
109 ::rtl::OUString aBaseCommand;
110 ::rtl::OUString aCustomShapeType;
111 return parseCommandURL( rCommandURL, &nFeatureId, &aBaseCommand, &aCustomShapeType );
112 }
113
getPolygon(sal_uInt16 nResId,SdrModel & rModel)114 ::basegfx::B2DPolyPolygon getPolygon( sal_uInt16 nResId, SdrModel& rModel )
115 {
116 ::basegfx::B2DPolyPolygon aReturn;
117 XLineEndListSharedPtr aLineEndList = rModel.GetLineEndListFromSdrModel();
118 if ( aLineEndList.get() )
119 {
120 String aName( SVX_RES( nResId ) );
121 long nCount = aLineEndList->Count();
122 for ( long nIndex = 0; nIndex < nCount; ++nIndex )
123 {
124 XLineEndEntry* pEntry = aLineEndList->GetLineEnd( nIndex );
125 if ( pEntry->GetName() == aName )
126 {
127 aReturn = pEntry->GetLineEnd();
128 break;
129 }
130 }
131 }
132 return aReturn;
133 }
134
setAttributes(SdrObject * pObj)135 void DrawCommandDispatch::setAttributes( SdrObject* pObj )
136 {
137 if ( m_pChartController )
138 {
139 DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
140 DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
141 if ( pDrawModelWrapper && pDrawViewWrapper && pDrawViewWrapper->GetCurrentObjIdentifier() == OBJ_CUSTOMSHAPE )
142 {
143 sal_Bool bAttributesAppliedFromGallery = sal_False;
144 if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) )
145 {
146 ::std::vector< ::rtl::OUString > aObjList;
147 if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) )
148 {
149 for ( sal_uInt16 i = 0; i < aObjList.size(); ++i )
150 {
151 if ( aObjList[ i ].equalsIgnoreAsciiCase( m_aCustomShapeType ) )
152 {
153 FmFormModel aModel;
154 SfxItemPool& rPool = aModel.GetItemPool();
155 rPool.FreezeIdRanges();
156 if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aModel ) )
157 {
158 const SdrObject* pSourceObj = aModel.GetPage( 0 )->GetObj( 0 );
159 if ( pSourceObj )
160 {
161 const SfxItemSet& rSource = pSourceObj->GetMergedItemSet();
162 SfxItemSet aDest( pObj->GetModel()->GetItemPool(), // ranges from SdrAttrObj
163 SDRATTR_START, SDRATTR_SHADOW_LAST,
164 SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
165 SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,
166 // Graphic Attributes
167 SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST,
168 // 3d Properties
169 SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
170 // CustomShape properties
171 SDRATTR_CUSTOMSHAPE_FIRST, SDRATTR_CUSTOMSHAPE_LAST,
172 // range from SdrTextObj
173 EE_ITEMS_START, EE_ITEMS_END,
174 // end
175 0, 0);
176 aDest.Set( rSource );
177 pObj->SetMergedItemSet( aDest );
178 sal_Int32 nAngle = pSourceObj->GetRotateAngle();
179 if ( nAngle )
180 {
181 double a = nAngle * F_PI18000;
182 pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle, sin( a ), cos( a ) );
183 }
184 bAttributesAppliedFromGallery = sal_True;
185 }
186 }
187 break;
188 }
189 }
190 }
191 }
192 if ( !bAttributesAppliedFromGallery )
193 {
194 pObj->SetMergedItem( SvxAdjustItem( SVX_ADJUST_CENTER, 0 ) );
195 pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
196 pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
197 pObj->SetMergedItem( SdrTextAutoGrowHeightItem( sal_False ) );
198 ( dynamic_cast< SdrObjCustomShape* >( pObj ) )->MergeDefaultAttributes( &m_aCustomShapeType );
199 }
200 }
201 }
202 }
203
setLineEnds(SfxItemSet & rAttr)204 void DrawCommandDispatch::setLineEnds( SfxItemSet& rAttr )
205 {
206 if ( m_nFeatureId == COMMAND_ID_LINE_ARROW_END && m_pChartController )
207 {
208 DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
209 DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
210 if ( pDrawModelWrapper && pDrawViewWrapper )
211 {
212 ::basegfx::B2DPolyPolygon aArrow( getPolygon( RID_SVXSTR_ARROW, pDrawModelWrapper->getSdrModel() ) );
213 if ( !aArrow.count() )
214 {
215 ::basegfx::B2DPolygon aNewArrow;
216 aNewArrow.append( ::basegfx::B2DPoint( 10.0, 0.0 ) );
217 aNewArrow.append( ::basegfx::B2DPoint( 0.0, 30.0) );
218 aNewArrow.append( ::basegfx::B2DPoint( 20.0, 30.0 ) );
219 aNewArrow.setClosed( true );
220 aArrow.append( aNewArrow );
221 }
222
223 SfxItemSet aSet( pDrawViewWrapper->GetModel()->GetItemPool() );
224 pDrawViewWrapper->GetAttributes( aSet );
225
226 long nWidth = 300; // (1/100th mm)
227 if ( aSet.GetItemState( XATTR_LINEWIDTH ) != SFX_ITEM_DONTCARE )
228 {
229 long nValue = ( ( const XLineWidthItem& ) aSet.Get( XATTR_LINEWIDTH ) ).GetValue();
230 if ( nValue > 0 )
231 {
232 nWidth = nValue * 3;
233 }
234 }
235
236 rAttr.Put( XLineEndItem( SVX_RESSTR( RID_SVXSTR_ARROW ), aArrow ) );
237 rAttr.Put( XLineEndWidthItem( nWidth ) );
238 }
239 }
240 }
241
242 // WeakComponentImplHelperBase
disposing()243 void DrawCommandDispatch::disposing()
244 {
245 }
246
247 // XEventListener
disposing(const lang::EventObject &)248 void DrawCommandDispatch::disposing( const lang::EventObject& /* Source */ )
249 {
250 }
251
getState(const::rtl::OUString & rCommand)252 FeatureState DrawCommandDispatch::getState( const ::rtl::OUString& rCommand )
253 {
254 FeatureState aReturn;
255 aReturn.bEnabled = false;
256 aReturn.aState <<= false;
257
258 sal_uInt16 nFeatureId = 0;
259 ::rtl::OUString aBaseCommand;
260 ::rtl::OUString aCustomShapeType;
261 if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) )
262 {
263 switch ( nFeatureId )
264 {
265 case COMMAND_ID_OBJECT_SELECT:
266 case COMMAND_ID_DRAW_LINE:
267 case COMMAND_ID_LINE_ARROW_END:
268 case COMMAND_ID_DRAW_RECT:
269 case COMMAND_ID_DRAW_ELLIPSE:
270 case COMMAND_ID_DRAW_FREELINE_NOFILL:
271 case COMMAND_ID_DRAW_TEXT:
272 case COMMAND_ID_DRAW_CAPTION:
273 case COMMAND_ID_DRAWTBX_CS_BASIC:
274 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
275 case COMMAND_ID_DRAWTBX_CS_ARROW:
276 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
277 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
278 case COMMAND_ID_DRAWTBX_CS_STAR:
279 {
280 aReturn.bEnabled = true;
281 aReturn.aState <<= false;
282 }
283 break;
284 default:
285 {
286 aReturn.bEnabled = false;
287 aReturn.aState <<= false;
288 }
289 break;
290 }
291 }
292
293 return aReturn;
294 }
295
execute(const::rtl::OUString & rCommand,const Sequence<beans::PropertyValue> & rArgs)296 void DrawCommandDispatch::execute( const ::rtl::OUString& rCommand, const Sequence< beans::PropertyValue>& rArgs )
297 {
298 (void)rArgs;
299
300 ChartDrawMode eDrawMode = CHARTDRAW_SELECT;
301 SdrObjKind eKind = OBJ_NONE;
302 bool bCreate = false;
303
304 sal_uInt16 nFeatureId = 0;
305 ::rtl::OUString aBaseCommand;
306 ::rtl::OUString aCustomShapeType;
307 if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) )
308 {
309 m_nFeatureId = nFeatureId;
310 m_aCustomShapeType = aCustomShapeType;
311
312 switch ( nFeatureId )
313 {
314 case COMMAND_ID_OBJECT_SELECT:
315 {
316 eDrawMode = CHARTDRAW_SELECT;
317 eKind = OBJ_NONE;
318 }
319 break;
320 case COMMAND_ID_DRAW_LINE:
321 case COMMAND_ID_LINE_ARROW_END:
322 {
323 eDrawMode = CHARTDRAW_INSERT;
324 eKind = OBJ_LINE;
325 }
326 break;
327 case COMMAND_ID_DRAW_RECT:
328 {
329 eDrawMode = CHARTDRAW_INSERT;
330 eKind = OBJ_RECT;
331 }
332 break;
333 case COMMAND_ID_DRAW_ELLIPSE:
334 {
335 eDrawMode = CHARTDRAW_INSERT;
336 eKind = OBJ_CIRC;
337 }
338 break;
339 case COMMAND_ID_DRAW_FREELINE_NOFILL:
340 {
341 eDrawMode = CHARTDRAW_INSERT;
342 eKind = OBJ_FREELINE;
343 }
344 break;
345 case COMMAND_ID_DRAW_TEXT:
346 {
347 eDrawMode = CHARTDRAW_INSERT;
348 eKind = OBJ_TEXT;
349 bCreate = true;
350 }
351 break;
352 case COMMAND_ID_DRAW_CAPTION:
353 {
354 eDrawMode = CHARTDRAW_INSERT;
355 eKind = OBJ_CAPTION;
356 }
357 break;
358 case COMMAND_ID_DRAWTBX_CS_BASIC:
359 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
360 case COMMAND_ID_DRAWTBX_CS_ARROW:
361 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
362 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
363 case COMMAND_ID_DRAWTBX_CS_STAR:
364 {
365 eDrawMode = CHARTDRAW_INSERT;
366 eKind = OBJ_CUSTOMSHAPE;
367 }
368 break;
369 default:
370 {
371 eDrawMode = CHARTDRAW_SELECT;
372 eKind = OBJ_NONE;
373 }
374 break;
375 }
376
377 if ( m_pChartController )
378 {
379 DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
380 if ( pDrawViewWrapper )
381 {
382 ::vos::OGuard aGuard( Application::GetSolarMutex() );
383 m_pChartController->setDrawMode( eDrawMode );
384 setInsertObj( sal::static_int_cast< sal_uInt16 >( eKind ) );
385 if ( bCreate )
386 {
387 pDrawViewWrapper->SetCreateMode();
388 }
389
390 const ::rtl::OUString sKeyModifier( C2U( "KeyModifier" ) );
391 const beans::PropertyValue* pIter = rArgs.getConstArray();
392 const beans::PropertyValue* pEnd = pIter + rArgs.getLength();
393 const beans::PropertyValue* pKeyModifier = ::std::find_if(
394 pIter, pEnd, ::std::bind2nd( PropertyValueCompare(), boost::cref( sKeyModifier ) ) );
395 sal_Int16 nKeyModifier = 0;
396 if ( pKeyModifier && ( pKeyModifier->Value >>= nKeyModifier ) && nKeyModifier == KEY_MOD1 )
397 {
398 if ( eDrawMode == CHARTDRAW_INSERT )
399 {
400 SdrObject* pObj = createDefaultObject( nFeatureId );
401 if ( pObj )
402 {
403 SdrPageView* pPageView = pDrawViewWrapper->GetSdrPageView();
404 pDrawViewWrapper->InsertObjectAtView( pObj, *pPageView );
405 Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY );
406 if ( xShape.is() )
407 {
408 m_pChartController->m_aSelection.setSelection( xShape );
409 m_pChartController->m_aSelection.applySelection( pDrawViewWrapper );
410 }
411 if ( nFeatureId == SID_DRAW_TEXT )
412 {
413 m_pChartController->StartTextEdit();
414 }
415 }
416 }
417 }
418 }
419 }
420 }
421 }
422
describeSupportedFeatures()423 void DrawCommandDispatch::describeSupportedFeatures()
424 {
425 implDescribeSupportedFeature( ".uno:SelectObject", COMMAND_ID_OBJECT_SELECT, CommandGroup::INSERT );
426 implDescribeSupportedFeature( ".uno:Line", COMMAND_ID_DRAW_LINE, CommandGroup::INSERT );
427 implDescribeSupportedFeature( ".uno:LineArrowEnd", COMMAND_ID_LINE_ARROW_END, CommandGroup::INSERT );
428 implDescribeSupportedFeature( ".uno:Rect", COMMAND_ID_DRAW_RECT, CommandGroup::INSERT );
429 implDescribeSupportedFeature( ".uno:Ellipse", COMMAND_ID_DRAW_ELLIPSE, CommandGroup::INSERT );
430 implDescribeSupportedFeature( ".uno:Freeline_Unfilled", COMMAND_ID_DRAW_FREELINE_NOFILL, CommandGroup::INSERT );
431 implDescribeSupportedFeature( ".uno:DrawText", COMMAND_ID_DRAW_TEXT, CommandGroup::INSERT );
432 implDescribeSupportedFeature( ".uno:DrawCaption", COMMAND_ID_DRAW_CAPTION, CommandGroup::INSERT );
433 implDescribeSupportedFeature( ".uno:BasicShapes", COMMAND_ID_DRAWTBX_CS_BASIC, CommandGroup::INSERT );
434 implDescribeSupportedFeature( ".uno:SymbolShapes", COMMAND_ID_DRAWTBX_CS_SYMBOL, CommandGroup::INSERT );
435 implDescribeSupportedFeature( ".uno:ArrowShapes", COMMAND_ID_DRAWTBX_CS_ARROW, CommandGroup::INSERT );
436 implDescribeSupportedFeature( ".uno:FlowChartShapes", COMMAND_ID_DRAWTBX_CS_FLOWCHART, CommandGroup::INSERT );
437 implDescribeSupportedFeature( ".uno:CalloutShapes", COMMAND_ID_DRAWTBX_CS_CALLOUT, CommandGroup::INSERT );
438 implDescribeSupportedFeature( ".uno:StarShapes", COMMAND_ID_DRAWTBX_CS_STAR, CommandGroup::INSERT );
439 }
440
setInsertObj(sal_uInt16 eObj)441 void DrawCommandDispatch::setInsertObj( sal_uInt16 eObj )
442 {
443 DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
444 if ( pDrawViewWrapper )
445 {
446 pDrawViewWrapper->SetCurrentObj( eObj /*, Inventor */);
447 }
448 }
449
createDefaultObject(const sal_uInt16 nID)450 SdrObject* DrawCommandDispatch::createDefaultObject( const sal_uInt16 nID )
451 {
452 SdrObject* pObj = NULL;
453 DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
454 DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
455
456 if ( pDrawViewWrapper && pDrawModelWrapper )
457 {
458 Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
459 SdrPage* pPage = GetSdrPageFromXDrawPage( xDrawPage );
460 if ( pPage )
461 {
462 ::vos::OGuard aGuard( Application::GetSolarMutex() );
463 pObj = SdrObjFactory::MakeNewObject( pDrawViewWrapper->GetCurrentObjInventor(),
464 pDrawViewWrapper->GetCurrentObjIdentifier(), pPage );
465 if ( pObj )
466 {
467 long nDefaultObjectSizeWidth = 4000;
468 long nDefaultObjectSizeHeight = 2500;
469 Size aObjectSize( nDefaultObjectSizeWidth, nDefaultObjectSizeHeight );
470 Rectangle aPageRect( Rectangle( Point( 0, 0 ), pPage->GetSize() ) );
471 Point aObjectPos = aPageRect.Center();
472 aObjectPos.X() -= aObjectSize.Width() / 2;
473 aObjectPos.Y() -= aObjectSize.Height() / 2;
474 Rectangle aRect( aObjectPos, aObjectSize );
475
476 switch ( nID )
477 {
478 case COMMAND_ID_DRAW_LINE:
479 case COMMAND_ID_LINE_ARROW_END:
480 {
481 if ( pObj->ISA( SdrPathObj ) )
482 {
483 Point aStart = aRect.TopLeft();
484 Point aEnd = aRect.BottomRight();
485 sal_Int32 nYMiddle( ( aRect.Top() + aRect.Bottom() ) / 2 );
486 basegfx::B2DPolygon aPoly;
487 aPoly.append( basegfx::B2DPoint( aStart.X(), nYMiddle ) );
488 aPoly.append( basegfx::B2DPoint( aEnd.X(), nYMiddle ) );
489 ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( basegfx::B2DPolyPolygon( aPoly ) );
490 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
491 setLineEnds( aSet );
492 pObj->SetMergedItemSet( aSet );
493 }
494 }
495 break;
496 case COMMAND_ID_DRAW_FREELINE_NOFILL:
497 {
498 if ( pObj->ISA( SdrPathObj ) )
499 {
500 basegfx::B2DPolygon aInnerPoly;
501 aInnerPoly.append( basegfx::B2DPoint( aRect.Left(), aRect.Bottom() ) );
502 aInnerPoly.appendBezierSegment(
503 basegfx::B2DPoint( aRect.Left(), aRect.Top() ),
504 basegfx::B2DPoint( aRect.Center().X(), aRect.Top() ),
505 basegfx::B2DPoint( aRect.Center().X(), aRect.Center().Y() ) );
506 aInnerPoly.appendBezierSegment(
507 basegfx::B2DPoint( aRect.Center().X(), aRect.Bottom() ),
508 basegfx::B2DPoint( aRect.Right(), aRect.Bottom() ),
509 basegfx::B2DPoint( aRect.Right(), aRect.Top() ) );
510 basegfx::B2DPolyPolygon aPoly;
511 aPoly.append( aInnerPoly );
512 ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( aPoly );
513 }
514 }
515 break;
516 case COMMAND_ID_DRAW_TEXT:
517 case COMMAND_ID_DRAW_TEXT_VERTICAL:
518 {
519 if ( pObj->ISA( SdrTextObj ) )
520 {
521 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
522 if ( pTextObj )
523 {
524 pTextObj->SetLogicRect( aRect );
525 sal_Bool bVertical = ( nID == SID_DRAW_TEXT_VERTICAL );
526 pTextObj->SetVerticalWriting( bVertical );
527 if ( bVertical )
528 {
529 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
530 aSet.Put( SdrTextAutoGrowWidthItem( sal_True ) );
531 aSet.Put( SdrTextAutoGrowHeightItem( sal_False ) );
532 aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_TOP ) );
533 aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) );
534 pTextObj->SetMergedItemSet( aSet );
535 }
536 }
537 }
538 }
539 break;
540 case COMMAND_ID_DRAW_CAPTION:
541 case COMMAND_ID_DRAW_CAPTION_VERTICAL:
542 {
543 if ( pObj->ISA( SdrCaptionObj ) )
544 {
545 sal_Bool bIsVertical( SID_DRAW_CAPTION_VERTICAL == nID );
546 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
547 if ( pTextObj )
548 {
549 pTextObj->SetVerticalWriting( bIsVertical );
550 }
551 if ( bIsVertical )
552 {
553 SfxItemSet aSet( pObj->GetMergedItemSet() );
554 aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
555 aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) );
556 pObj->SetMergedItemSet( aSet );
557 }
558 SdrCaptionObj* pCaptionObj = dynamic_cast< SdrCaptionObj* >( pObj );
559 if ( pCaptionObj )
560 {
561 pCaptionObj->SetLogicRect( aRect );
562 pCaptionObj->SetTailPos(
563 aRect.TopLeft() - Point( aRect.GetWidth() / 2, aRect.GetHeight() / 2 ) );
564 }
565 }
566 }
567 break;
568 default:
569 {
570 pObj->SetLogicRect( aRect );
571 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
572 setAttributes( pObj );
573 pObj->SetMergedItemSet( aSet );
574 }
575 break;
576 }
577 }
578 }
579 }
580
581 return pObj;
582 }
583
parseCommandURL(const::rtl::OUString & rCommandURL,sal_uInt16 * pnFeatureId,::rtl::OUString * pBaseCommand,::rtl::OUString * pCustomShapeType)584 bool DrawCommandDispatch::parseCommandURL( const ::rtl::OUString& rCommandURL, sal_uInt16* pnFeatureId,
585 ::rtl::OUString* pBaseCommand, ::rtl::OUString* pCustomShapeType )
586 {
587 bool bFound = true;
588 sal_uInt16 nFeatureId = 0;
589 ::rtl::OUString aBaseCommand;
590 ::rtl::OUString aType;
591
592 sal_Int32 nIndex = 1;
593 ::rtl::OUString aToken = rCommandURL.getToken( 0, '.', nIndex );
594 if ( nIndex == -1 || aToken.isEmpty() )
595 {
596 aBaseCommand = rCommandURL;
597 SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand );
598 if ( aIter != m_aSupportedFeatures.end() )
599 {
600 nFeatureId = aIter->second.nFeatureId;
601
602 switch ( nFeatureId )
603 {
604 case COMMAND_ID_DRAWTBX_CS_BASIC:
605 {
606 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "diamond" ) );
607 }
608 break;
609 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
610 {
611 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "smiley" ) );
612 }
613 break;
614 case COMMAND_ID_DRAWTBX_CS_ARROW:
615 {
616 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "left-right-arrow" ) );
617 }
618 break;
619 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
620 {
621 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "flowchart-internal-storage" ) );
622 }
623 break;
624 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
625 {
626 aType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "round-rectangular-callout" ) );
627 }
628 break;
629 case COMMAND_ID_DRAWTBX_CS_STAR:
630 {
631 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "star5" ) );
632 }
633 break;
634 default:
635 {
636 }
637 break;
638 }
639 }
640 else
641 {
642 bFound = false;
643 }
644 }
645 else
646 {
647 aBaseCommand = rCommandURL.copy( 0, nIndex - 1 );
648 SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand );
649 if ( aIter != m_aSupportedFeatures.end() )
650 {
651 nFeatureId = aIter->second.nFeatureId;
652 aType = rCommandURL.getToken( 0, '.', nIndex );
653 }
654 else
655 {
656 bFound = false;
657 }
658 }
659
660 *pnFeatureId = nFeatureId;
661 *pBaseCommand = aBaseCommand;
662 *pCustomShapeType = aType;
663
664 return bFound;
665 }
666
667 //.............................................................................
668 } // namespace chart
669 //.............................................................................
670