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 "ShapeController.hxx"
28 #include "ShapeController.hrc"
29 #include "ChartController.hxx"
30 #include "ChartWindow.hxx"
31 #include "ViewElementListProvider.hxx"
32 #include "dlg_ShapeFont.hxx"
33 #include "dlg_ShapeParagraph.hxx"
34 #include "chartview/DrawModelWrapper.hxx"
35 #include "macros.hxx"
36 
37 #include <com/sun/star/frame/XStorable.hpp>
38 
39 #include <vos/mutex.hxx>
40 #include <vcl/msgbox.hxx>
41 #include <vcl/svapp.hxx>
42 #include <editeng/brkitem.hxx>
43 #include <svx/dialogs.hrc>
44 #include <svx/drawitem.hxx>
45 #include <editeng/eeitem.hxx>
46 #include <editeng/hyznitem.hxx>
47 #include <editeng/orphitem.hxx>
48 #include <editeng/spltitem.hxx>
49 #include <svx/svxdlg.hxx>
50 #include <editeng/widwitem.hxx>
51 
52 #include <boost/scoped_ptr.hpp>
53 
54 using namespace ::com::sun::star;
55 using namespace ::com::sun::star::frame;
56 
57 using ::com::sun::star::uno::Reference;
58 using ::com::sun::star::uno::Sequence;
59 
60 //.............................................................................
61 namespace chart
62 {
63 //.............................................................................
64 
ShapeController(const Reference<uno::XComponentContext> & rxContext,ChartController * pController)65 ShapeController::ShapeController( const Reference< uno::XComponentContext >& rxContext,
66         ChartController* pController )
67     :FeatureCommandDispatchBase( rxContext )
68     ,m_pChartController( pController )
69 {
70 }
71 
~ShapeController()72 ShapeController::~ShapeController()
73 {
74 }
75 
initialize()76 void ShapeController::initialize()
77 {
78     FeatureCommandDispatchBase::initialize();
79 }
80 
81 // WeakComponentImplHelperBase
disposing()82 void ShapeController::disposing()
83 {
84 }
85 
86 // XEventListener
disposing(const lang::EventObject &)87 void ShapeController::disposing( const lang::EventObject& /* Source */ )
88     throw (uno::RuntimeException)
89 {
90 }
91 
getState(const::rtl::OUString & rCommand)92 FeatureState ShapeController::getState( const ::rtl::OUString& rCommand )
93 {
94     FeatureState aReturn;
95     aReturn.bEnabled = false;
96     aReturn.aState <<= false;
97 
98     bool bWritable = false;
99     if ( m_pChartController )
100     {
101         Reference< frame::XStorable > xStorable( m_pChartController->getModel(), uno::UNO_QUERY );
102         if ( xStorable.is() )
103         {
104             bWritable = !xStorable->isReadonly();
105         }
106     }
107 
108     SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( rCommand );
109     if ( aIter != m_aSupportedFeatures.end() )
110     {
111         sal_uInt16 nFeatureId = aIter->second.nFeatureId;
112         switch ( nFeatureId )
113         {
114             case COMMAND_ID_FORMAT_LINE:
115             case COMMAND_ID_FORMAT_AREA:
116             case COMMAND_ID_TEXT_ATTRIBUTES:
117             case COMMAND_ID_TRANSFORM_DIALOG:
118             case COMMAND_ID_OBJECT_TITLE_DESCRIPTION:
119             case COMMAND_ID_RENAME_OBJECT:
120                 {
121                     aReturn.bEnabled = bWritable;
122                     aReturn.aState <<= false;
123                 }
124                 break;
125             case COMMAND_ID_BRING_TO_FRONT:
126             case COMMAND_ID_FORWARD:
127                 {
128                     aReturn.bEnabled = ( bWritable && isForwardPossible() );
129                     aReturn.aState <<= false;
130                 }
131                 break;
132             case COMMAND_ID_BACKWARD:
133             case COMMAND_ID_SEND_TO_BACK:
134                 {
135 
136                     aReturn.bEnabled = ( bWritable && isBackwardPossible() );
137                     aReturn.aState <<= false;
138                 }
139                 break;
140             case COMMAND_ID_FONT_DIALOG:
141             case COMMAND_ID_PARAGRAPH_DIALOG:
142                 {
143                     aReturn.bEnabled = bWritable;
144                     aReturn.aState <<= false;
145                 }
146                 break;
147             default:
148                 {
149                     aReturn.bEnabled = false;
150                     aReturn.aState <<= false;
151                 }
152                 break;
153         }
154     }
155 
156     return aReturn;
157 }
158 
execute(const::rtl::OUString & rCommand,const Sequence<beans::PropertyValue> & rArgs)159 void ShapeController::execute( const ::rtl::OUString& rCommand, const Sequence< beans::PropertyValue>& rArgs )
160 {
161     (void)rArgs;
162 
163     SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( rCommand );
164     if ( aIter != m_aSupportedFeatures.end() )
165     {
166         sal_uInt16 nFeatureId = aIter->second.nFeatureId;
167         switch ( nFeatureId )
168         {
169             case COMMAND_ID_FORMAT_LINE:
170                 {
171                     executeDispatch_FormatLine();
172                 }
173                 break;
174             case COMMAND_ID_FORMAT_AREA:
175                 {
176                     executeDispatch_FormatArea();
177                 }
178                 break;
179             case COMMAND_ID_TEXT_ATTRIBUTES:
180                 {
181                     executeDispatch_TextAttributes();
182                 }
183                 break;
184             case COMMAND_ID_TRANSFORM_DIALOG:
185                 {
186                     executeDispatch_TransformDialog();
187                 }
188                 break;
189             case COMMAND_ID_OBJECT_TITLE_DESCRIPTION:
190                 {
191                     executeDispatch_ObjectTitleDescription();
192                 }
193                 break;
194             case COMMAND_ID_RENAME_OBJECT:
195                 {
196                     executeDispatch_RenameObject();
197                 }
198                 break;
199             case COMMAND_ID_BRING_TO_FRONT:
200             case COMMAND_ID_FORWARD:
201             case COMMAND_ID_BACKWARD:
202             case COMMAND_ID_SEND_TO_BACK:
203                 {
204                     executeDispatch_ChangeZOrder( nFeatureId );
205                 }
206                 break;
207             case COMMAND_ID_FONT_DIALOG:
208                 {
209                     executeDispatch_FontDialog();
210                 }
211                 break;
212             case COMMAND_ID_PARAGRAPH_DIALOG:
213                 {
214                     executeDispatch_ParagraphDialog();
215                 }
216                 break;
217             default:
218                 {
219                 }
220                 break;
221         }
222     }
223 }
224 
describeSupportedFeatures()225 void ShapeController::describeSupportedFeatures()
226 {
227     implDescribeSupportedFeature( ".uno:FormatLine",                COMMAND_ID_FORMAT_LINE,                 CommandGroup::FORMAT );
228     implDescribeSupportedFeature( ".uno:FormatArea",                COMMAND_ID_FORMAT_AREA,                 CommandGroup::FORMAT );
229     implDescribeSupportedFeature( ".uno:TextAttributes",            COMMAND_ID_TEXT_ATTRIBUTES,             CommandGroup::FORMAT );
230     implDescribeSupportedFeature( ".uno:TransformDialog",           COMMAND_ID_TRANSFORM_DIALOG,            CommandGroup::FORMAT );
231     implDescribeSupportedFeature( ".uno:ObjectTitleDescription",    COMMAND_ID_OBJECT_TITLE_DESCRIPTION,    CommandGroup::FORMAT );
232     implDescribeSupportedFeature( ".uno:RenameObject",              COMMAND_ID_RENAME_OBJECT,               CommandGroup::FORMAT );
233     implDescribeSupportedFeature( ".uno:BringToFront",              COMMAND_ID_BRING_TO_FRONT,              CommandGroup::FORMAT );
234     implDescribeSupportedFeature( ".uno:Forward",                   COMMAND_ID_FORWARD,                     CommandGroup::FORMAT );
235     implDescribeSupportedFeature( ".uno:Backward",                  COMMAND_ID_BACKWARD,                    CommandGroup::FORMAT );
236     implDescribeSupportedFeature( ".uno:SendToBack",                COMMAND_ID_SEND_TO_BACK,                CommandGroup::FORMAT );
237     implDescribeSupportedFeature( ".uno:FontDialog",                COMMAND_ID_FONT_DIALOG,                 CommandGroup::EDIT );
238     implDescribeSupportedFeature( ".uno:ParagraphDialog",           COMMAND_ID_PARAGRAPH_DIALOG,            CommandGroup::EDIT );
239 }
240 
IMPL_LINK(ShapeController,CheckNameHdl,AbstractSvxNameDialog *,pDialog)241 IMPL_LINK( ShapeController, CheckNameHdl, AbstractSvxNameDialog*, pDialog )
242 {
243     String aName;
244     if ( pDialog )
245     {
246         pDialog->GetName( aName );
247     }
248     if ( aName.Len() )
249     {
250         DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
251         if ( pDrawViewWrapper && pDrawViewWrapper->getNamedSdrObject( aName ) )
252         {
253             return 0;
254         }
255     }
256     return 1;
257 }
258 
executeDispatch_FormatLine()259 void ShapeController::executeDispatch_FormatLine()
260 {
261     ::vos::OGuard aGuard( Application::GetSolarMutex() );
262     if ( m_pChartController )
263     {
264         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
265         DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
266         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
267         if ( pParent && pDrawModelWrapper && pDrawViewWrapper )
268         {
269             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
270             SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() );
271             sal_Bool bHasMarked = pDrawViewWrapper->AreObjectsMarked();
272             if ( bHasMarked )
273             {
274                 pDrawViewWrapper->MergeAttrFromMarked( aAttr, sal_False );
275             }
276             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
277             if ( pFact )
278             {
279                 ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
280                     pFact->CreateSvxLineTabDialog( pParent, &aAttr, &pDrawModelWrapper->getSdrModel(),
281                         pSelectedObj, bHasMarked ) );
282                 if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
283                 {
284                     const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
285                     if ( bHasMarked )
286                     {
287                         pDrawViewWrapper->SetAttrToMarked( *pOutAttr, sal_False );
288                     }
289                     else
290                     {
291                         pDrawViewWrapper->SetDefaultAttr( *pOutAttr, sal_False );
292                     }
293 	            }
294             }
295         }
296     }
297 }
298 
executeDispatch_FormatArea()299 void ShapeController::executeDispatch_FormatArea()
300 {
301     ::vos::OGuard aGuard( Application::GetSolarMutex() );
302     if ( m_pChartController )
303     {
304         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
305         DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
306         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
307         if ( pParent && pDrawModelWrapper && pDrawViewWrapper )
308         {
309             SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() );
310             sal_Bool bHasMarked = pDrawViewWrapper->AreObjectsMarked();
311             if ( bHasMarked )
312             {
313                 pDrawViewWrapper->MergeAttrFromMarked( aAttr, sal_False );
314             }
315             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
316             if ( pFact )
317             {
318                 ::boost::scoped_ptr< AbstractSvxAreaTabDialog > pDlg(
319                     pFact->CreateSvxAreaTabDialog( pParent, &aAttr, &pDrawModelWrapper->getSdrModel(), true ) );
320                 if ( pDlg.get() )
321                 {
322                     SfxItemPool& rItemPool = pDrawViewWrapper->GetModel()->GetItemPool();
323                     SfxItemSet aSet( rItemPool, rItemPool.GetFirstWhich(), rItemPool.GetLastWhich() );
324                     // const SvxColorTableItem* pColorItem = static_cast< const SvxColorTableItem* >( aSet.GetItem( SID_COLOR_TABLE ) );
325 
326                     if ( pDlg->Execute() == RET_OK )
327                     {
328                         const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
329                         if ( bHasMarked )
330                         {
331                             pDrawViewWrapper->SetAttrToMarked( *pOutAttr, sal_False );
332                         }
333                         else
334                         {
335                             pDrawViewWrapper->SetDefaultAttr( *pOutAttr, sal_False );
336                         }
337 	                }
338                 }
339             }
340         }
341     }
342 }
343 
executeDispatch_TextAttributes()344 void ShapeController::executeDispatch_TextAttributes()
345 {
346     ::vos::OGuard aGuard( Application::GetSolarMutex() );
347     if ( m_pChartController )
348     {
349         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
350         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
351         if ( pParent && pDrawViewWrapper )
352         {
353             SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() );
354             sal_Bool bHasMarked = pDrawViewWrapper->AreObjectsMarked();
355             if ( bHasMarked )
356             {
357                 pDrawViewWrapper->MergeAttrFromMarked( aAttr, sal_False );
358             }
359             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
360             if ( pFact )
361             {
362                 ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
363                     pFact->CreateTextTabDialog( pParent, &aAttr, pDrawViewWrapper ) );
364                 if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
365                 {
366                     const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
367                     if ( bHasMarked )
368                     {
369                         pDrawViewWrapper->SetAttributes( *pOutAttr );
370                     }
371                     else
372                     {
373                         pDrawViewWrapper->SetDefaultAttr( *pOutAttr, sal_False );
374                     }
375 	            }
376             }
377         }
378     }
379 }
380 
executeDispatch_TransformDialog()381 void ShapeController::executeDispatch_TransformDialog()
382 {
383     ::vos::OGuard aGuard( Application::GetSolarMutex() );
384     if ( m_pChartController )
385     {
386         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
387         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
388         if ( pParent && pDrawViewWrapper )
389         {
390             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
391             if ( pSelectedObj && pSelectedObj->GetObjIdentifier() == OBJ_CAPTION )
392             {
393                 // item set for caption
394                 SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() );
395                 pDrawViewWrapper->GetAttributes( aAttr );
396                 // item set for position and size
397                 SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() );
398                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
399                 if ( pFact )
400                 {
401                     ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
402                         pFact->CreateCaptionDialog( pParent, pDrawViewWrapper ) );
403                     if ( pDlg.get() )
404                     {
405                         const sal_uInt16* pRange = pDlg->GetInputRanges( *aAttr.GetPool() );
406                         SfxItemSet aCombAttr( *aAttr.GetPool(), pRange );
407                         aCombAttr.Put( aAttr );
408                         aCombAttr.Put( aGeoAttr );
409                         pDlg->SetInputSet( &aCombAttr );
410                         if ( pDlg->Execute() == RET_OK )
411                         {
412                             const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
413                             pDrawViewWrapper->SetAttributes( *pOutAttr );
414                             pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr );
415                         }
416                     }
417 		        }
418             }
419             else
420             {
421                 SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() );
422                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
423                 if ( pFact )
424                 {
425                     ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
426                         pFact->CreateSvxTransformTabDialog( pParent, &aGeoAttr, pDrawViewWrapper ) );
427                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
428                     {
429                         const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
430                         pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr );
431 			        }
432 		        }
433 	        }
434         }
435     }
436 }
437 
executeDispatch_ObjectTitleDescription()438 void ShapeController::executeDispatch_ObjectTitleDescription()
439 {
440     ::vos::OGuard aGuard( Application::GetSolarMutex() );
441     if ( m_pChartController )
442     {
443         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
444         if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 )
445         {
446             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
447             if ( pSelectedObj )
448             {
449                 String aTitle( pSelectedObj->GetTitle() );
450                 String aDescription( pSelectedObj->GetDescription() );
451                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
452                 if ( pFact )
453                 {
454                     ::boost::scoped_ptr< AbstractSvxObjectTitleDescDialog > pDlg(
455                         pFact->CreateSvxObjectTitleDescDialog( NULL, aTitle, aDescription ) );
456                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
457                     {
458                         pDlg->GetTitle( aTitle );
459                         pDlg->GetDescription( aDescription );
460                         pSelectedObj->SetTitle( aTitle );
461                         pSelectedObj->SetDescription( aDescription );
462                     }
463                 }
464             }
465         }
466     }
467 }
468 
executeDispatch_RenameObject()469 void ShapeController::executeDispatch_RenameObject()
470 {
471     ::vos::OGuard aGuard( Application::GetSolarMutex() );
472     if ( m_pChartController )
473     {
474         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
475         if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 )
476         {
477             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
478             if ( pSelectedObj )
479             {
480                 String aName( pSelectedObj->GetName() );
481                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
482                 if ( pFact )
483                 {
484                     ::boost::scoped_ptr< AbstractSvxObjectNameDialog > pDlg(
485                         pFact->CreateSvxObjectNameDialog( NULL, aName ) );
486                     pDlg->SetCheckNameHdl( LINK( this, ShapeController, CheckNameHdl ) );
487                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
488                     {
489                         pDlg->GetName( aName );
490                         if ( aName != pSelectedObj->GetName() )
491                         {
492                             pSelectedObj->SetName( aName );
493                         }
494                     }
495                 }
496             }
497         }
498     }
499 }
500 
executeDispatch_ChangeZOrder(sal_uInt16 nId)501 void ShapeController::executeDispatch_ChangeZOrder( sal_uInt16 nId )
502 {
503     ::vos::OGuard aGuard( Application::GetSolarMutex() );
504     DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
505     if ( pDrawViewWrapper )
506     {
507         switch ( nId )
508         {
509             case COMMAND_ID_BRING_TO_FRONT:
510                 {
511                     if ( isForwardPossible() )
512                     {
513                         pDrawViewWrapper->PutMarkedToTop();
514                     }
515                 }
516                 break;
517             case COMMAND_ID_FORWARD:
518                 {
519                     if ( isForwardPossible() )
520                     {
521                         pDrawViewWrapper->MovMarkedToTop();
522                     }
523                 }
524                 break;
525             case COMMAND_ID_BACKWARD:
526                 {
527                     if ( isBackwardPossible() )
528                     {
529                         pDrawViewWrapper->MovMarkedToBtm();
530                     }
531                 }
532                 break;
533             case COMMAND_ID_SEND_TO_BACK:
534                 {
535                     if ( isBackwardPossible() )
536                     {
537                         SdrObject* pFirstObj = getFirstAdditionalShape();
538                         pDrawViewWrapper->PutMarkedBehindObj( pFirstObj );
539                     }
540                 }
541                 break;
542             default:
543                 {
544                 }
545                 break;
546         }
547     }
548 }
549 
executeDispatch_FontDialog()550 void ShapeController::executeDispatch_FontDialog()
551 {
552     ::vos::OGuard aGuard( Application::GetSolarMutex() );
553     if ( m_pChartController )
554     {
555         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
556         DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
557         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
558         if ( pParent && pDrawModelWrapper && pDrawViewWrapper )
559         {
560             SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() );
561             pDrawViewWrapper->GetAttributes( aAttr );
562             ViewElementListProvider aViewElementListProvider( pDrawModelWrapper );
563             ::boost::scoped_ptr< ShapeFontDialog > pDlg( new ShapeFontDialog( pParent, &aAttr, &aViewElementListProvider ) );
564             if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
565             {
566                 const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
567                 pDrawViewWrapper->SetAttributes( *pOutAttr );
568             }
569         }
570     }
571 }
572 
executeDispatch_ParagraphDialog()573 void ShapeController::executeDispatch_ParagraphDialog()
574 {
575     ::vos::OGuard aGuard( Application::GetSolarMutex() );
576     if ( m_pChartController )
577     {
578         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
579         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
580         if ( pParent && pDrawViewWrapper )
581         {
582             SfxItemPool& rPool = pDrawViewWrapper->GetModel()->GetItemPool();
583             SfxItemSet aAttr( rPool );
584             pDrawViewWrapper->GetAttributes( aAttr );
585 
586             SfxItemSet aNewAttr( rPool,
587                                     EE_ITEMS_START, EE_ITEMS_END,
588                                     SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE,
589                                     SID_ATTR_PARA_PAGEBREAK, SID_ATTR_PARA_PAGEBREAK,
590                                     SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT,
591                                     SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS,
592                                     SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS,
593                                     0 );
594             aNewAttr.Put( aAttr );
595             aNewAttr.Put( SvxHyphenZoneItem( sal_False, SID_ATTR_PARA_HYPHENZONE ) );
596             aNewAttr.Put( SvxFmtBreakItem( SVX_BREAK_NONE, SID_ATTR_PARA_PAGEBREAK ) );
597             aNewAttr.Put( SvxFmtSplitItem( sal_True, SID_ATTR_PARA_SPLIT)  );
598             aNewAttr.Put( SvxWidowsItem( 0, SID_ATTR_PARA_WIDOWS) );
599             aNewAttr.Put( SvxOrphansItem( 0, SID_ATTR_PARA_ORPHANS) );
600 
601             ::boost::scoped_ptr< ShapeParagraphDialog > pDlg( new ShapeParagraphDialog( pParent, &aNewAttr ) );
602             if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
603             {
604                 const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
605                 pDrawViewWrapper->SetAttributes( *pOutAttr );
606             }
607         }
608     }
609 }
610 
getFirstAdditionalShape()611 SdrObject* ShapeController::getFirstAdditionalShape()
612 {
613     SdrObject* pFirstObj = NULL;
614 
615     try
616     {
617         DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
618         if ( pDrawModelWrapper )
619         {
620             Reference< drawing::XShape > xFirstShape;
621             Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
622             Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW );
623             Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) );
624             sal_Int32 nCount = xDrawPageShapes->getCount();
625             for ( sal_Int32 i = 0; i < nCount; ++i )
626             {
627                 Reference< drawing::XShape > xShape;
628                 if ( xDrawPageShapes->getByIndex( i ) >>= xShape )
629                 {
630                     if ( xShape.is() && xShape != xChartRoot )
631                     {
632                         xFirstShape = xShape;
633                         break;
634                     }
635                 }
636             }
637             if ( xFirstShape.is() )
638             {
639                 pFirstObj = DrawViewWrapper::getSdrObject( xFirstShape );
640             }
641         }
642     }
643     catch ( uno::Exception& ex )
644     {
645         ASSERT_EXCEPTION( ex );
646     }
647 
648     return pFirstObj;
649 }
650 
getLastAdditionalShape()651 SdrObject* ShapeController::getLastAdditionalShape()
652 {
653     SdrObject* pLastObj = NULL;
654 
655     try
656     {
657         DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
658         if ( pDrawModelWrapper )
659         {
660             Reference< drawing::XShape > xLastShape;
661             Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
662             Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW );
663             Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) );
664             sal_Int32 nCount = xDrawPageShapes->getCount();
665             for ( sal_Int32 i = nCount - 1; i >= 0; --i )
666             {
667                 Reference< drawing::XShape > xShape;
668                 if ( xDrawPageShapes->getByIndex( i ) >>= xShape )
669                 {
670                     if ( xShape.is() && xShape != xChartRoot )
671                     {
672                         xLastShape = xShape;
673                         break;
674                     }
675                 }
676             }
677             if ( xLastShape.is() )
678             {
679                 pLastObj = DrawViewWrapper::getSdrObject( xLastShape );
680             }
681         }
682     }
683     catch ( uno::Exception& ex )
684     {
685         ASSERT_EXCEPTION( ex );
686     }
687 
688     return pLastObj;
689 }
690 
isBackwardPossible()691 bool ShapeController::isBackwardPossible()
692 {
693     if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() )
694     {
695         ::vos::OGuard aGuard( Application::GetSolarMutex() );
696         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
697         if ( pDrawViewWrapper )
698         {
699             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
700             SdrObject* pFirstObj = getFirstAdditionalShape();
701             if ( pSelectedObj && pFirstObj && pSelectedObj != pFirstObj )
702             {
703                 return true;
704             }
705         }
706     }
707     return false;
708 }
709 
isForwardPossible()710 bool ShapeController::isForwardPossible()
711 {
712     if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() )
713     {
714         ::vos::OGuard aGuard( Application::GetSolarMutex() );
715         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
716         if ( pDrawViewWrapper )
717         {
718             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
719             SdrObject* pLastObj = getLastAdditionalShape();
720             if ( pSelectedObj && pLastObj && pSelectedObj != pLastObj )
721             {
722                 return true;
723             }
724         }
725     }
726     return false;
727 }
728 
729 //.............................................................................
730 } //  namespace chart
731 //.............................................................................
732