xref: /aoo42x/main/svx/source/svdraw/svddrgv.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <svx/svddrgv.hxx>
32*cdf0e10cSrcweir #include "svx/xattr.hxx"
33*cdf0e10cSrcweir #include <svx/xpoly.hxx>
34*cdf0e10cSrcweir #include <svx/svdetc.hxx>
35*cdf0e10cSrcweir #include <svx/svdtrans.hxx>
36*cdf0e10cSrcweir #include <svx/svdundo.hxx>
37*cdf0e10cSrcweir #include <svx/svdocapt.hxx>
38*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
39*cdf0e10cSrcweir #include <svx/svdopath.hxx>
40*cdf0e10cSrcweir #include <svx/svdoedge.hxx>
41*cdf0e10cSrcweir #include "svx/svdstr.hrc"
42*cdf0e10cSrcweir #include "svx/svdglob.hxx"
43*cdf0e10cSrcweir #include "svddrgm1.hxx"
44*cdf0e10cSrcweir #include <svx/obj3d.hxx>
45*cdf0e10cSrcweir #include <svx/svdoashp.hxx>
46*cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
47*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygontools.hxx>
48*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
49*cdf0e10cSrcweir #include <svx/polypolygoneditor.hxx>
50*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
51*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx>
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir using namespace sdr;
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
56*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
57*cdf0e10cSrcweir //
58*cdf0e10cSrcweir //  @@@@@  @@@@@   @@@@   @@@@   @@ @@ @@ @@@@@ @@   @@
59*cdf0e10cSrcweir //  @@  @@ @@  @@ @@  @@ @@  @@  @@ @@ @@ @@    @@   @@
60*cdf0e10cSrcweir //  @@  @@ @@  @@ @@  @@ @@      @@ @@ @@ @@    @@ @ @@
61*cdf0e10cSrcweir //  @@  @@ @@@@@  @@@@@@ @@ @@@  @@@@@ @@ @@@@  @@@@@@@
62*cdf0e10cSrcweir //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@@@@@
63*cdf0e10cSrcweir //  @@  @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@ @@@
64*cdf0e10cSrcweir //  @@@@@  @@  @@ @@  @@  @@@@@    @   @@ @@@@@ @@   @@
65*cdf0e10cSrcweir //
66*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
67*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir void SdrDragView::ImpClearVars()
70*cdf0e10cSrcweir {
71*cdf0e10cSrcweir 	bFramDrag=sal_False;
72*cdf0e10cSrcweir 	eDragMode=SDRDRAG_MOVE;
73*cdf0e10cSrcweir 	bDragLimit=sal_False;
74*cdf0e10cSrcweir 	bMarkedHitMovesAlways=sal_False;
75*cdf0e10cSrcweir 	eDragHdl=HDL_MOVE;
76*cdf0e10cSrcweir 	pDragHdl=NULL;
77*cdf0e10cSrcweir 	bDragHdl=sal_False;
78*cdf0e10cSrcweir 	bDragSpecial=sal_False;
79*cdf0e10cSrcweir 	mpCurrentSdrDragMethod=NULL;
80*cdf0e10cSrcweir 	bDragStripes=sal_False;
81*cdf0e10cSrcweir 	bMirrRefDragObj=sal_True;
82*cdf0e10cSrcweir 	bDragWithCopy=sal_False;
83*cdf0e10cSrcweir 	pInsPointUndo=NULL;
84*cdf0e10cSrcweir 	bInsGluePoint=sal_False;
85*cdf0e10cSrcweir 	bInsObjPointMode=sal_False;
86*cdf0e10cSrcweir 	bInsGluePointMode=sal_False;
87*cdf0e10cSrcweir 	nDragXorPolyLimit=100;
88*cdf0e10cSrcweir 	nDragXorPointLimit=500;
89*cdf0e10cSrcweir 	bNoDragXorPolys=sal_False;
90*cdf0e10cSrcweir 	bAutoVertexCon=sal_True;
91*cdf0e10cSrcweir 	bAutoCornerCon=sal_False;
92*cdf0e10cSrcweir 	bRubberEdgeDragging=sal_True;
93*cdf0e10cSrcweir 	nRubberEdgeDraggingLimit=100;
94*cdf0e10cSrcweir 	bDetailedEdgeDragging=sal_True;
95*cdf0e10cSrcweir 	nDetailedEdgeDraggingLimit=10;
96*cdf0e10cSrcweir 	bResizeAtCenter=sal_False;
97*cdf0e10cSrcweir 	bCrookAtCenter=sal_False;
98*cdf0e10cSrcweir 	bMouseHideWhileDraggingPoints=sal_False;
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir 	// init using default
101*cdf0e10cSrcweir 	mbSolidDragging = getOptionsDrawinglayer().IsSolidDragCreate();
102*cdf0e10cSrcweir }
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir void SdrDragView::ImpMakeDragAttr()
105*cdf0e10cSrcweir {
106*cdf0e10cSrcweir 	ImpDelDragAttr();
107*cdf0e10cSrcweir }
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir SdrDragView::SdrDragView(SdrModel* pModel1, OutputDevice* pOut)
110*cdf0e10cSrcweir :	SdrExchangeView(pModel1,pOut)
111*cdf0e10cSrcweir {
112*cdf0e10cSrcweir 	ImpClearVars();
113*cdf0e10cSrcweir 	ImpMakeDragAttr();
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir SdrDragView::~SdrDragView()
117*cdf0e10cSrcweir {
118*cdf0e10cSrcweir 	ImpDelDragAttr();
119*cdf0e10cSrcweir }
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir void SdrDragView::ImpDelDragAttr()
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir }
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir sal_Bool SdrDragView::IsAction() const
126*cdf0e10cSrcweir {
127*cdf0e10cSrcweir 	return (mpCurrentSdrDragMethod || SdrExchangeView::IsAction());
128*cdf0e10cSrcweir }
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir void SdrDragView::MovAction(const Point& rPnt)
131*cdf0e10cSrcweir {
132*cdf0e10cSrcweir 	SdrExchangeView::MovAction(rPnt);
133*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod)
134*cdf0e10cSrcweir 	{
135*cdf0e10cSrcweir 		MovDragObj(rPnt);
136*cdf0e10cSrcweir 	}
137*cdf0e10cSrcweir }
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir void SdrDragView::EndAction()
140*cdf0e10cSrcweir {
141*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod)
142*cdf0e10cSrcweir 	{
143*cdf0e10cSrcweir 		EndDragObj(sal_False);
144*cdf0e10cSrcweir 	}
145*cdf0e10cSrcweir 	SdrExchangeView::EndAction();
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir void SdrDragView::BckAction()
149*cdf0e10cSrcweir {
150*cdf0e10cSrcweir 	SdrExchangeView::BckAction();
151*cdf0e10cSrcweir 	BrkDragObj();
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir void SdrDragView::BrkAction()
155*cdf0e10cSrcweir {
156*cdf0e10cSrcweir 	SdrExchangeView::BrkAction();
157*cdf0e10cSrcweir 	BrkDragObj();
158*cdf0e10cSrcweir }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir void SdrDragView::TakeActionRect(Rectangle& rRect) const
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod)
163*cdf0e10cSrcweir 	{
164*cdf0e10cSrcweir 		rRect=aDragStat.GetActionRect();
165*cdf0e10cSrcweir 		if (rRect.IsEmpty())
166*cdf0e10cSrcweir 		{
167*cdf0e10cSrcweir 			SdrPageView* pPV = GetSdrPageView();
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 			if(pPV&& pPV->HasMarkedObjPageView())
170*cdf0e10cSrcweir 			{
171*cdf0e10cSrcweir                 // #i95646# is this used..?
172*cdf0e10cSrcweir                 const basegfx::B2DRange aBoundRange(mpCurrentSdrDragMethod->getCurrentRange());
173*cdf0e10cSrcweir 				rRect = Rectangle(
174*cdf0e10cSrcweir                     basegfx::fround(aBoundRange.getMinX()), basegfx::fround(aBoundRange.getMinY()),
175*cdf0e10cSrcweir                     basegfx::fround(aBoundRange.getMaxX()), basegfx::fround(aBoundRange.getMaxY()));
176*cdf0e10cSrcweir 			}
177*cdf0e10cSrcweir 		}
178*cdf0e10cSrcweir 		if (rRect.IsEmpty())
179*cdf0e10cSrcweir 		{
180*cdf0e10cSrcweir 			rRect=Rectangle(aDragStat.GetNow(),aDragStat.GetNow());
181*cdf0e10cSrcweir 		}
182*cdf0e10cSrcweir 	}
183*cdf0e10cSrcweir 	else
184*cdf0e10cSrcweir 	{
185*cdf0e10cSrcweir 		SdrExchangeView::TakeActionRect(rRect);
186*cdf0e10cSrcweir 	}
187*cdf0e10cSrcweir }
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir sal_Bool SdrDragView::TakeDragObjAnchorPos(Point& rPos, sal_Bool bTR ) const
190*cdf0e10cSrcweir {
191*cdf0e10cSrcweir 	Rectangle aR;
192*cdf0e10cSrcweir 	TakeActionRect(aR);
193*cdf0e10cSrcweir 	rPos = bTR ? aR.TopRight() : aR.TopLeft();
194*cdf0e10cSrcweir 	if (GetMarkedObjectCount()==1 && IsDragObj() && // nur bei Einzelselektion
195*cdf0e10cSrcweir 		!IsDraggingPoints() && !IsDraggingGluePoints() && // nicht beim Punkteschieben
196*cdf0e10cSrcweir 		!mpCurrentSdrDragMethod->ISA(SdrDragMovHdl)) // nicht beim Handlesschieben
197*cdf0e10cSrcweir 	{
198*cdf0e10cSrcweir 		SdrObject* pObj=GetMarkedObjectByIndex(0);
199*cdf0e10cSrcweir 		if (pObj->ISA(SdrCaptionObj))
200*cdf0e10cSrcweir 		{
201*cdf0e10cSrcweir 			Point aPt(((SdrCaptionObj*)pObj)->GetTailPos());
202*cdf0e10cSrcweir 			sal_Bool bTail=eDragHdl==HDL_POLY; // Schwanz wird gedraggt (nicht so ganz feine Abfrage hier)
203*cdf0e10cSrcweir 			sal_Bool bOwn=mpCurrentSdrDragMethod->ISA(SdrDragObjOwn); // Objektspeziefisch
204*cdf0e10cSrcweir 			if (!bTail)
205*cdf0e10cSrcweir 			{ // bei bTail liefert TakeActionRect schon das richtige
206*cdf0e10cSrcweir 				if (bOwn)
207*cdf0e10cSrcweir 				{ // bOwn kann sein MoveTextFrame, ResizeTextFrame aber eben nicht mehr DragTail
208*cdf0e10cSrcweir 					rPos=aPt;
209*cdf0e10cSrcweir 				}
210*cdf0e10cSrcweir 				else
211*cdf0e10cSrcweir 				{
212*cdf0e10cSrcweir 					// drag the whole Object (Move, Resize, ...)
213*cdf0e10cSrcweir 					const basegfx::B2DPoint aTransformed(mpCurrentSdrDragMethod->getCurrentTransformation() * basegfx::B2DPoint(aPt.X(), aPt.Y()));
214*cdf0e10cSrcweir 					rPos.X() = basegfx::fround(aTransformed.getX());
215*cdf0e10cSrcweir 					rPos.Y() = basegfx::fround(aTransformed.getY());
216*cdf0e10cSrcweir 				}
217*cdf0e10cSrcweir 			}
218*cdf0e10cSrcweir 		}
219*cdf0e10cSrcweir 		return sal_True;
220*cdf0e10cSrcweir 	}
221*cdf0e10cSrcweir 	return sal_False;
222*cdf0e10cSrcweir }
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir sal_Bool SdrDragView::TakeDragLimit(SdrDragMode /*eMode*/, Rectangle& /*rRect*/) const
227*cdf0e10cSrcweir {
228*cdf0e10cSrcweir 	return sal_False;
229*cdf0e10cSrcweir }
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir sal_Bool SdrDragView::BegDragObj(const Point& rPnt, OutputDevice* pOut, SdrHdl* pHdl, short nMinMov, SdrDragMethod* pForcedMeth)
232*cdf0e10cSrcweir {
233*cdf0e10cSrcweir 	BrkAction();
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir 	bool bRet=false;
236*cdf0e10cSrcweir 	{
237*cdf0e10cSrcweir 		SetDragWithCopy(sal_False);
238*cdf0e10cSrcweir 		//ForceEdgesOfMarkedNodes();
239*cdf0e10cSrcweir 		//TODO: aAni.Reset();
240*cdf0e10cSrcweir 		mpCurrentSdrDragMethod=NULL;
241*cdf0e10cSrcweir 		bDragSpecial=sal_False;
242*cdf0e10cSrcweir 		bDragLimit=sal_False;
243*cdf0e10cSrcweir 		SdrDragMode eTmpMode=eDragMode;
244*cdf0e10cSrcweir 		if (eTmpMode==SDRDRAG_MOVE && pHdl!=NULL && pHdl->GetKind()!=HDL_MOVE) {
245*cdf0e10cSrcweir 			eTmpMode=SDRDRAG_RESIZE;
246*cdf0e10cSrcweir 		}
247*cdf0e10cSrcweir 		bDragLimit=TakeDragLimit(eTmpMode,aDragLimit);
248*cdf0e10cSrcweir 		bFramDrag=ImpIsFrameHandles();
249*cdf0e10cSrcweir 		if (!bFramDrag &&
250*cdf0e10cSrcweir 			(pMarkedObj==NULL || !pMarkedObj->hasSpecialDrag()) &&
251*cdf0e10cSrcweir 			(pHdl==NULL || pHdl->GetObj()==NULL)) {
252*cdf0e10cSrcweir 			bFramDrag=sal_True;
253*cdf0e10cSrcweir 		}
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir 		Point aPnt(rPnt);
256*cdf0e10cSrcweir 		if(pHdl == NULL
257*cdf0e10cSrcweir 			|| pHdl->GetKind() == HDL_MOVE
258*cdf0e10cSrcweir 			|| pHdl->GetKind() == HDL_MIRX
259*cdf0e10cSrcweir 			|| pHdl->GetKind() == HDL_TRNS
260*cdf0e10cSrcweir 			|| pHdl->GetKind() == HDL_GRAD)
261*cdf0e10cSrcweir 		{
262*cdf0e10cSrcweir 			aDragStat.Reset(aPnt);
263*cdf0e10cSrcweir 		}
264*cdf0e10cSrcweir 		else
265*cdf0e10cSrcweir 		{
266*cdf0e10cSrcweir 			aDragStat.Reset(pHdl->GetPos());
267*cdf0e10cSrcweir 		}
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir 		aDragStat.SetView((SdrView*)this);
270*cdf0e10cSrcweir 		aDragStat.SetPageView(pMarkedPV);  // <<-- hier muss die DragPV rein!!!
271*cdf0e10cSrcweir 		aDragStat.SetMinMove(ImpGetMinMovLogic(nMinMov,pOut));
272*cdf0e10cSrcweir 		aDragStat.SetHdl(pHdl);
273*cdf0e10cSrcweir 		aDragStat.NextPoint();
274*cdf0e10cSrcweir 		pDragWin=pOut;
275*cdf0e10cSrcweir 		pDragHdl=pHdl;
276*cdf0e10cSrcweir 		eDragHdl= pHdl==NULL ? HDL_MOVE : pHdl->GetKind();
277*cdf0e10cSrcweir 		bDragHdl=eDragHdl==HDL_REF1 || eDragHdl==HDL_REF2 || eDragHdl==HDL_MIRX;
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 		// #103894# Expand test for HDL_ANCHOR_TR
280*cdf0e10cSrcweir 		sal_Bool bNotDraggable = (HDL_ANCHOR == eDragHdl || HDL_ANCHOR_TR == eDragHdl);
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir 		if(pHdl && (pHdl->GetKind() == HDL_SMARTTAG) && pForcedMeth )
283*cdf0e10cSrcweir 		{
284*cdf0e10cSrcweir 			// just use the forced method for smart tags
285*cdf0e10cSrcweir 		}
286*cdf0e10cSrcweir 		else if(bDragHdl)
287*cdf0e10cSrcweir 		{
288*cdf0e10cSrcweir 			mpCurrentSdrDragMethod = new SdrDragMovHdl(*this);
289*cdf0e10cSrcweir 		}
290*cdf0e10cSrcweir 		else if(!bNotDraggable)
291*cdf0e10cSrcweir 		{
292*cdf0e10cSrcweir 			switch (eDragMode)
293*cdf0e10cSrcweir 			{
294*cdf0e10cSrcweir 				case SDRDRAG_ROTATE: case SDRDRAG_SHEAR: case SDRDRAG_DISTORT:
295*cdf0e10cSrcweir 				{
296*cdf0e10cSrcweir 					switch (eDragHdl)
297*cdf0e10cSrcweir 					{
298*cdf0e10cSrcweir 						case HDL_LEFT:  case HDL_RIGHT:
299*cdf0e10cSrcweir 						case HDL_UPPER: case HDL_LOWER:
300*cdf0e10cSrcweir 						{
301*cdf0e10cSrcweir 							// Sind 3D-Objekte selektiert?
302*cdf0e10cSrcweir 							sal_Bool b3DObjSelected = sal_False;
303*cdf0e10cSrcweir 							for(sal_uInt32 a=0;!b3DObjSelected && a<GetMarkedObjectCount();a++)
304*cdf0e10cSrcweir 							{
305*cdf0e10cSrcweir 								SdrObject* pObj = GetMarkedObjectByIndex(a);
306*cdf0e10cSrcweir 								if(pObj && pObj->ISA(E3dObject))
307*cdf0e10cSrcweir 									b3DObjSelected = sal_True;
308*cdf0e10cSrcweir 							}
309*cdf0e10cSrcweir 							// Falls ja, Shear auch bei !IsShearAllowed zulassen,
310*cdf0e10cSrcweir 							// da es sich bei 3D-Objekten um eingeschraenkte
311*cdf0e10cSrcweir 							// Rotationen handelt
312*cdf0e10cSrcweir 							if (!b3DObjSelected && !IsShearAllowed())
313*cdf0e10cSrcweir 								return sal_False;
314*cdf0e10cSrcweir 							mpCurrentSdrDragMethod = new SdrDragShear(*this,eDragMode==SDRDRAG_ROTATE);
315*cdf0e10cSrcweir 						} break;
316*cdf0e10cSrcweir 						case HDL_UPLFT: case HDL_UPRGT:
317*cdf0e10cSrcweir 						case HDL_LWLFT: case HDL_LWRGT:
318*cdf0e10cSrcweir 						{
319*cdf0e10cSrcweir 							if (eDragMode==SDRDRAG_SHEAR || eDragMode==SDRDRAG_DISTORT)
320*cdf0e10cSrcweir 							{
321*cdf0e10cSrcweir 								if (!IsDistortAllowed(sal_True) && !IsDistortAllowed(sal_False)) return sal_False;
322*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragDistort(*this);
323*cdf0e10cSrcweir 							}
324*cdf0e10cSrcweir 							else
325*cdf0e10cSrcweir 							{
326*cdf0e10cSrcweir 								if (!IsRotateAllowed(sal_True)) return sal_False;
327*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragRotate(*this);
328*cdf0e10cSrcweir 							}
329*cdf0e10cSrcweir 						} break;
330*cdf0e10cSrcweir 						default:
331*cdf0e10cSrcweir 						{
332*cdf0e10cSrcweir 							if (IsMarkedHitMovesAlways() && eDragHdl==HDL_MOVE)
333*cdf0e10cSrcweir 							{ // HDL_MOVE ist auch wenn Obj direkt getroffen
334*cdf0e10cSrcweir 								if (!IsMoveAllowed()) return sal_False;
335*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragMove(*this);
336*cdf0e10cSrcweir 							}
337*cdf0e10cSrcweir 							else
338*cdf0e10cSrcweir 							{
339*cdf0e10cSrcweir 								if (!IsRotateAllowed(sal_True)) return sal_False;
340*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragRotate(*this);
341*cdf0e10cSrcweir 							}
342*cdf0e10cSrcweir 						}
343*cdf0e10cSrcweir 					}
344*cdf0e10cSrcweir 				} break;
345*cdf0e10cSrcweir 				case SDRDRAG_MIRROR:
346*cdf0e10cSrcweir 				{
347*cdf0e10cSrcweir 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
348*cdf0e10cSrcweir 					{
349*cdf0e10cSrcweir 						if (!IsMoveAllowed()) return sal_False;
350*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
351*cdf0e10cSrcweir 					}
352*cdf0e10cSrcweir 					else
353*cdf0e10cSrcweir 					{
354*cdf0e10cSrcweir 						if (!IsMirrorAllowed(sal_True,sal_True)) return sal_False;
355*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMirror(*this);
356*cdf0e10cSrcweir 					}
357*cdf0e10cSrcweir 				} break;
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir 				case SDRDRAG_CROP:
360*cdf0e10cSrcweir 				{
361*cdf0e10cSrcweir 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
362*cdf0e10cSrcweir 					{
363*cdf0e10cSrcweir 						if (!IsMoveAllowed())
364*cdf0e10cSrcweir 							return sal_False;
365*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
366*cdf0e10cSrcweir 					}
367*cdf0e10cSrcweir 					else
368*cdf0e10cSrcweir 					{
369*cdf0e10cSrcweir 						if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False))
370*cdf0e10cSrcweir 							return sal_False;
371*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragCrop(*this);
372*cdf0e10cSrcweir 					}
373*cdf0e10cSrcweir 				}
374*cdf0e10cSrcweir 				break;
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir 				case SDRDRAG_TRANSPARENCE:
377*cdf0e10cSrcweir 				{
378*cdf0e10cSrcweir 					if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
379*cdf0e10cSrcweir 					{
380*cdf0e10cSrcweir 						if(!IsMoveAllowed())
381*cdf0e10cSrcweir 							return sal_False;
382*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
383*cdf0e10cSrcweir 					}
384*cdf0e10cSrcweir 					else
385*cdf0e10cSrcweir 					{
386*cdf0e10cSrcweir 						if(!IsTransparenceAllowed())
387*cdf0e10cSrcweir 							return sal_False;
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragGradient(*this, sal_False);
390*cdf0e10cSrcweir 					}
391*cdf0e10cSrcweir 					break;
392*cdf0e10cSrcweir 				}
393*cdf0e10cSrcweir 				case SDRDRAG_GRADIENT:
394*cdf0e10cSrcweir 				{
395*cdf0e10cSrcweir 					if(eDragHdl == HDL_MOVE && IsMarkedHitMovesAlways())
396*cdf0e10cSrcweir 					{
397*cdf0e10cSrcweir 						if(!IsMoveAllowed())
398*cdf0e10cSrcweir 							return sal_False;
399*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
400*cdf0e10cSrcweir 					}
401*cdf0e10cSrcweir 					else
402*cdf0e10cSrcweir 					{
403*cdf0e10cSrcweir 						if(!IsGradientAllowed())
404*cdf0e10cSrcweir 							return sal_False;
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragGradient(*this);
407*cdf0e10cSrcweir 					}
408*cdf0e10cSrcweir 					break;
409*cdf0e10cSrcweir 				}
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir 				case SDRDRAG_CROOK :
412*cdf0e10cSrcweir 				{
413*cdf0e10cSrcweir 					if (eDragHdl==HDL_MOVE && IsMarkedHitMovesAlways())
414*cdf0e10cSrcweir 					{
415*cdf0e10cSrcweir 						if (!IsMoveAllowed()) return sal_False;
416*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
417*cdf0e10cSrcweir 					}
418*cdf0e10cSrcweir 					else
419*cdf0e10cSrcweir 					{
420*cdf0e10cSrcweir 						if (!IsCrookAllowed(sal_True) && !IsCrookAllowed(sal_False)) return sal_False;
421*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragCrook(*this);
422*cdf0e10cSrcweir 					}
423*cdf0e10cSrcweir 				} break;
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir 				default:
426*cdf0e10cSrcweir 				{
427*cdf0e10cSrcweir 					// SDRDRAG_MOVE
428*cdf0e10cSrcweir 					if((eDragHdl == HDL_MOVE) && !IsMoveAllowed())
429*cdf0e10cSrcweir 					{
430*cdf0e10cSrcweir 						return sal_False;
431*cdf0e10cSrcweir 					}
432*cdf0e10cSrcweir 					else if(eDragHdl == HDL_GLUE)
433*cdf0e10cSrcweir 					{
434*cdf0e10cSrcweir 						mpCurrentSdrDragMethod = new SdrDragMove(*this);
435*cdf0e10cSrcweir 					}
436*cdf0e10cSrcweir 					else
437*cdf0e10cSrcweir 					{
438*cdf0e10cSrcweir 						if(bFramDrag)
439*cdf0e10cSrcweir 						{
440*cdf0e10cSrcweir 							if(eDragHdl == HDL_MOVE)
441*cdf0e10cSrcweir 							{
442*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragMove(*this);
443*cdf0e10cSrcweir 							}
444*cdf0e10cSrcweir 							else
445*cdf0e10cSrcweir 							{
446*cdf0e10cSrcweir 								if(!IsResizeAllowed(sal_True))
447*cdf0e10cSrcweir 								{
448*cdf0e10cSrcweir 									return sal_False;
449*cdf0e10cSrcweir 								}
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir 								sal_Bool bSingleTextObjMark = sal_False;	// SJ: #i100490#
452*cdf0e10cSrcweir 								if ( GetMarkedObjectCount() == 1 )
453*cdf0e10cSrcweir 								{
454*cdf0e10cSrcweir 									pMarkedObj=GetMarkedObjectByIndex(0);
455*cdf0e10cSrcweir 									if ( pMarkedObj &&
456*cdf0e10cSrcweir 										pMarkedObj->ISA( SdrTextObj ) &&
457*cdf0e10cSrcweir 										static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame() )
458*cdf0e10cSrcweir 										bSingleTextObjMark = sal_True;
459*cdf0e10cSrcweir 								}
460*cdf0e10cSrcweir 								if ( bSingleTextObjMark )
461*cdf0e10cSrcweir 									mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
462*cdf0e10cSrcweir 								else
463*cdf0e10cSrcweir 									mpCurrentSdrDragMethod = new SdrDragResize(*this);
464*cdf0e10cSrcweir 							}
465*cdf0e10cSrcweir 						}
466*cdf0e10cSrcweir 						else
467*cdf0e10cSrcweir 						{
468*cdf0e10cSrcweir 							if(HDL_MOVE == eDragHdl)
469*cdf0e10cSrcweir 							{
470*cdf0e10cSrcweir                                 const bool bCustomShapeSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrObjCustomShape));
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir                                 if(bCustomShapeSelected)
473*cdf0e10cSrcweir                                 {
474*cdf0e10cSrcweir     								mpCurrentSdrDragMethod = new SdrDragMove( *this );
475*cdf0e10cSrcweir                                 }
476*cdf0e10cSrcweir 							}
477*cdf0e10cSrcweir 							else if(HDL_POLY == eDragHdl)
478*cdf0e10cSrcweir                             {
479*cdf0e10cSrcweir                                 const bool bConnectorSelected(1 == GetMarkedObjectCount() && GetMarkedObjectByIndex(0)->ISA(SdrEdgeObj));
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir                                 if(bConnectorSelected)
482*cdf0e10cSrcweir                                 {
483*cdf0e10cSrcweir                                     // #i97784#
484*cdf0e10cSrcweir                                     // fallback to old behaviour for connectors (see
485*cdf0e10cSrcweir                                     // text in task description for more details)
486*cdf0e10cSrcweir                                 }
487*cdf0e10cSrcweir                                 else if(!IsMoveAllowed() || !IsResizeAllowed())
488*cdf0e10cSrcweir     							{
489*cdf0e10cSrcweir 	    							// #i77187#
490*cdf0e10cSrcweir                                     // do not allow move of polygon points if object is move or size protected
491*cdf0e10cSrcweir 		    						return sal_False;
492*cdf0e10cSrcweir                                 }
493*cdf0e10cSrcweir                             }
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir                             if(!mpCurrentSdrDragMethod)
496*cdf0e10cSrcweir                             {
497*cdf0e10cSrcweir                                 // fallback to DragSpecial if no interaction defined
498*cdf0e10cSrcweir                                 bDragSpecial = sal_True;
499*cdf0e10cSrcweir 								mpCurrentSdrDragMethod = new SdrDragObjOwn(*this);
500*cdf0e10cSrcweir 							}
501*cdf0e10cSrcweir 						}
502*cdf0e10cSrcweir 					}
503*cdf0e10cSrcweir 				}
504*cdf0e10cSrcweir 			}
505*cdf0e10cSrcweir 		}
506*cdf0e10cSrcweir 		if (pForcedMeth!=NULL)
507*cdf0e10cSrcweir 		{
508*cdf0e10cSrcweir             delete mpCurrentSdrDragMethod;
509*cdf0e10cSrcweir 			mpCurrentSdrDragMethod = pForcedMeth;
510*cdf0e10cSrcweir 		}
511*cdf0e10cSrcweir 		aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
512*cdf0e10cSrcweir 		if (mpCurrentSdrDragMethod)
513*cdf0e10cSrcweir 		{
514*cdf0e10cSrcweir 			bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
515*cdf0e10cSrcweir 			if (!bRet)
516*cdf0e10cSrcweir 			{
517*cdf0e10cSrcweir 				if (pHdl==NULL && IS_TYPE(SdrDragObjOwn,mpCurrentSdrDragMethod))
518*cdf0e10cSrcweir 				{
519*cdf0e10cSrcweir 					// Aha, Obj kann nicht Move SpecialDrag, also MoveFrameDrag versuchen
520*cdf0e10cSrcweir                     delete mpCurrentSdrDragMethod;
521*cdf0e10cSrcweir                     mpCurrentSdrDragMethod = 0;
522*cdf0e10cSrcweir 					bDragSpecial=sal_False;
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir                     if (!IsMoveAllowed())
525*cdf0e10cSrcweir                         return sal_False;
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir                     bFramDrag=sal_True;
528*cdf0e10cSrcweir 					mpCurrentSdrDragMethod = new SdrDragMove(*this);
529*cdf0e10cSrcweir 					aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
530*cdf0e10cSrcweir 					bRet = mpCurrentSdrDragMethod->BeginSdrDrag();
531*cdf0e10cSrcweir 				}
532*cdf0e10cSrcweir 			}
533*cdf0e10cSrcweir 			if (!bRet)
534*cdf0e10cSrcweir 			{
535*cdf0e10cSrcweir                 delete mpCurrentSdrDragMethod;
536*cdf0e10cSrcweir                 mpCurrentSdrDragMethod = 0;
537*cdf0e10cSrcweir 				aDragStat.SetDragMethod(mpCurrentSdrDragMethod);
538*cdf0e10cSrcweir 			}
539*cdf0e10cSrcweir 		}
540*cdf0e10cSrcweir 	}
541*cdf0e10cSrcweir 
542*cdf0e10cSrcweir 	return bRet;
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir void SdrDragView::MovDragObj(const Point& rPnt)
546*cdf0e10cSrcweir {
547*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod)
548*cdf0e10cSrcweir 	{
549*cdf0e10cSrcweir 		Point aPnt(rPnt);
550*cdf0e10cSrcweir 		ImpLimitToWorkArea(aPnt);
551*cdf0e10cSrcweir 		mpCurrentSdrDragMethod->MoveSdrDrag(aPnt); // this call already makes a Hide()/Show combination
552*cdf0e10cSrcweir 	}
553*cdf0e10cSrcweir }
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir sal_Bool SdrDragView::EndDragObj(sal_Bool bCopy)
556*cdf0e10cSrcweir {
557*cdf0e10cSrcweir 	bool bRet(false);
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir 	// #i73341# If insert GluePoint, do not insist on last points being different
560*cdf0e10cSrcweir 	if(mpCurrentSdrDragMethod && aDragStat.IsMinMoved() && (IsInsertGluePoint() || aDragStat.GetNow() != aDragStat.GetPrev()))
561*cdf0e10cSrcweir 	{
562*cdf0e10cSrcweir 		sal_uIntPtr nHdlAnzMerk=0;
563*cdf0e10cSrcweir 
564*cdf0e10cSrcweir 		if (bEliminatePolyPoints)
565*cdf0e10cSrcweir 		{ // IBM Special
566*cdf0e10cSrcweir 			nHdlAnzMerk=GetMarkablePointCount();
567*cdf0e10cSrcweir 		}
568*cdf0e10cSrcweir 
569*cdf0e10cSrcweir 		const bool bUndo = IsUndoEnabled();
570*cdf0e10cSrcweir         if (IsInsertGluePoint() && bUndo)
571*cdf0e10cSrcweir 		{
572*cdf0e10cSrcweir 			BegUndo(aInsPointUndoStr);
573*cdf0e10cSrcweir 			AddUndo(pInsPointUndo);
574*cdf0e10cSrcweir 		}
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir         bRet = mpCurrentSdrDragMethod->EndSdrDrag(bCopy);
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir         if( IsInsertGluePoint() && bUndo)
579*cdf0e10cSrcweir             EndUndo();
580*cdf0e10cSrcweir 
581*cdf0e10cSrcweir         delete mpCurrentSdrDragMethod;
582*cdf0e10cSrcweir         mpCurrentSdrDragMethod = 0;
583*cdf0e10cSrcweir 
584*cdf0e10cSrcweir         if (bEliminatePolyPoints)
585*cdf0e10cSrcweir 		{ // IBM Special
586*cdf0e10cSrcweir 			if (nHdlAnzMerk!=GetMarkablePointCount())
587*cdf0e10cSrcweir 			{
588*cdf0e10cSrcweir 				UnmarkAllPoints();
589*cdf0e10cSrcweir 			}
590*cdf0e10cSrcweir 		}
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir         if (bInsPolyPoint)
593*cdf0e10cSrcweir 		{
594*cdf0e10cSrcweir 			SetMarkHandles();
595*cdf0e10cSrcweir 			bInsPolyPoint=sal_False;
596*cdf0e10cSrcweir 			if( bUndo )
597*cdf0e10cSrcweir 			{
598*cdf0e10cSrcweir 				BegUndo(aInsPointUndoStr);
599*cdf0e10cSrcweir 				AddUndo(pInsPointUndo);
600*cdf0e10cSrcweir 				EndUndo();
601*cdf0e10cSrcweir 			}
602*cdf0e10cSrcweir 		}
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir 		eDragHdl=HDL_MOVE;
605*cdf0e10cSrcweir 		pDragHdl=NULL;
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir 		if (!bSomeObjChgdFlag)
608*cdf0e10cSrcweir 		{
609*cdf0e10cSrcweir 			// Aha, Obj hat nicht gebroadcastet (z.B. Writer FlyFrames)
610*cdf0e10cSrcweir 			if(!bDragHdl)
611*cdf0e10cSrcweir 			{
612*cdf0e10cSrcweir 				AdjustMarkHdl();
613*cdf0e10cSrcweir 			}
614*cdf0e10cSrcweir 		}
615*cdf0e10cSrcweir 	}
616*cdf0e10cSrcweir 	else
617*cdf0e10cSrcweir 	{
618*cdf0e10cSrcweir 		BrkDragObj();
619*cdf0e10cSrcweir 	}
620*cdf0e10cSrcweir 
621*cdf0e10cSrcweir     bInsPolyPoint=sal_False;
622*cdf0e10cSrcweir 	SetInsertGluePoint(sal_False);
623*cdf0e10cSrcweir 
624*cdf0e10cSrcweir 	return bRet;
625*cdf0e10cSrcweir }
626*cdf0e10cSrcweir 
627*cdf0e10cSrcweir void SdrDragView::BrkDragObj()
628*cdf0e10cSrcweir {
629*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod)
630*cdf0e10cSrcweir 	{
631*cdf0e10cSrcweir 		mpCurrentSdrDragMethod->CancelSdrDrag();
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir         delete mpCurrentSdrDragMethod;
634*cdf0e10cSrcweir         mpCurrentSdrDragMethod = 0;
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir         if (bInsPolyPoint)
637*cdf0e10cSrcweir 		{
638*cdf0e10cSrcweir 			pInsPointUndo->Undo(); // Den eingefuegten Punkt wieder raus
639*cdf0e10cSrcweir 			delete pInsPointUndo;
640*cdf0e10cSrcweir 			pInsPointUndo=NULL;
641*cdf0e10cSrcweir 			SetMarkHandles();
642*cdf0e10cSrcweir 			bInsPolyPoint=sal_False;
643*cdf0e10cSrcweir 		}
644*cdf0e10cSrcweir 
645*cdf0e10cSrcweir         if (IsInsertGluePoint())
646*cdf0e10cSrcweir 		{
647*cdf0e10cSrcweir 			pInsPointUndo->Undo(); // Den eingefuegten Klebepunkt wieder raus
648*cdf0e10cSrcweir 			delete pInsPointUndo;
649*cdf0e10cSrcweir 			pInsPointUndo=NULL;
650*cdf0e10cSrcweir 			SetInsertGluePoint(sal_False);
651*cdf0e10cSrcweir 		}
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir         eDragHdl=HDL_MOVE;
654*cdf0e10cSrcweir 		pDragHdl=NULL;
655*cdf0e10cSrcweir 	}
656*cdf0e10cSrcweir }
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir sal_Bool SdrDragView::IsInsObjPointPossible() const
659*cdf0e10cSrcweir {
660*cdf0e10cSrcweir 	return pMarkedObj!=NULL && pMarkedObj->IsPolyObj();
661*cdf0e10cSrcweir }
662*cdf0e10cSrcweir 
663*cdf0e10cSrcweir sal_Bool SdrDragView::ImpBegInsObjPoint(sal_Bool bIdxZwang, sal_uInt32 nIdx, const Point& rPnt, sal_Bool bNewObj, OutputDevice* pOut)
664*cdf0e10cSrcweir {
665*cdf0e10cSrcweir 	sal_Bool bRet(sal_False);
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir 	if(pMarkedObj && pMarkedObj->ISA(SdrPathObj))
668*cdf0e10cSrcweir 	{
669*cdf0e10cSrcweir 		SdrPathObj* pMarkedPath = (SdrPathObj*)pMarkedObj;
670*cdf0e10cSrcweir 		BrkAction();
671*cdf0e10cSrcweir 		pInsPointUndo = dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pMarkedObj) );
672*cdf0e10cSrcweir 		DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir 		XubString aStr(ImpGetResStr(STR_DragInsertPoint));
675*cdf0e10cSrcweir 		XubString aName;
676*cdf0e10cSrcweir         pMarkedObj->TakeObjNameSingul(aName);
677*cdf0e10cSrcweir 		xub_StrLen nPos(aStr.SearchAscii("%1"));
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir 		if(STRING_NOTFOUND != nPos)
680*cdf0e10cSrcweir 		{
681*cdf0e10cSrcweir 			aStr.Erase(nPos, 2);
682*cdf0e10cSrcweir 			aStr.Insert(aName, nPos);
683*cdf0e10cSrcweir 		}
684*cdf0e10cSrcweir 
685*cdf0e10cSrcweir 		aInsPointUndoStr = aStr;
686*cdf0e10cSrcweir 		Point aPt(rPnt);
687*cdf0e10cSrcweir 
688*cdf0e10cSrcweir 		if(bNewObj)
689*cdf0e10cSrcweir 			aPt = GetSnapPos(aPt,pMarkedPV);
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir 		sal_Bool bClosed0(pMarkedPath->IsClosedObj());
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir 		if(bIdxZwang)
694*cdf0e10cSrcweir 		{
695*cdf0e10cSrcweir 			mnInsPointNum = pMarkedPath->NbcInsPoint(nIdx, aPt, bNewObj, sal_True);
696*cdf0e10cSrcweir 		}
697*cdf0e10cSrcweir 		else
698*cdf0e10cSrcweir 		{
699*cdf0e10cSrcweir 			mnInsPointNum = pMarkedPath->NbcInsPointOld(aPt, bNewObj, sal_True);
700*cdf0e10cSrcweir 		}
701*cdf0e10cSrcweir 
702*cdf0e10cSrcweir 		if(bClosed0 != pMarkedPath->IsClosedObj())
703*cdf0e10cSrcweir 		{
704*cdf0e10cSrcweir 			// Obj was closed implicit
705*cdf0e10cSrcweir 			// object changed
706*cdf0e10cSrcweir 			pMarkedPath->SetChanged();
707*cdf0e10cSrcweir 			pMarkedPath->BroadcastObjectChange();
708*cdf0e10cSrcweir 		}
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir 		if(0xffffffff != mnInsPointNum)
711*cdf0e10cSrcweir 		{
712*cdf0e10cSrcweir 			bInsPolyPoint = sal_True;
713*cdf0e10cSrcweir 			UnmarkAllPoints();
714*cdf0e10cSrcweir 			AdjustMarkHdl();
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir 			bRet = BegDragObj(rPnt, pOut, aHdl.GetHdl(mnInsPointNum), 0);
717*cdf0e10cSrcweir 
718*cdf0e10cSrcweir 			if (bRet)
719*cdf0e10cSrcweir 			{
720*cdf0e10cSrcweir 				aDragStat.SetMinMoved();
721*cdf0e10cSrcweir 				MovDragObj(rPnt);
722*cdf0e10cSrcweir 			}
723*cdf0e10cSrcweir 		}
724*cdf0e10cSrcweir 		else
725*cdf0e10cSrcweir 		{
726*cdf0e10cSrcweir 			delete pInsPointUndo;
727*cdf0e10cSrcweir 			pInsPointUndo = NULL;
728*cdf0e10cSrcweir 		}
729*cdf0e10cSrcweir 	}
730*cdf0e10cSrcweir 
731*cdf0e10cSrcweir 	return bRet;
732*cdf0e10cSrcweir }
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir sal_Bool SdrDragView::EndInsObjPoint(SdrCreateCmd eCmd)
735*cdf0e10cSrcweir {
736*cdf0e10cSrcweir 	if(IsInsObjPoint())
737*cdf0e10cSrcweir 	{
738*cdf0e10cSrcweir 		sal_uInt32 nNextPnt(mnInsPointNum);
739*cdf0e10cSrcweir 		Point aPnt(aDragStat.GetNow());
740*cdf0e10cSrcweir 		sal_Bool bOk=EndDragObj(sal_False);
741*cdf0e10cSrcweir 		if (bOk==sal_True && eCmd!=SDRCREATE_FORCEEND)
742*cdf0e10cSrcweir 		{
743*cdf0e10cSrcweir 			// Ret=True bedeutet: Action ist vorbei.
744*cdf0e10cSrcweir 			bOk=!(ImpBegInsObjPoint(sal_True, nNextPnt, aPnt, eCmd == SDRCREATE_NEXTOBJECT, pDragWin));
745*cdf0e10cSrcweir 		}
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir 		return bOk;
748*cdf0e10cSrcweir 	} else return sal_False;
749*cdf0e10cSrcweir }
750*cdf0e10cSrcweir 
751*cdf0e10cSrcweir sal_Bool SdrDragView::IsInsGluePointPossible() const
752*cdf0e10cSrcweir {
753*cdf0e10cSrcweir 	sal_Bool bRet=sal_False;
754*cdf0e10cSrcweir 	if (IsInsGluePointMode() && AreObjectsMarked())
755*cdf0e10cSrcweir 	{
756*cdf0e10cSrcweir 		if (GetMarkedObjectCount()==1)
757*cdf0e10cSrcweir 		{
758*cdf0e10cSrcweir 			// sal_False liefern, wenn 1 Objekt und dieses ein Verbinder ist.
759*cdf0e10cSrcweir 			const SdrObject* pObj=GetMarkedObjectByIndex(0);
760*cdf0e10cSrcweir 			if (!HAS_BASE(SdrEdgeObj,pObj))
761*cdf0e10cSrcweir 			{
762*cdf0e10cSrcweir 			   bRet=sal_True;
763*cdf0e10cSrcweir 			}
764*cdf0e10cSrcweir 		}
765*cdf0e10cSrcweir 		else
766*cdf0e10cSrcweir 		{
767*cdf0e10cSrcweir 			bRet=sal_True;
768*cdf0e10cSrcweir 		}
769*cdf0e10cSrcweir 	}
770*cdf0e10cSrcweir 	return bRet;
771*cdf0e10cSrcweir }
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir sal_Bool SdrDragView::BegInsGluePoint(const Point& rPnt)
774*cdf0e10cSrcweir {
775*cdf0e10cSrcweir 	sal_Bool bRet=sal_False;
776*cdf0e10cSrcweir 	SdrObject* pObj;
777*cdf0e10cSrcweir 	SdrPageView* pPV;
778*cdf0e10cSrcweir 	sal_uIntPtr nMarkNum;
779*cdf0e10cSrcweir 	if (PickMarkedObj(rPnt,pObj,pPV,&nMarkNum,SDRSEARCH_PASS2BOUND))
780*cdf0e10cSrcweir 	{
781*cdf0e10cSrcweir 		BrkAction();
782*cdf0e10cSrcweir 		UnmarkAllGluePoints();
783*cdf0e10cSrcweir 		pInsPointUndo= dynamic_cast< SdrUndoGeoObj* >( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj) );
784*cdf0e10cSrcweir 		DBG_ASSERT( pInsPointUndo, "svx::SdrDragView::BegInsObjPoint(), could not create correct undo object!" );
785*cdf0e10cSrcweir 		XubString aStr(ImpGetResStr(STR_DragInsertGluePoint));
786*cdf0e10cSrcweir 		XubString aName; pObj->TakeObjNameSingul(aName);
787*cdf0e10cSrcweir 
788*cdf0e10cSrcweir 		aStr.SearchAndReplaceAscii("%1", aName);
789*cdf0e10cSrcweir 
790*cdf0e10cSrcweir 		aInsPointUndoStr=aStr;
791*cdf0e10cSrcweir 		SdrGluePointList* pGPL=pObj->ForceGluePointList();
792*cdf0e10cSrcweir 		if (pGPL!=NULL)
793*cdf0e10cSrcweir 		{
794*cdf0e10cSrcweir 			sal_uInt16 nGlueIdx=pGPL->Insert(SdrGluePoint());
795*cdf0e10cSrcweir 			SdrGluePoint& rGP=(*pGPL)[nGlueIdx];
796*cdf0e10cSrcweir 			sal_uInt16 nGlueId=rGP.GetId();
797*cdf0e10cSrcweir 			rGP.SetAbsolutePos(rPnt,*pObj);
798*cdf0e10cSrcweir 
799*cdf0e10cSrcweir 			SdrHdl* pHdl=NULL;
800*cdf0e10cSrcweir 			if (MarkGluePoint(pObj,nGlueId,pPV))
801*cdf0e10cSrcweir 			{
802*cdf0e10cSrcweir 				pHdl=GetGluePointHdl(pObj,nGlueId);
803*cdf0e10cSrcweir 			}
804*cdf0e10cSrcweir 			if (pHdl!=NULL && pHdl->GetKind()==HDL_GLUE && pHdl->GetObj()==pObj && pHdl->GetObjHdlNum()==nGlueId)
805*cdf0e10cSrcweir 			{
806*cdf0e10cSrcweir 				SetInsertGluePoint(sal_True);
807*cdf0e10cSrcweir 				bRet=BegDragObj(rPnt,NULL,pHdl,0);
808*cdf0e10cSrcweir 				if (bRet)
809*cdf0e10cSrcweir 				{
810*cdf0e10cSrcweir 					aDragStat.SetMinMoved();
811*cdf0e10cSrcweir 					MovDragObj(rPnt);
812*cdf0e10cSrcweir 				}
813*cdf0e10cSrcweir 				else
814*cdf0e10cSrcweir 				{
815*cdf0e10cSrcweir 					SetInsertGluePoint(sal_False);
816*cdf0e10cSrcweir 					delete pInsPointUndo;
817*cdf0e10cSrcweir 					pInsPointUndo=NULL;
818*cdf0e10cSrcweir 				}
819*cdf0e10cSrcweir 			}
820*cdf0e10cSrcweir 			else
821*cdf0e10cSrcweir 			{
822*cdf0e10cSrcweir 				DBG_ERROR("BegInsGluePoint(): GluePoint-Handle nicht gefunden");
823*cdf0e10cSrcweir 			}
824*cdf0e10cSrcweir 		}
825*cdf0e10cSrcweir 		else
826*cdf0e10cSrcweir 		{
827*cdf0e10cSrcweir 			// Keine Klebepunkte moeglich bei diesem Objekt (z.B. Edge)
828*cdf0e10cSrcweir 			SetInsertGluePoint(sal_False);
829*cdf0e10cSrcweir 			delete pInsPointUndo;
830*cdf0e10cSrcweir 			pInsPointUndo=NULL;
831*cdf0e10cSrcweir 		}
832*cdf0e10cSrcweir 	}
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir 	return bRet;
835*cdf0e10cSrcweir }
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir void SdrDragView::ShowDragObj()
838*cdf0e10cSrcweir {
839*cdf0e10cSrcweir 	if(mpCurrentSdrDragMethod && !aDragStat.IsShown())
840*cdf0e10cSrcweir 	{
841*cdf0e10cSrcweir         for(sal_uInt32 a(0); a < PaintWindowCount(); a++)
842*cdf0e10cSrcweir         {
843*cdf0e10cSrcweir 	        SdrPaintWindow* pCandidate = GetPaintWindow(a);
844*cdf0e10cSrcweir 	        sdr::overlay::OverlayManager* pOverlayManager = pCandidate->GetOverlayManager();
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir 	        if(pOverlayManager)
847*cdf0e10cSrcweir 	        {
848*cdf0e10cSrcweir 		        mpCurrentSdrDragMethod->CreateOverlayGeometry(*pOverlayManager);
849*cdf0e10cSrcweir 
850*cdf0e10cSrcweir 				// #i101679# Force changed overlay to be shown
851*cdf0e10cSrcweir 				pOverlayManager->flush();
852*cdf0e10cSrcweir 	        }
853*cdf0e10cSrcweir         }
854*cdf0e10cSrcweir 
855*cdf0e10cSrcweir 		aDragStat.SetShown(sal_True);
856*cdf0e10cSrcweir 	}
857*cdf0e10cSrcweir }
858*cdf0e10cSrcweir 
859*cdf0e10cSrcweir void SdrDragView::HideDragObj()
860*cdf0e10cSrcweir {
861*cdf0e10cSrcweir 	if(mpCurrentSdrDragMethod && aDragStat.IsShown())
862*cdf0e10cSrcweir 	{
863*cdf0e10cSrcweir         mpCurrentSdrDragMethod->destroyOverlayGeometry();
864*cdf0e10cSrcweir 		aDragStat.SetShown(sal_False);
865*cdf0e10cSrcweir 	}
866*cdf0e10cSrcweir }
867*cdf0e10cSrcweir 
868*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
869*cdf0e10cSrcweir 
870*cdf0e10cSrcweir void SdrDragView::SetNoDragXorPolys(sal_Bool bOn)
871*cdf0e10cSrcweir {
872*cdf0e10cSrcweir 	if (IsNoDragXorPolys()!=bOn)
873*cdf0e10cSrcweir 	{
874*cdf0e10cSrcweir 		const bool bDragging(mpCurrentSdrDragMethod);
875*cdf0e10cSrcweir 		const bool bShown(bDragging && aDragStat.IsShown());
876*cdf0e10cSrcweir 
877*cdf0e10cSrcweir         if(bShown)
878*cdf0e10cSrcweir         {
879*cdf0e10cSrcweir             HideDragObj();
880*cdf0e10cSrcweir         }
881*cdf0e10cSrcweir 
882*cdf0e10cSrcweir 		bNoDragXorPolys = bOn;
883*cdf0e10cSrcweir 
884*cdf0e10cSrcweir 		if(bDragging)
885*cdf0e10cSrcweir 		{
886*cdf0e10cSrcweir             // force recreation of drag content
887*cdf0e10cSrcweir             mpCurrentSdrDragMethod->resetSdrDragEntries();
888*cdf0e10cSrcweir 		}
889*cdf0e10cSrcweir 
890*cdf0e10cSrcweir 		if(bShown)
891*cdf0e10cSrcweir         {
892*cdf0e10cSrcweir 			ShowDragObj();
893*cdf0e10cSrcweir         }
894*cdf0e10cSrcweir 	}
895*cdf0e10cSrcweir }
896*cdf0e10cSrcweir 
897*cdf0e10cSrcweir void SdrDragView::SetDragStripes(sal_Bool bOn)
898*cdf0e10cSrcweir {
899*cdf0e10cSrcweir 	if (mpCurrentSdrDragMethod && aDragStat.IsShown())
900*cdf0e10cSrcweir 	{
901*cdf0e10cSrcweir 		HideDragObj();
902*cdf0e10cSrcweir 		bDragStripes=bOn;
903*cdf0e10cSrcweir 		ShowDragObj();
904*cdf0e10cSrcweir 	}
905*cdf0e10cSrcweir 	else
906*cdf0e10cSrcweir 	{
907*cdf0e10cSrcweir 		bDragStripes=bOn;
908*cdf0e10cSrcweir 	}
909*cdf0e10cSrcweir }
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir sal_Bool SdrDragView::IsOrthoDesired() const
912*cdf0e10cSrcweir {
913*cdf0e10cSrcweir 	if(mpCurrentSdrDragMethod && (IS_TYPE(SdrDragObjOwn, mpCurrentSdrDragMethod) || IS_TYPE(SdrDragResize, mpCurrentSdrDragMethod)))
914*cdf0e10cSrcweir 	{
915*cdf0e10cSrcweir 		return bOrthoDesiredOnMarked;
916*cdf0e10cSrcweir 	}
917*cdf0e10cSrcweir 
918*cdf0e10cSrcweir     return sal_False;
919*cdf0e10cSrcweir }
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
922*cdf0e10cSrcweir 
923*cdf0e10cSrcweir void SdrDragView::SetRubberEdgeDragging(sal_Bool bOn)
924*cdf0e10cSrcweir {
925*cdf0e10cSrcweir 	if (bOn!=IsRubberEdgeDragging())
926*cdf0e10cSrcweir 	{
927*cdf0e10cSrcweir 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
928*cdf0e10cSrcweir 		sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
929*cdf0e10cSrcweir 				 (nRubberEdgeDraggingLimit>=nAnz);
930*cdf0e10cSrcweir 		if (bShowHide)
931*cdf0e10cSrcweir 			HideDragObj();
932*cdf0e10cSrcweir 		bRubberEdgeDragging=bOn;
933*cdf0e10cSrcweir 		if (bShowHide)
934*cdf0e10cSrcweir 			ShowDragObj();
935*cdf0e10cSrcweir 	}
936*cdf0e10cSrcweir }
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir void SdrDragView::SetRubberEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
939*cdf0e10cSrcweir {
940*cdf0e10cSrcweir 	if (nEdgeObjAnz!=nRubberEdgeDraggingLimit)
941*cdf0e10cSrcweir 	{
942*cdf0e10cSrcweir 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
943*cdf0e10cSrcweir 		sal_Bool bShowHide=IsRubberEdgeDragging() && nAnz!=0 && IsDragObj() &&
944*cdf0e10cSrcweir 				 (nEdgeObjAnz>=nAnz)!=(nRubberEdgeDraggingLimit>=nAnz);
945*cdf0e10cSrcweir 		if (bShowHide)
946*cdf0e10cSrcweir 			HideDragObj();
947*cdf0e10cSrcweir 		nRubberEdgeDraggingLimit=nEdgeObjAnz;
948*cdf0e10cSrcweir 		if (bShowHide)
949*cdf0e10cSrcweir 			ShowDragObj();
950*cdf0e10cSrcweir 	}
951*cdf0e10cSrcweir }
952*cdf0e10cSrcweir 
953*cdf0e10cSrcweir void SdrDragView::SetDetailedEdgeDragging(sal_Bool bOn)
954*cdf0e10cSrcweir {
955*cdf0e10cSrcweir 	if (bOn!=IsDetailedEdgeDragging())
956*cdf0e10cSrcweir 	{
957*cdf0e10cSrcweir 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
958*cdf0e10cSrcweir 		sal_Bool bShowHide=nAnz!=0 && IsDragObj() &&
959*cdf0e10cSrcweir 				 (nDetailedEdgeDraggingLimit>=nAnz);
960*cdf0e10cSrcweir 		if (bShowHide)
961*cdf0e10cSrcweir 			HideDragObj();
962*cdf0e10cSrcweir 		bDetailedEdgeDragging=bOn;
963*cdf0e10cSrcweir 		if (bShowHide)
964*cdf0e10cSrcweir 			ShowDragObj();
965*cdf0e10cSrcweir 	}
966*cdf0e10cSrcweir }
967*cdf0e10cSrcweir 
968*cdf0e10cSrcweir void SdrDragView::SetDetailedEdgeDraggingLimit(sal_uInt16 nEdgeObjAnz)
969*cdf0e10cSrcweir {
970*cdf0e10cSrcweir 	if (nEdgeObjAnz!=nDetailedEdgeDraggingLimit)
971*cdf0e10cSrcweir 	{
972*cdf0e10cSrcweir 		sal_uIntPtr nAnz = GetEdgesOfMarkedNodes().GetMarkCount();
973*cdf0e10cSrcweir 		sal_Bool bShowHide=IsDetailedEdgeDragging() && nAnz!=0 && IsDragObj() &&
974*cdf0e10cSrcweir 				 (nEdgeObjAnz>=nAnz)!=(nDetailedEdgeDraggingLimit>=nAnz);
975*cdf0e10cSrcweir 		if (bShowHide)
976*cdf0e10cSrcweir 			HideDragObj();
977*cdf0e10cSrcweir 		nDetailedEdgeDraggingLimit=nEdgeObjAnz;
978*cdf0e10cSrcweir 		if (bShowHide)
979*cdf0e10cSrcweir 			ShowDragObj();
980*cdf0e10cSrcweir 	}
981*cdf0e10cSrcweir }
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir void SdrDragView::SetMarkHandles()
984*cdf0e10cSrcweir {
985*cdf0e10cSrcweir 	if( pDragHdl )
986*cdf0e10cSrcweir 		pDragHdl = 0;
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir 	SdrExchangeView::SetMarkHandles();
989*cdf0e10cSrcweir }
990*cdf0e10cSrcweir 
991*cdf0e10cSrcweir void SdrDragView::SetSolidDragging(bool bOn)
992*cdf0e10cSrcweir {
993*cdf0e10cSrcweir 	if((bool)mbSolidDragging != bOn)
994*cdf0e10cSrcweir 	{
995*cdf0e10cSrcweir 		mbSolidDragging = bOn;
996*cdf0e10cSrcweir 	}
997*cdf0e10cSrcweir }
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir bool SdrDragView::IsSolidDragging() const
1000*cdf0e10cSrcweir {
1001*cdf0e10cSrcweir 	// allow each user to disable by having a local setting, but using AND for
1002*cdf0e10cSrcweir 	// checking allowance
1003*cdf0e10cSrcweir 	return mbSolidDragging && getOptionsDrawinglayer().IsSolidDragCreate();
1004*cdf0e10cSrcweir }
1005*cdf0e10cSrcweir 
1006*cdf0e10cSrcweir // eof
1007