xref: /trunk/main/svx/source/svdraw/svddrag.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 #include <svx/svdview.hxx>
31 #include <svx/svddrag.hxx>
32 
33 void SdrDragStat::Clear(FASTBOOL bLeaveOne)
34 {
35     void* pP=aPnts.First();
36     while (pP!=NULL) {
37         delete (Point*)pP;
38         pP=aPnts.Next();
39     }
40     if (pUser!=NULL) delete pUser;
41     pUser=NULL;
42     aPnts.Clear();
43     if (bLeaveOne) {
44         aPnts.Insert(new Point,CONTAINER_APPEND);
45     }
46 }
47 
48 void SdrDragStat::Reset()
49 {
50     pView=NULL;
51     pPageView=NULL;
52     bShown=sal_False;
53     nMinMov=1;
54     bMinMoved=sal_False;
55     bHorFixed=sal_False;
56     bVerFixed=sal_False;
57     bWantNoSnap=sal_False;
58     pHdl=NULL;
59     bOrtho4=sal_False;
60     bOrtho8=sal_False;
61     pDragMethod=NULL;
62     bEndDragChangesAttributes=sal_False;
63     bEndDragChangesGeoAndAttributes=sal_False;
64     bMouseIsUp=sal_False;
65     Clear(sal_True);
66     aActionRect=Rectangle();
67 }
68 
69 void SdrDragStat::Reset(const Point& rPnt)
70 {
71     Reset();
72     Start()=rPnt;
73     aPos0=rPnt;
74     aRealPos0=rPnt;
75     RealNow()=rPnt;
76 }
77 
78 void SdrDragStat::NextMove(const Point& rPnt)
79 {
80     aRealPos0=GetRealNow();
81     aPos0=GetNow();
82     RealNow()=rPnt;
83     Point aBla=KorregPos(GetRealNow(),GetPrev());
84     Now()=aBla;
85 }
86 
87 void SdrDragStat::NextPoint(FASTBOOL bSaveReal)
88 {
89     Point aPnt(GetNow());
90     if (bSaveReal) aPnt=aRealNow;
91     aPnts.Insert(new Point(KorregPos(GetRealNow(),aPnt)),CONTAINER_APPEND);
92     Prev()=aPnt;
93 }
94 
95 void SdrDragStat::PrevPoint()
96 {
97     if (aPnts.Count()>=2) { // einer muss immer da bleiben
98         Point* pPnt=(Point*)(aPnts.GetObject(aPnts.Count()-2));
99         aPnts.Remove(aPnts.Count()-2);
100         delete pPnt;
101         Now()=KorregPos(GetRealNow(),GetPrev());
102     }
103 }
104 
105 Point SdrDragStat::KorregPos(const Point& rNow, const Point& /*rPrev*/) const
106 {
107     Point aRet(rNow);
108     return aRet;
109 }
110 
111 FASTBOOL SdrDragStat::CheckMinMoved(const Point& rPnt)
112 {
113     if (!bMinMoved) {
114         long dx=rPnt.X()-GetPrev().X(); if (dx<0) dx=-dx;
115         long dy=rPnt.Y()-GetPrev().Y(); if (dy<0) dy=-dy;
116         if (dx>=long(nMinMov) || dy>=long(nMinMov))
117             bMinMoved=sal_True;
118     }
119     return bMinMoved;
120 }
121 
122 Fraction SdrDragStat::GetXFact() const
123 {
124     long nMul=GetNow().X()-aRef1.X();
125     long nDiv=GetPrev().X()-aRef1.X();
126     if (nDiv==0) nDiv=1;
127     if (bHorFixed) { nMul=1; nDiv=1; }
128     return Fraction(nMul,nDiv);
129 }
130 
131 Fraction SdrDragStat::GetYFact() const
132 {
133     long nMul=GetNow().Y()-aRef1.Y();
134     long nDiv=GetPrev().Y()-aRef1.Y();
135     if (nDiv==0) nDiv=1;
136     if (bVerFixed) { nMul=1; nDiv=1; }
137     return Fraction(nMul,nDiv);
138 }
139 
140 void SdrDragStat::TakeCreateRect(Rectangle& rRect) const
141 {
142     rRect=Rectangle(GetStart(),GetNow());
143     if (GetPointAnz()>=2) {
144         Point aBtmRgt(GetPoint(1));
145         rRect.Right()=aBtmRgt.X();
146         rRect.Bottom()=aBtmRgt.Y();
147     }
148     if (pView!=NULL && pView->IsCreate1stPointAsCenter()) {
149         rRect.Top()+=rRect.Top()-rRect.Bottom();
150         rRect.Left()+=rRect.Left()-rRect.Right();
151     }
152 }
153 
154