bump product version to 4.1.6.2
[LibreOffice.git] / include / svx / svddrgv.hxx
blob3a5f09cdb6d8b4a400d0d933a1fceee00efbd34c
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef _SVDDRGV_HXX
21 #define _SVDDRGV_HXX
23 #include "svx/svxdllapi.h"
24 #include <svx/svdxcgv.hxx>
26 //************************************************************
27 // Vorausdeklarationen
28 //************************************************************
30 class SdrUndoGeoObj;
32 ////////////////////////////////////////////////////////////////////////////////////////////////////
33 ////////////////////////////////////////////////////////////////////////////////////////////////////
35 // @@@@@ @@@@@ @@@@ @@@@ @@ @@ @@ @@@@@ @@ @@
36 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@
37 // @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @ @@
38 // @@ @@ @@@@@ @@@@@@ @@ @@@ @@@@@ @@ @@@@ @@@@@@@
39 // @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@@@@@
40 // @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@ @@ @@@ @@@
41 // @@@@@ @@ @@ @@ @@ @@@@@ @ @@ @@@@@ @@ @@
43 ////////////////////////////////////////////////////////////////////////////////////////////////////
44 ////////////////////////////////////////////////////////////////////////////////////////////////////
46 class SVX_DLLPUBLIC SdrDragView: public SdrExchangeView
48 friend class SdrPageView;
49 friend class SdrDragMethod;
51 protected:
52 SdrHdl* pDragHdl;
53 SdrDragMethod* mpCurrentSdrDragMethod;
54 SdrUndoGeoObj* pInsPointUndo;
55 Rectangle aDragLimit;
56 OUString aInsPointUndoStr;
57 SdrMarkList aFollowingEdges; // If nodes are dragged, all edges should follow as Xor
58 SdrHdlKind eDragHdl;
60 sal_uIntPtr nDragXorPolyLimit;
61 sal_uIntPtr nDragXorPointLimit;
62 sal_uInt16 nDetailedEdgeDraggingLimit;
64 unsigned bFramDrag : 1; // currently frame dragging
65 unsigned bDragSpecial : 1; // currently Special Obj-dragging
66 unsigned bMarkedHitMovesAlways : 1; // Persistent
67 unsigned bDragLimit : 1; // Limit on SnapRect instead of BoundRect
68 unsigned bDragHdl : 1; // TRUE: RefPt is slid
69 unsigned bDragStripes : 1; // Persistent
70 unsigned bMirrRefDragObj : 1; // Persistent - During the drag, show the mirror axis of the mirrored objects as Xor
71 unsigned mbSolidDragging : 1; // allow solid create/drag of objects
72 unsigned bMouseHideWhileDraggingPoints : 1;
73 unsigned bResizeAtCenter : 1;
74 unsigned bCrookAtCenter : 1;
75 unsigned bDragWithCopy : 1;
76 unsigned bInsGluePoint : 1;
77 unsigned bInsObjPointMode : 1;
78 unsigned bInsGluePointMode : 1;
79 unsigned bNoDragXorPolys : 1;
80 unsigned bAutoVertexCon : 1; // Automatische Konnektorgenerierung an den Scheitelpunkten
81 unsigned bAutoCornerCon : 1; // Automatische Konnektorgenerierung an den Eckpunkten
82 unsigned bRubberEdgeDragging : 1;
83 unsigned bDetailedEdgeDragging : 1;
85 private:
86 SVX_DLLPRIVATE void ImpClearVars();
88 protected:
89 virtual void SetMarkHandles();
90 void ShowDragObj();
91 void HideDragObj();
92 sal_Bool ImpBegInsObjPoint(sal_Bool bIdxZwang, sal_uInt32 nIdx, const Point& rPnt, sal_Bool bNewObj, OutputDevice* pOut);
94 protected:
95 // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
96 SdrDragView(SdrModel* pModel1, OutputDevice* pOut = 0L);
97 virtual ~SdrDragView();
99 public:
100 virtual sal_Bool IsAction() const;
101 virtual void MovAction(const Point& rPnt);
102 virtual void EndAction();
103 virtual void BckAction();
104 virtual void BrkAction();
105 virtual void TakeActionRect(Rectangle& rRect) const;
107 // Spezialimplementation fuer den Writer:
108 // TakeDragObjAnchorPos() liefert die Position an der ein Objekt
109 // beim Draggen einer Einfachselektion ungefaehr landet wenn es
110 // "losgelassen" wird (EndDrag).
111 // In der Regel ist das die linke obere Ecke des zu erwartenden neuen
112 // SnapRects. Ausnahme: CaptionObj. Dort ist es die Position des
113 // "Schwanzendes".
114 // Bei Returncode sal_False konnte ich die Position nicht bestimmen
115 // (z.B. Punktverschiebung, Mehrfachselektion, Schieben der
116 // Spiegelschse, ...)
117 sal_Bool TakeDragObjAnchorPos(Point& rPos, sal_Bool bTopRight = sal_False ) const;
119 // Wird pForcedMeth uebergeben, so wird pHdl, ... nicht ausgewerten, sondern diese
120 // Drag-Methode verwendet. Die Instanz geht dabei ins Eigentum der View ueber und
121 // wird zum Ende des Draggings destruiert.
122 virtual sal_Bool BegDragObj(const Point& rPnt, OutputDevice* pOut=NULL, SdrHdl* pHdl=NULL, short nMinMov=-3, SdrDragMethod* pForcedMeth=NULL);
123 void MovDragObj(const Point& rPnt);
124 sal_Bool EndDragObj(sal_Bool bCopy=sal_False);
125 void BrkDragObj();
126 sal_Bool IsDragObj() const { return mpCurrentSdrDragMethod && !bInsPolyPoint && !bInsGluePoint; }
127 SdrHdl* GetDragHdl() const { return pDragHdl; }
128 SdrDragMethod* GetDragMethod() const { return mpCurrentSdrDragMethod; }
129 sal_Bool IsDraggingPoints() const { return eDragHdl==HDL_POLY; }
130 sal_Bool IsDraggingGluePoints() const { return eDragHdl==HDL_GLUE; }
132 // Wer das beim BegDrag oder mittendrin schon festlegen will.
133 // (Wird bei jedem BegDrag auf sal_False zurueckgesetzt, also nach
134 // BegDrag setzen.)
135 void SetDragWithCopy(sal_Bool bOn) { bDragWithCopy = bOn; }
136 sal_Bool IsDragWithCopy() const { return bDragWithCopy; }
138 void SetInsertGluePoint(sal_Bool bOn) { bInsGluePoint = bOn; }
139 sal_Bool IsInsertGluePoint() const { return bInsGluePoint; }
141 // Interaktives einfuegen eines neuen Punktes. nIdx=0 => vor dem ersten Punkt.
142 bool IsInsObjPointPossible() const;
143 sal_Bool BegInsObjPoint(const Point& rPnt, sal_Bool bNewObj) { return ImpBegInsObjPoint(sal_False, 0L, rPnt, bNewObj, 0L); }
144 void MovInsObjPoint(const Point& rPnt) { MovDragObj(rPnt); }
145 sal_Bool EndInsObjPoint(SdrCreateCmd eCmd);
146 void BrkInsObjPoint() { BrkDragObj(); }
147 sal_Bool IsInsObjPoint() const { return mpCurrentSdrDragMethod && bInsPolyPoint; }
149 // Fuer die App zum Verwalten des Status. GetPreferedPointer() wird
150 // spaeter vielleicht einen passenden Pointer dafuer liefern
151 void SetInsObjPointMode(sal_Bool bOn) { bInsObjPointMode = bOn; }
152 sal_Bool IsInsObjPointMode() const { return bInsObjPointMode; }
154 sal_Bool IsInsGluePointPossible() const;
155 sal_Bool BegInsGluePoint(const Point& rPnt);
156 void MovInsGluePoint(const Point& rPnt) { MovDragObj(rPnt); }
157 sal_Bool EndInsGluePoint() { return EndDragObj(); }
158 void BrkInsGluePoint() { BrkDragObj(); }
159 sal_Bool IsInsGluePoint() const { return mpCurrentSdrDragMethod && bInsGluePoint; }
161 // Fuer die App zum Verwalten des Status. GetPreferedPointer() wird
162 // spaeter vielleicht einen passenden Pointer dafuer liefern
163 void SetInsGluePointMode(sal_Bool bOn) { bInsGluePointMode = bOn; }
164 sal_Bool IsInsGluePointMode() const { return bInsGluePointMode; }
166 // Begrenzungslinien ueber's gesamte Win waehrend des Draggens
167 // Persistent. Default=FALSE.
168 void SetDragStripes(sal_Bool bOn);
169 sal_Bool IsDragStripes() const { return bDragStripes; }
171 // Handles waehrend des Draggens verstecken
172 //HMHvoid SetDragHdlHide(sal_Bool bOn);
173 //HMHBOOL IsDragHdlHide() const { return bNoDragHdl; }
175 // Beim Draggen von Polygonpunkten und Klebepunkten
176 // die Maus verstecken. Default=FALSE
177 void SetMouseHideWhileDraggingPoints(sal_Bool bOn) { bMouseHideWhileDraggingPoints = bOn; }
178 sal_Bool IsMouseHideWhileDraggingPoints() const { return bMouseHideWhileDraggingPoints; }
180 // Beim Draggen werden i.d.R. die Konturen der markierten Objekte
181 // als Xor-Polygone dargestellt. Wird dieses Flag hier gesetzt,
182 // wird (z.B. bei Mehrfachselektion) nur ein Xor-Frame gezeichnet.
183 // Bei objektspeziefischem Dragging (Polygonpunkte,Eckenradius,...
184 // hat diese Einstellung keine Auswirkung.
185 // Auch waerend des Draggens umschaltbar.
186 // Default=Off
187 void SetNoDragXorPolys(sal_Bool bOn);
188 sal_Bool IsNoDragXorPolys() const { return bNoDragXorPolys; }
190 // Uebersteigt die Anzahl der markierten Objekte den hier eingestellten
191 // Wert, wird implizit (temporaer) auf NoDragPolys geschaltet.
192 // PolyPolygone etc werden entsprechend als mehrere Objekte gewertet.
193 // Default=100
194 void SetDragXorPolyLimit(sal_uIntPtr nObjAnz) { nDragXorPolyLimit=nObjAnz; }
195 sal_uIntPtr GetDragXorPolyLimit() const { return nDragXorPolyLimit; }
197 // Wie DragXorPolyLimit, jedoch bezogen auf die Gesamtpunktanzahl
198 // aller Polygone. Default=500.
199 // Auf NoDragPolys wird (temporaer) geschaltet, wenn eins der Limits
200 // ueberstiegen wird.
201 void SetDragXorPointLimit(sal_uIntPtr nPntAnz) { nDragXorPointLimit=nPntAnz; }
202 sal_uIntPtr GetDragXorPointLimit() const { return nDragXorPointLimit; }
204 void SetSolidDragging(bool bOn);
205 bool IsSolidDragging() const;
207 // Dragging/Creating von Verbindern:
208 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
209 // Verbinder an Objektscheitelpunkte ankleben
210 // Default=sal_True=Ja
211 void SetAutoVertexConnectors(sal_Bool bOn) { bAutoVertexCon = bOn; }
212 sal_Bool IsAutoVertexConnectors() const { return bAutoVertexCon; }
214 // Verbinder an Objektecken ankleben
215 // Default=sal_False=Nein
216 void SetAutoCornerConnectors(sal_Bool bOn) { bAutoCornerCon = bOn; }
217 sal_Bool IsAutoCornerConnectors() const { return bAutoCornerCon; }
219 // Dragging von verbundenen Objekten (Nodes):
220 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
221 // DetailedEdgeDraggingLimit: Wie RubberEdgeDraggingLimit, jedoch bezieht
222 // sich dieses Limit auf die detalierte Darstellung, d.h. nicht nur
223 // Gummibaender sondern komplette Neuberechnunen sind beim Draggen sichtbar.
224 // Diese detalierte Darstellung ist eh nur beim MoveDrag moeglich.
225 // Defaultwert ist 10
226 sal_Bool IsDetailedEdgeDragging() const { return bDetailedEdgeDragging; }
228 sal_uInt16 GetDetailedEdgeDraggingLimit() const { return nDetailedEdgeDraggingLimit; }
230 // EdgeDraggingLimit: Sind mehr als nEdgeObjAnz Kanten betroffen, werden
231 // diese beim interaktiven Draggen nicht mit angezeigt.
232 // Gemeint sind hier die "Gummibaender", die weniger Rechenzeit benoetigen
233 // als die kompletten Neuberechnungen beim DetailedEdgeDragging.
234 // Defaultwert ist 100
235 sal_Bool IsRubberEdgeDragging() const { return bRubberEdgeDragging; }
237 // Verbinderhandling also zu deutsch wie folgt (bei Defaulteinstellungen):
238 // - Sind bis max 10 Verbinder betroffen werden diese bei jedem
239 // MouseMove neu berechnet
240 // - Sind zwischen 11 und 100 Verbinder betroffen werden die
241 // Verbindungen beim Draggen als gerade Linien dargestellt.
242 // - Bei mehr als 100 betroffenen Verbindern wird beim Draggen nichts
243 // mehr gezeichnet was auf Verbinder hinweist.
245 // Ist ein spezieller Dragmode eingeschaltet, wie Rotate, Mirror oder Crook,
246 // dann leitet ein Hit auf das markierte Objekt genau dieses Dragging ein.
247 // Setzt man MarkedHitMovesAlways auf sal_True, so leitet ein Hit auf das
248 // markierte Objekt immer ein Moven ein, unabhaengig vom gesetzten DragMode.
249 // Dieses Flag ist persistent und sollte von der App fuer den Anwender
250 // konfigurierbar sein!
251 void SetMarkedHitMovesAlways(sal_Bool bOn) { bMarkedHitMovesAlways = bOn; }
252 sal_Bool IsMarkedHitMovesAlways() const { return bMarkedHitMovesAlways; }
254 // Beim Draggen der Spiegelachse das Spiegelbild der markierten Objekte
255 // als Xor darstellen? Persistent. Noch nicht implementiert. Default TRUE.
256 void SetMirrRefDragObj(sal_Bool bOn) { bMirrRefDragObj = bOn; }
257 sal_Bool IsMirrRefDragObj() const { return bMirrRefDragObj; }
259 sal_Bool IsOrthoDesired() const;
261 // Beim Resize die Mitte als Referenz
262 // Default=FALSE.
263 sal_Bool IsResizeAtCenter() const { return bResizeAtCenter; }
264 void SetResizeAtCenter(sal_Bool bOn) { bResizeAtCenter = bOn; }
266 // Symmetrisches Crook
267 // Default=FALSE.
268 sal_Bool IsCrookAtCenter() const { return bCrookAtCenter; }
269 void SetCrookAtCenter(sal_Bool bOn) { bCrookAtCenter = bOn; }
271 // Begrenzung des Arbeitsbereichs. Die Begrenzung bezieht sich auf die
272 // View, nicht auf die einzelnen PageViews. Von der View wird diese
273 // Begrenzung nur bei Interaktionen wie Dragging und Create ausgewertet.
274 // Bei von der App algorithmisch oder UI-gesteuerte Aktionen (SetGeoAttr,
275 // MoveMarkedObj, ...) muss die App dieses Limit selbst beruecksichtigen.
276 // Ferner ist dieses Limit als Grob-Limit zu sehen. U.U. koennen Objekte
277 // (z.B. beim Drehen) nicht exakt bis an dieses Limit herangedraggt werden,
278 // koennen Objekte durch Rundungsfehler doch etwas ueberstehen, ... .
279 // Default=EmptyRect=keine Begrenzung.
280 // erst z.T. impl.
281 // (besser in die DragView?)
282 void SetWorkArea(const Rectangle& rRect) { aMaxWorkArea=rRect; }
283 const Rectangle& GetWorkArea() const { return aMaxWorkArea; }
286 // Das DragLimit ist bezogen auf die Page des Objekts.
287 // (Oder auf die View??? Muss ich mal^^^^recherchieren. Joe.)
288 // sal_False=Kein Limit.
289 // Das Rueckgabe-Rect muss absolute Koordinaten enthalten. Der Maximale
290 // Dragbereich wird von der View dann so gewaehlt, dass das SnapRect des
291 // Objekts bis Maximal auf die Kante des LimitRects gemoved bzw. gesized
292 // wird. Bei Objekten wie Bezierkurven, gedrehten Rechtecken ist zu beachten
293 // das durch anschliessende Neuberechnung des SnapRects (bei Resize)
294 // Rundungsfehler auftreten koennen, wodurch das LimitRect minnimal
295 // ueberschritten werden koennte...
296 // Implementiert fuer Move und Resize.
297 virtual sal_Bool TakeDragLimit(SdrDragMode eMode, Rectangle& rRect) const;
300 #endif //_SVDDRGV_HXX
302 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */