xref: /AOO41X/main/svx/inc/svx/svddrgv.hxx (revision 3334a7e6acdae9820fa1a6f556bb10129a8de6b2)
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 #ifndef _SVDDRGV_HXX
25 #define _SVDDRGV_HXX
26 
27 #include "svx/svxdllapi.h"
28 #include <svx/svdxcgv.hxx>
29 
30 //************************************************************
31 //   Vorausdeklarationen
32 //************************************************************
33 
34 class SdrUndoGeoObj;
35 
36 ////////////////////////////////////////////////////////////////////////////////////////////////////
37 ////////////////////////////////////////////////////////////////////////////////////////////////////
38 //
39 //  @@@@@  @@@@@   @@@@   @@@@   @@ @@ @@ @@@@@ @@   @@
40 //  @@  @@ @@  @@ @@  @@ @@  @@  @@ @@ @@ @@    @@   @@
41 //  @@  @@ @@  @@ @@  @@ @@      @@ @@ @@ @@    @@ @ @@
42 //  @@  @@ @@@@@  @@@@@@ @@ @@@  @@@@@ @@ @@@@  @@@@@@@
43 //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@@@@@
44 //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@ @@@
45 //  @@@@@  @@  @@ @@  @@  @@@@@    @   @@ @@@@@ @@   @@
46 //
47 ////////////////////////////////////////////////////////////////////////////////////////////////////
48 ////////////////////////////////////////////////////////////////////////////////////////////////////
49 
50 class ImpSdrDragViewExtraData;
51 
52 class SVX_DLLPUBLIC SdrDragView: public SdrExchangeView
53 {
54     friend class                SdrPageView;
55     friend class                SdrDragMethod;
56 
57 protected:
58     SdrHdl*                     pDragHdl;
59     SdrDragMethod*              mpCurrentSdrDragMethod;
60     SdrUndoGeoObj*              pInsPointUndo;
61     Rectangle                   aDragLimit;
62     XubString                   aInsPointUndoStr;
63     SdrMarkList                 aFollowingEdges; // Wenn Knoten gedraggd werden, sollen alle Kanten als Xor folgen
64     SdrHdlKind                  eDragHdl;
65 
66     sal_uIntPtr                     nDragXorPolyLimit;
67     sal_uIntPtr                     nDragXorPointLimit;
68     sal_uInt16                      nRubberEdgeDraggingLimit;
69     sal_uInt16                      nDetailedEdgeDraggingLimit;
70 
71     unsigned                    bFramDrag : 1;        // z.Zt. FrameDrag
72     unsigned                    bDragSpecial : 1;     // z.Zt. Special Obj-Dragging
73     unsigned                    bMarkedHitMovesAlways : 1; // Persistent
74     unsigned                    bDragLimit : 1;      // Limit auf SnapRect statt BoundRect
75     unsigned                    bDragHdl : 1;        // TRUE: RefPt wird verschoben
76     unsigned                    bDragStripes : 1;    // Persistent
77     unsigned                    bMirrRefDragObj : 1; // Persistent - Waehrend des Draggens der Spiegelachse die gespiegelten Objekte als Xor zeigen
78     unsigned                    mbSolidDragging : 1;  // allow solid create/drag of objects
79     unsigned                    bMouseHideWhileDraggingPoints : 1;
80     unsigned                    bResizeAtCenter : 1;
81     unsigned                    bCrookAtCenter : 1;
82     unsigned                    bDragWithCopy : 1;
83     unsigned                    bInsGluePoint : 1;
84     unsigned                    bInsObjPointMode : 1;
85     unsigned                    bInsGluePointMode : 1;
86     unsigned                    bNoDragXorPolys : 1;
87     unsigned                    bAutoVertexCon : 1;  // Automatische Konnektorgenerierung an den Scheitelpunkten
88     unsigned                    bAutoCornerCon : 1;  // Automatische Konnektorgenerierung an den Eckpunkten
89     unsigned                    bRubberEdgeDragging : 1;
90     unsigned                    bDetailedEdgeDragging : 1;
91 
92 private:
93     SVX_DLLPRIVATE void ImpClearVars();
94     SVX_DLLPRIVATE void ImpMakeDragAttr();
95     SVX_DLLPRIVATE void ImpDelDragAttr();
96 
97 protected:
98     virtual void SetMarkHandles();
99     void ShowDragObj();
100     void HideDragObj();
101     sal_Bool ImpBegInsObjPoint(sal_Bool bIdxZwang, sal_uInt32 nIdx, const Point& rPnt, sal_Bool bNewObj, OutputDevice* pOut);
102 
103 protected:
104     // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
105     SdrDragView(SdrModel* pModel1, OutputDevice* pOut = 0L);
106     virtual ~SdrDragView();
107 
108 public:
109     virtual sal_Bool IsAction() const;
110     virtual void MovAction(const Point& rPnt);
111     virtual void EndAction();
112     virtual void BckAction();
113     virtual void BrkAction();
114     virtual void TakeActionRect(Rectangle& rRect) const;
115 
116     // Spezialimplementation fuer den Writer:
117     // TakeDragObjAnchorPos() liefert die Position an der ein Objekt
118     // beim Draggen einer Einfachselektion ungefaehr landet wenn es
119     // "losgelassen" wird (EndDrag).
120     // In der Regel ist das die linke obere Ecke des zu erwartenden neuen
121     // SnapRects. Ausnahme: CaptionObj. Dort ist es die Position des
122     // "Schwanzendes".
123     // Bei Returncode sal_False konnte ich die Position nicht bestimmen
124     // (z.B. Punktverschiebung, Mehrfachselektion, Schieben der
125     // Spiegelschse, ...)
126     sal_Bool TakeDragObjAnchorPos(Point& rPos, sal_Bool bTopRight = sal_False ) const;
127 
128     // Wird pForcedMeth uebergeben, so wird pHdl, ... nicht ausgewerten, sondern diese
129     // Drag-Methode verwendet. Die Instanz geht dabei ins Eigentum der View ueber und
130     // wird zum Ende des Draggings destruiert.
131     virtual sal_Bool BegDragObj(const Point& rPnt, OutputDevice* pOut=NULL, SdrHdl* pHdl=NULL, short nMinMov=-3, SdrDragMethod* pForcedMeth=NULL);
132     void MovDragObj(const Point& rPnt);
133     sal_Bool EndDragObj(sal_Bool bCopy=sal_False);
134     void BrkDragObj();
IsDragObj() const135     sal_Bool IsDragObj() const { return mpCurrentSdrDragMethod && !bInsPolyPoint && !bInsGluePoint; }
GetDragHdl() const136     SdrHdl* GetDragHdl() const { return pDragHdl; }
GetDragMethod() const137     SdrDragMethod* GetDragMethod() const { return mpCurrentSdrDragMethod; }
IsDraggingPoints() const138     sal_Bool IsDraggingPoints() const { return eDragHdl==HDL_POLY; }
IsDraggingGluePoints() const139     sal_Bool IsDraggingGluePoints() const { return eDragHdl==HDL_GLUE; }
140 
141     // Wer das beim BegDrag oder mittendrin schon festlegen will.
142     // (Wird bei jedem BegDrag auf sal_False zurueckgesetzt, also nach
143     // BegDrag setzen.)
SetDragWithCopy(sal_Bool bOn)144     void SetDragWithCopy(sal_Bool bOn) { bDragWithCopy = bOn; }
IsDragWithCopy() const145     sal_Bool IsDragWithCopy() const { return bDragWithCopy; }
146 
SetInsertGluePoint(sal_Bool bOn)147     void SetInsertGluePoint(sal_Bool bOn) { bInsGluePoint = bOn; }
IsInsertGluePoint() const148     sal_Bool IsInsertGluePoint() const { return bInsGluePoint; }
149 
150     // Interaktives einfuegen eines neuen Punktes. nIdx=0 => vor dem ersten Punkt.
151     sal_Bool IsInsObjPointPossible() const;
IsInsPointPossible() const152     sal_Bool IsInsPointPossible() const { return IsInsObjPointPossible(); }
BegInsObjPoint(const Point & rPnt,sal_Bool bNewObj)153     sal_Bool BegInsObjPoint(const Point& rPnt, sal_Bool bNewObj) { return ImpBegInsObjPoint(sal_False, 0L, rPnt, bNewObj, 0L); }
MovInsObjPoint(const Point & rPnt)154     void MovInsObjPoint(const Point& rPnt) { MovDragObj(rPnt); }
155     sal_Bool EndInsObjPoint(SdrCreateCmd eCmd);
BrkInsObjPoint()156     void BrkInsObjPoint() { BrkDragObj(); }
IsInsObjPoint() const157     sal_Bool IsInsObjPoint() const { return mpCurrentSdrDragMethod && bInsPolyPoint; }
158 
159     // Fuer die App zum Verwalten des Status. GetPreferedPointer() wird
160     // spaeter vielleicht einen passenden Pointer dafuer liefern
SetInsObjPointMode(sal_Bool bOn)161     void SetInsObjPointMode(sal_Bool bOn) { bInsObjPointMode = bOn; }
IsInsObjPointMode() const162     sal_Bool IsInsObjPointMode() const { return bInsObjPointMode; }
163 
164     sal_Bool IsInsGluePointPossible() const;
165     sal_Bool BegInsGluePoint(const Point& rPnt);
MovInsGluePoint(const Point & rPnt)166     void MovInsGluePoint(const Point& rPnt) { MovDragObj(rPnt); }
EndInsGluePoint()167     sal_Bool EndInsGluePoint() { return EndDragObj(); }
BrkInsGluePoint()168     void BrkInsGluePoint() { BrkDragObj(); }
IsInsGluePoint() const169     sal_Bool IsInsGluePoint() const { return mpCurrentSdrDragMethod && bInsGluePoint; }
170 
171     // Fuer die App zum Verwalten des Status. GetPreferedPointer() wird
172     // spaeter vielleicht einen passenden Pointer dafuer liefern
SetInsGluePointMode(sal_Bool bOn)173     void SetInsGluePointMode(sal_Bool bOn) { bInsGluePointMode = bOn; }
IsInsGluePointMode() const174     sal_Bool IsInsGluePointMode() const { return bInsGluePointMode; }
175 
176     // Begrenzungslinien ueber's gesamte Win waehrend des Draggens
177     // Persistent. Default=FALSE.
178     void SetDragStripes(sal_Bool bOn);
IsDragStripes() const179     sal_Bool IsDragStripes() const { return bDragStripes; }
180 
181     // Handles waehrend des Draggens verstecken
182     //HMHvoid SetDragHdlHide(sal_Bool bOn);
183     //HMHBOOL IsDragHdlHide() const { return bNoDragHdl; }
184 
185     // Beim Draggen von Polygonpunkten und Klebepunkten
186     // die Maus verstecken. Default=FALSE
SetMouseHideWhileDraggingPoints(sal_Bool bOn)187     void SetMouseHideWhileDraggingPoints(sal_Bool bOn) { bMouseHideWhileDraggingPoints = bOn; }
IsMouseHideWhileDraggingPoints() const188     sal_Bool IsMouseHideWhileDraggingPoints() const { return bMouseHideWhileDraggingPoints; }
189 
190     // Beim Draggen werden i.d.R. die Konturen der markierten Objekte
191     // als Xor-Polygone dargestellt. Wird dieses Flag hier gesetzt,
192     // wird (z.B. bei Mehrfachselektion) nur ein Xor-Frame gezeichnet.
193     // Bei objektspeziefischem Dragging (Polygonpunkte,Eckenradius,...
194     // hat diese Einstellung keine Auswirkung.
195     // Auch waerend des Draggens umschaltbar.
196     // Default=Off
197     void SetNoDragXorPolys(sal_Bool bOn);
IsNoDragXorPolys() const198     sal_Bool IsNoDragXorPolys() const { return bNoDragXorPolys; }
199 
200     // Uebersteigt die Anzahl der markierten Objekte den hier eingestellten
201     // Wert, wird implizit (temporaer) auf NoDragPolys geschaltet.
202     // PolyPolygone etc werden entsprechend als mehrere Objekte gewertet.
203     // Default=100
SetDragXorPolyLimit(sal_uIntPtr nObjAnz)204     void  SetDragXorPolyLimit(sal_uIntPtr nObjAnz) { nDragXorPolyLimit=nObjAnz; }
GetDragXorPolyLimit() const205     sal_uIntPtr GetDragXorPolyLimit() const { return nDragXorPolyLimit; }
206 
207     // Wie DragXorPolyLimit, jedoch bezogen auf die Gesamtpunktanzahl
208     // aller Polygone. Default=500.
209     // Auf NoDragPolys wird (temporaer) geschaltet, wenn eins der Limits
210     // ueberstiegen wird.
SetDragXorPointLimit(sal_uIntPtr nPntAnz)211     void  SetDragXorPointLimit(sal_uIntPtr nPntAnz) { nDragXorPointLimit=nPntAnz; }
GetDragXorPointLimit() const212     sal_uIntPtr GetDragXorPointLimit() const { return nDragXorPointLimit; }
213 
214     void SetSolidDragging(bool bOn);
215     bool IsSolidDragging() const;
216 
217     // Dragging/Creating von Verbindern:
218     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
219     // Verbinder an Objektscheitelpunkte ankleben
220     // Default=sal_True=Ja
SetAutoVertexConnectors(sal_Bool bOn)221     void SetAutoVertexConnectors(sal_Bool bOn) { bAutoVertexCon = bOn; }
IsAutoVertexConnectors() const222     sal_Bool IsAutoVertexConnectors() const { return bAutoVertexCon; }
223 
224     // Verbinder an Objektecken ankleben
225     // Default=sal_False=Nein
SetAutoCornerConnectors(sal_Bool bOn)226     void SetAutoCornerConnectors(sal_Bool bOn) { bAutoCornerCon = bOn; }
IsAutoCornerConnectors() const227     sal_Bool IsAutoCornerConnectors() const { return bAutoCornerCon; }
228 
229     // Dragging von verbundenen Objekten (Nodes):
230     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
231     // DetailedEdgeDraggingLimit: Wie RubberEdgeDraggingLimit, jedoch bezieht
232     // sich dieses Limit auf die detalierte Darstellung, d.h. nicht nur
233     // Gummibaender sondern komplette Neuberechnunen sind beim Draggen sichtbar.
234     // Diese detalierte Darstellung ist eh nur beim MoveDrag moeglich.
235     // Defaultwert ist 10
236     void SetDetailedEdgeDragging(sal_Bool bOn); // Default an
IsDetailedEdgeDragging() const237     sal_Bool IsDetailedEdgeDragging() const { return bDetailedEdgeDragging; }
238 
239     void SetDetailedEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz);
GetDetailedEdgeDraggingLimit() const240     sal_uInt16 GetDetailedEdgeDraggingLimit() const { return nDetailedEdgeDraggingLimit; }
241 
242     // EdgeDraggingLimit: Sind mehr als nEdgeObjAnz Kanten betroffen, werden
243     // diese beim interaktiven Draggen nicht mit angezeigt.
244     // Gemeint sind hier die "Gummibaender", die weniger Rechenzeit benoetigen
245     // als die kompletten Neuberechnungen beim DetailedEdgeDragging.
246     // Defaultwert ist 100
247     void SetRubberEdgeDragging(sal_Bool bOn);  // Default an
IsRubberEdgeDragging() const248     sal_Bool IsRubberEdgeDragging() const { return bRubberEdgeDragging; }
249 
250     void SetRubberEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz);
GetRubberEdgeDraggingLimit() const251     sal_uInt16 GetRubberEdgeDraggingLimit() const { return nRubberEdgeDraggingLimit; }
252 
253     // Verbinderhandling also zu deutsch wie folgt (bei Defaulteinstellungen):
254     // - Sind bis max 10 Verbinder betroffen werden diese bei jedem
255     //   MouseMove neu berechnet
256     // - Sind zwischen 11 und 100 Verbinder betroffen werden die
257     //   Verbindungen beim Draggen als gerade Linien dargestellt.
258     // - Bei mehr als 100 betroffenen Verbindern wird beim Draggen nichts
259     //   mehr gezeichnet was auf Verbinder hinweist.
260 
261     // Ist ein spezieller Dragmode eingeschaltet, wie Rotate, Mirror oder Crook,
262     // dann leitet ein Hit auf das markierte Objekt genau dieses Dragging ein.
263     // Setzt man MarkedHitMovesAlways auf sal_True, so leitet ein Hit auf das
264     // markierte Objekt immer ein Moven ein, unabhaengig vom gesetzten DragMode.
265     // Dieses Flag ist persistent und sollte von der App fuer den Anwender
266     // konfigurierbar sein!
SetMarkedHitMovesAlways(sal_Bool bOn)267     void SetMarkedHitMovesAlways(sal_Bool bOn) { bMarkedHitMovesAlways = bOn; }
IsMarkedHitMovesAlways() const268     sal_Bool IsMarkedHitMovesAlways() const { return bMarkedHitMovesAlways; }
269 
270     // Beim Draggen der Spiegelachse das Spiegelbild der markierten Objekte
271     // als Xor darstellen? Persistent. Noch nicht implementiert. Default TRUE.
SetMirrRefDragObj(sal_Bool bOn)272     void SetMirrRefDragObj(sal_Bool bOn) { bMirrRefDragObj = bOn; }
IsMirrRefDragObj() const273     sal_Bool IsMirrRefDragObj() const { return bMirrRefDragObj; }
274 
275     sal_Bool IsOrthoDesired() const;
276 
277     // Beim Resize die Mitte als Referenz
278     // Default=FALSE.
IsResizeAtCenter() const279     sal_Bool IsResizeAtCenter() const { return bResizeAtCenter; }
SetResizeAtCenter(sal_Bool bOn)280     void SetResizeAtCenter(sal_Bool bOn) { bResizeAtCenter = bOn; }
281 
282     // Symmetrisches Crook
283     // Default=FALSE.
IsCrookAtCenter() const284     sal_Bool IsCrookAtCenter() const { return bCrookAtCenter; }
SetCrookAtCenter(sal_Bool bOn)285     void SetCrookAtCenter(sal_Bool bOn) { bCrookAtCenter = bOn; }
286 
287     // Begrenzung des Arbeitsbereichs. Die Begrenzung bezieht sich auf die
288     // View, nicht auf die einzelnen PageViews. Von der View wird diese
289     // Begrenzung nur bei Interaktionen wie Dragging und Create ausgewertet.
290     // Bei von der App algorithmisch oder UI-gesteuerte Aktionen (SetGeoAttr,
291     // MoveMarkedObj, ...) muss die App dieses Limit selbst beruecksichtigen.
292     // Ferner ist dieses Limit als Grob-Limit zu sehen. U.U. koennen Objekte
293     // (z.B. beim Drehen) nicht exakt bis an dieses Limit herangedraggt werden,
294     // koennen Objekte durch Rundungsfehler doch etwas ueberstehen, ... .
295     // Default=EmptyRect=keine Begrenzung.
296     // erst z.T. impl.
297     // (besser in die DragView?)
SetWorkArea(const Rectangle & rRect)298     void SetWorkArea(const Rectangle& rRect) { aMaxWorkArea=rRect; }
GetWorkArea() const299     const Rectangle& GetWorkArea() const { return aMaxWorkArea; }
300 
301 
302     // Das DragLimit ist bezogen auf die Page des Objekts.
303     // (Oder auf die View??? Muss ich mal^^^^recherchieren. Joe.)
304     // sal_False=Kein Limit.
305     // Das Rueckgabe-Rect muss absolute Koordinaten enthalten. Der Maximale
306     // Dragbereich wird von der View dann so gewaehlt, dass das SnapRect des
307     // Objekts bis Maximal auf die Kante des LimitRects gemoved bzw. gesized
308     // wird. Bei Objekten wie Bezierkurven, gedrehten Rechtecken ist zu beachten
309     // das durch anschliessende Neuberechnung des SnapRects (bei Resize)
310     // Rundungsfehler auftreten koennen, wodurch das LimitRect minnimal
311     // ueberschritten werden koennte...
312     // Implementiert fuer Move und Resize.
313     virtual sal_Bool TakeDragLimit(SdrDragMode eMode, Rectangle& rRect) const;
314 };
315 
316 #endif //_SVDDRGV_HXX
317 
318