xref: /AOO41X/main/svx/inc/svx/svddrag.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 _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