xref: /trunk/main/sw/source/ui/shells/beziersh.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "cmdid.h"
29cdf0e10cSrcweir #include <svx/svdview.hxx>
30cdf0e10cSrcweir #include <svl/srchitem.hxx>
31cdf0e10cSrcweir #include <svl/eitem.hxx>
32cdf0e10cSrcweir #include <svl/whiter.hxx>
33cdf0e10cSrcweir #include <svx/svdopath.hxx>
34*f120fe41SAndre Fischer #include <sfx2/sidebar/EnumContext.hxx>
35cdf0e10cSrcweir #include <sfx2/request.hxx>
36cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
37cdf0e10cSrcweir #include <sfx2/objface.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include "wrtsh.hxx"
40cdf0e10cSrcweir #include "view.hxx"
41cdf0e10cSrcweir #include "edtwin.hxx"
42cdf0e10cSrcweir #include "helpid.h"
43cdf0e10cSrcweir #include "globals.hrc"
44cdf0e10cSrcweir #include "drawbase.hxx"
45cdf0e10cSrcweir #include "beziersh.hxx"
46cdf0e10cSrcweir #include "popup.hrc"
47cdf0e10cSrcweir #include "shells.hrc"
48cdf0e10cSrcweir #define SwBezierShell
49cdf0e10cSrcweir #include <sfx2/msg.hxx>
50cdf0e10cSrcweir #include "swslots.hxx"
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #include <unomid.h>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
SFX_IMPL_INTERFACE(SwBezierShell,SwBaseShell,SW_RES (STR_SHELLNAME_BEZIER))55cdf0e10cSrcweir SFX_IMPL_INTERFACE(SwBezierShell, SwBaseShell, SW_RES(STR_SHELLNAME_BEZIER))
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAW_POPUPMENU));
58cdf0e10cSrcweir     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_BEZIER_TOOLBOX));
59cdf0e10cSrcweir }
60cdf0e10cSrcweir 
TYPEINIT1(SwBezierShell,SwBaseShell)61cdf0e10cSrcweir TYPEINIT1(SwBezierShell,SwBaseShell)
62cdf0e10cSrcweir 
63cdf0e10cSrcweir /*--------------------------------------------------------------------
64cdf0e10cSrcweir     Beschreibung:
65cdf0e10cSrcweir  --------------------------------------------------------------------*/
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
68cdf0e10cSrcweir SwBezierShell::SwBezierShell(SwView &_rView):
69cdf0e10cSrcweir     SwBaseShell( _rView )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir     SetName(C2S("Bezier"));
72cdf0e10cSrcweir     SetHelpId(SW_BEZIERSHELL);
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     SwWrtShell *pSh = &GetShell();
75cdf0e10cSrcweir     SdrView*    pSdrView = pSh->GetDrawView();
76cdf0e10cSrcweir     pSdrView->SetEliminatePolyPointLimitAngle(1500L);
77*f120fe41SAndre Fischer 
78*f120fe41SAndre Fischer     SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Draw));
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir /*--------------------------------------------------------------------
82cdf0e10cSrcweir     Beschreibung:
83cdf0e10cSrcweir  --------------------------------------------------------------------*/
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 
Execute(SfxRequest & rReq)86cdf0e10cSrcweir void SwBezierShell::Execute(SfxRequest &rReq)
87cdf0e10cSrcweir {
88cdf0e10cSrcweir     SwWrtShell *pSh = &GetShell();
89cdf0e10cSrcweir     SdrView*    pSdrView = pSh->GetDrawView();
90cdf0e10cSrcweir     const SfxItemSet *pArgs = rReq.GetArgs();
91cdf0e10cSrcweir     sal_uInt16      nSlotId = rReq.GetSlot();
92cdf0e10cSrcweir     sal_Bool        bChanged = pSdrView->GetModel()->IsChanged();
93cdf0e10cSrcweir     pSdrView->GetModel()->SetChanged(sal_False);
94cdf0e10cSrcweir     const SfxPoolItem* pItem;
95cdf0e10cSrcweir     if(pArgs)
96cdf0e10cSrcweir         pArgs->GetItemState(nSlotId, sal_False, &pItem);
97cdf0e10cSrcweir 
98cdf0e10cSrcweir     switch (nSlotId)
99cdf0e10cSrcweir     {
100cdf0e10cSrcweir         case SID_DELETE:
101cdf0e10cSrcweir         case FN_BACKSPACE:
102cdf0e10cSrcweir             if (pSh->IsObjSelected())
103cdf0e10cSrcweir             {
104cdf0e10cSrcweir                 if (pSdrView->HasMarkedPoints())
105cdf0e10cSrcweir                     pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_DELETE, sal_False);
106cdf0e10cSrcweir                 else
107cdf0e10cSrcweir                 {
108cdf0e10cSrcweir                     pSh->DelSelectedObj();
109cdf0e10cSrcweir                     if (pSh->IsSelFrmMode())
110cdf0e10cSrcweir                     {
111cdf0e10cSrcweir                         pSh->LeaveSelFrmMode();
112cdf0e10cSrcweir                         pSh->NoEdit();
113cdf0e10cSrcweir                     }
114cdf0e10cSrcweir                     GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
115cdf0e10cSrcweir                 }
116cdf0e10cSrcweir             }
117cdf0e10cSrcweir             break;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir         case FN_ESCAPE:
120cdf0e10cSrcweir             if (pSdrView->HasMarkedPoints())
121cdf0e10cSrcweir                 pSdrView->UnmarkAllPoints();
122cdf0e10cSrcweir             else
123cdf0e10cSrcweir             {
124cdf0e10cSrcweir                 if ( pSh->IsDrawCreate() )
125cdf0e10cSrcweir                 {
126cdf0e10cSrcweir                     GetView().GetDrawFuncPtr()->BreakCreate();
127cdf0e10cSrcweir                     GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
128cdf0e10cSrcweir                 }
129cdf0e10cSrcweir                 else if ( pSh->HasSelection() || GetView().IsDrawMode() )
130cdf0e10cSrcweir                 {
131cdf0e10cSrcweir                     GetView().LeaveDrawCreate();
132cdf0e10cSrcweir                     pSh->EnterStdMode();
133cdf0e10cSrcweir                     GetView().AttrChangedNotify(pSh); // ggf Shellwechsel...
134cdf0e10cSrcweir                 }
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir             break;
137cdf0e10cSrcweir 
138cdf0e10cSrcweir         case SID_BEZIER_MOVE:
139cdf0e10cSrcweir         case SID_BEZIER_INSERT:
140cdf0e10cSrcweir             {
141cdf0e10cSrcweir                 GetView().GetEditWin().SetBezierMode(nSlotId);
142cdf0e10cSrcweir                 static sal_uInt16 __READONLY_DATA aInva[] =
143cdf0e10cSrcweir                                 {
144cdf0e10cSrcweir                                     SID_BEZIER_INSERT,
145cdf0e10cSrcweir                                     SID_BEZIER_MOVE,
146cdf0e10cSrcweir                                     0
147cdf0e10cSrcweir                                 };
148cdf0e10cSrcweir                 GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
149cdf0e10cSrcweir             }
150cdf0e10cSrcweir             break;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir         case SID_BEZIER_DELETE:
153cdf0e10cSrcweir         case SID_BEZIER_CUTLINE:
154cdf0e10cSrcweir         case SID_BEZIER_CONVERT:
155cdf0e10cSrcweir         case SID_BEZIER_EDGE:
156cdf0e10cSrcweir         case SID_BEZIER_SMOOTH:
157cdf0e10cSrcweir         case SID_BEZIER_SYMMTR:
158cdf0e10cSrcweir         case SID_BEZIER_CLOSE:
159cdf0e10cSrcweir         case SID_BEZIER_ELIMINATE_POINTS:
160cdf0e10cSrcweir         {
161cdf0e10cSrcweir             const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
162cdf0e10cSrcweir 
163cdf0e10cSrcweir             if (rMarkList.GetMark(0) && !pSdrView->IsAction())
164cdf0e10cSrcweir             {
165cdf0e10cSrcweir                 switch (nSlotId)
166cdf0e10cSrcweir                 {
167cdf0e10cSrcweir                     case SID_BEZIER_DELETE:
168cdf0e10cSrcweir                         pSdrView->DeleteMarkedPoints();
169cdf0e10cSrcweir                         break;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir                     case SID_BEZIER_CUTLINE:
172cdf0e10cSrcweir                         {
173cdf0e10cSrcweir                             pSdrView->RipUpAtMarkedPoints();
174cdf0e10cSrcweir                             pSh->CheckUnboundObjects();
175cdf0e10cSrcweir                         }
176cdf0e10cSrcweir                         break;
177cdf0e10cSrcweir 
178cdf0e10cSrcweir                     case SID_BEZIER_CONVERT:
179cdf0e10cSrcweir                     {
180cdf0e10cSrcweir                         pSdrView->SetMarkedSegmentsKind(SDRPATHSEGMENT_TOGGLE);
181cdf0e10cSrcweir                         break;
182cdf0e10cSrcweir                     }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir                     case SID_BEZIER_EDGE:
185cdf0e10cSrcweir                     case SID_BEZIER_SMOOTH:
186cdf0e10cSrcweir                     case SID_BEZIER_SYMMTR:
187cdf0e10cSrcweir                     {
188cdf0e10cSrcweir                         SdrPathSmoothKind eKind = SDRPATHSMOOTH_ASYMMETRIC;
189cdf0e10cSrcweir 
190cdf0e10cSrcweir                         switch (nSlotId)
191cdf0e10cSrcweir                         {
192cdf0e10cSrcweir                             case SID_BEZIER_EDGE:   eKind = SDRPATHSMOOTH_ANGULAR; break;
193cdf0e10cSrcweir                             case SID_BEZIER_SMOOTH: eKind = SDRPATHSMOOTH_ASYMMETRIC; break;
194cdf0e10cSrcweir                             case SID_BEZIER_SYMMTR: eKind = SDRPATHSMOOTH_SYMMETRIC; break;
195cdf0e10cSrcweir                         }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir                         SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
198cdf0e10cSrcweir                         if (eKind != eSmooth)
199cdf0e10cSrcweir                         {
200cdf0e10cSrcweir                             pSdrView->SetMarkedPointsSmooth(eKind);
201cdf0e10cSrcweir 
202cdf0e10cSrcweir                             static sal_uInt16 __READONLY_DATA aInva[] =
203cdf0e10cSrcweir                                             {
204cdf0e10cSrcweir                                                 SID_BEZIER_SMOOTH,
205cdf0e10cSrcweir                                                 SID_BEZIER_EDGE,
206cdf0e10cSrcweir                                                 SID_BEZIER_SYMMTR,
207cdf0e10cSrcweir                                                 0
208cdf0e10cSrcweir                                             };
209cdf0e10cSrcweir                             GetView().GetViewFrame()->GetBindings().Invalidate(aInva);
210cdf0e10cSrcweir                         }
211cdf0e10cSrcweir                         break;
212cdf0e10cSrcweir                     }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir                     case SID_BEZIER_CLOSE:
215cdf0e10cSrcweir                     {
216cdf0e10cSrcweir                         SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
217cdf0e10cSrcweir                         pSdrView->UnmarkAllPoints();
218cdf0e10cSrcweir                         // Size aDist(GetView().GetEditWin().PixelToLogic(Size(8,8)));
219cdf0e10cSrcweir                         pPathObj->ToggleClosed(); // aDist.Width());
220cdf0e10cSrcweir                         break;
221cdf0e10cSrcweir                     }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir                     case SID_BEZIER_ELIMINATE_POINTS:
224cdf0e10cSrcweir                         pSdrView->SetEliminatePolyPoints(!pSdrView->IsEliminatePolyPoints());
225cdf0e10cSrcweir                         break;
226cdf0e10cSrcweir                 }
227cdf0e10cSrcweir             }
228cdf0e10cSrcweir         }
229cdf0e10cSrcweir         break;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         default:
232cdf0e10cSrcweir             break;
233cdf0e10cSrcweir     }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir     if (pSdrView->GetModel()->IsChanged())
236cdf0e10cSrcweir         GetShell().SetModified();
237cdf0e10cSrcweir     else if (bChanged)
238cdf0e10cSrcweir         pSdrView->GetModel()->SetChanged(sal_True);
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir /*--------------------------------------------------------------------
242cdf0e10cSrcweir     Beschreibung:
243cdf0e10cSrcweir  --------------------------------------------------------------------*/
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 
GetState(SfxItemSet & rSet)246cdf0e10cSrcweir void SwBezierShell::GetState(SfxItemSet &rSet)
247cdf0e10cSrcweir {
248cdf0e10cSrcweir     SdrView* pSdrView = GetShell().GetDrawView();
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     SfxWhichIter aIter( rSet );
251cdf0e10cSrcweir     sal_uInt16 nWhich = aIter.FirstWhich();
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     while( nWhich )
254cdf0e10cSrcweir     {
255cdf0e10cSrcweir         switch( nWhich )
256cdf0e10cSrcweir         {
257cdf0e10cSrcweir             case SID_BEZIER_MOVE:
258cdf0e10cSrcweir             case SID_BEZIER_INSERT:
259cdf0e10cSrcweir             {
260cdf0e10cSrcweir                 sal_uInt16 nEditMode = GetView().GetEditWin().GetBezierMode();
261cdf0e10cSrcweir 
262cdf0e10cSrcweir                 rSet.Put(SfxBoolItem(nWhich, nEditMode == nWhich));
263cdf0e10cSrcweir             }
264cdf0e10cSrcweir             break;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir             case SID_BEZIER_CUTLINE:
267cdf0e10cSrcweir                 if (!pSdrView->IsRipUpAtMarkedPointsPossible())
268cdf0e10cSrcweir                 {
269cdf0e10cSrcweir                     rSet.DisableItem(SID_BEZIER_CUTLINE);
270cdf0e10cSrcweir                 }
271cdf0e10cSrcweir                 break;
272cdf0e10cSrcweir 
273cdf0e10cSrcweir             case SID_BEZIER_DELETE:
274cdf0e10cSrcweir                 if (!pSdrView->IsDeleteMarkedPointsPossible())
275cdf0e10cSrcweir                 {
276cdf0e10cSrcweir                     rSet.DisableItem(SID_BEZIER_DELETE);
277cdf0e10cSrcweir                 }
278cdf0e10cSrcweir                 break;
279cdf0e10cSrcweir 
280cdf0e10cSrcweir             case SID_BEZIER_CONVERT:
281cdf0e10cSrcweir                 if (!pSdrView->IsSetMarkedSegmentsKindPossible())
282cdf0e10cSrcweir                 {
283cdf0e10cSrcweir                     rSet.DisableItem(SID_BEZIER_CONVERT);
284cdf0e10cSrcweir                 }
285cdf0e10cSrcweir                 else
286cdf0e10cSrcweir                 {
287cdf0e10cSrcweir                     SdrPathSegmentKind eSegm = pSdrView->GetMarkedSegmentsKind();
288cdf0e10cSrcweir                     switch (eSegm)
289cdf0e10cSrcweir                     {
290cdf0e10cSrcweir                         case SDRPATHSEGMENT_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
291cdf0e10cSrcweir                         case SDRPATHSEGMENT_LINE    : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_False)); break; // Button reingedrueckt = Kurve
292cdf0e10cSrcweir                         case SDRPATHSEGMENT_CURVE   : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_True));  break;
293cdf0e10cSrcweir                         default:; //prevent warning
294cdf0e10cSrcweir                     }
295cdf0e10cSrcweir                 }
296cdf0e10cSrcweir                 break;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir             case SID_BEZIER_EDGE:
299cdf0e10cSrcweir             case SID_BEZIER_SMOOTH:
300cdf0e10cSrcweir             case SID_BEZIER_SYMMTR:
301cdf0e10cSrcweir                 if (!pSdrView->IsSetMarkedPointsSmoothPossible())
302cdf0e10cSrcweir                     rSet.DisableItem(nWhich);
303cdf0e10cSrcweir                 else
304cdf0e10cSrcweir                 {
305cdf0e10cSrcweir                     SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
306cdf0e10cSrcweir                     sal_Bool bEnable = sal_False;
307cdf0e10cSrcweir                     switch (eSmooth)
308cdf0e10cSrcweir                     {
309cdf0e10cSrcweir                         case SDRPATHSMOOTH_DONTCARE  :
310cdf0e10cSrcweir                             break;
311cdf0e10cSrcweir                         case SDRPATHSMOOTH_ANGULAR   :
312cdf0e10cSrcweir                             bEnable = nWhich == SID_BEZIER_EDGE;
313cdf0e10cSrcweir                             break;
314cdf0e10cSrcweir                         case SDRPATHSMOOTH_ASYMMETRIC:
315cdf0e10cSrcweir                             bEnable = nWhich == SID_BEZIER_SMOOTH;
316cdf0e10cSrcweir                             break;
317cdf0e10cSrcweir                         case SDRPATHSMOOTH_SYMMETRIC :
318cdf0e10cSrcweir                             bEnable = nWhich == SID_BEZIER_SYMMTR;
319cdf0e10cSrcweir                             break;
320cdf0e10cSrcweir                     }
321cdf0e10cSrcweir                     rSet.Put(SfxBoolItem(nWhich, bEnable));
322cdf0e10cSrcweir                 }
323cdf0e10cSrcweir                 break;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir             case SID_BEZIER_CLOSE:
326cdf0e10cSrcweir                 if (!pSdrView->IsOpenCloseMarkedObjectsPossible())
327cdf0e10cSrcweir                 {
328cdf0e10cSrcweir                     rSet.DisableItem(SID_BEZIER_CLOSE);
329cdf0e10cSrcweir                 }
330cdf0e10cSrcweir                 else
331cdf0e10cSrcweir                 {
332cdf0e10cSrcweir                     SdrObjClosedKind eClose = pSdrView->GetMarkedObjectsClosedState();
333cdf0e10cSrcweir                     switch (eClose)
334cdf0e10cSrcweir                     {
335cdf0e10cSrcweir                         case SDROBJCLOSED_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
336cdf0e10cSrcweir                         case SDROBJCLOSED_OPEN    : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_False)); break;
337cdf0e10cSrcweir                         case SDROBJCLOSED_CLOSED  : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_True)); break;
338cdf0e10cSrcweir                         default:; //prevent warning
339cdf0e10cSrcweir                     }
340cdf0e10cSrcweir                 }
341cdf0e10cSrcweir                 break;
342cdf0e10cSrcweir 
343cdf0e10cSrcweir             case SID_BEZIER_ELIMINATE_POINTS:
344cdf0e10cSrcweir                 rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, pSdrView->IsEliminatePolyPoints()));
345cdf0e10cSrcweir                 break;
346cdf0e10cSrcweir 
347cdf0e10cSrcweir             default:
348cdf0e10cSrcweir                 break;
349cdf0e10cSrcweir         }
350cdf0e10cSrcweir         nWhich = aIter.NextWhich();
351cdf0e10cSrcweir     }
352cdf0e10cSrcweir }
353