1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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 INCLUDED_SVX_SVDSNPV_HXX
21 #define INCLUDED_SVX_SVDSNPV_HXX
23 #include <svx/svdpntv.hxx>
24 #include <svx/svdhlpln.hxx>
25 #include <svx/svxdllapi.h>
28 #define SDRSNAP_NOTSNAPPED 0x0000
29 #define SDRSNAP_XSNAPPED 0x0001
30 #define SDRSNAP_YSNAPPED 0x0002
31 #define SDRSNAP_XYSNAPPED 0x0003
33 // SDRCROOK_STRETCH ist noch nicht implementiert!
41 // #114409#-1 Migrate PageOrigin
42 class ImplPageOriginOverlay
;
44 class SVX_DLLPUBLIC SdrSnapView
: public SdrPaintView
47 // #114409#-1 Migrate PageOrigin
48 class ImplPageOriginOverlay
* mpPageOriginOverlay
;
50 // #114409#-2 Migrate HelpLine
51 class ImplHelpLineOverlay
* mpHelpLineOverlay
;
57 sal_uInt16 nMagnSizPix
;
59 long nEliminatePolyPointLimitAngle
;
61 SdrCrookMode eCrookMode
;
63 unsigned bSnapEnab
: 1;
64 unsigned bGridSnap
: 1;
65 unsigned bSnapTo1Pix
: 1; // Wenn GridSnap aus, auf ein Pixel fangen um Werte wie 10.01 zu vermeiden
66 unsigned bBordSnap
: 1;
67 unsigned bHlplSnap
: 1;
68 unsigned bOFrmSnap
: 1;
69 unsigned bOPntSnap
: 1;
70 unsigned bOConSnap
: 1;
71 unsigned bMoveMFrmSnap
: 1;
72 unsigned bMoveOFrmSnap
: 1;
73 unsigned bMoveOPntSnap
: 1;
74 unsigned bMoveOConSnap
: 1;
75 unsigned bMoveSnapOnlyTopLeft
: 1; // Speacial fuer den Dialogeditor
77 unsigned bBigOrtho
: 1;
78 unsigned bAngleSnapEnab
: 1;
79 unsigned bMoveOnlyDragging
: 1; // Objekte nur verschieben bei Resize/Rotate/...
80 unsigned bSlantButShear
: 1; // Slant anstelle von Shear anwenden
81 unsigned bCrookNoContortion
: 1; // Objekte bei Crook nicht verzerren
82 unsigned bHlplFixed
: 1; // sal_True=Hilfslinien fixiert, also nicht verschiebbar
83 unsigned bEliminatePolyPoints
: 1;
86 SVX_DLLPRIVATE
void ClearVars();
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();
94 virtual sal_Bool
IsAction() const;
95 virtual void MovAction(const Point
& rPnt
);
96 virtual void EndAction();
97 virtual void BckAction();
98 virtual void BrkAction(); // f.abg.Klassen Actions z,B, Draggen abbrechen.
99 virtual void TakeActionRect(Rectangle
& rRect
) const;
101 void SetSnapGridWidth(const Fraction
& rX
, const Fraction
& rY
) { aSnapWdtX
=rX
; aSnapWdtY
=rY
; }
102 const Fraction
& GetSnapGridWidthX() const { return aSnapWdtX
; }
103 const Fraction
& GetSnapGridWidthY() const { return aSnapWdtY
; }
105 void SetSnapMagnetic(const Size
& rSiz
) { if (rSiz
!=aMagnSiz
) { aMagnSiz
=rSiz
; } }
106 const Size
& GetSnapMagnetic() const { return aMagnSiz
; }
107 void SetSnapMagneticPixel(sal_uInt16 nPix
) { nMagnSizPix
=nPix
; }
108 sal_uInt16
GetSnapMagneticPixel() const { return nMagnSizPix
; }
110 // RecalcLogicSnapMagnetic muss bei jedem Wechsel des OutputDevices
111 // sowie bei jedem Wechsel des MapModes gerufen werden!
112 void RecalcLogicSnapMagnetic(const OutputDevice
& rOut
) { SetSnapMagnetic(rOut
.PixelToLogic(Size(nMagnSizPix
,nMagnSizPix
))); }
113 void SetActualWin(const OutputDevice
* pWin
) { SdrPaintView::SetActualWin(pWin
); if (pWin
!=NULL
) RecalcLogicSnapMagnetic(*pWin
); }
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;
122 // Alle Fangeinstellungen sind Persistent.
123 sal_Bool
IsSnapEnabled() const { return bSnapEnab
; }
124 sal_Bool
IsGridSnap() const { return bGridSnap
; } // Fang auf Rastergitter
125 sal_Bool
IsBordSnap() const { return bBordSnap
; } // Fang auf Seitenraender
126 sal_Bool
IsHlplSnap() const { return bHlplSnap
; } // Fang auf Hilfslinien
127 sal_Bool
IsOFrmSnap() const { return bOFrmSnap
; } // Fang auf LogFram von umgebenden Zeichenobjekten
128 sal_Bool
IsOPntSnap() const { return bOPntSnap
; } // Fang auf ausgepraegte Punkte von umgebenden Zeichenobjekten
129 sal_Bool
IsOConSnap() const { return bOConSnap
; } // Fang auf Konnektoren der Zeichenobjekte
130 void SetSnapEnabled(sal_Bool bOn
) { bSnapEnab
=bOn
; }
131 void SetGridSnap(sal_Bool bOn
) { bGridSnap
=bOn
; }
132 void SetBordSnap(sal_Bool bOn
) { bBordSnap
=bOn
; }
133 void SetHlplSnap(sal_Bool bOn
) { bHlplSnap
=bOn
; }
134 void SetOFrmSnap(sal_Bool bOn
) { bOFrmSnap
=bOn
; }
135 void SetOPntSnap(sal_Bool bOn
) { bOPntSnap
=bOn
; }
136 void SetOConSnap(sal_Bool bOn
) { bOConSnap
=bOn
; }
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 void SetMoveSnapOnlyTopLeft(sal_Bool bOn
) { bMoveSnapOnlyTopLeft
=bOn
; }
143 sal_Bool
IsMoveSnapOnlyTopLeft() const { return bMoveSnapOnlyTopLeft
; }
145 // Hilfslinien fixiert (nicht verschiebbar)
146 // Persistent, Default=FALSE.
147 sal_Bool
IsHlplFixed() const { return bHlplFixed
; }
148 void SetHlplFixed(sal_Bool bOn
) { bHlplFixed
=bOn
; }
150 sal_Bool
IsMoveMFrmSnap() const { return bMoveMFrmSnap
; } // Fang des LogFram aller markierten Objekte
151 sal_Bool
IsMoveOFrmSnap() const { return bMoveOFrmSnap
; } // Fang aller LogFram der markierten Objekte
152 sal_Bool
IsMoveOPntSnap() const { return bMoveOPntSnap
; } // Fang ausgepraegter Punkte der markierten Objekte
153 sal_Bool
IsMoveOConSnap() const { return bMoveOConSnap
; } // Fang der Konnektoren der markierten Objekte
155 void SetMoveMFrmSnap(sal_Bool bOn
) { bMoveMFrmSnap
=bOn
; }
156 void SetMoveOFrmSnap(sal_Bool bOn
) { bMoveOFrmSnap
=bOn
; }
157 void SetMoveOPntSnap(sal_Bool bOn
) { bMoveOPntSnap
=bOn
; }
158 void SetMoveOConSnap(sal_Bool bOn
) { bMoveOConSnap
=bOn
; }
160 // #114409#-1 Migrate PageOrigin
161 sal_Bool
BegSetPageOrg(const Point
& rPnt
);
162 void MovSetPageOrg(const Point
& rPnt
);
163 sal_Bool
EndSetPageOrg();
164 void BrkSetPageOrg();
165 sal_Bool
IsSetPageOrg() const { return (0L != mpPageOriginOverlay
); }
167 // HitTest. Bei sal_True steht in rnHelpLineNum die Nummer der Hilfslinie und in rpPV
168 // die zugehoerige PageView.
169 sal_Bool
PickHelpLine(const Point
& rPnt
, short nTol
, const OutputDevice
& rOut
, sal_uInt16
& rnHelpLineNum
, SdrPageView
*& rpPV
) const;
171 // Verschieben einer vorhandenen Hilfslinie. nHelpLineNum und pPV von PickHelpLine verwenden.
172 sal_Bool
BegDragHelpLine(sal_uInt16 nHelpLineNum
, SdrPageView
* pPV
);
173 // Interaktives einfuegen einer neuen Hilfslinie
174 sal_Bool
BegDragHelpLine(const Point
& rPnt
, SdrHelpLineKind eNewKind
);
175 Pointer
GetDraggedHelpLinePointer() const;
177 // Aendern des Hilfslinientyps waerend des draggens
178 // void SetDraggedHelpLineKind(SdrHelpLineKind eNewKind);
179 void MovDragHelpLine(const Point
& rPnt
);
180 sal_Bool
EndDragHelpLine();
181 void BrkDragHelpLine();
182 sal_Bool
IsDragHelpLine() const { return (0L != mpHelpLineOverlay
); }
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)
196 void SetAngleSnapEnabled(sal_Bool bOn
) { bAngleSnapEnab
=bOn
; }
197 sal_Bool
IsAngleSnapEnabled() const { return bAngleSnapEnab
; }
198 void SetSnapAngle(long nWink
) { nSnapAngle
=nWink
; }
199 long GetSnapAngle() const { return nSnapAngle
; }
201 // Ortho hat je nach Kontext verschiedene Effekte:
203 // - Linien werden nur im 45deg Raster zugelassen
204 // - Statt Rechtecke werden Quadrate erzeugt
205 // - Statt Ellipsen werden Kreise erzeugt
207 // - allgemeines Dragging
208 // - Move nur Hor, Vert oder 45deg
209 // - Resize proportional
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 void SetOrtho(bool bOn
) { bOrtho
=bOn
; } // unvollstaendig
222 bool IsOrtho() const { return bOrtho
; }
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 void SetBigOrtho(bool bOn
) { bBigOrtho
=bOn
; }
235 bool IsBigOrtho() const { return bBigOrtho
; }
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 void SetMoveOnlyDragging(sal_Bool bOn
) { bMoveOnlyDragging
=bOn
; }
242 sal_Bool
IsMoveOnlyDragging() const { return bMoveOnlyDragging
; }
244 // Slant anstelle von Shear anwenden. Persistent. Default=FALSE.
245 void SetSlantButShear(sal_Bool bOn
) { bSlantButShear
=bOn
; }
246 sal_Bool
IsSlantButShear() const { return bSlantButShear
; }
248 // Objekte bei Crook nicht verzerren. Persistent. Default=FALSE. (ni)
249 void SetCrookNoContortion(sal_Bool bOn
) { bCrookNoContortion
=bOn
; }
250 sal_Bool
IsCrookNoContortion() const { return bCrookNoContortion
; }
252 // Crook-Modus. Persistent. Default=SDRCROOK_ROTATE. (ni)
253 void SetCrookMode(SdrCrookMode eMode
) { eCrookMode
=eMode
; }
254 SdrCrookMode
GetCrookMode() const { return eCrookMode
; }
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 void SetEliminatePolyPoints(sal_Bool bOn
) { bEliminatePolyPoints
=bOn
; }
260 sal_Bool
IsEliminatePolyPoints() const { return bEliminatePolyPoints
; }
261 void SetEliminatePolyPointLimitAngle(long nAngle
) { nEliminatePolyPointLimitAngle
=nAngle
; }
262 long GetEliminatePolyPointLimitAngle() const { return nEliminatePolyPointLimitAngle
; }
265 ////////////////////////////////////////////////////////////////////////////////////////////////////
267 // Begriffsdefinition:
268 // - Etwas fangen=Gefangen werden kann z.B. der Mauszeiger oder die z.Zt. im
269 // Drag befindlichen markierten Objekte.
270 // - Auf etwas fangen=Man kann z.B. auf das Grid oder auf Hilfslinien fangen.
272 // Grundsaetzlich wird nur gefangen auf sichtbare Elemente (-> Border,
273 // Hilfslinien, Konnektoren; Ausnahme: Grid). Ebenso koennen nur sichtbare
274 // Elemente gefangen werden (->Konnektoren).
276 // Auf's Grid wird immer erst dann gefangen, wenn nix Anderes in der Naehe
279 // Der "Cursor" (also der Mauszeiger) beim Erzeugen von Objekten, beim Draggen
280 // von Polygonpunkten, ... wird immer auf allen eingeschalteten Fangalternativen
283 // Beim Verschieben markierter Objekte ist das etwas anders. Statt des einen
284 // Mauscursors gibt es hier 4 Alternativen an den markierten Objekten, die
285 // gefangen werden koennen:
286 // 1. die logisch-umschliessenden Rahmen der einzelnen Objekte
287 // 2. der logisch-umschliessende Rahmen aller markierten Objekte
288 // 3. ausgezeichnete Punkte der markierten Objekte (Polygonpunkte, ...)
289 // 4. die Konnektoren der markierten Objekte
290 // Da 1. und 2. einander ausschliessen (2. ist eine Verfeinerung von 1.)
291 // bleiben 3 voneinander unabhaengige Alternativen. Bei 6. Moeglichkeiten auf
292 // die gefangen werden kann kaeme man auf max. 18 Kombinationsmoeglichkeiten!
293 // Deshalb werden folgende Vereinfachungen festgelegt:
294 // 1. Konnektoren fangen sich nur auf Konnektoren.
295 // Verbleiben also nun noch max. 2x5+1=11 Fangkombinationen beim MoveDrag:
296 // 1-3. umschliessende(r) Rahmen auf Grid/Border/Hilfslinien
297 // 4. umschliessende(r) Rahmen auf ausgezeichnete Objektpunkte
298 // 5. umschliessende(r) Rahmen auf umschliessenden Rahmen
299 // 6-8. ausgezeichnete Punkte auf Grid/Border/Hilfslinien
300 // 7. ausgezeichnete Punkte auf ausgezeichnete Objektpunkte
301 // 8-10. ausgezeichnete Punkte auf umschliessenden Rahmen
302 // 11. Konnektoren auf Konnektoren
303 // Beim MouseMove-Event im DragMove werden also diese bis zu max. 11 moeglichen
304 // Alternativen durchgetestet und die mit dem gerigsten Korrekturaufwand
307 // Beim Resize, ... wird immer nur der logisch-umschliessende Rahmen der
308 // markierten Objekte gefangen.
310 ////////////////////////////////////////////////////////////////////////////////////////////////////
312 #endif // INCLUDED_SVX_SVDSNPV_HXX
314 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */