Line data Source code
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 :
27 :
28 : #define SDRSNAP_NOTSNAPPED 0x0000
29 : #define SDRSNAP_XSNAPPED 0x0001
30 : #define SDRSNAP_YSNAPPED 0x0002
31 : #define SDRSNAP_XYSNAPPED 0x0003
32 :
33 : // SDRCROOK_STRETCH ist noch nicht implementiert!
34 : enum SdrCrookMode {
35 : SDRCROOK_ROTATE,
36 : SDRCROOK_SLANT,
37 : SDRCROOK_STRETCH
38 : };
39 :
40 :
41 : // #114409#-1 Migrate PageOrigin
42 : class ImplPageOriginOverlay;
43 :
44 : class SVX_DLLPUBLIC SdrSnapView: public SdrPaintView
45 : {
46 : protected:
47 : // #114409#-1 Migrate PageOrigin
48 : class ImplPageOriginOverlay* mpPageOriginOverlay;
49 :
50 : // #114409#-2 Migrate HelpLine
51 : class ImplHelpLineOverlay* mpHelpLineOverlay;
52 :
53 : Size aMagnSiz;
54 : Fraction aSnapWdtX;
55 : Fraction aSnapWdtY;
56 :
57 : sal_uInt16 nMagnSizPix;
58 : long nSnapAngle;
59 : long nEliminatePolyPointLimitAngle;
60 :
61 : SdrCrookMode eCrookMode;
62 :
63 : bool bSnapEnab : 1;
64 : bool bGridSnap : 1;
65 : bool bSnapTo1Pix : 1; // Wenn GridSnap aus, auf ein Pixel fangen um Werte wie 10.01 zu vermeiden
66 : bool bBordSnap : 1;
67 : bool bHlplSnap : 1;
68 : bool bOFrmSnap : 1;
69 : bool bOPntSnap : 1;
70 : bool bOConSnap : 1;
71 : bool bMoveMFrmSnap : 1;
72 : bool bMoveOFrmSnap : 1;
73 : bool bMoveOPntSnap : 1;
74 : bool bMoveOConSnap : 1;
75 : bool bMoveSnapOnlyTopLeft : 1; // Speacial fuer den Dialogeditor
76 : bool bOrtho : 1;
77 : bool bBigOrtho : 1;
78 : bool bAngleSnapEnab : 1;
79 : bool bMoveOnlyDragging : 1; // Objekte nur verschieben bei Resize/Rotate/...
80 : bool bSlantButShear : 1; // Slant anstelle von Shear anwenden
81 : bool bCrookNoContortion : 1; // Objekte bei Crook nicht verzerren
82 : bool bHlplFixed : 1; // sal_True=Hilfslinien fixiert, also nicht verschiebbar
83 : bool bEliminatePolyPoints : 1;
84 :
85 : private:
86 : SVX_DLLPRIVATE void ClearVars();
87 :
88 : protected:
89 : // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
90 : SdrSnapView(SdrModel* pModel1, OutputDevice* pOut = 0L);
91 : virtual ~SdrSnapView();
92 :
93 : public:
94 : virtual bool IsAction() const SAL_OVERRIDE;
95 : virtual void MovAction(const Point& rPnt) SAL_OVERRIDE;
96 : virtual void EndAction() SAL_OVERRIDE;
97 : virtual void BckAction() SAL_OVERRIDE;
98 : virtual void BrkAction() SAL_OVERRIDE; // f.abg.Klassen Actions z,B, Draggen abbrechen.
99 : virtual void TakeActionRect(Rectangle& rRect) const SAL_OVERRIDE;
100 :
101 10320 : void SetSnapGridWidth(const Fraction& rX, const Fraction& rY) { aSnapWdtX=rX; aSnapWdtY=rY; }
102 3984 : const Fraction& GetSnapGridWidthX() const { return aSnapWdtX; }
103 3556 : const Fraction& GetSnapGridWidthY() const { return aSnapWdtY; }
104 :
105 25479 : void SetSnapMagnetic(const Size& rSiz) { if (rSiz!=aMagnSiz) { aMagnSiz=rSiz; } }
106 : const Size& GetSnapMagnetic() const { return aMagnSiz; }
107 596 : void SetSnapMagneticPixel(sal_uInt16 nPix) { nMagnSizPix=nPix; }
108 1738 : sal_uInt16 GetSnapMagneticPixel() const { return nMagnSizPix; }
109 :
110 : // RecalcLogicSnapMagnetic muss bei jedem Wechsel des OutputDevices
111 : // sowie bei jedem Wechsel des MapModes gerufen werden!
112 25479 : void RecalcLogicSnapMagnetic(const OutputDevice& rOut) { SetSnapMagnetic(rOut.PixelToLogic(Size(nMagnSizPix,nMagnSizPix))); }
113 24031 : void SetActualWin(const OutputDevice* pWin) { SdrPaintView::SetActualWin(pWin); if (pWin!=NULL) RecalcLogicSnapMagnetic(*pWin); }
114 :
115 : // Auf die View bezogene Koordinaten!
116 : // Rueckgabewerte sind SDRSNAP_NOTSNAPPED,SDRSNAP_XSNAPPED,
117 : // SDRSNAP_YSNAPPED oder SDRSNAP_XYSNAPPED
118 : sal_uInt16 SnapPos(Point& rPnt, const SdrPageView* pPV) const;
119 : Point GetSnapPos(const Point& rPnt, const SdrPageView* pPV) const;
120 : void CheckSnap(const Point& rPt, const SdrPageView* pPV, long& nBestXSnap, long& nBestYSnap, bool& bXSnapped, bool& bYSnapped) const;
121 :
122 : // Alle Fangeinstellungen sind Persistent.
123 0 : bool IsSnapEnabled() const { return bSnapEnab; }
124 4821 : bool IsGridSnap() const { return bGridSnap; } // Fang auf Rastergitter
125 3089 : bool IsBordSnap() const { return bBordSnap; } // Fang auf Seitenraender
126 3249 : bool IsHlplSnap() const { return bHlplSnap; } // Fang auf Hilfslinien
127 3249 : bool IsOFrmSnap() const { return bOFrmSnap; } // Fang auf LogFram von umgebenden Zeichenobjekten
128 3089 : bool IsOPntSnap() const { return bOPntSnap; } // Fang auf ausgepraegte Punkte von umgebenden Zeichenobjekten
129 3062 : bool IsOConSnap() const { return bOConSnap; } // Fang auf Konnektoren der Zeichenobjekte
130 726 : void SetSnapEnabled(bool bOn) { bSnapEnab=bOn; }
131 7996 : void SetGridSnap(bool bOn) { bGridSnap=bOn; }
132 1948 : void SetBordSnap(bool bOn) { bBordSnap=bOn; }
133 2108 : void SetHlplSnap(bool bOn) { bHlplSnap=bOn; }
134 2108 : void SetOFrmSnap(bool bOn) { bOFrmSnap=bOn; }
135 1948 : void SetOPntSnap(bool bOn) { bOPntSnap=bOn; }
136 1922 : void SetOConSnap(bool bOn) { bOConSnap=bOn; }
137 :
138 : // Normalerweise werden beim Move-Dragging von Zeichenobjekten alle
139 : // 4 Ecken des Object-SnapRects gefangen. Folgende Einstellmoeglichkeit,
140 : // wenn man nur auf die linke obere Ecke fangen will (z.B. DialogEditor):
141 : // Persistent, Default=FALSE.
142 0 : void SetMoveSnapOnlyTopLeft(bool bOn) { bMoveSnapOnlyTopLeft=bOn; }
143 0 : bool IsMoveSnapOnlyTopLeft() const { return bMoveSnapOnlyTopLeft; }
144 :
145 : // Hilfslinien fixiert (nicht verschiebbar)
146 : // Persistent, Default=FALSE.
147 : bool IsHlplFixed() const { return bHlplFixed; }
148 : void SetHlplFixed(bool bOn) { bHlplFixed=bOn; }
149 :
150 : bool IsMoveMFrmSnap() const { return bMoveMFrmSnap; } // Fang des LogFram aller markierten Objekte
151 : bool IsMoveOFrmSnap() const { return bMoveOFrmSnap; } // Fang aller LogFram der markierten Objekte
152 : bool IsMoveOPntSnap() const { return bMoveOPntSnap; } // Fang ausgepraegter Punkte der markierten Objekte
153 : bool IsMoveOConSnap() const { return bMoveOConSnap; } // Fang der Konnektoren der markierten Objekte
154 :
155 : void SetMoveMFrmSnap(bool bOn) { bMoveMFrmSnap=bOn; }
156 : void SetMoveOFrmSnap(bool bOn) { bMoveOFrmSnap=bOn; }
157 : void SetMoveOPntSnap(bool bOn) { bMoveOPntSnap=bOn; }
158 : void SetMoveOConSnap(bool bOn) { bMoveOConSnap=bOn; }
159 :
160 : // #114409#-1 Migrate PageOrigin
161 : bool BegSetPageOrg(const Point& rPnt);
162 : void MovSetPageOrg(const Point& rPnt);
163 : bool EndSetPageOrg();
164 : void BrkSetPageOrg();
165 44800 : bool IsSetPageOrg() const { return (0L != mpPageOriginOverlay); }
166 :
167 : // HitTest. Bei sal_True steht in rnHelpLineNum die Nummer der Hilfslinie und in rpPV
168 : // die zugehoerige PageView.
169 : bool PickHelpLine(const Point& rPnt, short nTol, const OutputDevice& rOut, sal_uInt16& rnHelpLineNum, SdrPageView*& rpPV) const;
170 :
171 : // Verschieben einer vorhandenen Hilfslinie. nHelpLineNum und pPV von PickHelpLine verwenden.
172 : bool BegDragHelpLine(sal_uInt16 nHelpLineNum, SdrPageView* pPV);
173 : // Interaktives einfuegen einer neuen Hilfslinie
174 : bool BegDragHelpLine(const Point& rPnt, SdrHelpLineKind eNewKind);
175 : Pointer GetDraggedHelpLinePointer() const;
176 :
177 : // Aendern des Hilfslinientyps waerend des draggens
178 : // void SetDraggedHelpLineKind(SdrHelpLineKind eNewKind);
179 : void MovDragHelpLine(const Point& rPnt);
180 : bool EndDragHelpLine();
181 : void BrkDragHelpLine();
182 44800 : bool IsDragHelpLine() const { return (0L != mpHelpLineOverlay); }
183 :
184 : // SnapAngle ist fuer Winkel im Kreis, RotateDragging, ...
185 : // Der Winkelfang wird unterdrueckt, wenn er mit
186 : // durch SetAngleSnapEnabled(sal_False) ausgeschaltet ist.
187 : // Der Winkelfang ist unabhaengig vom Koordinatenfang
188 : // und somit von der Einstellung IsSnapEnabled()
189 : // Es sollten nur Werte angegeben werden fuer die gilt:
190 : // 36000 modulu nWink = 0
191 : // Implementiert fuer:
192 : // - Rotate (Dragging)
193 : // - Shear (Dragging)
194 : // - Kreisbogen/-sektor/-abschnitt Winkel (Create und Dragging)
195 : // Persistent.
196 624 : void SetAngleSnapEnabled(bool bOn) { bAngleSnapEnab=bOn; }
197 1746 : bool IsAngleSnapEnabled() const { return bAngleSnapEnab; }
198 1948 : void SetSnapAngle(long nWink) { nSnapAngle=nWink; }
199 3070 : long GetSnapAngle() const { return nSnapAngle; }
200 :
201 : // Ortho hat je nach Kontext verschiedene Effekte:
202 : // - Create
203 : // - Linien werden nur im 45deg Raster zugelassen
204 : // - Statt Rechtecke werden Quadrate erzeugt
205 : // - Statt Ellipsen werden Kreise erzeugt
206 : // - Dragging
207 : // - allgemeines Dragging
208 : // - Move nur Hor, Vert oder 45deg
209 : // - Resize proportional
210 : // - Mirror: nichts
211 : // - Shear ohne Resize
212 : // - Crook ohne Resize
213 : // - verschieben der Handles
214 : // - Spiegelachse nur 45deg Raster
215 : // - Objekteigenes Dragging
216 : // - Rechteck Eckenradius: nichts
217 : // - Kreisobjekt Winkel: nichts
218 : // - Linie behaelt beim Draggen ihren Winkel bei und wird nur (ni)
219 : // verlaengert bzw. verkuerzt.
220 : // Defaultmaessig ist Ortho ausgeschaltet. Persistent.
221 384 : void SetOrtho(bool bOn) { bOrtho=bOn; } // unvollstaendig
222 1526 : bool IsOrtho() const { return bOrtho; }
223 :
224 : // BigOrtho hat nur Relevanz wenn Ortho eingeschaltet ist.
225 : // Beispiel: Ein Rechteck wird mit eingeschaltetem Ortho (also ein Quadrat)
226 : // erzeugt und die Maus wurde dabei vom Nullpunkt zu den Koordinaten
227 : // (80,30) gedraggt. Dann stuenden nun 2 Alternativen zur Bestimmung der
228 : // Kantenlaenge des Quadrats zur Wahl: 30 und 80.
229 : // Die normale Ortho-Funktuionalitaet brachte hierbei ein Quadrat mit
230 : // Kantenlaenge 30 (also immer die kleinere Groesse). Bei hinzugeschal-
231 : // tetem BigOrtho bekaeme man dagegen ein Quadrat der Kantenlaenge 80.
232 : // Gleiches gilt auch fuer Resize.
233 : // Defaultmaessig ist BigOrtho eingeschaltet. Persistent.
234 1708 : void SetBigOrtho(bool bOn) { bBigOrtho=bOn; }
235 2850 : bool IsBigOrtho() const { return bBigOrtho; }
236 :
237 : // bei MoveOnlyDragging=sal_True wird bei Resize/Rotate/Shear/Mirror/Crook
238 : // nur das Zentrum der markierten Objekte transformiert. Groesse, Form
239 : // und Drehwinkel der Objekte bleiben erhalten, nur ihre Positionen
240 : // aendern sich. Persistent. Default=FALSE. (ni)
241 1708 : void SetMoveOnlyDragging(bool bOn) { bMoveOnlyDragging=bOn; }
242 2850 : bool IsMoveOnlyDragging() const { return bMoveOnlyDragging; }
243 :
244 : // Slant anstelle von Shear anwenden. Persistent. Default=FALSE.
245 384 : void SetSlantButShear(bool bOn) { bSlantButShear=bOn; }
246 2 : bool IsSlantButShear() const { return bSlantButShear; }
247 :
248 : // Objekte bei Crook nicht verzerren. Persistent. Default=FALSE. (ni)
249 1708 : void SetCrookNoContortion(bool bOn) { bCrookNoContortion=bOn; }
250 7069 : bool IsCrookNoContortion() const { return bCrookNoContortion; }
251 :
252 : // Crook-Modus. Persistent. Default=SDRCROOK_ROTATE. (ni)
253 0 : void SetCrookMode(SdrCrookMode eMode) { eCrookMode=eMode; }
254 0 : SdrCrookMode GetCrookMode() const { return eCrookMode; }
255 :
256 : // Special fuer IBM: Beim Draggen eines Polygonpunkts wird dieser
257 : // geloescht, wenn seine beiden angrenzenden Linien eh' fast eine
258 : // durchgehende Linie sind.
259 1948 : void SetEliminatePolyPoints(bool bOn) { bEliminatePolyPoints=bOn; }
260 3070 : bool IsEliminatePolyPoints() const { return bEliminatePolyPoints; }
261 2160 : void SetEliminatePolyPointLimitAngle(long nAngle) { nEliminatePolyPointLimitAngle=nAngle; }
262 3282 : long GetEliminatePolyPointLimitAngle() const { return nEliminatePolyPointLimitAngle; }
263 : };
264 :
265 : // Begriffsdefinition:
266 : // - Etwas fangen=Gefangen werden kann z.B. der Mauszeiger oder die z.Zt. im
267 : // Drag befindlichen markierten Objekte.
268 : // - Auf etwas fangen=Man kann z.B. auf das Grid oder auf Hilfslinien fangen.
269 : //
270 : // Grundsaetzlich wird nur gefangen auf sichtbare Elemente (-> Border,
271 : // Hilfslinien, Konnektoren; Ausnahme: Grid). Ebenso koennen nur sichtbare
272 : // Elemente gefangen werden (->Konnektoren).
273 : //
274 : // Auf's Grid wird immer erst dann gefangen, wenn nix Anderes in der Naehe
275 : // (->Magnetic) ist.
276 : //
277 : // Der "Cursor" (also der Mauszeiger) beim Erzeugen von Objekten, beim Draggen
278 : // von Polygonpunkten, ... wird immer auf allen eingeschalteten Fangalternativen
279 : // gefangen (max 6).
280 : //
281 : // Beim Verschieben markierter Objekte ist das etwas anders. Statt des einen
282 : // Mauscursors gibt es hier 4 Alternativen an den markierten Objekten, die
283 : // gefangen werden koennen:
284 : // 1. die logisch-umschliessenden Rahmen der einzelnen Objekte
285 : // 2. der logisch-umschliessende Rahmen aller markierten Objekte
286 : // 3. ausgezeichnete Punkte der markierten Objekte (Polygonpunkte, ...)
287 : // 4. die Konnektoren der markierten Objekte
288 : // Da 1. und 2. einander ausschliessen (2. ist eine Verfeinerung von 1.)
289 : // bleiben 3 voneinander unabhaengige Alternativen. Bei 6. Moeglichkeiten auf
290 : // die gefangen werden kann kaeme man auf max. 18 Kombinationsmoeglichkeiten!
291 : // Deshalb werden folgende Vereinfachungen festgelegt:
292 : // 1. Konnektoren fangen sich nur auf Konnektoren.
293 : // Verbleiben also nun noch max. 2x5+1=11 Fangkombinationen beim MoveDrag:
294 : // 1-3. umschliessende(r) Rahmen auf Grid/Border/Hilfslinien
295 : // 4. umschliessende(r) Rahmen auf ausgezeichnete Objektpunkte
296 : // 5. umschliessende(r) Rahmen auf umschliessenden Rahmen
297 : // 6-8. ausgezeichnete Punkte auf Grid/Border/Hilfslinien
298 : // 7. ausgezeichnete Punkte auf ausgezeichnete Objektpunkte
299 : // 8-10. ausgezeichnete Punkte auf umschliessenden Rahmen
300 : // 11. Konnektoren auf Konnektoren
301 : // Beim MouseMove-Event im DragMove werden also diese bis zu max. 11 moeglichen
302 : // Alternativen durchgetestet und die mit dem gerigsten Korrekturaufwand
303 : // vollzogen.
304 : //
305 : // Beim Resize, ... wird immer nur der logisch-umschliessende Rahmen der
306 : // markierten Objekte gefangen.
307 :
308 : #endif // INCLUDED_SVX_SVDSNPV_HXX
309 :
310 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|