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