LibreOffice Module sw (master)  1
beziersh.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <cmdid.h>
21 #include <svx/svdview.hxx>
22 #include <svl/eitem.hxx>
23 #include <svl/whiter.hxx>
24 #include <svx/svdopath.hxx>
25 #include <vcl/EnumContext.hxx>
26 #include <sfx2/request.hxx>
27 #include <sfx2/dispatch.hxx>
28 #include <sfx2/objface.hxx>
29 #include <sfx2/viewfrm.hxx>
30 
31 #include <wrtsh.hxx>
32 #include <view.hxx>
33 #include <edtwin.hxx>
34 #include <drawbase.hxx>
35 #include <beziersh.hxx>
36 #define ShellClass_SwBezierShell
37 #include <sfx2/msg.hxx>
38 #include <swslots.hxx>
39 
41 
42 void SwBezierShell::InitInterface_Impl()
43 {
44  GetStaticInterface()->RegisterPopupMenu("draw");
45 
46  GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT, SfxVisibilityFlags::Invisible, ToolbarId::Bezier_Toolbox_Sw);
47 }
48 
49 
51  SwBaseShell( _rView )
52 {
53  SetName("Bezier");
54 
55  SwWrtShell *pSh = &GetShell();
56  SdrView* pSdrView = pSh->GetDrawView();
57  pSdrView->SetEliminatePolyPointLimitAngle(1500);
58 
60 }
61 
63 {
64  SwWrtShell *pSh = &GetShell();
65  SdrView* pSdrView = pSh->GetDrawView();
66  const SfxItemSet *pArgs = rReq.GetArgs();
67  sal_uInt16 nSlotId = rReq.GetSlot();
68  bool bChanged = pSdrView->GetModel()->IsChanged();
69  pSdrView->GetModel()->SetChanged(false);
70  const SfxPoolItem* pItem;
71  if(pArgs)
72  pArgs->GetItemState(nSlotId, false, &pItem);
73 
74  switch (nSlotId)
75  {
76  case SID_DELETE:
77  case FN_BACKSPACE:
78  if (pSh->IsObjSelected())
79  {
80  if (pSdrView->HasMarkedPoints())
81  pSh->GetView().GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_DELETE);
82  else
83  {
84  pSh->DelSelectedObj();
85  if (pSh->IsSelFrameMode())
86  {
87  pSh->LeaveSelFrameMode();
88  pSh->NoEdit();
89  }
90  GetView().AttrChangedNotify(nullptr); // Shell change if applicable...
91  }
92  }
93  break;
94 
95  case FN_ESCAPE:
96  if (pSdrView->HasMarkedPoints())
97  pSdrView->UnmarkAllPoints();
98  else
99  {
100  if ( pSh->IsDrawCreate() )
101  {
103  GetView().AttrChangedNotify(nullptr); // Shell change if applicable...
104  }
105  else if ( pSh->HasSelection() || GetView().IsDrawMode() )
106  {
108  pSh->EnterStdMode();
109  GetView().AttrChangedNotify(nullptr); // Shell change if applicable...
110  }
111  }
112  break;
113 
114  case SID_BEZIER_MOVE:
115  case SID_BEZIER_INSERT:
116  {
117  GetView().GetEditWin().SetBezierMode(nSlotId);
118  static sal_uInt16 aInva[] =
119  {
120  SID_BEZIER_INSERT,
121  SID_BEZIER_MOVE,
122  0
123  };
125  }
126  break;
127 
128  case SID_BEZIER_DELETE:
129  case SID_BEZIER_CUTLINE:
130  case SID_BEZIER_CONVERT:
131  case SID_BEZIER_EDGE:
132  case SID_BEZIER_SMOOTH:
133  case SID_BEZIER_SYMMTR:
134  case SID_BEZIER_CLOSE:
135  case SID_BEZIER_ELIMINATE_POINTS:
136  {
137  const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
138 
139  if (rMarkList.GetMark(0) && !pSdrView->IsAction())
140  {
141  switch (nSlotId)
142  {
143  case SID_BEZIER_DELETE:
144  pSdrView->DeleteMarkedPoints();
145  break;
146 
147  case SID_BEZIER_CUTLINE:
148  {
149  pSdrView->RipUpAtMarkedPoints();
150  pSh->CheckUnboundObjects();
151  }
152  break;
153 
154  case SID_BEZIER_CONVERT:
155  {
156  pSdrView->SetMarkedSegmentsKind(SdrPathSegmentKind::Toggle);
157  break;
158  }
159 
160  case SID_BEZIER_EDGE:
161  case SID_BEZIER_SMOOTH:
162  case SID_BEZIER_SYMMTR:
163  {
164  SdrPathSmoothKind eKind = SdrPathSmoothKind::Asymmetric;
165 
166  switch (nSlotId)
167  {
168  case SID_BEZIER_EDGE: eKind = SdrPathSmoothKind::Angular; break;
169  case SID_BEZIER_SMOOTH: eKind = SdrPathSmoothKind::Asymmetric; break;
170  case SID_BEZIER_SYMMTR: eKind = SdrPathSmoothKind::Symmetric; break;
171  }
172 
173  SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
174  if (eKind != eSmooth)
175  {
176  pSdrView->SetMarkedPointsSmooth(eKind);
177 
178  static sal_uInt16 aInva[] =
179  {
180  SID_BEZIER_SMOOTH,
181  SID_BEZIER_EDGE,
182  SID_BEZIER_SYMMTR,
183  0
184  };
186  }
187  break;
188  }
189 
190  case SID_BEZIER_CLOSE:
191  {
192  SdrPathObj* pPathObj = static_cast<SdrPathObj*>( rMarkList.GetMark(0)->GetMarkedSdrObj() );
193  pSdrView->UnmarkAllPoints();
194  // Size aDist(GetView().GetEditWin().PixelToLogic(Size(8,8)));
195  pPathObj->ToggleClosed(); // aDist.Width());
196  break;
197  }
198 
199  case SID_BEZIER_ELIMINATE_POINTS:
200  pSdrView->SetEliminatePolyPoints(!pSdrView->IsEliminatePolyPoints());
201  break;
202  }
203  }
204  }
205  break;
206 
207  default:
208  break;
209  }
210 
211  if (pSdrView->GetModel()->IsChanged())
212  GetShell().SetModified();
213  else if (bChanged)
214  pSdrView->GetModel()->SetChanged();
215 }
216 
218 {
219  SdrView* pSdrView = GetShell().GetDrawView();
220 
221  SfxWhichIter aIter( rSet );
222  sal_uInt16 nWhich = aIter.FirstWhich();
223 
224  while( nWhich )
225  {
226  switch( nWhich )
227  {
228  case SID_BEZIER_MOVE:
229  case SID_BEZIER_INSERT:
230  {
231  sal_uInt16 nEditMode = GetView().GetEditWin().GetBezierMode();
232 
233  rSet.Put(SfxBoolItem(nWhich, nEditMode == nWhich));
234  }
235  break;
236 
237  case SID_BEZIER_CUTLINE:
238  if (!pSdrView->IsRipUpAtMarkedPointsPossible())
239  {
240  rSet.DisableItem(SID_BEZIER_CUTLINE);
241  }
242  break;
243 
244  case SID_BEZIER_DELETE:
245  if (!pSdrView->IsDeleteMarkedPointsPossible())
246  {
247  rSet.DisableItem(SID_BEZIER_DELETE);
248  }
249  break;
250 
251  case SID_BEZIER_CONVERT:
252  if (!pSdrView->IsSetMarkedSegmentsKindPossible())
253  {
254  rSet.DisableItem(SID_BEZIER_CONVERT);
255  }
256  else
257  {
258  SdrPathSegmentKind eSegm = pSdrView->GetMarkedSegmentsKind();
259  switch (eSegm)
260  {
261  case SdrPathSegmentKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
262  case SdrPathSegmentKind::Line : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,false)); break; // Button pressed = curve
263  case SdrPathSegmentKind::Curve : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,true)); break;
264  default:; //prevent warning
265  }
266  }
267  break;
268 
269  case SID_BEZIER_EDGE:
270  case SID_BEZIER_SMOOTH:
271  case SID_BEZIER_SYMMTR:
272  if (!pSdrView->IsSetMarkedPointsSmoothPossible())
273  rSet.DisableItem(nWhich);
274  else
275  {
276  SdrPathSmoothKind eSmooth = pSdrView->GetMarkedPointsSmooth();
277  bool bEnable = false;
278  switch (eSmooth)
279  {
280  case SdrPathSmoothKind::DontCare :
281  break;
282  case SdrPathSmoothKind::Angular :
283  bEnable = nWhich == SID_BEZIER_EDGE;
284  break;
285  case SdrPathSmoothKind::Asymmetric:
286  bEnable = nWhich == SID_BEZIER_SMOOTH;
287  break;
288  case SdrPathSmoothKind::Symmetric :
289  bEnable = nWhich == SID_BEZIER_SYMMTR;
290  break;
291  }
292  rSet.Put(SfxBoolItem(nWhich, bEnable));
293  }
294  break;
295 
296  case SID_BEZIER_CLOSE:
297  if (!pSdrView->IsOpenCloseMarkedObjectsPossible())
298  {
299  rSet.DisableItem(SID_BEZIER_CLOSE);
300  }
301  else
302  {
303  SdrObjClosedKind eClose = pSdrView->GetMarkedObjectsClosedState();
304  switch (eClose)
305  {
306  case SdrObjClosedKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
307  case SdrObjClosedKind::Open : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,false)); break;
308  case SdrObjClosedKind::Closed : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,true)); break;
309  default:; //prevent warning
310  }
311  }
312  break;
313 
314  case SID_BEZIER_ELIMINATE_POINTS:
315  rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, pSdrView->IsEliminatePolyPoints()));
316  break;
317 
318  default:
319  break;
320  }
321  nWhich = aIter.NextWhich();
322  }
323 }
324 
325 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SfxViewFrame * GetViewFrame() const
bool IsEliminatePolyPoints() const
SwView & GetView()
Definition: basesh.hxx:57
bool IsDrawMode() const
Definition: view.hxx:526
#define SFX_IMPL_INTERFACE(Class, SuperClass)
SdrView * GetDrawView()
Definition: vnew.cxx:375
void DeleteMarkedPoints() override
SfxDispatcher * GetDispatcher()
SwWrtShell & GetShell()
Definition: basesh.cxx:2673
void CheckUnboundObjects()
Temporary work around for bug.
Definition: feshview.cxx:2722
void SetEliminatePolyPointLimitAngle(long nAngle)
SdrPathSegmentKind GetMarkedSegmentsKind() const override
void RipUpAtMarkedPoints() override
void InvalidateItem(sal_uInt16 nWhich)
sal_uInt16 FirstWhich()
void EnterStdMode()
Definition: select.cxx:550
SwEditWin & GetEditWin()
Definition: view.hxx:403
SdrMark * GetMark(size_t nNum) const
void SetMarkedSegmentsKind(SdrPathSegmentKind eKind) override
void SetModified()
Definition: edws.cxx:69
const SfxItemSet * GetArgs() const
void Invalidate(sal_uInt16 nId)
void GetState(SfxItemSet &)
Definition: beziersh.cxx:217
sal_uInt16 GetBezierMode() const
Definition: edtwin.hxx:216
void NoEdit(bool bHideCursor=true)
Definition: wrtsh1.cxx:143
sal_uInt16 NextWhich()
Used by the UI to modify the document model.
Definition: wrtsh.hxx:90
SdrPathSmoothKind GetMarkedPointsSmooth() const override
void BreakCreate()
Definition: drawbase.cxx:464
const SwView & GetView() const
Definition: wrtsh.hxx:428
virtual void SetChanged(bool bFlg=true)
bool IsDeleteMarkedPointsPossible() const override
SdrObjClosedKind GetMarkedObjectsClosedState() const override
void SetEliminatePolyPoints(bool bOn)
virtual bool HasMarkedPoints() const
SdrObject * GetMarkedSdrObj() const
bool HasSelection() const
Definition: wrtsh.hxx:141
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
SdrObjClosedKind
SfxBindings & GetBindings()
const SdrMarkList & GetMarkedObjectList() const
void SetMarkedPointsSmooth(SdrPathSmoothKind eKind) override
void SetName(const OUString &rName)
void LeaveDrawCreate()
Definition: view.hxx:525
SwDrawBase * GetDrawFuncPtr() const
Definition: view.hxx:513
#define SFX_OBJECTBAR_OBJECT
bool IsChanged() const
virtual bool IsAction() const override
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
sal_uInt16 GetSlot() const
static const OUString & GetContextName(const Context eContext)
bool UnmarkAllPoints()
void DisableItem(sal_uInt16 nWhich)
bool IsOpenCloseMarkedObjectsPossible() const override
bool IsSetMarkedSegmentsKindPossible() const override
bool IsRipUpAtMarkedPointsPossible() const override
SdrPathSmoothKind
void Execute(SfxRequest const &)
Definition: beziersh.cxx:62
#define FN_BACKSPACE
Definition: cmdid.h:651
size_t IsObjSelected() const
Definition: feshview.cxx:1158
void DelSelectedObj()
Definition: feshview.cxx:2289
void LeaveSelFrameMode()
Definition: select.cxx:719
SdrPathSegmentKind
void SetBezierMode(sal_uInt16 eBezMode)
Definition: edtwin.hxx:217
const SfxPoolItem * Execute(sal_uInt16 nSlot, SfxCallMode nCall=SfxCallMode::SLOT, const SfxPoolItem **pArgs=nullptr, sal_uInt16 nModi=0, const SfxPoolItem **pInternalArgs=nullptr)
bool IsSetMarkedPointsSmoothPossible() const override
#define FN_ESCAPE
Definition: cmdid.h:665
bool IsDrawCreate() const
Definition: feshview.cxx:2140
void ToggleClosed()
SdrModel * GetModel() const
void SetContextName(const OUString &rsContextName)
Definition: view.hxx:146
bool IsSelFrameMode() const
Definition: wrtsh.hxx:170
SwBezierShell(SwView &rView)
Definition: beziersh.cxx:50