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_chart2.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 ()__anon1849fc660111::PropertyValueCompare70 bool operator() ( const beans::PropertyValue& rPropValue, const ::rtl::OUString& rName ) const
71 {
72 return rPropValue.Name.equals( rName );
73 }
operator ()__anon1849fc660111::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 throw (uno::RuntimeException)
250 {
251 }
252
getState(const::rtl::OUString & rCommand)253 FeatureState DrawCommandDispatch::getState( const ::rtl::OUString& rCommand )
254 {
255 FeatureState aReturn;
256 aReturn.bEnabled = false;
257 aReturn.aState <<= false;
258
259 sal_uInt16 nFeatureId = 0;
260 ::rtl::OUString aBaseCommand;
261 ::rtl::OUString aCustomShapeType;
262 if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) )
263 {
264 switch ( nFeatureId )
265 {
266 case COMMAND_ID_OBJECT_SELECT:
267 case COMMAND_ID_DRAW_LINE:
268 case COMMAND_ID_LINE_ARROW_END:
269 case COMMAND_ID_DRAW_RECT:
270 case COMMAND_ID_DRAW_ELLIPSE:
271 case COMMAND_ID_DRAW_FREELINE_NOFILL:
272 case COMMAND_ID_DRAW_TEXT:
273 case COMMAND_ID_DRAW_CAPTION:
274 case COMMAND_ID_DRAWTBX_CS_BASIC:
275 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
276 case COMMAND_ID_DRAWTBX_CS_ARROW:
277 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
278 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
279 case COMMAND_ID_DRAWTBX_CS_STAR:
280 {
281 aReturn.bEnabled = true;
282 aReturn.aState <<= false;
283 }
284 break;
285 default:
286 {
287 aReturn.bEnabled = false;
288 aReturn.aState <<= false;
289 }
290 break;
291 }
292 }
293
294 return aReturn;
295 }
296
execute(const::rtl::OUString & rCommand,const Sequence<beans::PropertyValue> & rArgs)297 void DrawCommandDispatch::execute( const ::rtl::OUString& rCommand, const Sequence< beans::PropertyValue>& rArgs )
298 {
299 (void)rArgs;
300
301 ChartDrawMode eDrawMode = CHARTDRAW_SELECT;
302 SdrObjKind eKind = OBJ_NONE;
303 bool bCreate = false;
304
305 sal_uInt16 nFeatureId = 0;
306 ::rtl::OUString aBaseCommand;
307 ::rtl::OUString aCustomShapeType;
308 if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) )
309 {
310 m_nFeatureId = nFeatureId;
311 m_aCustomShapeType = aCustomShapeType;
312
313 switch ( nFeatureId )
314 {
315 case COMMAND_ID_OBJECT_SELECT:
316 {
317 eDrawMode = CHARTDRAW_SELECT;
318 eKind = OBJ_NONE;
319 }
320 break;
321 case COMMAND_ID_DRAW_LINE:
322 case COMMAND_ID_LINE_ARROW_END:
323 {
324 eDrawMode = CHARTDRAW_INSERT;
325 eKind = OBJ_LINE;
326 }
327 break;
328 case COMMAND_ID_DRAW_RECT:
329 {
330 eDrawMode = CHARTDRAW_INSERT;
331 eKind = OBJ_RECT;
332 }
333 break;
334 case COMMAND_ID_DRAW_ELLIPSE:
335 {
336 eDrawMode = CHARTDRAW_INSERT;
337 eKind = OBJ_CIRC;
338 }
339 break;
340 case COMMAND_ID_DRAW_FREELINE_NOFILL:
341 {
342 eDrawMode = CHARTDRAW_INSERT;
343 eKind = OBJ_FREELINE;
344 }
345 break;
346 case COMMAND_ID_DRAW_TEXT:
347 {
348 eDrawMode = CHARTDRAW_INSERT;
349 eKind = OBJ_TEXT;
350 bCreate = true;
351 }
352 break;
353 case COMMAND_ID_DRAW_CAPTION:
354 {
355 eDrawMode = CHARTDRAW_INSERT;
356 eKind = OBJ_CAPTION;
357 }
358 break;
359 case COMMAND_ID_DRAWTBX_CS_BASIC:
360 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
361 case COMMAND_ID_DRAWTBX_CS_ARROW:
362 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
363 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
364 case COMMAND_ID_DRAWTBX_CS_STAR:
365 {
366 eDrawMode = CHARTDRAW_INSERT;
367 eKind = OBJ_CUSTOMSHAPE;
368 }
369 break;
370 default:
371 {
372 eDrawMode = CHARTDRAW_SELECT;
373 eKind = OBJ_NONE;
374 }
375 break;
376 }
377
378 if ( m_pChartController )
379 {
380 DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
381 if ( pDrawViewWrapper )
382 {
383 ::vos::OGuard aGuard( Application::GetSolarMutex() );
384 m_pChartController->setDrawMode( eDrawMode );
385 setInsertObj( sal::static_int_cast< sal_uInt16 >( eKind ) );
386 if ( bCreate )
387 {
388 pDrawViewWrapper->SetCreateMode();
389 }
390
391 const ::rtl::OUString sKeyModifier( C2U( "KeyModifier" ) );
392 const beans::PropertyValue* pIter = rArgs.getConstArray();
393 const beans::PropertyValue* pEnd = pIter + rArgs.getLength();
394 const beans::PropertyValue* pKeyModifier = ::std::find_if(
395 pIter, pEnd, ::std::bind2nd( PropertyValueCompare(), boost::cref( sKeyModifier ) ) );
396 sal_Int16 nKeyModifier = 0;
397 if ( pKeyModifier && ( pKeyModifier->Value >>= nKeyModifier ) && nKeyModifier == KEY_MOD1 )
398 {
399 if ( eDrawMode == CHARTDRAW_INSERT )
400 {
401 SdrObject* pObj = createDefaultObject( nFeatureId );
402 if ( pObj )
403 {
404 SdrPageView* pPageView = pDrawViewWrapper->GetSdrPageView();
405 pDrawViewWrapper->InsertObjectAtView( pObj, *pPageView );
406 Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY );
407 if ( xShape.is() )
408 {
409 m_pChartController->m_aSelection.setSelection( xShape );
410 m_pChartController->m_aSelection.applySelection( pDrawViewWrapper );
411 }
412 if ( nFeatureId == SID_DRAW_TEXT )
413 {
414 m_pChartController->StartTextEdit();
415 }
416 }
417 }
418 }
419 }
420 }
421 }
422 }
423
describeSupportedFeatures()424 void DrawCommandDispatch::describeSupportedFeatures()
425 {
426 implDescribeSupportedFeature( ".uno:SelectObject", COMMAND_ID_OBJECT_SELECT, CommandGroup::INSERT );
427 implDescribeSupportedFeature( ".uno:Line", COMMAND_ID_DRAW_LINE, CommandGroup::INSERT );
428 implDescribeSupportedFeature( ".uno:LineArrowEnd", COMMAND_ID_LINE_ARROW_END, CommandGroup::INSERT );
429 implDescribeSupportedFeature( ".uno:Rect", COMMAND_ID_DRAW_RECT, CommandGroup::INSERT );
430 implDescribeSupportedFeature( ".uno:Ellipse", COMMAND_ID_DRAW_ELLIPSE, CommandGroup::INSERT );
431 implDescribeSupportedFeature( ".uno:Freeline_Unfilled", COMMAND_ID_DRAW_FREELINE_NOFILL, CommandGroup::INSERT );
432 implDescribeSupportedFeature( ".uno:DrawText", COMMAND_ID_DRAW_TEXT, CommandGroup::INSERT );
433 implDescribeSupportedFeature( ".uno:DrawCaption", COMMAND_ID_DRAW_CAPTION, CommandGroup::INSERT );
434 implDescribeSupportedFeature( ".uno:BasicShapes", COMMAND_ID_DRAWTBX_CS_BASIC, CommandGroup::INSERT );
435 implDescribeSupportedFeature( ".uno:SymbolShapes", COMMAND_ID_DRAWTBX_CS_SYMBOL, CommandGroup::INSERT );
436 implDescribeSupportedFeature( ".uno:ArrowShapes", COMMAND_ID_DRAWTBX_CS_ARROW, CommandGroup::INSERT );
437 implDescribeSupportedFeature( ".uno:FlowChartShapes", COMMAND_ID_DRAWTBX_CS_FLOWCHART, CommandGroup::INSERT );
438 implDescribeSupportedFeature( ".uno:CalloutShapes", COMMAND_ID_DRAWTBX_CS_CALLOUT, CommandGroup::INSERT );
439 implDescribeSupportedFeature( ".uno:StarShapes", COMMAND_ID_DRAWTBX_CS_STAR, CommandGroup::INSERT );
440 }
441
setInsertObj(sal_uInt16 eObj)442 void DrawCommandDispatch::setInsertObj( sal_uInt16 eObj )
443 {
444 DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
445 if ( pDrawViewWrapper )
446 {
447 pDrawViewWrapper->SetCurrentObj( eObj /*, Inventor */);
448 }
449 }
450
createDefaultObject(const sal_uInt16 nID)451 SdrObject* DrawCommandDispatch::createDefaultObject( const sal_uInt16 nID )
452 {
453 SdrObject* pObj = NULL;
454 DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
455 DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
456
457 if ( pDrawViewWrapper && pDrawModelWrapper )
458 {
459 Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
460 SdrPage* pPage = GetSdrPageFromXDrawPage( xDrawPage );
461 if ( pPage )
462 {
463 ::vos::OGuard aGuard( Application::GetSolarMutex() );
464 pObj = SdrObjFactory::MakeNewObject( pDrawViewWrapper->GetCurrentObjInventor(),
465 pDrawViewWrapper->GetCurrentObjIdentifier(), pPage );
466 if ( pObj )
467 {
468 long nDefaultObjectSizeWidth = 4000;
469 long nDefaultObjectSizeHeight = 2500;
470 Size aObjectSize( nDefaultObjectSizeWidth, nDefaultObjectSizeHeight );
471 Rectangle aPageRect( Rectangle( Point( 0, 0 ), pPage->GetSize() ) );
472 Point aObjectPos = aPageRect.Center();
473 aObjectPos.X() -= aObjectSize.Width() / 2;
474 aObjectPos.Y() -= aObjectSize.Height() / 2;
475 Rectangle aRect( aObjectPos, aObjectSize );
476
477 switch ( nID )
478 {
479 case COMMAND_ID_DRAW_LINE:
480 case COMMAND_ID_LINE_ARROW_END:
481 {
482 if ( pObj->ISA( SdrPathObj ) )
483 {
484 Point aStart = aRect.TopLeft();
485 Point aEnd = aRect.BottomRight();
486 sal_Int32 nYMiddle( ( aRect.Top() + aRect.Bottom() ) / 2 );
487 basegfx::B2DPolygon aPoly;
488 aPoly.append( basegfx::B2DPoint( aStart.X(), nYMiddle ) );
489 aPoly.append( basegfx::B2DPoint( aEnd.X(), nYMiddle ) );
490 ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( basegfx::B2DPolyPolygon( aPoly ) );
491 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
492 setLineEnds( aSet );
493 pObj->SetMergedItemSet( aSet );
494 }
495 }
496 break;
497 case COMMAND_ID_DRAW_FREELINE_NOFILL:
498 {
499 if ( pObj->ISA( SdrPathObj ) )
500 {
501 basegfx::B2DPolygon aInnerPoly;
502 aInnerPoly.append( basegfx::B2DPoint( aRect.Left(), aRect.Bottom() ) );
503 aInnerPoly.appendBezierSegment(
504 basegfx::B2DPoint( aRect.Left(), aRect.Top() ),
505 basegfx::B2DPoint( aRect.Center().X(), aRect.Top() ),
506 basegfx::B2DPoint( aRect.Center().X(), aRect.Center().Y() ) );
507 aInnerPoly.appendBezierSegment(
508 basegfx::B2DPoint( aRect.Center().X(), aRect.Bottom() ),
509 basegfx::B2DPoint( aRect.Right(), aRect.Bottom() ),
510 basegfx::B2DPoint( aRect.Right(), aRect.Top() ) );
511 basegfx::B2DPolyPolygon aPoly;
512 aPoly.append( aInnerPoly );
513 ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( aPoly );
514 }
515 }
516 break;
517 case COMMAND_ID_DRAW_TEXT:
518 case COMMAND_ID_DRAW_TEXT_VERTICAL:
519 {
520 if ( pObj->ISA( SdrTextObj ) )
521 {
522 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
523 if ( pTextObj )
524 {
525 pTextObj->SetLogicRect( aRect );
526 sal_Bool bVertical = ( nID == SID_DRAW_TEXT_VERTICAL );
527 pTextObj->SetVerticalWriting( bVertical );
528 if ( bVertical )
529 {
530 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
531 aSet.Put( SdrTextAutoGrowWidthItem( sal_True ) );
532 aSet.Put( SdrTextAutoGrowHeightItem( sal_False ) );
533 aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_TOP ) );
534 aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) );
535 pTextObj->SetMergedItemSet( aSet );
536 }
537 }
538 }
539 }
540 break;
541 case COMMAND_ID_DRAW_CAPTION:
542 case COMMAND_ID_DRAW_CAPTION_VERTICAL:
543 {
544 if ( pObj->ISA( SdrCaptionObj ) )
545 {
546 sal_Bool bIsVertical( SID_DRAW_CAPTION_VERTICAL == nID );
547 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
548 if ( pTextObj )
549 {
550 pTextObj->SetVerticalWriting( bIsVertical );
551 }
552 if ( bIsVertical )
553 {
554 SfxItemSet aSet( pObj->GetMergedItemSet() );
555 aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
556 aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) );
557 pObj->SetMergedItemSet( aSet );
558 }
559 SdrCaptionObj* pCaptionObj = dynamic_cast< SdrCaptionObj* >( pObj );
560 if ( pCaptionObj )
561 {
562 pCaptionObj->SetLogicRect( aRect );
563 pCaptionObj->SetTailPos(
564 aRect.TopLeft() - Point( aRect.GetWidth() / 2, aRect.GetHeight() / 2 ) );
565 }
566 }
567 }
568 break;
569 default:
570 {
571 pObj->SetLogicRect( aRect );
572 SfxItemSet aSet( pDrawModelWrapper->GetItemPool() );
573 setAttributes( pObj );
574 pObj->SetMergedItemSet( aSet );
575 }
576 break;
577 }
578 }
579 }
580 }
581
582 return pObj;
583 }
584
parseCommandURL(const::rtl::OUString & rCommandURL,sal_uInt16 * pnFeatureId,::rtl::OUString * pBaseCommand,::rtl::OUString * pCustomShapeType)585 bool DrawCommandDispatch::parseCommandURL( const ::rtl::OUString& rCommandURL, sal_uInt16* pnFeatureId,
586 ::rtl::OUString* pBaseCommand, ::rtl::OUString* pCustomShapeType )
587 {
588 bool bFound = true;
589 sal_uInt16 nFeatureId = 0;
590 ::rtl::OUString aBaseCommand;
591 ::rtl::OUString aType;
592
593 sal_Int32 nIndex = 1;
594 ::rtl::OUString aToken = rCommandURL.getToken( 0, '.', nIndex );
595 if ( nIndex == -1 || aToken.isEmpty() )
596 {
597 aBaseCommand = rCommandURL;
598 SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand );
599 if ( aIter != m_aSupportedFeatures.end() )
600 {
601 nFeatureId = aIter->second.nFeatureId;
602
603 switch ( nFeatureId )
604 {
605 case COMMAND_ID_DRAWTBX_CS_BASIC:
606 {
607 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "diamond" ) );
608 }
609 break;
610 case COMMAND_ID_DRAWTBX_CS_SYMBOL:
611 {
612 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "smiley" ) );
613 }
614 break;
615 case COMMAND_ID_DRAWTBX_CS_ARROW:
616 {
617 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "left-right-arrow" ) );
618 }
619 break;
620 case COMMAND_ID_DRAWTBX_CS_FLOWCHART:
621 {
622 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "flowchart-internal-storage" ) );
623 }
624 break;
625 case COMMAND_ID_DRAWTBX_CS_CALLOUT:
626 {
627 aType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "round-rectangular-callout" ) );
628 }
629 break;
630 case COMMAND_ID_DRAWTBX_CS_STAR:
631 {
632 aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "star5" ) );
633 }
634 break;
635 default:
636 {
637 }
638 break;
639 }
640 }
641 else
642 {
643 bFound = false;
644 }
645 }
646 else
647 {
648 aBaseCommand = rCommandURL.copy( 0, nIndex - 1 );
649 SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand );
650 if ( aIter != m_aSupportedFeatures.end() )
651 {
652 nFeatureId = aIter->second.nFeatureId;
653 aType = rCommandURL.getToken( 0, '.', nIndex );
654 }
655 else
656 {
657 bFound = false;
658 }
659 }
660
661 *pnFeatureId = nFeatureId;
662 *pBaseCommand = aBaseCommand;
663 *pCustomShapeType = aType;
664
665 return bFound;
666 }
667
668 //.............................................................................
669 } // namespace chart
670 //.............................................................................
671