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 
65 ShapeController::ShapeController( const Reference< uno::XComponentContext >& rxContext,
66         ChartController* pController )
67     :FeatureCommandDispatchBase( rxContext )
68     ,m_pChartController( pController )
69 {
70 }
71 
72 ShapeController::~ShapeController()
73 {
74 }
75 
76 void ShapeController::initialize()
77 {
78     FeatureCommandDispatchBase::initialize();
79 }
80 
81 // WeakComponentImplHelperBase
82 void ShapeController::disposing()
83 {
84 }
85 
86 // XEventListener
87 void ShapeController::disposing( const lang::EventObject& /* Source */ )
88     throw (uno::RuntimeException)
89 {
90 }
91 
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 
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 
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 
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 
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 
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(),
320                         pDrawViewWrapper ) );
321                 if ( pDlg.get() )
322                 {
323                     SfxItemPool& rItemPool = pDrawViewWrapper->GetModel()->GetItemPool();
324                     SfxItemSet aSet( rItemPool, rItemPool.GetFirstWhich(), rItemPool.GetLastWhich() );
325                     const SvxColorTableItem* pColorItem = static_cast< const SvxColorTableItem* >( aSet.GetItem( SID_COLOR_TABLE ) );
326                     if ( pColorItem && pColorItem->GetColorTable() == XColorList::GetStdColorList() )
327                     {
328                         pDlg->DontDeleteColorTable();
329                     }
330                     if ( pDlg->Execute() == RET_OK )
331                     {
332                         const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
333                         if ( bHasMarked )
334                         {
335                             pDrawViewWrapper->SetAttrToMarked( *pOutAttr, sal_False );
336                         }
337                         else
338                         {
339                             pDrawViewWrapper->SetDefaultAttr( *pOutAttr, sal_False );
340                         }
341 	                }
342                 }
343             }
344         }
345     }
346 }
347 
348 void ShapeController::executeDispatch_TextAttributes()
349 {
350     ::vos::OGuard aGuard( Application::GetSolarMutex() );
351     if ( m_pChartController )
352     {
353         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
354         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
355         if ( pParent && pDrawViewWrapper )
356         {
357             SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() );
358             sal_Bool bHasMarked = pDrawViewWrapper->AreObjectsMarked();
359             if ( bHasMarked )
360             {
361                 pDrawViewWrapper->MergeAttrFromMarked( aAttr, sal_False );
362             }
363             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
364             if ( pFact )
365             {
366                 ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
367                     pFact->CreateTextTabDialog( pParent, &aAttr, pDrawViewWrapper ) );
368                 if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
369                 {
370                     const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
371                     if ( bHasMarked )
372                     {
373                         pDrawViewWrapper->SetAttributes( *pOutAttr );
374                     }
375                     else
376                     {
377                         pDrawViewWrapper->SetDefaultAttr( *pOutAttr, sal_False );
378                     }
379 	            }
380             }
381         }
382     }
383 }
384 
385 void ShapeController::executeDispatch_TransformDialog()
386 {
387     ::vos::OGuard aGuard( Application::GetSolarMutex() );
388     if ( m_pChartController )
389     {
390         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
391         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
392         if ( pParent && pDrawViewWrapper )
393         {
394             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
395             if ( pSelectedObj && pSelectedObj->GetObjIdentifier() == OBJ_CAPTION )
396             {
397                 // item set for caption
398                 SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() );
399                 pDrawViewWrapper->GetAttributes( aAttr );
400                 // item set for position and size
401                 SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() );
402                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
403                 if ( pFact )
404                 {
405                     ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
406                         pFact->CreateCaptionDialog( pParent, pDrawViewWrapper ) );
407                     if ( pDlg.get() )
408                     {
409                         const sal_uInt16* pRange = pDlg->GetInputRanges( *aAttr.GetPool() );
410                         SfxItemSet aCombAttr( *aAttr.GetPool(), pRange );
411                         aCombAttr.Put( aAttr );
412                         aCombAttr.Put( aGeoAttr );
413                         pDlg->SetInputSet( &aCombAttr );
414                         if ( pDlg->Execute() == RET_OK )
415                         {
416                             const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
417                             pDrawViewWrapper->SetAttributes( *pOutAttr );
418                             pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr );
419                         }
420                     }
421 		        }
422             }
423             else
424             {
425                 SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() );
426                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
427                 if ( pFact )
428                 {
429                     ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg(
430                         pFact->CreateSvxTransformTabDialog( pParent, &aGeoAttr, pDrawViewWrapper ) );
431                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
432                     {
433                         const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
434                         pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr );
435 			        }
436 		        }
437 	        }
438         }
439     }
440 }
441 
442 void ShapeController::executeDispatch_ObjectTitleDescription()
443 {
444     ::vos::OGuard aGuard( Application::GetSolarMutex() );
445     if ( m_pChartController )
446     {
447         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
448         if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 )
449         {
450             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
451             if ( pSelectedObj )
452             {
453                 String aTitle( pSelectedObj->GetTitle() );
454                 String aDescription( pSelectedObj->GetDescription() );
455                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
456                 if ( pFact )
457                 {
458                     ::boost::scoped_ptr< AbstractSvxObjectTitleDescDialog > pDlg(
459                         pFact->CreateSvxObjectTitleDescDialog( NULL, aTitle, aDescription ) );
460                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
461                     {
462                         pDlg->GetTitle( aTitle );
463                         pDlg->GetDescription( aDescription );
464                         pSelectedObj->SetTitle( aTitle );
465                         pSelectedObj->SetDescription( aDescription );
466                     }
467                 }
468             }
469         }
470     }
471 }
472 
473 void ShapeController::executeDispatch_RenameObject()
474 {
475     ::vos::OGuard aGuard( Application::GetSolarMutex() );
476     if ( m_pChartController )
477     {
478         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
479         if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 )
480         {
481             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
482             if ( pSelectedObj )
483             {
484                 String aName( pSelectedObj->GetName() );
485                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
486                 if ( pFact )
487                 {
488                     ::boost::scoped_ptr< AbstractSvxObjectNameDialog > pDlg(
489                         pFact->CreateSvxObjectNameDialog( NULL, aName ) );
490                     pDlg->SetCheckNameHdl( LINK( this, ShapeController, CheckNameHdl ) );
491                     if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
492                     {
493                         pDlg->GetName( aName );
494                         if ( aName != pSelectedObj->GetName() )
495                         {
496                             pSelectedObj->SetName( aName );
497                         }
498                     }
499                 }
500             }
501         }
502     }
503 }
504 
505 void ShapeController::executeDispatch_ChangeZOrder( sal_uInt16 nId )
506 {
507     ::vos::OGuard aGuard( Application::GetSolarMutex() );
508     DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL );
509     if ( pDrawViewWrapper )
510     {
511         switch ( nId )
512         {
513             case COMMAND_ID_BRING_TO_FRONT:
514                 {
515                     if ( isForwardPossible() )
516                     {
517                         pDrawViewWrapper->PutMarkedToTop();
518                     }
519                 }
520                 break;
521             case COMMAND_ID_FORWARD:
522                 {
523                     if ( isForwardPossible() )
524                     {
525                         pDrawViewWrapper->MovMarkedToTop();
526                     }
527                 }
528                 break;
529             case COMMAND_ID_BACKWARD:
530                 {
531                     if ( isBackwardPossible() )
532                     {
533                         pDrawViewWrapper->MovMarkedToBtm();
534                     }
535                 }
536                 break;
537             case COMMAND_ID_SEND_TO_BACK:
538                 {
539                     if ( isBackwardPossible() )
540                     {
541                         SdrObject* pFirstObj = getFirstAdditionalShape();
542                         pDrawViewWrapper->PutMarkedBehindObj( pFirstObj );
543                     }
544                 }
545                 break;
546             default:
547                 {
548                 }
549                 break;
550         }
551     }
552 }
553 
554 void ShapeController::executeDispatch_FontDialog()
555 {
556     ::vos::OGuard aGuard( Application::GetSolarMutex() );
557     if ( m_pChartController )
558     {
559         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
560         DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper();
561         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
562         if ( pParent && pDrawModelWrapper && pDrawViewWrapper )
563         {
564             SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() );
565             pDrawViewWrapper->GetAttributes( aAttr );
566             ViewElementListProvider aViewElementListProvider( pDrawModelWrapper );
567             ::boost::scoped_ptr< ShapeFontDialog > pDlg( new ShapeFontDialog( pParent, &aAttr, &aViewElementListProvider ) );
568             if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
569             {
570                 const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
571                 pDrawViewWrapper->SetAttributes( *pOutAttr );
572             }
573         }
574     }
575 }
576 
577 void ShapeController::executeDispatch_ParagraphDialog()
578 {
579     ::vos::OGuard aGuard( Application::GetSolarMutex() );
580     if ( m_pChartController )
581     {
582         Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow );
583         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
584         if ( pParent && pDrawViewWrapper )
585         {
586             SfxItemPool& rPool = pDrawViewWrapper->GetModel()->GetItemPool();
587             SfxItemSet aAttr( rPool );
588             pDrawViewWrapper->GetAttributes( aAttr );
589 
590             SfxItemSet aNewAttr( rPool,
591                                     EE_ITEMS_START, EE_ITEMS_END,
592                                     SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE,
593                                     SID_ATTR_PARA_PAGEBREAK, SID_ATTR_PARA_PAGEBREAK,
594                                     SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT,
595                                     SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS,
596                                     SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS,
597                                     0 );
598             aNewAttr.Put( aAttr );
599             aNewAttr.Put( SvxHyphenZoneItem( sal_False, SID_ATTR_PARA_HYPHENZONE ) );
600             aNewAttr.Put( SvxFmtBreakItem( SVX_BREAK_NONE, SID_ATTR_PARA_PAGEBREAK ) );
601             aNewAttr.Put( SvxFmtSplitItem( sal_True, SID_ATTR_PARA_SPLIT)  );
602             aNewAttr.Put( SvxWidowsItem( 0, SID_ATTR_PARA_WIDOWS) );
603             aNewAttr.Put( SvxOrphansItem( 0, SID_ATTR_PARA_ORPHANS) );
604 
605             ::boost::scoped_ptr< ShapeParagraphDialog > pDlg( new ShapeParagraphDialog( pParent, &aNewAttr ) );
606             if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) )
607             {
608                 const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet();
609                 pDrawViewWrapper->SetAttributes( *pOutAttr );
610             }
611         }
612     }
613 }
614 
615 SdrObject* ShapeController::getFirstAdditionalShape()
616 {
617     SdrObject* pFirstObj = NULL;
618 
619     try
620     {
621         DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
622         if ( pDrawModelWrapper )
623         {
624             Reference< drawing::XShape > xFirstShape;
625             Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
626             Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW );
627             Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) );
628             sal_Int32 nCount = xDrawPageShapes->getCount();
629             for ( sal_Int32 i = 0; i < nCount; ++i )
630             {
631                 Reference< drawing::XShape > xShape;
632                 if ( xDrawPageShapes->getByIndex( i ) >>= xShape )
633                 {
634                     if ( xShape.is() && xShape != xChartRoot )
635                     {
636                         xFirstShape = xShape;
637                         break;
638                     }
639                 }
640             }
641             if ( xFirstShape.is() )
642             {
643                 pFirstObj = DrawViewWrapper::getSdrObject( xFirstShape );
644             }
645         }
646     }
647     catch ( uno::Exception& ex )
648     {
649         ASSERT_EXCEPTION( ex );
650     }
651 
652     return pFirstObj;
653 }
654 
655 SdrObject* ShapeController::getLastAdditionalShape()
656 {
657     SdrObject* pLastObj = NULL;
658 
659     try
660     {
661         DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL );
662         if ( pDrawModelWrapper )
663         {
664             Reference< drawing::XShape > xLastShape;
665             Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() );
666             Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW );
667             Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) );
668             sal_Int32 nCount = xDrawPageShapes->getCount();
669             for ( sal_Int32 i = nCount - 1; i >= 0; --i )
670             {
671                 Reference< drawing::XShape > xShape;
672                 if ( xDrawPageShapes->getByIndex( i ) >>= xShape )
673                 {
674                     if ( xShape.is() && xShape != xChartRoot )
675                     {
676                         xLastShape = xShape;
677                         break;
678                     }
679                 }
680             }
681             if ( xLastShape.is() )
682             {
683                 pLastObj = DrawViewWrapper::getSdrObject( xLastShape );
684             }
685         }
686     }
687     catch ( uno::Exception& ex )
688     {
689         ASSERT_EXCEPTION( ex );
690     }
691 
692     return pLastObj;
693 }
694 
695 bool ShapeController::isBackwardPossible()
696 {
697     if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() )
698     {
699         ::vos::OGuard aGuard( Application::GetSolarMutex() );
700         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
701         if ( pDrawViewWrapper )
702         {
703             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
704             SdrObject* pFirstObj = getFirstAdditionalShape();
705             if ( pSelectedObj && pFirstObj && pSelectedObj != pFirstObj )
706             {
707                 return true;
708             }
709         }
710     }
711     return false;
712 }
713 
714 bool ShapeController::isForwardPossible()
715 {
716     if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() )
717     {
718         ::vos::OGuard aGuard( Application::GetSolarMutex() );
719         DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper();
720         if ( pDrawViewWrapper )
721         {
722             SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject();
723             SdrObject* pLastObj = getLastAdditionalShape();
724             if ( pSelectedObj && pLastObj && pSelectedObj != pLastObj )
725             {
726                 return true;
727             }
728         }
729     }
730     return false;
731 }
732 
733 //.............................................................................
734 } //  namespace chart
735 //.............................................................................
736