LibreOffice Module svx (master)  1
svdsnpv.hxx
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 #ifndef INCLUDED_SVX_SVDSNPV_HXX
21 #define INCLUDED_SVX_SVDSNPV_HXX
22 
23 #include <svx/svdpntv.hxx>
24 #include <svx/svdhlpln.hxx>
25 #include <svx/svxdllapi.h>
26 #include <o3tl/typed_flags_set.hxx>
27 
71 enum class SdrSnap
72 {
73  NOTSNAPPED = 0x00,
74  XSNAPPED = 0x01,
75  YSNAPPED = 0x02
76 };
77 namespace o3tl
78 {
79  template<> struct typed_flags<SdrSnap> : is_typed_flags<SdrSnap, 3> {};
80 }
81 
82 // TODO SdrCrookMode::Stretch is not implemented yet!
83 enum class SdrCrookMode {
84  Rotate,
85  Slant,
86  Stretch
87 };
88 
89 
90 // #114409#-1 Migrate PageOrigin
92 
94 {
95 protected:
96  // #114409#-1 Migrate PageOrigin
98 
99  // #114409#-2 Migrate HelpLine
101 
105 
106  sal_uInt16 nMagnSizPix;
109 
111 
112  bool bSnapEnab : 1;
113  bool bGridSnap : 1;
114  bool bBordSnap : 1;
115  bool bHlplSnap : 1;
116  bool bOFrmSnap : 1;
117  bool bOPntSnap : 1;
118  bool bOConSnap : 1;
119  bool bMoveSnapOnlyTopLeft : 1; // Special for dialogeditor
120  bool bOrtho : 1;
121  bool bBigOrtho : 1;
122  bool bAngleSnapEnab : 1;
123  bool bMoveOnlyDragging : 1; // only move objects while Resize/Rotate/...
124  bool bSlantButShear : 1; // use slant instead of shear
125  bool bCrookNoContortion : 1; // no contorsion while Crook
126  bool bEliminatePolyPoints : 1;
127 
128 protected:
129  // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
130  SdrSnapView(
131  SdrModel& rSdrModel,
132  OutputDevice* pOut);
133 
134  virtual ~SdrSnapView() override;
135 
136 public:
137  virtual bool IsAction() const override;
138  virtual void MovAction(const Point& rPnt) override;
139  virtual void EndAction() override;
140  virtual void BckAction() override;
141  virtual void BrkAction() override; // break actions for derived classes e.g. interrupt dragging.
142  virtual void TakeActionRect(tools::Rectangle& rRect) const override;
143 
144  void SetSnapGridWidth(const Fraction& rX, const Fraction& rY) { aSnapWdtX=rX; aSnapWdtY=rY; }
145  const Fraction& GetSnapGridWidthX() const { return aSnapWdtX; }
146  const Fraction& GetSnapGridWidthY() const { return aSnapWdtY; }
147 
148  void SetSnapMagnetic(const Size& rSiz) { if (rSiz!=aMagnSiz) { aMagnSiz=rSiz; } }
149  void SetSnapMagneticPixel(sal_uInt16 nPix) { nMagnSizPix=nPix; }
150  sal_uInt16 GetSnapMagneticPixel() const { return nMagnSizPix; }
151 
152  // RecalcLogicSnapMagnetic has to be called for every change of OutputDevices and every change of the MapMode!
153  void RecalcLogicSnapMagnetic(const OutputDevice& rOut) { SetSnapMagnetic(rOut.PixelToLogic(Size(nMagnSizPix,nMagnSizPix))); }
154  void SetActualWin(const OutputDevice* pWin) { SdrPaintView::SetActualWin(pWin); if (pWin!=nullptr) RecalcLogicSnapMagnetic(*pWin); }
155 
156  // Coordinates referred to the view!
157  // Returnvalues are SdrSnap::NOTSNAPPED,SdrSnap::XSNAPPED,
158  // SdrSnap::YSNAPPED or SdrSnap::XYSNAPPED
159  SdrSnap SnapPos(Point& rPnt, const SdrPageView* pPV) const;
160  Point GetSnapPos(const Point& rPnt, const SdrPageView* pPV) const;
161  void CheckSnap(const Point& rPt, long& nBestXSnap, long& nBestYSnap, bool& bXSnapped, bool& bYSnapped) const;
162 
163  // All attitudes to snap are persistent.
164  bool IsSnapEnabled() const { return bSnapEnab; }
165  bool IsGridSnap() const { return bGridSnap; } // Snap to grid
166  bool IsBordSnap() const { return bBordSnap; } // Snap to border
167  bool IsHlplSnap() const { return bHlplSnap; } // Snap to auxiliary line
168  bool IsOFrmSnap() const { return bOFrmSnap; } // Snap to LogFram from surrounding drawing objects
169  bool IsOPntSnap() const { return bOPntSnap; } // Snap to distinct points from surrounding drawing objects
170  bool IsOConSnap() const { return bOConSnap; } // Snap to connectors of the drawing objects
171  void SetSnapEnabled(bool bOn) { bSnapEnab=bOn; }
172  void SetGridSnap(bool bOn) { bGridSnap=bOn; }
173  void SetBordSnap(bool bOn) { bBordSnap=bOn; }
174  void SetHlplSnap(bool bOn) { bHlplSnap=bOn; }
175  void SetOFrmSnap(bool bOn) { bOFrmSnap=bOn; }
176  void SetOPntSnap(bool bOn) { bOPntSnap=bOn; }
177  void SetOConSnap(bool bOn) { bOConSnap=bOn; }
178 
179  // Usually every 4 corners of Object-SnapRects are snapped for Move-Dragging.
180  // The following attitudes e.g. if you only want to snap the left corner on the top (e.g. DialogEditor)
181  // persistent, Default=FALSE.
182  void SetMoveSnapOnlyTopLeft(bool bOn) { bMoveSnapOnlyTopLeft=bOn; }
183  bool IsMoveSnapOnlyTopLeft() const { return bMoveSnapOnlyTopLeft; }
184 
185  // #114409#-1 Migrate PageOrigin
186  void BegSetPageOrg(const Point& rPnt);
187  void MovSetPageOrg(const Point& rPnt);
188  void EndSetPageOrg();
189  void BrkSetPageOrg();
190  bool IsSetPageOrg() const { return (nullptr != mpPageOriginOverlay); }
191 
192  // HitTest. If sal_True, in rnHelpLineNum is the number of the auxiliary line and in rpPv
193  // the appended PageView.
194  bool PickHelpLine(const Point& rPnt, short nTol, const OutputDevice& rOut, sal_uInt16& rnHelpLineNum, SdrPageView*& rpPV) const;
195 
196  // Move of an available auxiliary line. Use nHelpLineNum and pPV from PickHelpLine.
197  bool BegDragHelpLine(sal_uInt16 nHelpLineNum, SdrPageView* pPV);
198  // interactive insertion of a new auxiliary line
199  void BegDragHelpLine(const Point& rPnt, SdrHelpLineKind eNewKind);
200  PointerStyle GetDraggedHelpLinePointer() const;
201 
202  // change the type of auxiliary line while dragging
203  // void SetDraggedHelpLineKind(SdrHelpLineKind eNewKind);
204  void MovDragHelpLine(const Point& rPnt);
205  bool EndDragHelpLine();
206  void BrkDragHelpLine();
207  bool IsDragHelpLine() const { return (nullptr != mpHelpLineOverlay); }
208 
209  // SnapAngle is for angles in circle, RotateDragging, ...
210  // The snapping of an angle is beared down, if it is switched off
211  // with SetAngleSnapEnabled(sal_False)
212  // The snapping angles is independent of snapping coordinates
213  // and so independent of the attitude IsSnapEnabled()
214  // Only values should be specified for them is applied:
215  // 36000 modulo nAngle = 0
216  // Implemented for:
217  // - Rotate (Dragging)
218  // - Shear (Dragging)
219  // - circular arc/-sector/-section angle (Create and Dragging)
220  // persistent.
221  void SetAngleSnapEnabled(bool bOn) { bAngleSnapEnab=bOn; }
222  bool IsAngleSnapEnabled() const { return bAngleSnapEnab; }
223  void SetSnapAngle(long nAngle) { nSnapAngle=nAngle; }
224  long GetSnapAngle() const { return nSnapAngle; }
225 
226  // different effects from Ortho (depending on the context):
227  // - Create
228  // - only lines in 45deg grid
229  // - instead of rectangles squares are created
230  // - instead of ellipse circles are created
231  // - Dragging
232  // - general Dragging
233  // - Move only horizontal, vertical or 45deg
234  // - Resize proportional
235  // - Mirror: nothing
236  // - Shear without Resize
237  // - Crook without Resize
238  // - move handles
239  // - mirror axis only 45deg grid
240  // - object-specific Dragging
241  // - rectangle corner radius: nothing
242  // - circle object angle: nothing
243  // - line keeps while Dragging the angle and is only stretched/ contracted
244  // Default value for Ortho is off. persistent.
245  void SetOrtho(bool bOn) { bOrtho=bOn; } // incomplete
246  bool IsOrtho() const { return bOrtho; }
247 
248  // BigOrtho is only relevant if Ortho is switched on.
249  // Example: rectangle is created and ortho is switched on (--> square)
250  // and the Mouse was dragged from zero to the coordinates
251  // (80,30). Now there are 2 alternatives to determine the edge length
252  // of the square: 30 and 80.
253  // The standard Ortho-Function took 30 (every time the smaller length)
254  // If BigOrtho is switched on, you get a square with edge length of 80.
255  // The same also applies to Resize.
256  // Default value for BigOrtho is on. persistent.
257  void SetBigOrtho(bool bOn) { bBigOrtho=bOn; }
258  bool IsBigOrtho() const { return bBigOrtho; }
259 
260  // If MoveOnlyDragging=sal_True only the center of the marked objects is
261  // transformed when Resize/Rotate/Shear/Mirror/Crook is executed.
262  // Size, form and rotation angle of the objects are conserved only their positions
263  // are changed. persistent. Default=FALSE. (ni)
264  void SetMoveOnlyDragging(bool bOn) { bMoveOnlyDragging=bOn; }
265  bool IsMoveOnlyDragging() const { return bMoveOnlyDragging; }
266 
267  // Use Slant instead of Shear. persistent. Default=FALSE.
268  void SetSlantButShear(bool bOn) { bSlantButShear=bOn; }
269  bool IsSlantButShear() const { return bSlantButShear; }
270 
271  // Don't contort objecte while Crook. persistent. Default=FALSE. (ni)
272  void SetCrookNoContortion(bool bOn) { bCrookNoContortion=bOn; }
273  bool IsCrookNoContortion() const { return bCrookNoContortion; }
274 
275  // Crook-Mode. persistent. Default=SdrCrookMode::Rotate. (ni)
276  void SetCrookMode(SdrCrookMode eMode) { eCrookMode=eMode; }
277  SdrCrookMode GetCrookMode() const { return eCrookMode; }
278 
279  // Special for IBM: While Dragging of a traverse station, it is deleted
280  // if its adjacent lines are almost a solid line.
281  void SetEliminatePolyPoints(bool bOn) { bEliminatePolyPoints=bOn; }
282  bool IsEliminatePolyPoints() const { return bEliminatePolyPoints; }
283  void SetEliminatePolyPointLimitAngle(long nAngle) { nEliminatePolyPointLimitAngle=nAngle; }
284  long GetEliminatePolyPointLimitAngle() const { return nEliminatePolyPointLimitAngle; }
285 };
286 
287 #endif // INCLUDED_SVX_SVDSNPV_HXX
288 
289 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
long nSnapAngle
Definition: svdsnpv.hxx:107
bool IsEliminatePolyPoints() const
Definition: svdsnpv.hxx:282
void SetCrookMode(SdrCrookMode eMode)
Definition: svdsnpv.hxx:276
void SetOConSnap(bool bOn)
Definition: svdsnpv.hxx:177
Fraction aSnapWdtY
Definition: svdsnpv.hxx:104
virtual bool IsAction() const
Definition: svdpntv.cxx:287
void SetMoveOnlyDragging(bool bOn)
Definition: svdsnpv.hxx:264
bool IsHlplSnap() const
Definition: svdsnpv.hxx:167
bool IsOConSnap() const
Definition: svdsnpv.hxx:170
void SetEliminatePolyPointLimitAngle(long nAngle)
Definition: svdsnpv.hxx:283
void SetSnapGridWidth(const Fraction &rX, const Fraction &rY)
Definition: svdsnpv.hxx:144
void SetSnapMagnetic(const Size &rSiz)
Definition: svdsnpv.hxx:148
#define SVX_DLLPUBLIC
Definition: svxdllapi.h:28
long GetEliminatePolyPointLimitAngle() const
Definition: svdsnpv.hxx:284
long nEliminatePolyPointLimitAngle
Definition: svdsnpv.hxx:108
void SetGridSnap(bool bOn)
Definition: svdsnpv.hxx:172
SdrCrookMode
Definition: svdsnpv.hxx:83
bool IsOrtho() const
Definition: svdsnpv.hxx:246
Size aMagnSiz
Definition: svdsnpv.hxx:102
bool IsDragHelpLine() const
Definition: svdsnpv.hxx:207
SdrCrookMode GetCrookMode() const
Definition: svdsnpv.hxx:277
const Fraction & GetSnapGridWidthX() const
Definition: svdsnpv.hxx:145
const Fraction & GetSnapGridWidthY() const
Definition: svdsnpv.hxx:146
sal_uInt16 nMagnSizPix
Definition: svdsnpv.hxx:106
void SetSnapEnabled(bool bOn)
Definition: svdsnpv.hxx:171
bool IsSlantButShear() const
Definition: svdsnpv.hxx:269
void SetEliminatePolyPoints(bool bOn)
Definition: svdsnpv.hxx:281
virtual void EndAction()
Definition: svdpntv.cxx:296
void SetOFrmSnap(bool bOn)
Definition: svdsnpv.hxx:175
Fraction aSnapWdtX
Definition: svdsnpv.hxx:103
bool IsCrookNoContortion() const
Definition: svdsnpv.hxx:273
void SetSlantButShear(bool bOn)
Definition: svdsnpv.hxx:268
class ImplHelpLineOverlay * mpHelpLineOverlay
Definition: svdsnpv.hxx:100
void RecalcLogicSnapMagnetic(const OutputDevice &rOut)
Definition: svdsnpv.hxx:153
void SetHlplSnap(bool bOn)
Definition: svdsnpv.hxx:174
SdrSnap
Definition:
Definition: svdsnpv.hxx:71
bool IsSnapEnabled() const
Definition: svdsnpv.hxx:164
SdrCrookMode eCrookMode
Definition: svdsnpv.hxx:110
bool IsOPntSnap() const
Definition: svdsnpv.hxx:169
bool IsAngleSnapEnabled() const
Definition: svdsnpv.hxx:222
class ImplPageOriginOverlay * mpPageOriginOverlay
Definition: svdsnpv.hxx:97
long GetSnapAngle() const
Definition: svdsnpv.hxx:224
void SetOPntSnap(bool bOn)
Definition: svdsnpv.hxx:176
void SetActualWin(const OutputDevice *pWin)
Definition: svdsnpv.hxx:154
void SetBordSnap(bool bOn)
Definition: svdsnpv.hxx:173
Point PixelToLogic(const Point &rDevicePt) const
void SetSnapMagneticPixel(sal_uInt16 nPix)
Definition: svdsnpv.hxx:149
void SetAngleSnapEnabled(bool bOn)
Definition: svdsnpv.hxx:221
SdrHelpLineKind
Definition: svdhlpln.hxx:34
bool IsOFrmSnap() const
Definition: svdsnpv.hxx:168
sal_uInt16 GetSnapMagneticPixel() const
Definition: svdsnpv.hxx:150
void SetBigOrtho(bool bOn)
Definition: svdsnpv.hxx:257
void SetOrtho(bool bOn)
Definition: svdsnpv.hxx:245
void SetMoveSnapOnlyTopLeft(bool bOn)
Definition: svdsnpv.hxx:182
bool IsSetPageOrg() const
Definition: svdsnpv.hxx:190
bool IsGridSnap() const
Definition: svdsnpv.hxx:165
bool IsBordSnap() const
Definition: svdsnpv.hxx:166
virtual void MovAction(const Point &rPnt)
Definition: svdpntv.cxx:292
PointerStyle
virtual void BrkAction()
Definition: svdpntv.cxx:304
bool IsMoveSnapOnlyTopLeft() const
Definition: svdsnpv.hxx:183
void SetActualWin(const OutputDevice *pWin)
Definition: svdpntv.cxx:355
void SetSnapAngle(long nAngle)
Definition: svdsnpv.hxx:223
bool IsBigOrtho() const
Definition: svdsnpv.hxx:258
virtual void BckAction()
Definition: svdpntv.cxx:300
bool IsMoveOnlyDragging() const
Definition: svdsnpv.hxx:265
virtual void TakeActionRect(tools::Rectangle &rRect) const
Definition: svdpntv.cxx:308
void SetCrookNoContortion(bool bOn)
Definition: svdsnpv.hxx:272