xref: /trunk/main/sd/source/ui/view/drbezob.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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_sd.hxx"
30 
31 #include "BezierObjectBar.hxx"
32 #include <sfx2/app.hxx>
33 #include <sfx2/msg.hxx>
34 
35 #include <sfx2/viewfrm.hxx>
36 #include <sfx2/objface.hxx>
37 
38 #include <svx/svxids.hrc>
39 #include <svl/eitem.hxx>
40 #include <sfx2/request.hxx>
41 #include <svx/svdopath.hxx>
42 #include <svl/aeitem.hxx>
43 #include <svx/svdundo.hxx>
44 #include <sfx2/dispatch.hxx>
45 
46 
47 #include "sdresid.hxx"
48 
49 
50 
51 #include "res_bmp.hrc"
52 #include "glob.hrc"
53 #include "strings.hrc"
54 
55 #include "DrawDocShell.hxx"
56 #include "ViewShell.hxx"
57 #include "Window.hxx"
58 #include "drawview.hxx"
59 #include "drawdoc.hxx"
60 #include "sdresid.hxx"
61 #include "fusel.hxx"
62 #include "fuconbez.hxx"
63 
64 
65 using namespace sd;
66 #define BezierObjectBar
67 #include "sdslots.hxx"
68 
69 namespace sd {
70 
71 /*************************************************************************
72 |*
73 |* Standardinterface deklarieren (Die Slotmap darf nicht leer sein)
74 |*
75 \************************************************************************/
76 
77 
78 
79 SFX_IMPL_INTERFACE(BezierObjectBar, ::SfxShell, SdResId(STR_BEZIEROBJECTBARSHELL))
80 {
81 }
82 
83 TYPEINIT1(BezierObjectBar, ::SfxShell);
84 
85 /*************************************************************************
86 |*
87 |* Standard-Konstruktor
88 |*
89 \************************************************************************/
90 
91 BezierObjectBar::BezierObjectBar(
92     ViewShell* pSdViewShell,
93     ::sd::View* pSdView)
94     : SfxShell(pSdViewShell->GetViewShell()),
95       mpView(pSdView),
96       mpViewSh(pSdViewShell)
97 {
98     DrawDocShell* pDocShell = mpViewSh->GetDocSh();
99     SetPool(&pDocShell->GetPool());
100     SetUndoManager(pDocShell->GetUndoManager());
101     SetRepeatTarget(mpView);
102 
103     SetHelpId( SD_IF_SDDRAWBEZIEROBJECTBAR );
104 }
105 
106 /*************************************************************************
107 |*
108 |* Destruktor
109 |*
110 \************************************************************************/
111 
112 BezierObjectBar::~BezierObjectBar()
113 {
114     SetRepeatTarget(NULL);
115 }
116 
117 
118 /*************************************************************************
119 |*
120 |* Status der Attribut-Items
121 |*
122 \************************************************************************/
123 
124 void BezierObjectBar::GetAttrState(SfxItemSet& rSet)
125 {
126     SfxItemSet aAttrSet( mpView->GetDoc()->GetPool() );
127     mpView->GetAttributes( aAttrSet );
128     rSet.Put(aAttrSet, sal_False); // <- sal_False, damit DontCare-Status uebernommen wird
129 
130     FunctionReference xFunc( mpViewSh->GetCurrentFunction() );
131 
132     if(xFunc.is())
133     {
134         if(xFunc->ISA(FuSelection))
135         {
136             sal_uInt16 nEditMode = static_cast<FuSelection*>(xFunc.get())->GetEditMode();
137             rSet.Put(SfxBoolItem(nEditMode, sal_True));
138         }
139         else if (xFunc->ISA(FuConstructBezierPolygon))
140         {
141             sal_uInt16 nEditMode = static_cast<FuConstructBezierPolygon*>(xFunc.get())->GetEditMode();
142             rSet.Put(SfxBoolItem(nEditMode, sal_True));
143         }
144     }
145 
146     if(!mpView->IsMoveAllowed() || !mpView->IsResizeAllowed())
147     {
148         // #i77187# if object is move and/or size protected, do not allow point editing at all
149         rSet.DisableItem(SID_BEZIER_MOVE);
150         rSet.DisableItem(SID_BEZIER_INSERT);
151 
152         rSet.DisableItem(SID_BEZIER_DELETE);
153         rSet.DisableItem(SID_BEZIER_CUTLINE);
154         rSet.DisableItem(SID_BEZIER_CONVERT);
155 
156         rSet.DisableItem(SID_BEZIER_EDGE);
157         rSet.DisableItem(SID_BEZIER_SMOOTH);
158         rSet.DisableItem(SID_BEZIER_SYMMTR);
159 
160         rSet.DisableItem(SID_BEZIER_CLOSE);
161 
162         rSet.DisableItem(SID_BEZIER_ELIMINATE_POINTS);
163     }
164     else
165     {
166         IPolyPolygonEditorController* pIPPEC = 0;
167         if( mpView->GetMarkedObjectList().GetMarkCount() )
168             pIPPEC = mpView;
169         else
170             pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );
171 
172         if ( !pIPPEC || !pIPPEC->IsRipUpAtMarkedPointsPossible())
173         {
174             rSet.DisableItem(SID_BEZIER_CUTLINE);
175         }
176         if (!pIPPEC || !pIPPEC->IsDeleteMarkedPointsPossible())
177         {
178             rSet.DisableItem(SID_BEZIER_DELETE);
179         }
180         if (!pIPPEC || !pIPPEC->IsSetMarkedSegmentsKindPossible())
181         {
182             rSet.DisableItem(SID_BEZIER_CONVERT);
183         }
184         else
185         {
186             SdrPathSegmentKind eSegm = pIPPEC->GetMarkedSegmentsKind();
187             switch (eSegm)
188             {
189                 case SDRPATHSEGMENT_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
190                 case SDRPATHSEGMENT_LINE    : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_False)); break; // Button reingedrueckt = Kurve
191                 case SDRPATHSEGMENT_CURVE   : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_True));  break;
192                 default: break;
193             }
194         }
195         if (!pIPPEC || !pIPPEC->IsSetMarkedPointsSmoothPossible())
196         {
197             rSet.DisableItem(SID_BEZIER_EDGE);
198             rSet.DisableItem(SID_BEZIER_SMOOTH);
199             rSet.DisableItem(SID_BEZIER_SYMMTR);
200         }
201         else
202         {
203             SdrPathSmoothKind eSmooth = pIPPEC->GetMarkedPointsSmooth();
204             switch (eSmooth)
205             {
206                 case SDRPATHSMOOTH_DONTCARE  : break;
207                 case SDRPATHSMOOTH_ANGULAR   : rSet.Put(SfxBoolItem(SID_BEZIER_EDGE,  sal_True)); break;
208                 case SDRPATHSMOOTH_ASYMMETRIC: rSet.Put(SfxBoolItem(SID_BEZIER_SMOOTH,sal_True)); break;
209                 case SDRPATHSMOOTH_SYMMETRIC : rSet.Put(SfxBoolItem(SID_BEZIER_SYMMTR,sal_True)); break;
210             }
211         }
212         if (!pIPPEC || !pIPPEC->IsOpenCloseMarkedObjectsPossible())
213         {
214             rSet.DisableItem(SID_BEZIER_CLOSE);
215         }
216         else
217         {
218             SdrObjClosedKind eClose = pIPPEC->GetMarkedObjectsClosedState();
219             switch (eClose)
220             {
221                 case SDROBJCLOSED_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
222                 case SDROBJCLOSED_OPEN    : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_False)); break;
223                 case SDROBJCLOSED_CLOSED  : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_True)); break;
224                 default: break;
225             }
226         }
227 
228         if(pIPPEC == mpView)
229             rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, mpView->IsEliminatePolyPoints()));
230         else
231             rSet.DisableItem( SID_BEZIER_ELIMINATE_POINTS ); // only works for views
232     }
233 }
234 
235 
236 /*************************************************************************
237 |*
238 |* Bearbeitung der SfxRequests
239 |*
240 \************************************************************************/
241 
242 void BezierObjectBar::Execute(SfxRequest& rReq)
243 {
244     sal_uInt16 nSId = rReq.GetSlot();
245 
246     switch (nSId)
247     {
248         case SID_BEZIER_CUTLINE:
249         case SID_BEZIER_CONVERT:
250         case SID_BEZIER_DELETE:
251         case SID_BEZIER_EDGE:
252         case SID_BEZIER_SMOOTH:
253         case SID_BEZIER_SYMMTR:
254         case SID_BEZIER_CLOSE:
255         {
256             const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
257 
258             IPolyPolygonEditorController* pIPPEC = 0;
259             if( rMarkList.GetMarkCount() )
260                 pIPPEC = mpView;
261             else
262                 pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );
263 
264             if( pIPPEC && !mpView->IsAction())
265             {
266                 switch (nSId)
267                 {
268                     case SID_BEZIER_DELETE:
269                         pIPPEC->DeleteMarkedPoints();
270                         break;
271 
272                     case SID_BEZIER_CUTLINE:
273                         pIPPEC->RipUpAtMarkedPoints();
274                         break;
275 
276                     case SID_BEZIER_CONVERT:
277                     {
278                         pIPPEC->SetMarkedSegmentsKind(SDRPATHSEGMENT_TOGGLE);
279                         break;
280                     }
281 
282                     case SID_BEZIER_EDGE:
283                     case SID_BEZIER_SMOOTH:
284                     case SID_BEZIER_SYMMTR:
285                     {
286                         SdrPathSmoothKind eKind;
287 
288                         switch (nSId)
289                         {
290                             default:
291                             case SID_BEZIER_EDGE:   eKind = SDRPATHSMOOTH_ANGULAR; break;
292                             case SID_BEZIER_SMOOTH: eKind = SDRPATHSMOOTH_ASYMMETRIC; break;
293                             case SID_BEZIER_SYMMTR: eKind = SDRPATHSMOOTH_SYMMETRIC; break;
294                         }
295 
296                         pIPPEC->SetMarkedPointsSmooth(eKind);
297                         break;
298                     }
299 
300                     case SID_BEZIER_CLOSE:
301                     {
302                         SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
303                         const bool bUndo = mpView->IsUndoEnabled();
304                         if( bUndo )
305                             mpView->BegUndo(String(SdResId(STR_UNDO_BEZCLOSE)));
306 
307                         mpView->UnmarkAllPoints();
308 
309                         if( bUndo )
310                             mpView->AddUndo(mpView->GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPathObj));
311 
312                         pPathObj->ToggleClosed();
313 
314                         if( bUndo )
315                             mpView->EndUndo();
316                         break;
317                     }
318                 }
319             }
320 
321             if( (pIPPEC == mpView) && !mpView->AreObjectsMarked() )
322                 mpViewSh->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
323 
324             rReq.Ignore();
325         }
326         break;
327 
328         case SID_BEZIER_ELIMINATE_POINTS:
329         {
330             mpView->SetEliminatePolyPoints(!mpView->IsEliminatePolyPoints());
331             Invalidate(SID_BEZIER_ELIMINATE_POINTS);
332             rReq.Done();
333         }
334         break;
335 
336         case SID_BEZIER_MOVE:
337         case SID_BEZIER_INSERT:
338         {
339             FunctionReference xFunc( mpViewSh->GetCurrentFunction() );
340 
341             if(xFunc.is())
342             {
343                 if(xFunc->ISA(FuSelection))
344                 {
345                     static_cast<FuSelection*>(xFunc.get())->SetEditMode(rReq.GetSlot());
346                 }
347                 else if(xFunc->ISA(FuConstructBezierPolygon))
348                 {
349                     static_cast<FuConstructBezierPolygon*>(xFunc.get())->SetEditMode(rReq.GetSlot());
350                 }
351             }
352 
353             rReq.Ignore ();
354         }
355         break;
356 
357         default:
358         break;
359     }
360 
361     Invalidate();
362 }
363 
364 
365 } // end of namespace sd
366