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