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_SVDDRGMT_HXX
21 #define INCLUDED_SVX_SVDDRGMT_HXX
22
23 #include <svx/svddrgv.hxx>
24 #include <svx/svxdllapi.h>
25 #include <svx/sdr/contact/objectcontact.hxx>
26 #include <memory>
27
28 class SdrDragView;
29 class SdrDragStat;
30
31 class SAL_DLLPUBLIC_RTTI SdrDragEntry
32 {
33 private:
34 bool mbAddToTransparent : 1;
35
36 protected:
37 // access for derived classes
setAddToTransparent(bool bNew)38 void setAddToTransparent(bool bNew) { mbAddToTransparent = bNew; }
39
40 public:
41 SdrDragEntry();
42 virtual ~SdrDragEntry();
43
44 virtual drawinglayer::primitive2d::Primitive2DContainer createPrimitive2DSequenceInCurrentState(SdrDragMethod& rDragMethod) = 0;
45
46 // data read access
getAddToTransparent() const47 bool getAddToTransparent() const { return mbAddToTransparent; }
48 };
49
50
51 class SVX_DLLPUBLIC SdrDragEntryPolyPolygon final : public SdrDragEntry
52 {
53 private:
54 basegfx::B2DPolyPolygon const maOriginalPolyPolygon;
55
56 public:
57 SdrDragEntryPolyPolygon(const basegfx::B2DPolyPolygon& rOriginalPolyPolygon);
58 virtual ~SdrDragEntryPolyPolygon() override;
59
60 virtual drawinglayer::primitive2d::Primitive2DContainer createPrimitive2DSequenceInCurrentState(SdrDragMethod& rDragMethod) override;
61 };
62
63
64 class SdrDragEntrySdrObject final : public SdrDragEntry
65 {
66 private:
67 const SdrObject& maOriginal;
68 SdrObjectUniquePtr mxClone;
69 bool const mbModify;
70
71 public:
72 SdrDragEntrySdrObject(
73 const SdrObject& rOriginal,
74 bool bModify);
75 virtual ~SdrDragEntrySdrObject() override;
76
77 // #i54102# Split createPrimitive2DSequenceInCurrentState in prepareCurrentState and processing,
78 // added accessors to original and clone
79 void prepareCurrentState(SdrDragMethod& rDragMethod);
getOriginal() const80 const SdrObject& getOriginal() const { return maOriginal; }
getClone()81 SdrObject* getClone() { return mxClone.get(); }
82
83 virtual drawinglayer::primitive2d::Primitive2DContainer createPrimitive2DSequenceInCurrentState(SdrDragMethod& rDragMethod) override;
84 };
85
86
87 class SdrDragEntryPrimitive2DSequence final : public SdrDragEntry
88 {
89 private:
90 drawinglayer::primitive2d::Primitive2DContainer const maPrimitive2DSequence;
91
92 public:
93 SdrDragEntryPrimitive2DSequence(
94 const drawinglayer::primitive2d::Primitive2DContainer& rSequence);
95 virtual ~SdrDragEntryPrimitive2DSequence() override;
96
97 virtual drawinglayer::primitive2d::Primitive2DContainer createPrimitive2DSequenceInCurrentState(SdrDragMethod& rDragMethod) override;
98 };
99
100
101 class SdrDragEntryPointGlueDrag final : public SdrDragEntry
102 {
103 private:
104 std::vector< basegfx::B2DPoint > const maPositions;
105 bool const mbIsPointDrag;
106
107 public:
108 SdrDragEntryPointGlueDrag(const std::vector< basegfx::B2DPoint >& rPositions, bool bIsPointDrag);
109 virtual ~SdrDragEntryPointGlueDrag() override;
110
111 virtual drawinglayer::primitive2d::Primitive2DContainer createPrimitive2DSequenceInCurrentState(SdrDragMethod& rDragMethod) override;
112 };
113
114
115 class SVX_DLLPUBLIC SdrDragMethod
116 {
117 private:
118 std::vector< std::unique_ptr<SdrDragEntry> > maSdrDragEntries;
119 sdr::overlay::OverlayObjectList maOverlayObjectList;
120 SdrDragView& mrSdrDragView;
121
122 bool mbMoveOnly : 1;
123 bool mbSolidDraggingActive : 1;
124 bool mbShiftPressed : 1;
125
126 protected:
127 // access for derivated classes to maSdrDragEntries
128 void clearSdrDragEntries();
129 void addSdrDragEntry(std::unique_ptr<SdrDragEntry> pNew);
130 virtual void createSdrDragEntries();
131 virtual void createSdrDragEntryForSdrObject(const SdrObject& rOriginal);
132
133 // Helper to support inserting a new OverlayObject. It will do all
134 // necessary stuff involved with that:
135 // - add GridOffset for non-linear ViewToDevice transformation (calc)
136 // - add to OverlayManager
137 // - add to local OverlayObjectList - ownership change (!)
138 // It is centralized here (and protected) to avoid that new usages/
139 // implementations forget one of these needed steps.
140 void insertNewlyCreatedOverlayObjectForSdrDragMethod(
141 std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject,
142 const sdr::contact::ObjectContact& rObjectContact,
143 sdr::overlay::OverlayManager& rOverlayManager);
144
145 // access for derivated classes to mrSdrDragView
getSdrDragView()146 SdrDragView& getSdrDragView() { return mrSdrDragView; }
getSdrDragView() const147 const SdrDragView& getSdrDragView() const { return mrSdrDragView; }
148
149 // access for derivated classes for bools
setMoveOnly(bool bNew)150 void setMoveOnly(bool bNew) { mbMoveOnly = bNew; }
setSolidDraggingActive(bool bNew)151 void setSolidDraggingActive(bool bNew) { mbSolidDraggingActive = bNew; }
152
153 // internal helpers for creation of standard drag entries
154 void createSdrDragEntries_SolidDrag();
155 void createSdrDragEntries_PolygonDrag();
156 void createSdrDragEntries_PointDrag();
157 void createSdrDragEntries_GlueDrag();
158
159 // old call forwarders to the SdrDragView
160 OUString ImpGetDescriptionStr(const char* pStrCacheID) const;
GetDragHdl() const161 SdrHdl* GetDragHdl() const { return getSdrDragView().mpDragHdl; }
GetDragHdlKind() const162 SdrHdlKind GetDragHdlKind() const { return getSdrDragView().meDragHdl; }
DragStat()163 SdrDragStat& DragStat() { return getSdrDragView().maDragStat; }
DragStat() const164 const SdrDragStat& DragStat() const { return getSdrDragView().maDragStat; }
Ref1() const165 Point& Ref1() const { return mrSdrDragView.maRef1; }
Ref2() const166 Point& Ref2() const { return mrSdrDragView.maRef2; }
GetHdlList() const167 const SdrHdlList& GetHdlList() const { return getSdrDragView().GetHdlList(); }
AddUndo(std::unique_ptr<SdrUndoAction> pUndo)168 void AddUndo(std::unique_ptr<SdrUndoAction> pUndo) { getSdrDragView().AddUndo(std::move(pUndo)); }
IsDragLimit()169 bool IsDragLimit() { return getSdrDragView().mbDragLimit; }
GetDragLimitRect()170 const tools::Rectangle& GetDragLimitRect() { return getSdrDragView().maDragLimit; }
GetMarkedObjectList()171 const SdrMarkList& GetMarkedObjectList() { return getSdrDragView().GetMarkedObjectList(); }
GetSnapPos(const Point & rPt) const172 Point GetSnapPos(const Point& rPt) const { return getSdrDragView().GetSnapPos(rPt,getSdrDragView().mpMarkedPV); }
SnapPos(Point & rPt) const173 SdrSnap SnapPos(Point& rPt) const { return getSdrDragView().SnapPos(rPt,getSdrDragView().mpMarkedPV); }
174 inline const tools::Rectangle& GetMarkedRect() const;
175 SdrPageView* GetDragPV() const;
176 SdrObject* GetDragObj() const;
IsDraggingPoints() const177 bool IsDraggingPoints() const { return getSdrDragView().IsDraggingPoints(); }
IsDraggingGluePoints() const178 bool IsDraggingGluePoints() const { return getSdrDragView().IsDraggingGluePoints(); }
179
180 bool DoAddConnectorOverlays();
181 drawinglayer::primitive2d::Primitive2DContainer AddConnectorOverlays();
182
183 public:
184
185 void resetSdrDragEntries();
186 basegfx::B2DRange getCurrentRange() const;
187
188 // #i58950# also moved constructor implementation to cxx
189 SdrDragMethod(SdrDragView& rNewView);
190
191 // #i58950# virtual destructor was missing
192 virtual ~SdrDragMethod();
193
194 void Show();
195 void Hide();
IsShiftPressed() const196 bool IsShiftPressed() const { return mbShiftPressed; }
SetShiftPressed(bool bShiftPressed)197 void SetShiftPressed(bool bShiftPressed) { mbShiftPressed = bShiftPressed; }
198 virtual OUString GetSdrDragComment() const=0;
199 virtual bool BeginSdrDrag()=0;
200 virtual void MoveSdrDrag(const Point& rPnt)=0;
201 virtual bool EndSdrDrag(bool bCopy)=0;
202 virtual void CancelSdrDrag();
203 virtual PointerStyle GetSdrDragPointer() const=0;
204
205 virtual void CreateOverlayGeometry(
206 sdr::overlay::OverlayManager& rOverlayManager,
207 const sdr::contact::ObjectContact& rObjectContact);
208 void destroyOverlayGeometry();
209
210 virtual basegfx::B2DHomMatrix getCurrentTransformation();
211 virtual void applyCurrentTransformationToSdrObject(SdrObject& rTarget);
212 virtual void applyCurrentTransformationToPolyPolygon(basegfx::B2DPolyPolygon& rTarget);
213
214 // data read access
getMoveOnly() const215 bool getMoveOnly() const { return mbMoveOnly; }
getSolidDraggingActive() const216 bool getSolidDraggingActive() const { return mbSolidDraggingActive; }
217 };
218
GetMarkedRect() const219 inline const tools::Rectangle& SdrDragMethod::GetMarkedRect() const
220 {
221 return getSdrDragView().meDragHdl==SdrHdlKind::Poly ? getSdrDragView().GetMarkedPointsRect() :
222 getSdrDragView().meDragHdl==SdrHdlKind::Glue ? getSdrDragView().GetMarkedGluePointsRect() :
223 getSdrDragView().GetMarkedObjRect();
224 }
225
226
227 // SdrDragMove
228
229 class SVX_DLLPUBLIC SdrDragMove : public SdrDragMethod
230 {
231 private:
232 long nBestXSnap;
233 long nBestYSnap;
234 bool bXSnapped;
235 bool bYSnapped;
236
237 void ImpCheckSnap(const Point& rPt);
238
239 protected:
240 virtual void createSdrDragEntryForSdrObject(const SdrObject& rOriginal) override;
241
242 public:
243 SdrDragMove(SdrDragView& rNewView);
244
245 virtual OUString GetSdrDragComment() const override;
246 virtual bool BeginSdrDrag() override;
247 virtual void MoveSdrDrag(const Point& rPnt) override;
248 virtual bool EndSdrDrag(bool bCopy) override;
249 virtual PointerStyle GetSdrDragPointer() const override;
250
251 virtual basegfx::B2DHomMatrix getCurrentTransformation() override;
252 virtual void applyCurrentTransformationToSdrObject(SdrObject& rTarget) override;
253 };
254
255
256 // SdrDragResize
257
258 class SVX_DLLPUBLIC SdrDragResize : public SdrDragMethod
259 {
260 protected:
261 Fraction aXFact;
262 Fraction aYFact;
263
264 public:
265 SdrDragResize(SdrDragView& rNewView);
266
267 virtual OUString GetSdrDragComment() const override;
268 virtual bool BeginSdrDrag() override;
269 virtual void MoveSdrDrag(const Point& rPnt) override;
270 virtual bool EndSdrDrag(bool bCopy) override;
271 virtual PointerStyle GetSdrDragPointer() const override;
272
273 virtual basegfx::B2DHomMatrix getCurrentTransformation() override;
274 virtual void applyCurrentTransformationToSdrObject(SdrObject& rTarget) override;
275 };
276
277
278 // SdrDragObjOwn
279
280 class SVX_DLLPUBLIC SdrDragObjOwn : public SdrDragMethod
281 {
282 private:
283 // SdrDragObjOwn always works on a clone since it has no transformation
284 // mechanism to modify wireframe visualisations, but uses the
285 // SdrObject::applySpecialDrag() method to change a clone of the
286 // SdrObject
287 SdrObjectUniquePtr mxClone;
288
289 protected:
290 virtual void createSdrDragEntries() override;
291
292 public:
293 SdrDragObjOwn(SdrDragView& rNewView);
294 virtual ~SdrDragObjOwn() override;
295
296 virtual OUString GetSdrDragComment() const override;
297 virtual bool BeginSdrDrag() override;
298 virtual void MoveSdrDrag(const Point& rPnt) override;
299 virtual bool EndSdrDrag(bool bCopy) override;
300 virtual PointerStyle GetSdrDragPointer() const override;
301 };
302
303 #endif // INCLUDED_SVX_SVDDRGMT_HXX
304
305 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
306