xref: /trunk/main/svx/inc/svx/svddrag.hxx (revision 3334a7e6)
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 _SVDDRAG_HXX
25 #define _SVDDRAG_HXX
26 
27 
28 #include <tools/contnr.hxx>
29 #include <tools/gen.hxx>
30 #include <tools/fract.hxx>
31 #include "svx/svxdllapi.h"
32 
33 // Statushalter fuer objektspeziefisches Draggen. Damit das Model
34 // Statusfrei bleibt werden die Statusdaten an der View gehalten
35 // und dem Objekt zu gegebener Zeit als Parameter uebergeben.
36 // Ausserdem auch Statushalter fuer den Vorgang der Interaktiven
37 // Objekterzeugung. pHdl ist in diesem Fall NULL.
38 class SdrHdl;
39 class SdrView;
40 class SdrPageView;
41 class SdrDragMethod;
42 
43 struct SVX_DLLPUBLIC SdrDragStatUserData
44 {
45 };
46 
47 class SVX_DLLPUBLIC SdrDragStat {
48 protected:
49 	SdrHdl*  pHdl;      // Der Handle an dem der User zottelt
50 	SdrView* pView;
51 	SdrPageView* pPageView;
52 	Container aPnts;    // Alle bisherigen Punkte: [0]=Start, [Count()-2]=Prev
53 	Point     aRef1;     // Referenzpunkt: Resize-Fixpunkt, (Drehachse,
54 	Point     aRef2;     // Spiegelachse, ...)
55 	Point     aPos0;     // Position beim letzten Event
56 	Point     aRealPos0; // Position beim letzten Event
57 	Point     aRealNow;  // Aktuelle Dragposition ohne Snap, Ortho und Limit
58 	Point     aRealLast; // RealPos des letzten Punkts (fuer MinMoved)
59 	Rectangle aActionRect;
60 
61 	// Reserve fuer kompatible Erweiterungen, die sonst inkompatibel wuerden.
62 	Point     aReservePoint1;
63 	Point     aReservePoint2;
64 	Point     aReservePoint3;
65 	Point     aReservePoint4;
66 	Rectangle aReserveRect1;
67 	Rectangle aReserveRect2;
68 	FASTBOOL  bEndDragChangesAttributes;
69 	FASTBOOL  bEndDragChangesGeoAndAttributes;
70 	FASTBOOL  bMouseIsUp;
71 	FASTBOOL  aReserveBool3;
72 	FASTBOOL  aReserveBool4;
73 	long      aReserveLong1;
74 	long      aReserveLong2;
75 	long      aReserveLong3;
76 	long      aReserveLong4;
77 	void*     aReservePtr1;
78 	void*     aReservePtr2;
79 	void*     aReservePtr3;
80 	void*     aReservePtr4;
81 
82 	FASTBOOL  bShown;    // Xor sichrbar?
83 	sal_uInt16    nMinMov;   // Soviel muss erstmal minimal bewegt werden
84 	FASTBOOL  bMinMoved; // MinMove durchbrochen?
85 
86 	FASTBOOL  bHorFixed; // nur Vertikal draggen
87 	FASTBOOL  bVerFixed; // nur Horizontal draggen
88 	FASTBOOL  bWantNoSnap; // sal_True=Fuer die Entscheidung ob fuer pObj->MovCreate() NoSnapPos verwendet
89 						  // werden soll. Entsprechend wird auch NoSnapPos in den Buffer geschrieben.
90 	FASTBOOL  bOrtho4;
91 	FASTBOOL  bOrtho8;
92 
93 	SdrDragMethod* pDragMethod;
94 
95 protected:
96 	void Clear(FASTBOOL bLeaveOne);
Pnt(sal_uIntPtr nNum)97 	Point& Pnt(sal_uIntPtr nNum)                           { return *((Point*)aPnts.GetObject(nNum)); }
98 //public:
99 	SdrDragStatUserData*    pUser;     // Userdata
100 public:
SdrDragStat()101 	SdrDragStat(): aPnts(1024,16,16)                 { pUser=NULL; Reset(); }
~SdrDragStat()102 	~SdrDragStat()                                   { Clear(sal_False); }
103 	void         Reset();
GetView() const104 	SdrView*     GetView() const                     { return pView; }
SetView(SdrView * pV)105 	void         SetView(SdrView* pV)                { pView=pV; }
GetPageView() const106 	SdrPageView* GetPageView() const                 { return pPageView; }
SetPageView(SdrPageView * pPV)107 	void         SetPageView(SdrPageView* pPV)       { pPageView=pPV; }
GetPoint(sal_uIntPtr nNum) const108 	const Point& GetPoint(sal_uIntPtr nNum) const          { return *((Point*)aPnts.GetObject(nNum)); }
GetPointAnz() const109 	sal_uIntPtr        GetPointAnz() const                 { return aPnts.Count(); }
GetStart() const110 	const Point& GetStart() const                    { return GetPoint(0); }
Start()111 	Point&       Start()                             { return Pnt(0); }
GetPrev() const112 	const Point& GetPrev() const                     { return GetPoint(GetPointAnz()-(GetPointAnz()>=2 ? 2:1)); }
Prev()113 	Point& Prev()                                    { return Pnt(GetPointAnz()-(GetPointAnz()>=2 ? 2:1)); }
GetPos0() const114 	const Point& GetPos0() const                     { return aPos0;  }
Pos0()115 	Point&       Pos0()                              { return aPos0;  }
GetNow() const116 	const Point& GetNow() const                      { return GetPoint(GetPointAnz()-1); }
Now()117 	Point&       Now()                               { return Pnt(GetPointAnz()-1); }
GetRealNow() const118 	const Point& GetRealNow() const                  { return aRealNow; }
RealNow()119 	Point&       RealNow()                           { return aRealNow; }
GetRef1() const120 	const Point& GetRef1() const                     { return aRef1;  }
Ref1()121 	Point&       Ref1()                              { return aRef1;  }
GetRef2() const122 	const Point& GetRef2() const                     { return aRef2;  }
Ref2()123 	Point&       Ref2()                              { return aRef2;  }
GetHdl() const124 	const        SdrHdl* GetHdl() const              { return pHdl;   }
SetHdl(SdrHdl * pH)125 	void         SetHdl(SdrHdl* pH)                  { pHdl=pH;       }
GetUser() const126 	SdrDragStatUserData* GetUser() const             { return pUser;  }
SetUser(SdrDragStatUserData * pU)127 	void SetUser(SdrDragStatUserData* pU)            { pUser=pU; }
IsShown() const128 	FASTBOOL     IsShown() const                     { return bShown; }
SetShown(FASTBOOL bOn)129 	void         SetShown(FASTBOOL bOn)              { bShown=bOn; }
130 
IsMinMoved() const131 	FASTBOOL     IsMinMoved() const                  { return bMinMoved; }
SetMinMoved()132 	void         SetMinMoved()                       { bMinMoved=sal_True; }
ResetMinMoved()133 	void         ResetMinMoved()                     { bMinMoved=sal_False; }
SetMinMove(sal_uInt16 nDist)134 	void         SetMinMove(sal_uInt16 nDist)            { nMinMov=nDist; if (nMinMov<1) nMinMov=1; }
GetMinMove() const135 	sal_uInt16       GetMinMove() const                  { return nMinMov; }
136 
IsHorFixed() const137 	FASTBOOL     IsHorFixed() const                  { return bHorFixed; }
SetHorFixed(FASTBOOL bOn)138 	void         SetHorFixed(FASTBOOL bOn)           { bHorFixed=bOn; }
IsVerFixed() const139 	FASTBOOL     IsVerFixed() const                  { return bVerFixed; }
SetVerFixed(FASTBOOL bOn)140 	void         SetVerFixed(FASTBOOL bOn)           { bVerFixed=bOn; }
141 
142 	// Hier kann das Obj sagen: "Ich will keinen Koordinatenfang!"
143 	// z.B. fuer den Winkel des Kreisbogen...
IsNoSnap() const144 	FASTBOOL     IsNoSnap() const                     { return bWantNoSnap; }
SetNoSnap(FASTBOOL bOn=sal_True)145 	void         SetNoSnap(FASTBOOL bOn=sal_True)         { bWantNoSnap=bOn; }
146 
147 	// Und hier kann das Obj sagen welches Ortho (wenn ueberhaupt eins)
148 	// sinnvoll auf ihm angewendet werden kann.
149 	// Ortho4 bedeutet Ortho in 4 Richtungen (fuer Rect und Cirt)
IsOrtho4Possible() const150 	FASTBOOL     IsOrtho4Possible() const             { return bOrtho4; }
SetOrtho4Possible(FASTBOOL bOn=sal_True)151 	void         SetOrtho4Possible(FASTBOOL bOn=sal_True) { bOrtho4=bOn; }
152 	// Ortho8 bedeutet Ortho in 8 Richtungen (fuer Linien)
IsOrtho8Possible() const153 	FASTBOOL     IsOrtho8Possible() const             { return bOrtho8; }
SetOrtho8Possible(FASTBOOL bOn=sal_True)154 	void         SetOrtho8Possible(FASTBOOL bOn=sal_True) { bOrtho8=bOn; }
155 
156 	// Wird vom gedraggten Objekt gesetzt
IsEndDragChangesAttributes() const157 	FASTBOOL     IsEndDragChangesAttributes() const   { return bEndDragChangesAttributes; }
SetEndDragChangesAttributes(FASTBOOL bOn)158 	void         SetEndDragChangesAttributes(FASTBOOL bOn) { bEndDragChangesAttributes=bOn; }
IsEndDragChangesGeoAndAttributes() const159 	FASTBOOL     IsEndDragChangesGeoAndAttributes() const   { return bEndDragChangesGeoAndAttributes; }
SetEndDragChangesGeoAndAttributes(FASTBOOL bOn)160 	void         SetEndDragChangesGeoAndAttributes(FASTBOOL bOn) { bEndDragChangesGeoAndAttributes=bOn; }
161 
162 	// Wird von der View gesetzt und kann vom Obj ausgewertet werden
IsMouseDown() const163 	FASTBOOL     IsMouseDown() const                  { return !bMouseIsUp; }
SetMouseDown(FASTBOOL bDown)164 	void         SetMouseDown(FASTBOOL bDown)         { bMouseIsUp=!bDown; }
165 
166 	Point KorregPos(const Point& rNow, const Point& rPrev) const;
167 	void  Reset(const Point& rPnt);
168 	void  NextMove(const Point& rPnt);
169 	void  NextPoint(FASTBOOL bSaveReal=sal_False);
170 	void  PrevPoint();
171 	FASTBOOL CheckMinMoved(const Point& rPnt);
GetDX() const172 	long  GetDX() const                     { return GetNow().X()-GetPrev().X(); }
GetDY() const173 	long  GetDY() const                     { return GetNow().Y()-GetPrev().Y(); }
174 	Fraction GetXFact() const;
175 	Fraction GetYFact() const;
176 
GetDragMethod() const177 	SdrDragMethod* GetDragMethod() const               { return pDragMethod; }
SetDragMethod(SdrDragMethod * pMth)178 	void           SetDragMethod(SdrDragMethod* pMth)  { pDragMethod=pMth; }
179 
GetActionRect() const180 	const Rectangle& GetActionRect() const             { return aActionRect; }
SetActionRect(const Rectangle & rR)181 	void             SetActionRect(const Rectangle& rR) { aActionRect=rR; }
182 
183 	// Unter Beruecksichtigung von 1stPointAsCenter
184 	void TakeCreateRect(Rectangle& rRect) const;
185 };
186 
187 #endif //_SVDDRAG_HXX
188 
189