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