xref: /AOO41X/main/svx/source/svdraw/svdmrkv.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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/svdmrkv.hxx>
32*cdf0e10cSrcweir #include <svx/svdetc.hxx>
33*cdf0e10cSrcweir #include <svx/svdoedge.hxx>
34*cdf0e10cSrcweir #include "svx/svdglob.hxx"
35*cdf0e10cSrcweir #include "svx/svditext.hxx"
36*cdf0e10cSrcweir #include <svx/svdview.hxx>
37*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
38*cdf0e10cSrcweir #include <svx/svdpage.hxx>
39*cdf0e10cSrcweir #include "svddrgm1.hxx"
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #ifdef DBG_UTIL
42*cdf0e10cSrcweir #include <svdibrow.hxx>
43*cdf0e10cSrcweir #endif
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir #include <svx/svdoole2.hxx>
46*cdf0e10cSrcweir #include <svx/xgrad.hxx>
47*cdf0e10cSrcweir #include <svx/xflgrit.hxx>
48*cdf0e10cSrcweir #include "gradtrns.hxx"
49*cdf0e10cSrcweir #include <svx/xflftrit.hxx>
50*cdf0e10cSrcweir #include <svx/dialmgr.hxx>
51*cdf0e10cSrcweir #include "svx/svdstr.hrc"
52*cdf0e10cSrcweir #include <svx/svdundo.hxx>
53*cdf0e10cSrcweir #include <svx/svdopath.hxx>
54*cdf0e10cSrcweir #include <svx/scene3d.hxx>
55*cdf0e10cSrcweir #include <svx/svdovirt.hxx>
56*cdf0e10cSrcweir #include <svx/sdr/overlay/overlayrollingrectangle.hxx>
57*cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx>
58*cdf0e10cSrcweir #include <svx/sdrpaintwindow.hxx>
59*cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx>
60*cdf0e10cSrcweir #include <svx/sdrhittesthelper.hxx>
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
63*cdf0e10cSrcweir // predefines
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir class SdrUnoControlList;
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
68*cdf0e10cSrcweir // #114409#-3 Migrate Marking of Objects, Points and GluePoints
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir class ImplMarkingOverlay
71*cdf0e10cSrcweir {
72*cdf0e10cSrcweir 	// The OverlayObjects
73*cdf0e10cSrcweir 	::sdr::overlay::OverlayObjectList				maObjects;
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir 	// The remembered second position in logical coodinates
76*cdf0e10cSrcweir 	basegfx::B2DPoint								maSecondPosition;
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 	// bitfield
79*cdf0e10cSrcweir 	// A flag to remember if the action is for unmarking.
80*cdf0e10cSrcweir 	unsigned										mbUnmarking : 1;
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir public:
83*cdf0e10cSrcweir 	ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, sal_Bool bUnmarking = sal_False);
84*cdf0e10cSrcweir 	~ImplMarkingOverlay();
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir 	void SetSecondPosition(const basegfx::B2DPoint& rNewPosition);
87*cdf0e10cSrcweir 	sal_Bool IsUnmarking() const { return mbUnmarking; }
88*cdf0e10cSrcweir };
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir ImplMarkingOverlay::ImplMarkingOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos, sal_Bool bUnmarking)
91*cdf0e10cSrcweir :	maSecondPosition(rStartPos),
92*cdf0e10cSrcweir 	mbUnmarking(bUnmarking)
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir 	for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
95*cdf0e10cSrcweir 	{
96*cdf0e10cSrcweir 		SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
97*cdf0e10cSrcweir 		::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 		if(pTargetOverlay)
100*cdf0e10cSrcweir 		{
101*cdf0e10cSrcweir 			::sdr::overlay::OverlayRollingRectangleStriped* pNew = new ::sdr::overlay::OverlayRollingRectangleStriped(
102*cdf0e10cSrcweir 				rStartPos, rStartPos, false);
103*cdf0e10cSrcweir 			pTargetOverlay->add(*pNew);
104*cdf0e10cSrcweir 			maObjects.append(*pNew);
105*cdf0e10cSrcweir 		}
106*cdf0e10cSrcweir 	}
107*cdf0e10cSrcweir }
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir ImplMarkingOverlay::~ImplMarkingOverlay()
110*cdf0e10cSrcweir {
111*cdf0e10cSrcweir 	// The OverlayObjects are cleared using the destructor of OverlayObjectList.
112*cdf0e10cSrcweir 	// That destructor calls clear() at the list which removes all objects from the
113*cdf0e10cSrcweir 	// OverlayManager and deletes them.
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir void ImplMarkingOverlay::SetSecondPosition(const basegfx::B2DPoint& rNewPosition)
117*cdf0e10cSrcweir {
118*cdf0e10cSrcweir 	if(rNewPosition != maSecondPosition)
119*cdf0e10cSrcweir 	{
120*cdf0e10cSrcweir 		// apply to OverlayObjects
121*cdf0e10cSrcweir 		for(sal_uInt32 a(0L); a < maObjects.count(); a++)
122*cdf0e10cSrcweir 		{
123*cdf0e10cSrcweir 			::sdr::overlay::OverlayRollingRectangleStriped& rCandidate = (::sdr::overlay::OverlayRollingRectangleStriped&)maObjects.getOverlayObject(a);
124*cdf0e10cSrcweir 			rCandidate.setSecondPosition(rNewPosition);
125*cdf0e10cSrcweir 		}
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir 		// remember new position
128*cdf0e10cSrcweir 		maSecondPosition = rNewPosition;
129*cdf0e10cSrcweir 	}
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
133*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
134*cdf0e10cSrcweir //
135*cdf0e10cSrcweir //  @@   @@  @@@@  @@@@@  @@  @@  @@ @@ @@ @@@@@ @@   @@
136*cdf0e10cSrcweir //  @@@ @@@ @@  @@ @@  @@ @@  @@  @@ @@ @@ @@    @@   @@
137*cdf0e10cSrcweir //  @@@@@@@ @@  @@ @@  @@ @@ @@   @@ @@ @@ @@    @@ @ @@
138*cdf0e10cSrcweir //  @@@@@@@ @@@@@@ @@@@@  @@@@    @@@@@ @@ @@@@  @@@@@@@
139*cdf0e10cSrcweir //  @@ @ @@ @@  @@ @@  @@ @@ @@    @@@  @@ @@    @@@@@@@
140*cdf0e10cSrcweir //  @@   @@ @@  @@ @@  @@ @@  @@   @@@  @@ @@    @@@ @@@
141*cdf0e10cSrcweir //  @@   @@ @@  @@ @@  @@ @@  @@    @   @@ @@@@@ @@   @@
142*cdf0e10cSrcweir //
143*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
144*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir void SdrMarkView::ImpClearVars()
147*cdf0e10cSrcweir {
148*cdf0e10cSrcweir 	eDragMode=SDRDRAG_MOVE;
149*cdf0e10cSrcweir 	//HMHbHdlShown=sal_False;
150*cdf0e10cSrcweir 	bRefHdlShownOnly=sal_False;
151*cdf0e10cSrcweir 	eEditMode=SDREDITMODE_EDIT;
152*cdf0e10cSrcweir 	eEditMode0=SDREDITMODE_EDIT;
153*cdf0e10cSrcweir 	bDesignMode=sal_False;
154*cdf0e10cSrcweir 	pMarkedObj=NULL;
155*cdf0e10cSrcweir 	pMarkedPV=NULL;
156*cdf0e10cSrcweir 	bForceFrameHandles=sal_False;
157*cdf0e10cSrcweir 	bPlusHdlAlways=sal_False;
158*cdf0e10cSrcweir 	nFrameHandlesLimit=50;
159*cdf0e10cSrcweir 	bInsPolyPoint=sal_False;
160*cdf0e10cSrcweir 	mnInsPointNum = 0L;
161*cdf0e10cSrcweir 	bMarkedObjRectDirty=sal_False;
162*cdf0e10cSrcweir 	bMarkedPointsRectsDirty=sal_False;
163*cdf0e10cSrcweir 	mbMarkHandlesHidden = false;
164*cdf0e10cSrcweir 	bMrkPntDirty=sal_False;
165*cdf0e10cSrcweir 	bMarkHdlWhenTextEdit=sal_False;
166*cdf0e10cSrcweir 	bMarkableObjCountDirty=sal_False; // noch nicht implementiert
167*cdf0e10cSrcweir 	nMarkableObjCount=0;          // noch nicht implementiert
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	// #114409#-3 Migrate selections
170*cdf0e10cSrcweir 	BrkMarkObj();
171*cdf0e10cSrcweir 	BrkMarkPoints();
172*cdf0e10cSrcweir 	BrkMarkGluePoints();
173*cdf0e10cSrcweir }
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir SdrMarkView::SdrMarkView(SdrModel* pModel1, OutputDevice* pOut)
176*cdf0e10cSrcweir :	SdrSnapView(pModel1,pOut),
177*cdf0e10cSrcweir 	mpMarkObjOverlay(0L),
178*cdf0e10cSrcweir 	mpMarkPointsOverlay(0L),
179*cdf0e10cSrcweir 	mpMarkGluePointsOverlay(0L),
180*cdf0e10cSrcweir 	aHdl(this),
181*cdf0e10cSrcweir 	mpSdrViewSelection(new sdr::ViewSelection())
182*cdf0e10cSrcweir {
183*cdf0e10cSrcweir 	ImpClearVars();
184*cdf0e10cSrcweir 	StartListening(*pModel1);
185*cdf0e10cSrcweir }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir SdrMarkView::~SdrMarkView()
188*cdf0e10cSrcweir {
189*cdf0e10cSrcweir 	// #114409#-3 Migrate selections
190*cdf0e10cSrcweir 	BrkMarkObj();
191*cdf0e10cSrcweir 	BrkMarkPoints();
192*cdf0e10cSrcweir 	BrkMarkGluePoints();
193*cdf0e10cSrcweir 	delete mpSdrViewSelection;
194*cdf0e10cSrcweir }
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir void __EXPORT SdrMarkView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
197*cdf0e10cSrcweir {
198*cdf0e10cSrcweir 	SdrHint* pSdrHint=PTR_CAST(SdrHint,&rHint);
199*cdf0e10cSrcweir 	if (pSdrHint!=NULL)
200*cdf0e10cSrcweir 	{
201*cdf0e10cSrcweir 		SdrHintKind eKind=pSdrHint->GetKind();
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir 		if (eKind==HINT_OBJCHG || eKind==HINT_OBJINSERTED || eKind==HINT_OBJREMOVED)
204*cdf0e10cSrcweir 		{
205*cdf0e10cSrcweir 			bMarkedObjRectDirty=sal_True;
206*cdf0e10cSrcweir 			bMarkedPointsRectsDirty=sal_True;
207*cdf0e10cSrcweir 		}
208*cdf0e10cSrcweir /* removed for now since this breaks existing code who iterates over the mark list and sequentially replaces objects
209*cdf0e10cSrcweir 		if( eKind==HINT_OBJREMOVED && IsObjMarked( const_cast<SdrObject*>(pSdrHint->GetObject()) ) )
210*cdf0e10cSrcweir 		{
211*cdf0e10cSrcweir 			MarkObj( const_cast<SdrObject*>(pSdrHint->GetObject()), GetSdrPageView(), sal_True );
212*cdf0e10cSrcweir 		}
213*cdf0e10cSrcweir */
214*cdf0e10cSrcweir 	}
215*cdf0e10cSrcweir 	SdrSnapView::Notify(rBC,rHint);
216*cdf0e10cSrcweir }
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir void SdrMarkView::ModelHasChanged()
219*cdf0e10cSrcweir {
220*cdf0e10cSrcweir 	SdrPaintView::ModelHasChanged();
221*cdf0e10cSrcweir 	GetMarkedObjectListWriteAccess().SetNameDirty();
222*cdf0e10cSrcweir 	bMarkedObjRectDirty=sal_True;
223*cdf0e10cSrcweir 	bMarkedPointsRectsDirty=sal_True;
224*cdf0e10cSrcweir 	// Es sind beispielsweise Obj markiert und maMarkedObjectListist Sorted.
225*cdf0e10cSrcweir 	// In einer anderen View 2 wird die ObjOrder veraendert
226*cdf0e10cSrcweir 	// (z.B. MovToTop()). Dann ist Neusortieren der MarkList erforderlich.
227*cdf0e10cSrcweir 	GetMarkedObjectListWriteAccess().SetUnsorted();
228*cdf0e10cSrcweir 	SortMarkedObjects();
229*cdf0e10cSrcweir 	bMrkPntDirty=sal_True;
230*cdf0e10cSrcweir 	UndirtyMrkPnt();
231*cdf0e10cSrcweir 	SdrView* pV=(SdrView*)this;
232*cdf0e10cSrcweir 	if (pV!=NULL && !pV->IsDragObj() && !pV->IsInsObjPoint()) { // an dieser Stelle habe ich ein ziemliches Problem !!!
233*cdf0e10cSrcweir 		AdjustMarkHdl();
234*cdf0e10cSrcweir 	}
235*cdf0e10cSrcweir }
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir sal_Bool SdrMarkView::IsAction() const
240*cdf0e10cSrcweir {
241*cdf0e10cSrcweir 	return SdrSnapView::IsAction() || IsMarkObj() || IsMarkPoints() || IsMarkGluePoints();
242*cdf0e10cSrcweir }
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir void SdrMarkView::MovAction(const Point& rPnt)
245*cdf0e10cSrcweir {
246*cdf0e10cSrcweir 	SdrSnapView::MovAction(rPnt);
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 	if(IsMarkObj())
249*cdf0e10cSrcweir 	{
250*cdf0e10cSrcweir 		MovMarkObj(rPnt);
251*cdf0e10cSrcweir 	}
252*cdf0e10cSrcweir 	else if(IsMarkPoints())
253*cdf0e10cSrcweir 	{
254*cdf0e10cSrcweir 		MovMarkPoints(rPnt);
255*cdf0e10cSrcweir 	}
256*cdf0e10cSrcweir 	else if(IsMarkGluePoints())
257*cdf0e10cSrcweir 	{
258*cdf0e10cSrcweir 		MovMarkGluePoints(rPnt);
259*cdf0e10cSrcweir 	}
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir void SdrMarkView::EndAction()
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir 	if(IsMarkObj())
265*cdf0e10cSrcweir 	{
266*cdf0e10cSrcweir 		EndMarkObj();
267*cdf0e10cSrcweir 	}
268*cdf0e10cSrcweir 	else if(IsMarkPoints())
269*cdf0e10cSrcweir 	{
270*cdf0e10cSrcweir 		EndMarkPoints();
271*cdf0e10cSrcweir 	}
272*cdf0e10cSrcweir 	else if(IsMarkGluePoints())
273*cdf0e10cSrcweir 	{
274*cdf0e10cSrcweir 		EndMarkGluePoints();
275*cdf0e10cSrcweir 	}
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir 	SdrSnapView::EndAction();
278*cdf0e10cSrcweir }
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir void SdrMarkView::BckAction()
281*cdf0e10cSrcweir {
282*cdf0e10cSrcweir 	SdrSnapView::BckAction();
283*cdf0e10cSrcweir 	BrkMarkObj();
284*cdf0e10cSrcweir 	BrkMarkPoints();
285*cdf0e10cSrcweir 	BrkMarkGluePoints();
286*cdf0e10cSrcweir }
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir void SdrMarkView::BrkAction()
289*cdf0e10cSrcweir {
290*cdf0e10cSrcweir 	SdrSnapView::BrkAction();
291*cdf0e10cSrcweir 	BrkMarkObj();
292*cdf0e10cSrcweir 	BrkMarkPoints();
293*cdf0e10cSrcweir 	BrkMarkGluePoints();
294*cdf0e10cSrcweir }
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir void SdrMarkView::TakeActionRect(Rectangle& rRect) const
297*cdf0e10cSrcweir {
298*cdf0e10cSrcweir 	if(IsMarkObj() || IsMarkPoints() || IsMarkGluePoints())
299*cdf0e10cSrcweir 	{
300*cdf0e10cSrcweir 		rRect = Rectangle(aDragStat.GetStart(), aDragStat.GetNow());
301*cdf0e10cSrcweir 	}
302*cdf0e10cSrcweir 	else
303*cdf0e10cSrcweir 	{
304*cdf0e10cSrcweir 		SdrSnapView::TakeActionRect(rRect);
305*cdf0e10cSrcweir 	}
306*cdf0e10cSrcweir }
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir void SdrMarkView::ClearPageView()
311*cdf0e10cSrcweir {
312*cdf0e10cSrcweir 	UnmarkAllObj();
313*cdf0e10cSrcweir 	SdrSnapView::ClearPageView();
314*cdf0e10cSrcweir }
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir void SdrMarkView::HideSdrPage()
317*cdf0e10cSrcweir {
318*cdf0e10cSrcweir 	bool bMrkChg(false);
319*cdf0e10cSrcweir 	//HMHbool bVis(false);
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir 	if(mpPageView)
322*cdf0e10cSrcweir 	{
323*cdf0e10cSrcweir 		// break all creation actions when hiding page (#75081#)
324*cdf0e10cSrcweir 		BrkAction();
325*cdf0e10cSrcweir 		//HMHbVis = IsMarkHdlShown();
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir 		//HMHif(bVis)
328*cdf0e10cSrcweir 		//HMH{
329*cdf0e10cSrcweir 		//HMH	HideMarkHdl();
330*cdf0e10cSrcweir 		//HMH}
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir 		// Alle Markierungen dieser Seite verwerfen
333*cdf0e10cSrcweir 		bMrkChg = GetMarkedObjectListWriteAccess().DeletePageView(*mpPageView);
334*cdf0e10cSrcweir 	}
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir 	SdrSnapView::HideSdrPage();
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir 	if(bMrkChg)
339*cdf0e10cSrcweir 	{
340*cdf0e10cSrcweir 		MarkListHasChanged();
341*cdf0e10cSrcweir 		AdjustMarkHdl();
342*cdf0e10cSrcweir 	}
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 	//HMHif(bVis)
345*cdf0e10cSrcweir 	//HMH{
346*cdf0e10cSrcweir 	//HMH	ShowMarkHdl();
347*cdf0e10cSrcweir 	//HMH}
348*cdf0e10cSrcweir }
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkObj(const Point& rPnt, sal_Bool bUnmark)
353*cdf0e10cSrcweir {
354*cdf0e10cSrcweir 	BrkAction();
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 	DBG_ASSERT(0L == mpMarkObjOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkObjOverlay (!)");
357*cdf0e10cSrcweir 	basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
358*cdf0e10cSrcweir 	mpMarkObjOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir 	aDragStat.Reset(rPnt);
361*cdf0e10cSrcweir 	aDragStat.NextPoint();
362*cdf0e10cSrcweir 	aDragStat.SetMinMove(nMinMovLog);
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir 	return sal_True;
365*cdf0e10cSrcweir }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir void SdrMarkView::MovMarkObj(const Point& rPnt)
368*cdf0e10cSrcweir {
369*cdf0e10cSrcweir 	if(IsMarkObj() && aDragStat.CheckMinMoved(rPnt))
370*cdf0e10cSrcweir 	{
371*cdf0e10cSrcweir 		aDragStat.NextMove(rPnt);
372*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
373*cdf0e10cSrcweir 		basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
374*cdf0e10cSrcweir 		mpMarkObjOverlay->SetSecondPosition(aNewPos);
375*cdf0e10cSrcweir 	}
376*cdf0e10cSrcweir }
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkObj()
379*cdf0e10cSrcweir {
380*cdf0e10cSrcweir 	sal_Bool bRetval(sal_False);
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir 	if(IsMarkObj())
383*cdf0e10cSrcweir 	{
384*cdf0e10cSrcweir 		if(aDragStat.IsMinMoved())
385*cdf0e10cSrcweir 		{
386*cdf0e10cSrcweir 			Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow());
387*cdf0e10cSrcweir 			aRect.Justify();
388*cdf0e10cSrcweir 			MarkObj(aRect, mpMarkObjOverlay->IsUnmarking());
389*cdf0e10cSrcweir 			bRetval = sal_True;
390*cdf0e10cSrcweir 		}
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 		// cleanup
393*cdf0e10cSrcweir 		BrkMarkObj();
394*cdf0e10cSrcweir 	}
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir 	return bRetval;
397*cdf0e10cSrcweir }
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir void SdrMarkView::BrkMarkObj()
400*cdf0e10cSrcweir {
401*cdf0e10cSrcweir 	if(IsMarkObj())
402*cdf0e10cSrcweir 	{
403*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkObjOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
404*cdf0e10cSrcweir 		delete mpMarkObjOverlay;
405*cdf0e10cSrcweir 		mpMarkObjOverlay = 0L;
406*cdf0e10cSrcweir 	}
407*cdf0e10cSrcweir }
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkPoints(const Point& rPnt, sal_Bool bUnmark)
412*cdf0e10cSrcweir {
413*cdf0e10cSrcweir 	if(HasMarkablePoints())
414*cdf0e10cSrcweir 	{
415*cdf0e10cSrcweir 		BrkAction();
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir 		DBG_ASSERT(0L == mpMarkPointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkPointsOverlay (!)");
418*cdf0e10cSrcweir 		basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
419*cdf0e10cSrcweir 		mpMarkPointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir 		aDragStat.Reset(rPnt);
422*cdf0e10cSrcweir 		aDragStat.NextPoint();
423*cdf0e10cSrcweir 		aDragStat.SetMinMove(nMinMovLog);
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir 		return sal_True;
426*cdf0e10cSrcweir 	}
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir 	return sal_False;
429*cdf0e10cSrcweir }
430*cdf0e10cSrcweir 
431*cdf0e10cSrcweir void SdrMarkView::MovMarkPoints(const Point& rPnt)
432*cdf0e10cSrcweir {
433*cdf0e10cSrcweir 	if(IsMarkPoints() && aDragStat.CheckMinMoved(rPnt))
434*cdf0e10cSrcweir 	{
435*cdf0e10cSrcweir 		aDragStat.NextMove(rPnt);
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
438*cdf0e10cSrcweir 		basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
439*cdf0e10cSrcweir 		mpMarkPointsOverlay->SetSecondPosition(aNewPos);
440*cdf0e10cSrcweir 	}
441*cdf0e10cSrcweir }
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkPoints()
444*cdf0e10cSrcweir {
445*cdf0e10cSrcweir 	sal_Bool bRetval(sal_False);
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 	if(IsMarkPoints())
448*cdf0e10cSrcweir 	{
449*cdf0e10cSrcweir 		if(aDragStat.IsMinMoved())
450*cdf0e10cSrcweir 		{
451*cdf0e10cSrcweir 			Rectangle aRect(aDragStat.GetStart(), aDragStat.GetNow());
452*cdf0e10cSrcweir 			aRect.Justify();
453*cdf0e10cSrcweir 			MarkPoints(aRect, mpMarkPointsOverlay->IsUnmarking());
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 			bRetval = sal_True;
456*cdf0e10cSrcweir 		}
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir 		// cleanup
459*cdf0e10cSrcweir 		BrkMarkPoints();
460*cdf0e10cSrcweir 	}
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir 	return bRetval;
463*cdf0e10cSrcweir }
464*cdf0e10cSrcweir 
465*cdf0e10cSrcweir void SdrMarkView::BrkMarkPoints()
466*cdf0e10cSrcweir {
467*cdf0e10cSrcweir 	if(IsMarkPoints())
468*cdf0e10cSrcweir 	{
469*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkPointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
470*cdf0e10cSrcweir 		delete mpMarkPointsOverlay;
471*cdf0e10cSrcweir 		mpMarkPointsOverlay = 0L;
472*cdf0e10cSrcweir 	}
473*cdf0e10cSrcweir }
474*cdf0e10cSrcweir 
475*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir sal_Bool SdrMarkView::BegMarkGluePoints(const Point& rPnt, sal_Bool bUnmark)
478*cdf0e10cSrcweir {
479*cdf0e10cSrcweir 	if(HasMarkableGluePoints())
480*cdf0e10cSrcweir 	{
481*cdf0e10cSrcweir 		BrkAction();
482*cdf0e10cSrcweir 
483*cdf0e10cSrcweir 		DBG_ASSERT(0L == mpMarkGluePointsOverlay, "SdrMarkView::BegMarkObj: There exists a mpMarkGluePointsOverlay (!)");
484*cdf0e10cSrcweir 		basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
485*cdf0e10cSrcweir 		mpMarkGluePointsOverlay = new ImplMarkingOverlay(*this, aStartPos, bUnmark);
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir 		aDragStat.Reset(rPnt);
488*cdf0e10cSrcweir 		aDragStat.NextPoint();
489*cdf0e10cSrcweir 		aDragStat.SetMinMove(nMinMovLog);
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir 		return sal_True;
492*cdf0e10cSrcweir 	}
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir 	return sal_False;
495*cdf0e10cSrcweir }
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir void SdrMarkView::MovMarkGluePoints(const Point& rPnt)
498*cdf0e10cSrcweir {
499*cdf0e10cSrcweir 	if(IsMarkGluePoints() && aDragStat.CheckMinMoved(rPnt))
500*cdf0e10cSrcweir 	{
501*cdf0e10cSrcweir 		aDragStat.NextMove(rPnt);
502*cdf0e10cSrcweir 
503*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
504*cdf0e10cSrcweir 		basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
505*cdf0e10cSrcweir 		mpMarkGluePointsOverlay->SetSecondPosition(aNewPos);
506*cdf0e10cSrcweir 	}
507*cdf0e10cSrcweir }
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir sal_Bool SdrMarkView::EndMarkGluePoints()
510*cdf0e10cSrcweir {
511*cdf0e10cSrcweir 	sal_Bool bRetval(sal_False);
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir 	if(IsMarkGluePoints())
514*cdf0e10cSrcweir 	{
515*cdf0e10cSrcweir 		if(aDragStat.IsMinMoved())
516*cdf0e10cSrcweir 		{
517*cdf0e10cSrcweir 			Rectangle aRect(aDragStat.GetStart(),aDragStat.GetNow());
518*cdf0e10cSrcweir 			aRect.Justify();
519*cdf0e10cSrcweir 			MarkGluePoints(&aRect, mpMarkGluePointsOverlay->IsUnmarking());
520*cdf0e10cSrcweir 
521*cdf0e10cSrcweir 			bRetval = sal_True;
522*cdf0e10cSrcweir 		}
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir 		// cleanup
525*cdf0e10cSrcweir 		BrkMarkGluePoints();
526*cdf0e10cSrcweir 	}
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir 	return bRetval;
529*cdf0e10cSrcweir }
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir void SdrMarkView::BrkMarkGluePoints()
532*cdf0e10cSrcweir {
533*cdf0e10cSrcweir 	if(IsMarkGluePoints())
534*cdf0e10cSrcweir 	{
535*cdf0e10cSrcweir 		DBG_ASSERT(mpMarkGluePointsOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
536*cdf0e10cSrcweir 		delete mpMarkGluePointsOverlay;
537*cdf0e10cSrcweir 		mpMarkGluePointsOverlay = 0L;
538*cdf0e10cSrcweir 	}
539*cdf0e10cSrcweir }
540*cdf0e10cSrcweir 
541*cdf0e10cSrcweir sal_Bool SdrMarkView::HasMarkableObj() const
542*cdf0e10cSrcweir {
543*cdf0e10cSrcweir 	sal_uIntPtr nCount=0;
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir 	SdrPageView* pPV = GetSdrPageView();
546*cdf0e10cSrcweir 	if(pPV)
547*cdf0e10cSrcweir 	{
548*cdf0e10cSrcweir 		SdrObjList* pOL=pPV->GetObjList();
549*cdf0e10cSrcweir 		sal_uIntPtr nObjAnz=pOL->GetObjCount();
550*cdf0e10cSrcweir 		for (sal_uIntPtr nObjNum=0; nObjNum<nObjAnz && nCount==0; nObjNum++) {
551*cdf0e10cSrcweir 			SdrObject* pObj=pOL->GetObj(nObjNum);
552*cdf0e10cSrcweir 			if (IsObjMarkable(pObj,pPV)) {
553*cdf0e10cSrcweir 				nCount++;
554*cdf0e10cSrcweir 			}
555*cdf0e10cSrcweir 		}
556*cdf0e10cSrcweir 	}
557*cdf0e10cSrcweir 	return nCount!=0;
558*cdf0e10cSrcweir }
559*cdf0e10cSrcweir 
560*cdf0e10cSrcweir sal_uIntPtr SdrMarkView::GetMarkableObjCount() const
561*cdf0e10cSrcweir {
562*cdf0e10cSrcweir 	sal_uIntPtr nCount=0;
563*cdf0e10cSrcweir 	SdrPageView* pPV = GetSdrPageView();
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir 	if(pPV)
566*cdf0e10cSrcweir 	{
567*cdf0e10cSrcweir 		SdrObjList* pOL=pPV->GetObjList();
568*cdf0e10cSrcweir 		sal_uIntPtr nObjAnz=pOL->GetObjCount();
569*cdf0e10cSrcweir 		for (sal_uIntPtr nObjNum=0; nObjNum<nObjAnz; nObjNum++) {
570*cdf0e10cSrcweir 			SdrObject* pObj=pOL->GetObj(nObjNum);
571*cdf0e10cSrcweir 			if (IsObjMarkable(pObj,pPV)) {
572*cdf0e10cSrcweir 				nCount++;
573*cdf0e10cSrcweir 			}
574*cdf0e10cSrcweir 		}
575*cdf0e10cSrcweir 	}
576*cdf0e10cSrcweir 	return nCount;
577*cdf0e10cSrcweir }
578*cdf0e10cSrcweir 
579*cdf0e10cSrcweir //HMHvoid SdrMarkView::ImpShowMarkHdl(bool /*bNoRefHdl*/)
580*cdf0e10cSrcweir //HMH{
581*cdf0e10cSrcweir //HMH	bNoRefHdl=sal_False; // geht leider erstmal nicht anders
582*cdf0e10cSrcweir //HMH	if (!bHdlShown) {
583*cdf0e10cSrcweir //HMH		bRefHdlShownOnly=sal_False;
584*cdf0e10cSrcweir //HMH		bHdlShown=sal_True;
585*cdf0e10cSrcweir //HMH	}
586*cdf0e10cSrcweir //HMH}
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir //HMHvoid SdrMarkView::ShowMarkHdl(bool /*bNoRefHdl*/)
589*cdf0e10cSrcweir //HMH{
590*cdf0e10cSrcweir //HMH	bNoRefHdl=sal_False; // geht leider erstmal nicht anders
591*cdf0e10cSrcweir //HMH	ImpShowMarkHdl(bNoRefHdl);
592*cdf0e10cSrcweir //HMH}
593*cdf0e10cSrcweir 
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir //HMHvoid SdrMarkView::HideMarkHdl(bool /*bNoRefHdl*/)
596*cdf0e10cSrcweir //HMH{
597*cdf0e10cSrcweir //HMH	bNoRefHdl=sal_False; // geht leider erstmal nicht anders
598*cdf0e10cSrcweir //HMH	if (bHdlShown) {
599*cdf0e10cSrcweir //HMH		bRefHdlShownOnly=bNoRefHdl;
600*cdf0e10cSrcweir //HMH		bHdlShown=sal_False;
601*cdf0e10cSrcweir //HMH	}
602*cdf0e10cSrcweir //HMH}
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir void SdrMarkView::hideMarkHandles()
605*cdf0e10cSrcweir {
606*cdf0e10cSrcweir 	if(!mbMarkHandlesHidden)
607*cdf0e10cSrcweir 	{
608*cdf0e10cSrcweir 		mbMarkHandlesHidden = true;
609*cdf0e10cSrcweir 		AdjustMarkHdl();
610*cdf0e10cSrcweir 	}
611*cdf0e10cSrcweir }
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir void SdrMarkView::showMarkHandles()
614*cdf0e10cSrcweir {
615*cdf0e10cSrcweir 	if(mbMarkHandlesHidden)
616*cdf0e10cSrcweir 	{
617*cdf0e10cSrcweir 		mbMarkHandlesHidden = false;
618*cdf0e10cSrcweir 		AdjustMarkHdl();
619*cdf0e10cSrcweir 	}
620*cdf0e10cSrcweir }
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir sal_Bool SdrMarkView::ImpIsFrameHandles() const
623*cdf0e10cSrcweir {
624*cdf0e10cSrcweir 	sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
625*cdf0e10cSrcweir 	sal_Bool bFrmHdl=nMarkAnz>nFrameHandlesLimit || bForceFrameHandles;
626*cdf0e10cSrcweir 	sal_Bool bStdDrag=eDragMode==SDRDRAG_MOVE;
627*cdf0e10cSrcweir 	if (nMarkAnz==1 && bStdDrag && bFrmHdl)
628*cdf0e10cSrcweir 	{
629*cdf0e10cSrcweir 		const SdrObject* pObj=GetMarkedObjectByIndex(0);
630*cdf0e10cSrcweir 		if (pObj->GetObjInventor()==SdrInventor)
631*cdf0e10cSrcweir 		{
632*cdf0e10cSrcweir 			sal_uInt16 nIdent=pObj->GetObjIdentifier();
633*cdf0e10cSrcweir 			if (nIdent==OBJ_LINE || nIdent==OBJ_EDGE || nIdent==OBJ_CAPTION || nIdent==OBJ_MEASURE || nIdent==OBJ_CUSTOMSHAPE || nIdent==OBJ_TABLE )
634*cdf0e10cSrcweir 			{
635*cdf0e10cSrcweir 				bFrmHdl=sal_False;
636*cdf0e10cSrcweir 			}
637*cdf0e10cSrcweir 		}
638*cdf0e10cSrcweir 	}
639*cdf0e10cSrcweir 	if (!bStdDrag && !bFrmHdl) {
640*cdf0e10cSrcweir 		// Grundsaetzlich erstmal alle anderen Dragmodi nur mit FrameHandles
641*cdf0e10cSrcweir 		bFrmHdl=sal_True;
642*cdf0e10cSrcweir 		if (eDragMode==SDRDRAG_ROTATE) {
643*cdf0e10cSrcweir 			// bei Rotate ObjOwn-Drag, wenn mind. 1 PolyObj
644*cdf0e10cSrcweir 			for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && bFrmHdl; nMarkNum++) {
645*cdf0e10cSrcweir 				const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
646*cdf0e10cSrcweir 				const SdrObject* pObj=pM->GetMarkedSdrObj();
647*cdf0e10cSrcweir 				bFrmHdl=!pObj->IsPolyObj();
648*cdf0e10cSrcweir 			}
649*cdf0e10cSrcweir 		}
650*cdf0e10cSrcweir 	}
651*cdf0e10cSrcweir 	if (!bFrmHdl) {
652*cdf0e10cSrcweir 		// FrameHandles, wenn wenigstens 1 Obj kein SpecialDrag kann
653*cdf0e10cSrcweir 		for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && !bFrmHdl; nMarkNum++) {
654*cdf0e10cSrcweir 			const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
655*cdf0e10cSrcweir 			const SdrObject* pObj=pM->GetMarkedSdrObj();
656*cdf0e10cSrcweir 			bFrmHdl=!pObj->hasSpecialDrag();
657*cdf0e10cSrcweir 		}
658*cdf0e10cSrcweir 	}
659*cdf0e10cSrcweir 	return bFrmHdl;
660*cdf0e10cSrcweir }
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir void SdrMarkView::SetMarkHandles()
663*cdf0e10cSrcweir {
664*cdf0e10cSrcweir 	// #105722# remember old focus handle values to search for it again
665*cdf0e10cSrcweir 	const SdrHdl* pSaveOldFocusHdl = aHdl.GetFocusHdl();
666*cdf0e10cSrcweir 	sal_Bool bSaveOldFocus(sal_False);
667*cdf0e10cSrcweir 	sal_uInt32 nSavePolyNum(0L), nSavePointNum(0L);
668*cdf0e10cSrcweir 	SdrHdlKind eSaveKind(HDL_MOVE);
669*cdf0e10cSrcweir 	SdrObject* pSaveObj = NULL;
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir 	if(pSaveOldFocusHdl
672*cdf0e10cSrcweir 		&& pSaveOldFocusHdl->GetObj()
673*cdf0e10cSrcweir 		&& pSaveOldFocusHdl->GetObj()->ISA(SdrPathObj)
674*cdf0e10cSrcweir 		&& (pSaveOldFocusHdl->GetKind() == HDL_POLY || pSaveOldFocusHdl->GetKind() == HDL_BWGT))
675*cdf0e10cSrcweir 	{
676*cdf0e10cSrcweir 		bSaveOldFocus = sal_True;
677*cdf0e10cSrcweir 		nSavePolyNum = pSaveOldFocusHdl->GetPolyNum();
678*cdf0e10cSrcweir 		nSavePointNum = pSaveOldFocusHdl->GetPointNum();
679*cdf0e10cSrcweir 		pSaveObj = pSaveOldFocusHdl->GetObj();
680*cdf0e10cSrcweir 		eSaveKind = pSaveOldFocusHdl->GetKind();
681*cdf0e10cSrcweir 	}
682*cdf0e10cSrcweir 
683*cdf0e10cSrcweir 	// delete/clear all handles. This will always be done, even with areMarkHandlesHidden()
684*cdf0e10cSrcweir 	aHdl.Clear();
685*cdf0e10cSrcweir 	aHdl.SetRotateShear(eDragMode==SDRDRAG_ROTATE);
686*cdf0e10cSrcweir 	aHdl.SetDistortShear(eDragMode==SDRDRAG_SHEAR);
687*cdf0e10cSrcweir 	pMarkedObj=NULL;
688*cdf0e10cSrcweir 	pMarkedPV=NULL;
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir 	// are handles enabled at all? Create only then
691*cdf0e10cSrcweir 	if(!areMarkHandlesHidden())
692*cdf0e10cSrcweir 	{
693*cdf0e10cSrcweir 		sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
694*cdf0e10cSrcweir 		sal_Bool bStdDrag=eDragMode==SDRDRAG_MOVE;
695*cdf0e10cSrcweir 		sal_Bool bSingleTextObjMark=sal_False;
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir 		if (nMarkAnz==1)
698*cdf0e10cSrcweir 		{
699*cdf0e10cSrcweir 			pMarkedObj=GetMarkedObjectByIndex(0);
700*cdf0e10cSrcweir             bSingleTextObjMark =
701*cdf0e10cSrcweir                 pMarkedObj &&
702*cdf0e10cSrcweir                 pMarkedObj->ISA(SdrTextObj) &&
703*cdf0e10cSrcweir                 static_cast<SdrTextObj*>(pMarkedObj)->IsTextFrame();
704*cdf0e10cSrcweir 		}
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir 		sal_Bool bFrmHdl=ImpIsFrameHandles();
707*cdf0e10cSrcweir 
708*cdf0e10cSrcweir 		if (nMarkAnz>0)
709*cdf0e10cSrcweir 		{
710*cdf0e10cSrcweir 			pMarkedPV=GetSdrPageViewOfMarkedByIndex(0);
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir 			for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz && (pMarkedPV!=NULL || !bFrmHdl); nMarkNum++)
713*cdf0e10cSrcweir 			{
714*cdf0e10cSrcweir 				const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir 				if (pMarkedPV!=pM->GetPageView())
717*cdf0e10cSrcweir 				{
718*cdf0e10cSrcweir 					pMarkedPV=NULL;
719*cdf0e10cSrcweir 				}
720*cdf0e10cSrcweir 			}
721*cdf0e10cSrcweir 		}
722*cdf0e10cSrcweir 
723*cdf0e10cSrcweir 		if (bFrmHdl)
724*cdf0e10cSrcweir 		{
725*cdf0e10cSrcweir 			Rectangle aRect(GetMarkedObjRect());
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir 			// #i33755#
728*cdf0e10cSrcweir 			const sal_Bool bHideHandlesWhenInTextEdit(
729*cdf0e10cSrcweir 				((SdrView*)this)->IsTextEdit()
730*cdf0e10cSrcweir 				&& pMarkedObj
731*cdf0e10cSrcweir 				&& pMarkedObj->ISA(SdrTextObj)
732*cdf0e10cSrcweir 				&& ((SdrTextObj*)pMarkedObj)->IsInEditMode());
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir 			if(!aRect.IsEmpty() && !bHideHandlesWhenInTextEdit)
735*cdf0e10cSrcweir 			{ // sonst nix gefunden
736*cdf0e10cSrcweir                 if( bSingleTextObjMark )
737*cdf0e10cSrcweir                 {
738*cdf0e10cSrcweir                     const sal_uIntPtr nSiz0=aHdl.GetHdlCount();
739*cdf0e10cSrcweir                     pMarkedObj->AddToHdlList(aHdl);
740*cdf0e10cSrcweir                     const sal_uIntPtr nSiz1=aHdl.GetHdlCount();
741*cdf0e10cSrcweir                     for (sal_uIntPtr i=nSiz0; i<nSiz1; i++)
742*cdf0e10cSrcweir                     {
743*cdf0e10cSrcweir                         SdrHdl* pHdl=aHdl.GetHdl(i);
744*cdf0e10cSrcweir                         pHdl->SetObj(pMarkedObj);
745*cdf0e10cSrcweir                         pHdl->SetPageView(pMarkedPV);
746*cdf0e10cSrcweir                         pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0));
747*cdf0e10cSrcweir                     }
748*cdf0e10cSrcweir                 }
749*cdf0e10cSrcweir                 else if( eDragMode==SDRDRAG_CROP )
750*cdf0e10cSrcweir 				{
751*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.TopLeft()     ,HDL_UPLFT));
752*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.TopCenter()   ,HDL_UPPER));
753*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.TopRight()    ,HDL_UPRGT));
754*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.LeftCenter()  ,HDL_LEFT ));
755*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.RightCenter() ,HDL_RIGHT));
756*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.BottomLeft()  ,HDL_LWLFT));
757*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.BottomCenter(),HDL_LOWER));
758*cdf0e10cSrcweir 					aHdl.AddHdl(new SdrCropHdl(aRect.BottomRight() ,HDL_LWRGT));
759*cdf0e10cSrcweir 				}
760*cdf0e10cSrcweir 				else
761*cdf0e10cSrcweir 				{
762*cdf0e10cSrcweir 					sal_Bool bWdt0=aRect.Left()==aRect.Right();
763*cdf0e10cSrcweir 					sal_Bool bHgt0=aRect.Top()==aRect.Bottom();
764*cdf0e10cSrcweir 					if (bWdt0 && bHgt0)
765*cdf0e10cSrcweir 					{
766*cdf0e10cSrcweir 						aHdl.AddHdl(new SdrHdl(aRect.TopLeft(),HDL_UPLFT));
767*cdf0e10cSrcweir 					}
768*cdf0e10cSrcweir 					else if (!bStdDrag && (bWdt0 || bHgt0))
769*cdf0e10cSrcweir 					{
770*cdf0e10cSrcweir 						aHdl.AddHdl(new SdrHdl(aRect.TopLeft()    ,HDL_UPLFT));
771*cdf0e10cSrcweir 						aHdl.AddHdl(new SdrHdl(aRect.BottomRight(),HDL_LWRGT));
772*cdf0e10cSrcweir 					}
773*cdf0e10cSrcweir 					else
774*cdf0e10cSrcweir 					{
775*cdf0e10cSrcweir 						if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopLeft()     ,HDL_UPLFT));
776*cdf0e10cSrcweir 						if (          !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopCenter()   ,HDL_UPPER));
777*cdf0e10cSrcweir 						if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.TopRight()    ,HDL_UPRGT));
778*cdf0e10cSrcweir 						if (!bWdt0          ) aHdl.AddHdl(new SdrHdl(aRect.LeftCenter()  ,HDL_LEFT ));
779*cdf0e10cSrcweir 						if (!bWdt0          ) aHdl.AddHdl(new SdrHdl(aRect.RightCenter() ,HDL_RIGHT));
780*cdf0e10cSrcweir 						if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomLeft()  ,HDL_LWLFT));
781*cdf0e10cSrcweir 						if (          !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomCenter(),HDL_LOWER));
782*cdf0e10cSrcweir 						if (!bWdt0 && !bHgt0) aHdl.AddHdl(new SdrHdl(aRect.BottomRight() ,HDL_LWRGT));
783*cdf0e10cSrcweir 					}
784*cdf0e10cSrcweir 				}
785*cdf0e10cSrcweir 			}
786*cdf0e10cSrcweir 		}
787*cdf0e10cSrcweir 		else
788*cdf0e10cSrcweir 		{
789*cdf0e10cSrcweir 			for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++)
790*cdf0e10cSrcweir 			{
791*cdf0e10cSrcweir 				const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
792*cdf0e10cSrcweir 				SdrObject* pObj=pM->GetMarkedSdrObj();
793*cdf0e10cSrcweir 				SdrPageView* pPV=pM->GetPageView();
794*cdf0e10cSrcweir 				const sal_uIntPtr nSiz0=aHdl.GetHdlCount();
795*cdf0e10cSrcweir 				pObj->AddToHdlList(aHdl);
796*cdf0e10cSrcweir 				const sal_uIntPtr nSiz1=aHdl.GetHdlCount();
797*cdf0e10cSrcweir 				bool bPoly=pObj->IsPolyObj();
798*cdf0e10cSrcweir 				const SdrUShortCont* pMrkPnts=pM->GetMarkedPoints();
799*cdf0e10cSrcweir 				for (sal_uIntPtr i=nSiz0; i<nSiz1; i++)
800*cdf0e10cSrcweir 				{
801*cdf0e10cSrcweir 					SdrHdl* pHdl=aHdl.GetHdl(i);
802*cdf0e10cSrcweir 					pHdl->SetObj(pObj);
803*cdf0e10cSrcweir 					pHdl->SetPageView(pPV);
804*cdf0e10cSrcweir 					pHdl->SetObjHdlNum(sal_uInt16(i-nSiz0));
805*cdf0e10cSrcweir 					if (bPoly)
806*cdf0e10cSrcweir 					{
807*cdf0e10cSrcweir 						sal_Bool bSelected=pMrkPnts!=NULL && pMrkPnts->Exist(sal_uInt16(i-nSiz0));
808*cdf0e10cSrcweir 						pHdl->SetSelected(bSelected);
809*cdf0e10cSrcweir 						//sal_Bool bPlus=bPlusHdlAlways;
810*cdf0e10cSrcweir 						if (bPlusHdlAlways || bSelected)
811*cdf0e10cSrcweir 						{
812*cdf0e10cSrcweir 							sal_uInt32 nPlusAnz=pObj->GetPlusHdlCount(*pHdl);
813*cdf0e10cSrcweir 							for (sal_uInt32 nPlusNum=0; nPlusNum<nPlusAnz; nPlusNum++)
814*cdf0e10cSrcweir 							{
815*cdf0e10cSrcweir 								SdrHdl* pPlusHdl=pObj->GetPlusHdl(*pHdl,nPlusNum);
816*cdf0e10cSrcweir 								if (pPlusHdl!=NULL)
817*cdf0e10cSrcweir 								{
818*cdf0e10cSrcweir 									pPlusHdl->SetObj(pObj);
819*cdf0e10cSrcweir 									pPlusHdl->SetPageView(pPV);
820*cdf0e10cSrcweir 									pPlusHdl->SetPlusHdl(sal_True);
821*cdf0e10cSrcweir 									aHdl.AddHdl(pPlusHdl);
822*cdf0e10cSrcweir 								}
823*cdf0e10cSrcweir 							}
824*cdf0e10cSrcweir 						}
825*cdf0e10cSrcweir 					}
826*cdf0e10cSrcweir 				}
827*cdf0e10cSrcweir 			} // for nMarkNum
828*cdf0e10cSrcweir 		} // if bFrmHdl else
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir 		// GluePoint-Handles
831*cdf0e10cSrcweir 		for (sal_uIntPtr nMarkNum=0; nMarkNum<nMarkAnz; nMarkNum++)
832*cdf0e10cSrcweir 		{
833*cdf0e10cSrcweir 			const SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
834*cdf0e10cSrcweir 			SdrObject* pObj=pM->GetMarkedSdrObj();
835*cdf0e10cSrcweir 			SdrPageView* pPV=pM->GetPageView();
836*cdf0e10cSrcweir 			const SdrUShortCont* pMrkGlue=pM->GetMarkedGluePoints();
837*cdf0e10cSrcweir 			if (pMrkGlue!=NULL)
838*cdf0e10cSrcweir 			{
839*cdf0e10cSrcweir 				const SdrGluePointList* pGPL=pObj->GetGluePointList();
840*cdf0e10cSrcweir 				if (pGPL!=NULL)
841*cdf0e10cSrcweir 				{
842*cdf0e10cSrcweir 					//sal_uInt16 nGlueAnz=pGPL->GetCount();
843*cdf0e10cSrcweir 					sal_uInt16 nAnz=(sal_uInt16)pMrkGlue->GetCount();
844*cdf0e10cSrcweir 					for (sal_uInt16 nNum=0; nNum<nAnz; nNum++)
845*cdf0e10cSrcweir 					{
846*cdf0e10cSrcweir 						sal_uInt16 nId=pMrkGlue->GetObject(nNum);
847*cdf0e10cSrcweir 						//nNum changed to nNumGP because already used in for loop
848*cdf0e10cSrcweir 						sal_uInt16 nNumGP=pGPL->FindGluePoint(nId);
849*cdf0e10cSrcweir 						if (nNumGP!=SDRGLUEPOINT_NOTFOUND)
850*cdf0e10cSrcweir 						{
851*cdf0e10cSrcweir 							const SdrGluePoint& rGP=(*pGPL)[nNumGP];
852*cdf0e10cSrcweir 							Point aPos(rGP.GetAbsolutePos(*pObj));
853*cdf0e10cSrcweir 							SdrHdl* pGlueHdl=new SdrHdl(aPos,HDL_GLUE);
854*cdf0e10cSrcweir 							pGlueHdl->SetObj(pObj);
855*cdf0e10cSrcweir 							pGlueHdl->SetPageView(pPV);
856*cdf0e10cSrcweir 							pGlueHdl->SetObjHdlNum(nId);
857*cdf0e10cSrcweir 							aHdl.AddHdl(pGlueHdl);
858*cdf0e10cSrcweir 						}
859*cdf0e10cSrcweir 					}
860*cdf0e10cSrcweir 				}
861*cdf0e10cSrcweir 			}
862*cdf0e10cSrcweir 		}
863*cdf0e10cSrcweir 
864*cdf0e10cSrcweir 		// Drehpunkt/Spiegelachse
865*cdf0e10cSrcweir 		AddDragModeHdl(eDragMode);
866*cdf0e10cSrcweir 
867*cdf0e10cSrcweir 		// add custom handles (used by other apps, e.g. AnchorPos)
868*cdf0e10cSrcweir 		AddCustomHdl();
869*cdf0e10cSrcweir 
870*cdf0e10cSrcweir 		// sort handles
871*cdf0e10cSrcweir 		aHdl.Sort();
872*cdf0e10cSrcweir 
873*cdf0e10cSrcweir 		// #105722# try to restore focus handle index from remembered values
874*cdf0e10cSrcweir 		if(bSaveOldFocus)
875*cdf0e10cSrcweir 		{
876*cdf0e10cSrcweir 			for(sal_uInt32 a(0); a < aHdl.GetHdlCount(); a++)
877*cdf0e10cSrcweir 			{
878*cdf0e10cSrcweir 				SdrHdl* pCandidate = aHdl.GetHdl(a);
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir 				if(pCandidate->GetObj()
881*cdf0e10cSrcweir 					&& pCandidate->GetObj() == pSaveObj
882*cdf0e10cSrcweir 					&& pCandidate->GetKind() == eSaveKind
883*cdf0e10cSrcweir 					&& pCandidate->GetPolyNum() == nSavePolyNum
884*cdf0e10cSrcweir 					&& pCandidate->GetPointNum() == nSavePointNum)
885*cdf0e10cSrcweir 				{
886*cdf0e10cSrcweir 					aHdl.SetFocusHdl(pCandidate);
887*cdf0e10cSrcweir 					break;
888*cdf0e10cSrcweir 				}
889*cdf0e10cSrcweir 			}
890*cdf0e10cSrcweir 		}
891*cdf0e10cSrcweir 	}
892*cdf0e10cSrcweir }
893*cdf0e10cSrcweir 
894*cdf0e10cSrcweir void SdrMarkView::AddCustomHdl()
895*cdf0e10cSrcweir {
896*cdf0e10cSrcweir 	// add custom handles (used by other apps, e.g. AnchorPos)
897*cdf0e10cSrcweir }
898*cdf0e10cSrcweir 
899*cdf0e10cSrcweir void SdrMarkView::SetDragMode(SdrDragMode eMode)
900*cdf0e10cSrcweir {
901*cdf0e10cSrcweir 	SdrDragMode eMode0=eDragMode;
902*cdf0e10cSrcweir 	eDragMode=eMode;
903*cdf0e10cSrcweir 	if (eDragMode==SDRDRAG_RESIZE) eDragMode=SDRDRAG_MOVE;
904*cdf0e10cSrcweir 	if (eDragMode!=eMode0) {
905*cdf0e10cSrcweir 		//HMHBOOL bVis=IsMarkHdlShown();
906*cdf0e10cSrcweir 		//HMHif (bVis) HideMarkHdl();
907*cdf0e10cSrcweir 		ForceRefToMarked();
908*cdf0e10cSrcweir 		SetMarkHandles();
909*cdf0e10cSrcweir 		//HMHif (bVis) ShowMarkHdl();
910*cdf0e10cSrcweir 		{
911*cdf0e10cSrcweir 			if (AreObjectsMarked()) MarkListHasChanged();
912*cdf0e10cSrcweir 		}
913*cdf0e10cSrcweir 	}
914*cdf0e10cSrcweir }
915*cdf0e10cSrcweir 
916*cdf0e10cSrcweir void SdrMarkView::AddDragModeHdl(SdrDragMode eMode)
917*cdf0e10cSrcweir {
918*cdf0e10cSrcweir 	switch(eMode)
919*cdf0e10cSrcweir 	{
920*cdf0e10cSrcweir 		case SDRDRAG_ROTATE:
921*cdf0e10cSrcweir 		{
922*cdf0e10cSrcweir 			// add rotation center
923*cdf0e10cSrcweir 			SdrHdl* pHdl = new SdrHdl(aRef1, HDL_REF1);
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir 			aHdl.AddHdl(pHdl);
926*cdf0e10cSrcweir 
927*cdf0e10cSrcweir 			break;
928*cdf0e10cSrcweir 		}
929*cdf0e10cSrcweir 		case SDRDRAG_MIRROR:
930*cdf0e10cSrcweir 		{
931*cdf0e10cSrcweir 			// add mirror axis
932*cdf0e10cSrcweir 			SdrHdl* pHdl3 = new SdrHdl(aRef2, HDL_REF2);
933*cdf0e10cSrcweir 			SdrHdl* pHdl2 = new SdrHdl(aRef1, HDL_REF1);
934*cdf0e10cSrcweir 			SdrHdl* pHdl1 = new SdrHdlLine(*pHdl2, *pHdl3, HDL_MIRX);
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir 			pHdl1->SetObjHdlNum(1); // fuer Sortierung
937*cdf0e10cSrcweir 			pHdl2->SetObjHdlNum(2); // fuer Sortierung
938*cdf0e10cSrcweir 			pHdl3->SetObjHdlNum(3); // fuer Sortierung
939*cdf0e10cSrcweir 
940*cdf0e10cSrcweir 			aHdl.AddHdl(pHdl1); // Linie als erstes, damit als letztes im HitTest
941*cdf0e10cSrcweir 			aHdl.AddHdl(pHdl2);
942*cdf0e10cSrcweir 			aHdl.AddHdl(pHdl3);
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir 			break;
945*cdf0e10cSrcweir 		}
946*cdf0e10cSrcweir 		case SDRDRAG_TRANSPARENCE:
947*cdf0e10cSrcweir 		{
948*cdf0e10cSrcweir 			// add interactive transparence handle
949*cdf0e10cSrcweir 			sal_uIntPtr nMarkAnz = GetMarkedObjectCount();
950*cdf0e10cSrcweir 			if(nMarkAnz == 1)
951*cdf0e10cSrcweir 			{
952*cdf0e10cSrcweir 				SdrObject* pObj = GetMarkedObjectByIndex(0);
953*cdf0e10cSrcweir 				SdrModel* pModel = GetModel();
954*cdf0e10cSrcweir 				const SfxItemSet& rSet = pObj->GetMergedItemSet();
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir 				if(SFX_ITEM_SET != rSet.GetItemState(XATTR_FILLFLOATTRANSPARENCE, sal_False))
957*cdf0e10cSrcweir 				{
958*cdf0e10cSrcweir 					// add this item, it's not yet there
959*cdf0e10cSrcweir 					XFillFloatTransparenceItem aNewItem(
960*cdf0e10cSrcweir 						(const XFillFloatTransparenceItem&)rSet.Get(XATTR_FILLFLOATTRANSPARENCE));
961*cdf0e10cSrcweir 					XGradient aGrad = aNewItem.GetGradientValue();
962*cdf0e10cSrcweir 
963*cdf0e10cSrcweir 					aNewItem.SetEnabled(sal_True);
964*cdf0e10cSrcweir 					aGrad.SetStartIntens(100);
965*cdf0e10cSrcweir 					aGrad.SetEndIntens(100);
966*cdf0e10cSrcweir 					aNewItem.SetGradientValue(aGrad);
967*cdf0e10cSrcweir 
968*cdf0e10cSrcweir 					// add undo to allow user to take back this step
969*cdf0e10cSrcweir 					if( pModel->IsUndoEnabled() )
970*cdf0e10cSrcweir 					{
971*cdf0e10cSrcweir 						pModel->BegUndo(SVX_RESSTR(SIP_XA_FILLTRANSPARENCE));
972*cdf0e10cSrcweir 						pModel->AddUndo(pModel->GetSdrUndoFactory().CreateUndoAttrObject(*pObj));
973*cdf0e10cSrcweir 						pModel->EndUndo();
974*cdf0e10cSrcweir 					}
975*cdf0e10cSrcweir 
976*cdf0e10cSrcweir 					//pObj->SetItemAndBroadcast(aNewItem);
977*cdf0e10cSrcweir 					SfxItemSet aNewSet(pModel->GetItemPool());
978*cdf0e10cSrcweir 					aNewSet.Put(aNewItem);
979*cdf0e10cSrcweir 					pObj->SetMergedItemSetAndBroadcast(aNewSet);
980*cdf0e10cSrcweir 				}
981*cdf0e10cSrcweir 
982*cdf0e10cSrcweir 				// set values and transform to vector set
983*cdf0e10cSrcweir 				GradTransformer aGradTransformer;
984*cdf0e10cSrcweir 				GradTransVector aGradTransVector;
985*cdf0e10cSrcweir 				GradTransGradient aGradTransGradient;
986*cdf0e10cSrcweir 
987*cdf0e10cSrcweir 				aGradTransGradient.aGradient = ((XFillFloatTransparenceItem&)rSet.Get(XATTR_FILLFLOATTRANSPARENCE)).GetGradientValue();
988*cdf0e10cSrcweir 				aGradTransformer.GradToVec(aGradTransGradient, aGradTransVector, pObj);
989*cdf0e10cSrcweir 
990*cdf0e10cSrcweir 				// build handles
991*cdf0e10cSrcweir 				const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY()));
992*cdf0e10cSrcweir 				const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY()));
993*cdf0e10cSrcweir 				SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, SDR_HANDLE_COLOR_SIZE_NORMAL, sal_True);
994*cdf0e10cSrcweir 				SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, SDR_HANDLE_COLOR_SIZE_NORMAL, sal_True);
995*cdf0e10cSrcweir 				SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, sal_False);
996*cdf0e10cSrcweir 				DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Got not all necessary handles!!");
997*cdf0e10cSrcweir 
998*cdf0e10cSrcweir 				// link them
999*cdf0e10cSrcweir 				pGradHdl->SetColorHandles(pColHdl1, pColHdl2);
1000*cdf0e10cSrcweir 				pGradHdl->SetObj(pObj);
1001*cdf0e10cSrcweir 				pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
1002*cdf0e10cSrcweir 				pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
1003*cdf0e10cSrcweir 
1004*cdf0e10cSrcweir 				// insert them
1005*cdf0e10cSrcweir 				aHdl.AddHdl(pColHdl1);
1006*cdf0e10cSrcweir 				aHdl.AddHdl(pColHdl2);
1007*cdf0e10cSrcweir 				aHdl.AddHdl(pGradHdl);
1008*cdf0e10cSrcweir 			}
1009*cdf0e10cSrcweir 			break;
1010*cdf0e10cSrcweir 		}
1011*cdf0e10cSrcweir 		case SDRDRAG_GRADIENT:
1012*cdf0e10cSrcweir 		{
1013*cdf0e10cSrcweir 			// add interactive gradient handle
1014*cdf0e10cSrcweir 			sal_uIntPtr nMarkAnz = GetMarkedObjectCount();
1015*cdf0e10cSrcweir 			if(nMarkAnz == 1)
1016*cdf0e10cSrcweir 			{
1017*cdf0e10cSrcweir 				SdrObject* pObj = GetMarkedObjectByIndex(0);
1018*cdf0e10cSrcweir 				const SfxItemSet& rSet = pObj->GetMergedItemSet();
1019*cdf0e10cSrcweir 				XFillStyle eFillStyle = ((XFillStyleItem&)(rSet.Get(XATTR_FILLSTYLE))).GetValue();
1020*cdf0e10cSrcweir 
1021*cdf0e10cSrcweir 				if(eFillStyle == XFILL_GRADIENT)
1022*cdf0e10cSrcweir 				{
1023*cdf0e10cSrcweir 					// set values and transform to vector set
1024*cdf0e10cSrcweir 					GradTransformer aGradTransformer;
1025*cdf0e10cSrcweir 					GradTransVector aGradTransVector;
1026*cdf0e10cSrcweir 					GradTransGradient aGradTransGradient;
1027*cdf0e10cSrcweir 					Size aHdlSize(15, 15);
1028*cdf0e10cSrcweir 
1029*cdf0e10cSrcweir 					aGradTransGradient.aGradient = ((XFillGradientItem&)rSet.Get(XATTR_FILLGRADIENT)).GetGradientValue();
1030*cdf0e10cSrcweir 					aGradTransformer.GradToVec(aGradTransGradient, aGradTransVector, pObj);
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir 					// build handles
1033*cdf0e10cSrcweir 					const Point aTmpPos1(basegfx::fround(aGradTransVector.maPositionA.getX()), basegfx::fround(aGradTransVector.maPositionA.getY()));
1034*cdf0e10cSrcweir 					const Point aTmpPos2(basegfx::fround(aGradTransVector.maPositionB.getX()), basegfx::fround(aGradTransVector.maPositionB.getY()));
1035*cdf0e10cSrcweir 					SdrHdlColor* pColHdl1 = new SdrHdlColor(aTmpPos1, aGradTransVector.aCol1, aHdlSize, sal_False);
1036*cdf0e10cSrcweir 					SdrHdlColor* pColHdl2 = new SdrHdlColor(aTmpPos2, aGradTransVector.aCol2, aHdlSize, sal_False);
1037*cdf0e10cSrcweir 					SdrHdlGradient* pGradHdl = new SdrHdlGradient(aTmpPos1, aTmpPos2, sal_True);
1038*cdf0e10cSrcweir 					DBG_ASSERT(pColHdl1 && pColHdl2 && pGradHdl, "Got not all necessary handles!!");
1039*cdf0e10cSrcweir 
1040*cdf0e10cSrcweir 					// link them
1041*cdf0e10cSrcweir 					pGradHdl->SetColorHandles(pColHdl1, pColHdl2);
1042*cdf0e10cSrcweir 					pGradHdl->SetObj(pObj);
1043*cdf0e10cSrcweir 					pColHdl1->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
1044*cdf0e10cSrcweir 					pColHdl2->SetColorChangeHdl(LINK(pGradHdl, SdrHdlGradient, ColorChangeHdl));
1045*cdf0e10cSrcweir 
1046*cdf0e10cSrcweir 					// insert them
1047*cdf0e10cSrcweir 					aHdl.AddHdl(pColHdl1);
1048*cdf0e10cSrcweir 					aHdl.AddHdl(pColHdl2);
1049*cdf0e10cSrcweir 					aHdl.AddHdl(pGradHdl);
1050*cdf0e10cSrcweir 				}
1051*cdf0e10cSrcweir 			}
1052*cdf0e10cSrcweir 			break;
1053*cdf0e10cSrcweir 		}
1054*cdf0e10cSrcweir 		case SDRDRAG_CROP:
1055*cdf0e10cSrcweir 		{
1056*cdf0e10cSrcweir 			// todo
1057*cdf0e10cSrcweir 			break;
1058*cdf0e10cSrcweir 		}
1059*cdf0e10cSrcweir 		default: break;
1060*cdf0e10cSrcweir 	}
1061*cdf0e10cSrcweir }
1062*cdf0e10cSrcweir 
1063*cdf0e10cSrcweir /** handle mouse over effects for handles */
1064*cdf0e10cSrcweir sal_Bool SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
1065*cdf0e10cSrcweir {
1066*cdf0e10cSrcweir 	if(aHdl.GetHdlCount())
1067*cdf0e10cSrcweir 	{
1068*cdf0e10cSrcweir 		SdrHdl* pMouseOverHdl = 0;
1069*cdf0e10cSrcweir 		if( !rMEvt.IsLeaveWindow() && pWin )
1070*cdf0e10cSrcweir 		{
1071*cdf0e10cSrcweir 			Point aMDPos( pWin->PixelToLogic( rMEvt.GetPosPixel() ) );
1072*cdf0e10cSrcweir 			pMouseOverHdl = PickHandle(aMDPos);
1073*cdf0e10cSrcweir 		}
1074*cdf0e10cSrcweir 
1075*cdf0e10cSrcweir 		// notify last mouse over handle that he lost the mouse
1076*cdf0e10cSrcweir 		const sal_uIntPtr nHdlCount = aHdl.GetHdlCount();
1077*cdf0e10cSrcweir 
1078*cdf0e10cSrcweir 		for(sal_uIntPtr nHdl = 0; nHdl < nHdlCount; nHdl++ )
1079*cdf0e10cSrcweir 		{
1080*cdf0e10cSrcweir 			SdrHdl* pCurrentHdl = GetHdl(nHdl);
1081*cdf0e10cSrcweir 			if( pCurrentHdl->mbMouseOver )
1082*cdf0e10cSrcweir 			{
1083*cdf0e10cSrcweir 				if( pCurrentHdl != pMouseOverHdl )
1084*cdf0e10cSrcweir 				{
1085*cdf0e10cSrcweir 					pCurrentHdl->mbMouseOver = false;
1086*cdf0e10cSrcweir 					pCurrentHdl->onMouseLeave();
1087*cdf0e10cSrcweir 				}
1088*cdf0e10cSrcweir 				break;
1089*cdf0e10cSrcweir 			}
1090*cdf0e10cSrcweir 		}
1091*cdf0e10cSrcweir 
1092*cdf0e10cSrcweir 		// notify current mouse over handle
1093*cdf0e10cSrcweir 		if( pMouseOverHdl /* && !pMouseOverHdl->mbMouseOver */ )
1094*cdf0e10cSrcweir 		{
1095*cdf0e10cSrcweir 			pMouseOverHdl->mbMouseOver = true;
1096*cdf0e10cSrcweir 			pMouseOverHdl->onMouseEnter(rMEvt);
1097*cdf0e10cSrcweir 		}
1098*cdf0e10cSrcweir 	}
1099*cdf0e10cSrcweir 	return SdrSnapView::MouseMove(rMEvt, pWin);
1100*cdf0e10cSrcweir }
1101*cdf0e10cSrcweir 
1102*cdf0e10cSrcweir void SdrMarkView::ForceRefToMarked()
1103*cdf0e10cSrcweir {
1104*cdf0e10cSrcweir 	switch(eDragMode)
1105*cdf0e10cSrcweir 	{
1106*cdf0e10cSrcweir 		case SDRDRAG_ROTATE:
1107*cdf0e10cSrcweir 		{
1108*cdf0e10cSrcweir 			Rectangle aR(GetMarkedObjRect());
1109*cdf0e10cSrcweir 			aRef1 = aR.Center();
1110*cdf0e10cSrcweir 
1111*cdf0e10cSrcweir 			break;
1112*cdf0e10cSrcweir 		}
1113*cdf0e10cSrcweir 
1114*cdf0e10cSrcweir 		case SDRDRAG_MIRROR:
1115*cdf0e10cSrcweir 		{
1116*cdf0e10cSrcweir 			// Erstmal die laenge der Spiegelachsenlinie berechnen
1117*cdf0e10cSrcweir 			long nOutMin=0;
1118*cdf0e10cSrcweir 			long nOutMax=0;
1119*cdf0e10cSrcweir 			long nMinLen=0;
1120*cdf0e10cSrcweir 			long nObjDst=0;
1121*cdf0e10cSrcweir 			long nOutHgt=0;
1122*cdf0e10cSrcweir 			OutputDevice* pOut=GetFirstOutputDevice();
1123*cdf0e10cSrcweir 			//OutputDevice* pOut=GetWin(0);
1124*cdf0e10cSrcweir 			if (pOut!=NULL) {
1125*cdf0e10cSrcweir 				// Mindestlaenge 50 Pixel
1126*cdf0e10cSrcweir 				nMinLen=pOut->PixelToLogic(Size(0,50)).Height();
1127*cdf0e10cSrcweir 				// 20 Pixel fuer RefPt-Abstand vom Obj
1128*cdf0e10cSrcweir 				nObjDst=pOut->PixelToLogic(Size(0,20)).Height();
1129*cdf0e10cSrcweir 				// MinY/MaxY
1130*cdf0e10cSrcweir 				// Abstand zum Rand = Mindestlaenge = 10 Pixel
1131*cdf0e10cSrcweir 				long nDst=pOut->PixelToLogic(Size(0,10)).Height();
1132*cdf0e10cSrcweir 				nOutMin=-pOut->GetMapMode().GetOrigin().Y();
1133*cdf0e10cSrcweir 				nOutMax=pOut->GetOutputSize().Height()-1+nOutMin;
1134*cdf0e10cSrcweir 				nOutMin+=nDst;
1135*cdf0e10cSrcweir 				nOutMax-=nDst;
1136*cdf0e10cSrcweir 				// Absolute Mindestlaenge jedoch 10 Pixel
1137*cdf0e10cSrcweir 				if (nOutMax-nOutMin<nDst) {
1138*cdf0e10cSrcweir 					nOutMin+=nOutMax+1;
1139*cdf0e10cSrcweir 					nOutMin/=2;
1140*cdf0e10cSrcweir 					nOutMin-=(nDst+1)/2;
1141*cdf0e10cSrcweir 					nOutMax=nOutMin+nDst;
1142*cdf0e10cSrcweir 				}
1143*cdf0e10cSrcweir 				nOutHgt=nOutMax-nOutMin;
1144*cdf0e10cSrcweir 				// Sonst Mindestlaenge = 1/4 OutHgt
1145*cdf0e10cSrcweir 				long nTemp=nOutHgt/4;
1146*cdf0e10cSrcweir 				if (nTemp>nMinLen) nMinLen=nTemp;
1147*cdf0e10cSrcweir 			}
1148*cdf0e10cSrcweir 
1149*cdf0e10cSrcweir 			Rectangle aR(GetMarkedObjBoundRect());
1150*cdf0e10cSrcweir 			Point aCenter(aR.Center());
1151*cdf0e10cSrcweir 			long nMarkHgt=aR.GetHeight()-1;
1152*cdf0e10cSrcweir 			long nHgt=nMarkHgt+nObjDst*2;       // 20 Pixel obej und unten ueberstehend
1153*cdf0e10cSrcweir 			if (nHgt<nMinLen) nHgt=nMinLen;     // Mindestlaenge 50 Pixel bzw. 1/4 OutHgt
1154*cdf0e10cSrcweir 
1155*cdf0e10cSrcweir 			long nY1=aCenter.Y()-(nHgt+1)/2;
1156*cdf0e10cSrcweir 			long nY2=nY1+nHgt;
1157*cdf0e10cSrcweir 
1158*cdf0e10cSrcweir 			if (pOut!=NULL && nMinLen>nOutHgt) nMinLen=nOutHgt; // evtl. noch etwas verkuerzen
1159*cdf0e10cSrcweir 
1160*cdf0e10cSrcweir 			if (pOut!=NULL) { // nun vollstaendig in den sichtbaren Bereich schieben
1161*cdf0e10cSrcweir 				if (nY1<nOutMin) {
1162*cdf0e10cSrcweir 					nY1=nOutMin;
1163*cdf0e10cSrcweir 					if (nY2<nY1+nMinLen) nY2=nY1+nMinLen;
1164*cdf0e10cSrcweir 				}
1165*cdf0e10cSrcweir 				if (nY2>nOutMax) {
1166*cdf0e10cSrcweir 					nY2=nOutMax;
1167*cdf0e10cSrcweir 					if (nY1>nY2-nMinLen) nY1=nY2-nMinLen;
1168*cdf0e10cSrcweir 				}
1169*cdf0e10cSrcweir 			}
1170*cdf0e10cSrcweir 
1171*cdf0e10cSrcweir 			aRef1.X()=aCenter.X();
1172*cdf0e10cSrcweir 			aRef1.Y()=nY1;
1173*cdf0e10cSrcweir 			aRef2.X()=aCenter.X();
1174*cdf0e10cSrcweir 			aRef2.Y()=nY2;
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir 			break;
1177*cdf0e10cSrcweir 		}
1178*cdf0e10cSrcweir 
1179*cdf0e10cSrcweir 		case SDRDRAG_TRANSPARENCE:
1180*cdf0e10cSrcweir 		case SDRDRAG_GRADIENT:
1181*cdf0e10cSrcweir 		case SDRDRAG_CROP:
1182*cdf0e10cSrcweir 		{
1183*cdf0e10cSrcweir 			Rectangle aRect(GetMarkedObjBoundRect());
1184*cdf0e10cSrcweir 			aRef1 = aRect.TopLeft();
1185*cdf0e10cSrcweir 			aRef2 = aRect.BottomRight();
1186*cdf0e10cSrcweir 			break;
1187*cdf0e10cSrcweir 		}
1188*cdf0e10cSrcweir 		default: break;
1189*cdf0e10cSrcweir 	}
1190*cdf0e10cSrcweir }
1191*cdf0e10cSrcweir 
1192*cdf0e10cSrcweir void SdrMarkView::SetRef1(const Point& rPt)
1193*cdf0e10cSrcweir {
1194*cdf0e10cSrcweir 	if(eDragMode == SDRDRAG_ROTATE || eDragMode == SDRDRAG_MIRROR)
1195*cdf0e10cSrcweir 	{
1196*cdf0e10cSrcweir 		aRef1 = rPt;
1197*cdf0e10cSrcweir 		SdrHdl* pH = aHdl.GetHdl(HDL_REF1);
1198*cdf0e10cSrcweir 		if(pH)
1199*cdf0e10cSrcweir 			pH->SetPos(rPt);
1200*cdf0e10cSrcweir 		//HMHShowMarkHdl();
1201*cdf0e10cSrcweir 	}
1202*cdf0e10cSrcweir }
1203*cdf0e10cSrcweir 
1204*cdf0e10cSrcweir void SdrMarkView::SetRef2(const Point& rPt)
1205*cdf0e10cSrcweir {
1206*cdf0e10cSrcweir 	if(eDragMode == SDRDRAG_MIRROR)
1207*cdf0e10cSrcweir 	{
1208*cdf0e10cSrcweir 		aRef2 = rPt;
1209*cdf0e10cSrcweir 		SdrHdl* pH = aHdl.GetHdl(HDL_REF2);
1210*cdf0e10cSrcweir 		if(pH)
1211*cdf0e10cSrcweir 			pH->SetPos(rPt);
1212*cdf0e10cSrcweir 		//HMHShowMarkHdl();
1213*cdf0e10cSrcweir 	}
1214*cdf0e10cSrcweir }
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir void SdrMarkView::CheckMarked()
1217*cdf0e10cSrcweir {
1218*cdf0e10cSrcweir 	for (sal_uIntPtr nm=GetMarkedObjectCount(); nm>0;) {
1219*cdf0e10cSrcweir 		nm--;
1220*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nm);
1221*cdf0e10cSrcweir 		SdrObject* pObj=pM->GetMarkedSdrObj();
1222*cdf0e10cSrcweir 		SdrPageView* pPV=pM->GetPageView();
1223*cdf0e10cSrcweir 		SdrLayerID nLay=pObj->GetLayer();
1224*cdf0e10cSrcweir 		sal_Bool bRaus=!pObj->IsInserted(); // Obj geloescht?
1225*cdf0e10cSrcweir 		if (!pObj->Is3DObj()) {
1226*cdf0e10cSrcweir 			bRaus=bRaus || pObj->GetPage()!=pPV->GetPage();   // Obj ploetzlich in anderer Page oder Group
1227*cdf0e10cSrcweir 		}
1228*cdf0e10cSrcweir 		bRaus=bRaus || pPV->GetLockedLayers().IsSet(nLay) ||  // Layer gesperrt?
1229*cdf0e10cSrcweir 					   !pPV->GetVisibleLayers().IsSet(nLay);  // Layer nicht sichtbar?
1230*cdf0e10cSrcweir 
1231*cdf0e10cSrcweir 		if( !bRaus )
1232*cdf0e10cSrcweir 			bRaus = !pObj->IsVisible(); // not visible objects can not be marked
1233*cdf0e10cSrcweir 
1234*cdf0e10cSrcweir 		if (!bRaus) {
1235*cdf0e10cSrcweir 			// Joe am 9.3.1997: Gruppierte Objekten koennen nun auch
1236*cdf0e10cSrcweir 			// markiert werden. Nach EnterGroup muessen aber die Objekte
1237*cdf0e10cSrcweir 			// der hoeheren Ebene deselektiert werden.
1238*cdf0e10cSrcweir 			const SdrObjList* pOOL=pObj->GetObjList();
1239*cdf0e10cSrcweir 			const SdrObjList* pVOL=pPV->GetObjList();
1240*cdf0e10cSrcweir 			while (pOOL!=NULL && pOOL!=pVOL) {
1241*cdf0e10cSrcweir 				pOOL=pOOL->GetUpList();
1242*cdf0e10cSrcweir 			}
1243*cdf0e10cSrcweir 			bRaus=pOOL!=pVOL;
1244*cdf0e10cSrcweir 		}
1245*cdf0e10cSrcweir 
1246*cdf0e10cSrcweir 		if (bRaus)
1247*cdf0e10cSrcweir 		{
1248*cdf0e10cSrcweir 			GetMarkedObjectListWriteAccess().DeleteMark(nm);
1249*cdf0e10cSrcweir 		}
1250*cdf0e10cSrcweir 		else
1251*cdf0e10cSrcweir 		{
1252*cdf0e10cSrcweir 			if (!IsGluePointEditMode()) { // Markierte GluePoints nur im GlueEditMode
1253*cdf0e10cSrcweir 				SdrUShortCont* pPts=pM->GetMarkedGluePoints();
1254*cdf0e10cSrcweir 				if (pPts!=NULL && pPts->GetCount()!=0) {
1255*cdf0e10cSrcweir 					pPts->Clear();
1256*cdf0e10cSrcweir 				}
1257*cdf0e10cSrcweir 			}
1258*cdf0e10cSrcweir 		}
1259*cdf0e10cSrcweir 	}
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir 	// #97995# at least reset the remembered BoundRect to prevent handle
1262*cdf0e10cSrcweir 	// generation if bForceFrameHandles is TRUE.
1263*cdf0e10cSrcweir 	bMarkedObjRectDirty = sal_True;
1264*cdf0e10cSrcweir }
1265*cdf0e10cSrcweir 
1266*cdf0e10cSrcweir void SdrMarkView::SetMarkRects()
1267*cdf0e10cSrcweir {
1268*cdf0e10cSrcweir 	SdrPageView* pPV = GetSdrPageView();
1269*cdf0e10cSrcweir 
1270*cdf0e10cSrcweir 	if(pPV)
1271*cdf0e10cSrcweir 	{
1272*cdf0e10cSrcweir 		pPV->SetHasMarkedObj(GetSnapRectFromMarkedObjects(pPV, pPV->MarkSnap()));
1273*cdf0e10cSrcweir 		GetBoundRectFromMarkedObjects(pPV, pPV->MarkBound());
1274*cdf0e10cSrcweir 	}
1275*cdf0e10cSrcweir }
1276*cdf0e10cSrcweir 
1277*cdf0e10cSrcweir void SdrMarkView::SetFrameHandles(sal_Bool bOn)
1278*cdf0e10cSrcweir {
1279*cdf0e10cSrcweir 	if (bOn!=bForceFrameHandles) {
1280*cdf0e10cSrcweir 		sal_Bool bOld=ImpIsFrameHandles();
1281*cdf0e10cSrcweir 		bForceFrameHandles=bOn;
1282*cdf0e10cSrcweir 		sal_Bool bNew=ImpIsFrameHandles();
1283*cdf0e10cSrcweir 		if (bNew!=bOld) {
1284*cdf0e10cSrcweir 			AdjustMarkHdl(); //HMHTRUE);
1285*cdf0e10cSrcweir 			MarkListHasChanged();
1286*cdf0e10cSrcweir 		}
1287*cdf0e10cSrcweir 	}
1288*cdf0e10cSrcweir }
1289*cdf0e10cSrcweir 
1290*cdf0e10cSrcweir void SdrMarkView::SetEditMode(SdrViewEditMode eMode)
1291*cdf0e10cSrcweir {
1292*cdf0e10cSrcweir 	if (eMode!=eEditMode) {
1293*cdf0e10cSrcweir 		sal_Bool bGlue0=eEditMode==SDREDITMODE_GLUEPOINTEDIT;
1294*cdf0e10cSrcweir 		sal_Bool bEdge0=((SdrCreateView*)this)->IsEdgeTool();
1295*cdf0e10cSrcweir 		eEditMode0=eEditMode;
1296*cdf0e10cSrcweir 		eEditMode=eMode;
1297*cdf0e10cSrcweir 		sal_Bool bGlue1=eEditMode==SDREDITMODE_GLUEPOINTEDIT;
1298*cdf0e10cSrcweir 		sal_Bool bEdge1=((SdrCreateView*)this)->IsEdgeTool();
1299*cdf0e10cSrcweir 		// etwas Aufwand um Flackern zu verhindern beim Umschalten
1300*cdf0e10cSrcweir 		// zwischen GlueEdit und EdgeTool
1301*cdf0e10cSrcweir 		if (bGlue1 && !bGlue0) ImpSetGlueVisible2(bGlue1);
1302*cdf0e10cSrcweir 		if (bEdge1!=bEdge0) ImpSetGlueVisible3(bEdge1);
1303*cdf0e10cSrcweir 		if (!bGlue1 && bGlue0) ImpSetGlueVisible2(bGlue1);
1304*cdf0e10cSrcweir 		if (bGlue0 && !bGlue1) UnmarkAllGluePoints();
1305*cdf0e10cSrcweir 	}
1306*cdf0e10cSrcweir }
1307*cdf0e10cSrcweir 
1308*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1309*cdf0e10cSrcweir 
1310*cdf0e10cSrcweir sal_Bool SdrMarkView::IsObjMarkable(SdrObject* pObj, SdrPageView* pPV) const
1311*cdf0e10cSrcweir {
1312*cdf0e10cSrcweir 	if (pObj)
1313*cdf0e10cSrcweir 	{
1314*cdf0e10cSrcweir 		if (pObj->IsMarkProtect() ||
1315*cdf0e10cSrcweir 			(!bDesignMode && pObj->IsUnoObj()))
1316*cdf0e10cSrcweir 		{
1317*cdf0e10cSrcweir 			// Objekt nicht selektierbar oder
1318*cdf0e10cSrcweir 			// SdrUnoObj nicht im DesignMode
1319*cdf0e10cSrcweir 			return sal_False;
1320*cdf0e10cSrcweir 		}
1321*cdf0e10cSrcweir 	}
1322*cdf0e10cSrcweir 	return pPV!=NULL ? pPV->IsObjMarkable(pObj) : sal_True;
1323*cdf0e10cSrcweir }
1324*cdf0e10cSrcweir 
1325*cdf0e10cSrcweir sal_Bool SdrMarkView::IsMarkedObjHit(const Point& rPnt, short nTol) const
1326*cdf0e10cSrcweir {
1327*cdf0e10cSrcweir 	sal_Bool bRet=sal_False;
1328*cdf0e10cSrcweir 	nTol=ImpGetHitTolLogic(nTol,NULL);
1329*cdf0e10cSrcweir 	Point aPt(rPnt);
1330*cdf0e10cSrcweir 	for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount() && !bRet; nm++) {
1331*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nm);
1332*cdf0e10cSrcweir 		bRet = 0 != CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),0,0);
1333*cdf0e10cSrcweir 	}
1334*cdf0e10cSrcweir 	return bRet;
1335*cdf0e10cSrcweir }
1336*cdf0e10cSrcweir 
1337*cdf0e10cSrcweir SdrHdl* SdrMarkView::PickHandle(const Point& rPnt, sal_uIntPtr nOptions, SdrHdl* pHdl0) const
1338*cdf0e10cSrcweir {
1339*cdf0e10cSrcweir 	if (bSomeObjChgdFlag) { // ggf. Handles neu berechnen lassen!
1340*cdf0e10cSrcweir 		FlushComeBackTimer();
1341*cdf0e10cSrcweir 	}
1342*cdf0e10cSrcweir 	sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0;
1343*cdf0e10cSrcweir 	sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0;
1344*cdf0e10cSrcweir 	Point aPt(rPnt);
1345*cdf0e10cSrcweir 	return aHdl.IsHdlListHit(aPt,bBack,bNext,pHdl0);
1346*cdf0e10cSrcweir }
1347*cdf0e10cSrcweir 
1348*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkObj(const Point& rPnt, short nTol, sal_Bool bToggle, sal_Bool bDeep)
1349*cdf0e10cSrcweir {
1350*cdf0e10cSrcweir 	SdrObject* pObj;
1351*cdf0e10cSrcweir 	SdrPageView* pPV;
1352*cdf0e10cSrcweir 	nTol=ImpGetHitTolLogic(nTol,NULL);
1353*cdf0e10cSrcweir 	sal_uIntPtr nOptions=SDRSEARCH_PICKMARKABLE;
1354*cdf0e10cSrcweir 	if (bDeep) nOptions=nOptions|SDRSEARCH_DEEP;
1355*cdf0e10cSrcweir 	sal_Bool bRet=PickObj(rPnt,(sal_uInt16)nTol,pObj,pPV,nOptions);
1356*cdf0e10cSrcweir 	if (bRet) {
1357*cdf0e10cSrcweir 		sal_Bool bUnmark=bToggle && IsObjMarked(pObj);
1358*cdf0e10cSrcweir 		MarkObj(pObj,pPV,bUnmark);
1359*cdf0e10cSrcweir 	}
1360*cdf0e10cSrcweir 	return bRet;
1361*cdf0e10cSrcweir }
1362*cdf0e10cSrcweir 
1363*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkNextObj(sal_Bool bPrev)
1364*cdf0e10cSrcweir {
1365*cdf0e10cSrcweir 	SdrPageView* pPageView = GetSdrPageView();
1366*cdf0e10cSrcweir 
1367*cdf0e10cSrcweir 	if(!pPageView)
1368*cdf0e10cSrcweir 	{
1369*cdf0e10cSrcweir 		return sal_False;
1370*cdf0e10cSrcweir 	}
1371*cdf0e10cSrcweir 
1372*cdf0e10cSrcweir 	SortMarkedObjects();
1373*cdf0e10cSrcweir 	sal_uIntPtr  nMarkAnz=GetMarkedObjectCount();
1374*cdf0e10cSrcweir 	sal_uIntPtr  nChgMarkNum = ULONG_MAX; // Nummer des zu ersetzenden MarkEntries
1375*cdf0e10cSrcweir 	sal_uIntPtr  nSearchObjNum = bPrev ? 0 : ULONG_MAX;
1376*cdf0e10cSrcweir 	if (nMarkAnz!=0) {
1377*cdf0e10cSrcweir 		nChgMarkNum=bPrev ? 0 : sal_uIntPtr(nMarkAnz-1);
1378*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nChgMarkNum);
1379*cdf0e10cSrcweir         OSL_ASSERT(pM!=NULL);
1380*cdf0e10cSrcweir         if (pM->GetMarkedSdrObj() != NULL)
1381*cdf0e10cSrcweir             nSearchObjNum = pM->GetMarkedSdrObj()->GetNavigationPosition();
1382*cdf0e10cSrcweir 	}
1383*cdf0e10cSrcweir 
1384*cdf0e10cSrcweir 	SdrObject* pMarkObj=NULL;
1385*cdf0e10cSrcweir 	SdrObjList* pSearchObjList=pPageView->GetObjList();
1386*cdf0e10cSrcweir 	sal_uIntPtr nObjAnz=pSearchObjList->GetObjCount();
1387*cdf0e10cSrcweir 	if (nObjAnz!=0) {
1388*cdf0e10cSrcweir 		if (nSearchObjNum>nObjAnz) nSearchObjNum=nObjAnz;
1389*cdf0e10cSrcweir 		while (pMarkObj==NULL && ((!bPrev && nSearchObjNum>0) || (bPrev && nSearchObjNum<nObjAnz)))
1390*cdf0e10cSrcweir         {
1391*cdf0e10cSrcweir 			if (!bPrev)
1392*cdf0e10cSrcweir                 nSearchObjNum--;
1393*cdf0e10cSrcweir 			SdrObject* pSearchObj = pSearchObjList->GetObjectForNavigationPosition(nSearchObjNum);
1394*cdf0e10cSrcweir 			if (IsObjMarkable(pSearchObj,pPageView))
1395*cdf0e10cSrcweir             {
1396*cdf0e10cSrcweir 				if (TryToFindMarkedObject(pSearchObj)==CONTAINER_ENTRY_NOTFOUND)
1397*cdf0e10cSrcweir                 {
1398*cdf0e10cSrcweir 					pMarkObj=pSearchObj;
1399*cdf0e10cSrcweir 				}
1400*cdf0e10cSrcweir 			}
1401*cdf0e10cSrcweir 			if (bPrev) nSearchObjNum++;
1402*cdf0e10cSrcweir 		}
1403*cdf0e10cSrcweir 	}
1404*cdf0e10cSrcweir 
1405*cdf0e10cSrcweir 	if(!pMarkObj)
1406*cdf0e10cSrcweir 	{
1407*cdf0e10cSrcweir 		return sal_False;
1408*cdf0e10cSrcweir 	}
1409*cdf0e10cSrcweir 
1410*cdf0e10cSrcweir 	if (nChgMarkNum!=ULONG_MAX)
1411*cdf0e10cSrcweir 	{
1412*cdf0e10cSrcweir 		GetMarkedObjectListWriteAccess().DeleteMark(nChgMarkNum);
1413*cdf0e10cSrcweir 	}
1414*cdf0e10cSrcweir 	MarkObj(pMarkObj,pPageView); // ruft auch MarkListHasChanged(), AdjustMarkHdl()
1415*cdf0e10cSrcweir 	return sal_True;
1416*cdf0e10cSrcweir }
1417*cdf0e10cSrcweir 
1418*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkNextObj(const Point& rPnt, short nTol, sal_Bool bPrev)
1419*cdf0e10cSrcweir {
1420*cdf0e10cSrcweir 	SortMarkedObjects();
1421*cdf0e10cSrcweir 	nTol=ImpGetHitTolLogic(nTol,NULL);
1422*cdf0e10cSrcweir 	Point aPt(rPnt);
1423*cdf0e10cSrcweir 	SdrMark* pTopMarkHit=NULL;
1424*cdf0e10cSrcweir 	SdrMark* pBtmMarkHit=NULL;
1425*cdf0e10cSrcweir 	sal_uIntPtr nTopMarkHit=0;
1426*cdf0e10cSrcweir 	sal_uIntPtr nBtmMarkHit=0;
1427*cdf0e10cSrcweir 	// oberstes der markierten Objekte suchen, das von rPnt getroffen wird
1428*cdf0e10cSrcweir 	sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
1429*cdf0e10cSrcweir 	sal_uIntPtr nm=0;
1430*cdf0e10cSrcweir 	for (nm=nMarkAnz; nm>0 && pTopMarkHit==NULL;) {
1431*cdf0e10cSrcweir 		nm--;
1432*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nm);
1433*cdf0e10cSrcweir 		if(CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pM->GetPageView(),0,0))
1434*cdf0e10cSrcweir         {
1435*cdf0e10cSrcweir 			pTopMarkHit=pM;
1436*cdf0e10cSrcweir 			nTopMarkHit=nm;
1437*cdf0e10cSrcweir 		}
1438*cdf0e10cSrcweir 	}
1439*cdf0e10cSrcweir 	// Nichts gefunden, dann ganz normal ein Obj markieren.
1440*cdf0e10cSrcweir 	if (pTopMarkHit==NULL) return MarkObj(rPnt,sal_uInt16(nTol),sal_False);
1441*cdf0e10cSrcweir 
1442*cdf0e10cSrcweir 	SdrObject* pTopObjHit=pTopMarkHit->GetMarkedSdrObj();
1443*cdf0e10cSrcweir 	SdrObjList* pObjList=pTopObjHit->GetObjList();
1444*cdf0e10cSrcweir 	SdrPageView* pPV=pTopMarkHit->GetPageView();
1445*cdf0e10cSrcweir 	// unterstes der markierten Objekte suchen, das von rPnt getroffen wird
1446*cdf0e10cSrcweir 	// und auf der gleichen PageView liegt wie pTopMarkHit
1447*cdf0e10cSrcweir 	for (nm=0; nm<nMarkAnz && pBtmMarkHit==NULL; nm++) {
1448*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nm);
1449*cdf0e10cSrcweir 		SdrPageView* pPV2=pM->GetPageView();
1450*cdf0e10cSrcweir 		if (pPV2==pPV && CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pM->GetMarkedSdrObj(),pPV2,0,0))
1451*cdf0e10cSrcweir         {
1452*cdf0e10cSrcweir 			pBtmMarkHit=pM;
1453*cdf0e10cSrcweir 			nBtmMarkHit=nm;
1454*cdf0e10cSrcweir 		}
1455*cdf0e10cSrcweir 	}
1456*cdf0e10cSrcweir 	if (pBtmMarkHit==NULL) { pBtmMarkHit=pTopMarkHit; nBtmMarkHit=nTopMarkHit; }
1457*cdf0e10cSrcweir 	SdrObject* pBtmObjHit=pBtmMarkHit->GetMarkedSdrObj();
1458*cdf0e10cSrcweir 	sal_uIntPtr nObjAnz=pObjList->GetObjCount();
1459*cdf0e10cSrcweir 
1460*cdf0e10cSrcweir 	// #110988#
1461*cdf0e10cSrcweir 	//sal_uIntPtr nSearchBeg=bPrev ? pBtmObjHit->GetOrdNum()+1 : pTopObjHit->GetOrdNum();
1462*cdf0e10cSrcweir 	sal_uInt32 nSearchBeg;
1463*cdf0e10cSrcweir 	E3dScene* pScene = NULL;
1464*cdf0e10cSrcweir 	SdrObject* pObjHit = (bPrev) ? pBtmObjHit : pTopObjHit;
1465*cdf0e10cSrcweir 	sal_Bool bRemap = pObjHit->ISA(E3dCompoundObject)
1466*cdf0e10cSrcweir 		? ((E3dCompoundObject*)pObjHit)->IsAOrdNumRemapCandidate(pScene)
1467*cdf0e10cSrcweir 		: sal_False;
1468*cdf0e10cSrcweir 
1469*cdf0e10cSrcweir 	if(bPrev)
1470*cdf0e10cSrcweir 	{
1471*cdf0e10cSrcweir 		sal_uInt32 nOrdNumBtm(pBtmObjHit->GetOrdNum());
1472*cdf0e10cSrcweir 
1473*cdf0e10cSrcweir 		if(bRemap)
1474*cdf0e10cSrcweir 		{
1475*cdf0e10cSrcweir 			nOrdNumBtm = pScene->RemapOrdNum(nOrdNumBtm);
1476*cdf0e10cSrcweir 		}
1477*cdf0e10cSrcweir 
1478*cdf0e10cSrcweir 		nSearchBeg = nOrdNumBtm + 1;
1479*cdf0e10cSrcweir 	}
1480*cdf0e10cSrcweir 	else
1481*cdf0e10cSrcweir 	{
1482*cdf0e10cSrcweir 		sal_uInt32 nOrdNumTop(pTopObjHit->GetOrdNum());
1483*cdf0e10cSrcweir 
1484*cdf0e10cSrcweir 		if(bRemap)
1485*cdf0e10cSrcweir 		{
1486*cdf0e10cSrcweir 			nOrdNumTop = pScene->RemapOrdNum(nOrdNumTop);
1487*cdf0e10cSrcweir 		}
1488*cdf0e10cSrcweir 
1489*cdf0e10cSrcweir 		nSearchBeg = nOrdNumTop;
1490*cdf0e10cSrcweir 	}
1491*cdf0e10cSrcweir 
1492*cdf0e10cSrcweir 	sal_uIntPtr no=nSearchBeg;
1493*cdf0e10cSrcweir 	SdrObject* pFndObj=NULL;
1494*cdf0e10cSrcweir 	//SdrObject* pAktObj=NULL;
1495*cdf0e10cSrcweir 	while (pFndObj==NULL && ((!bPrev && no>0) || (bPrev && no<nObjAnz))) {
1496*cdf0e10cSrcweir 		if (!bPrev) no--;
1497*cdf0e10cSrcweir 		SdrObject* pObj;
1498*cdf0e10cSrcweir 
1499*cdf0e10cSrcweir 		if(bRemap)
1500*cdf0e10cSrcweir 		{
1501*cdf0e10cSrcweir 			pObj = pObjList->GetObj(pScene->RemapOrdNum(no));
1502*cdf0e10cSrcweir 		}
1503*cdf0e10cSrcweir 		else
1504*cdf0e10cSrcweir 		{
1505*cdf0e10cSrcweir 			pObj = pObjList->GetObj(no);
1506*cdf0e10cSrcweir 		}
1507*cdf0e10cSrcweir 
1508*cdf0e10cSrcweir 		if (CheckSingleSdrObjectHit(aPt,sal_uInt16(nTol),pObj,pPV,SDRSEARCH_TESTMARKABLE,0))
1509*cdf0e10cSrcweir         {
1510*cdf0e10cSrcweir 			if (TryToFindMarkedObject(pObj)==CONTAINER_ENTRY_NOTFOUND) {
1511*cdf0e10cSrcweir 				pFndObj=pObj;
1512*cdf0e10cSrcweir 			} else {
1513*cdf0e10cSrcweir 				// hier wg. Performance ggf. noch no auf Top bzw. auf Btm stellen
1514*cdf0e10cSrcweir 			}
1515*cdf0e10cSrcweir 		}
1516*cdf0e10cSrcweir 		if (bPrev) no++;
1517*cdf0e10cSrcweir 	}
1518*cdf0e10cSrcweir 	if (pFndObj!=NULL)
1519*cdf0e10cSrcweir 	{
1520*cdf0e10cSrcweir 		GetMarkedObjectListWriteAccess().DeleteMark(bPrev?nBtmMarkHit:nTopMarkHit);
1521*cdf0e10cSrcweir 		GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pFndObj,pPV));
1522*cdf0e10cSrcweir 		MarkListHasChanged();
1523*cdf0e10cSrcweir 		AdjustMarkHdl(); //HMHTRUE);
1524*cdf0e10cSrcweir 	}
1525*cdf0e10cSrcweir 	return pFndObj!=NULL;
1526*cdf0e10cSrcweir }
1527*cdf0e10cSrcweir 
1528*cdf0e10cSrcweir sal_Bool SdrMarkView::MarkObj(const Rectangle& rRect, sal_Bool bUnmark)
1529*cdf0e10cSrcweir {
1530*cdf0e10cSrcweir 	sal_Bool bFnd=sal_False;
1531*cdf0e10cSrcweir 	Rectangle aR(rRect);
1532*cdf0e10cSrcweir 	SdrObject* pObj;
1533*cdf0e10cSrcweir 	SdrObjList* pObjList;
1534*cdf0e10cSrcweir 	BrkAction();
1535*cdf0e10cSrcweir 	SdrPageView* pPV = GetSdrPageView();
1536*cdf0e10cSrcweir 
1537*cdf0e10cSrcweir 	if(pPV)
1538*cdf0e10cSrcweir 	{
1539*cdf0e10cSrcweir 		pObjList=pPV->GetObjList();
1540*cdf0e10cSrcweir 		Rectangle aFrm1(aR);
1541*cdf0e10cSrcweir 		sal_uIntPtr nObjAnz=pObjList->GetObjCount();
1542*cdf0e10cSrcweir 		for (sal_uIntPtr nO=0; nO<nObjAnz; nO++) {
1543*cdf0e10cSrcweir 			pObj=pObjList->GetObj(nO);
1544*cdf0e10cSrcweir 			Rectangle aRect(pObj->GetCurrentBoundRect());
1545*cdf0e10cSrcweir 			if (aFrm1.IsInside(aRect)) {
1546*cdf0e10cSrcweir 				if (!bUnmark) {
1547*cdf0e10cSrcweir 					if (IsObjMarkable(pObj,pPV))
1548*cdf0e10cSrcweir 					{
1549*cdf0e10cSrcweir 						GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV));
1550*cdf0e10cSrcweir 						bFnd=sal_True;
1551*cdf0e10cSrcweir 					}
1552*cdf0e10cSrcweir 				} else {
1553*cdf0e10cSrcweir 					sal_uIntPtr nPos=TryToFindMarkedObject(pObj);
1554*cdf0e10cSrcweir 					if (nPos!=CONTAINER_ENTRY_NOTFOUND)
1555*cdf0e10cSrcweir 					{
1556*cdf0e10cSrcweir 						GetMarkedObjectListWriteAccess().DeleteMark(nPos);
1557*cdf0e10cSrcweir 						bFnd=sal_True;
1558*cdf0e10cSrcweir 					}
1559*cdf0e10cSrcweir 				}
1560*cdf0e10cSrcweir 			}
1561*cdf0e10cSrcweir 		}
1562*cdf0e10cSrcweir 	}
1563*cdf0e10cSrcweir 	if (bFnd) {
1564*cdf0e10cSrcweir 		SortMarkedObjects();
1565*cdf0e10cSrcweir 		MarkListHasChanged();
1566*cdf0e10cSrcweir 		AdjustMarkHdl(); //HMHTRUE);
1567*cdf0e10cSrcweir 		//HMHShowMarkHdl();
1568*cdf0e10cSrcweir 	}
1569*cdf0e10cSrcweir 	return bFnd;
1570*cdf0e10cSrcweir }
1571*cdf0e10cSrcweir 
1572*cdf0e10cSrcweir void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, sal_Bool bUnmark, sal_Bool bImpNoSetMarkHdl)
1573*cdf0e10cSrcweir {
1574*cdf0e10cSrcweir 	if (pObj!=NULL && pPV!=NULL && IsObjMarkable(pObj, pPV)) {
1575*cdf0e10cSrcweir 		BrkAction();
1576*cdf0e10cSrcweir 		if (!bUnmark)
1577*cdf0e10cSrcweir 		{
1578*cdf0e10cSrcweir 			GetMarkedObjectListWriteAccess().InsertEntry(SdrMark(pObj,pPV));
1579*cdf0e10cSrcweir 		}
1580*cdf0e10cSrcweir 		else
1581*cdf0e10cSrcweir 		{
1582*cdf0e10cSrcweir 			sal_uIntPtr nPos=TryToFindMarkedObject(pObj);
1583*cdf0e10cSrcweir 			if (nPos!=CONTAINER_ENTRY_NOTFOUND)
1584*cdf0e10cSrcweir 			{
1585*cdf0e10cSrcweir 				GetMarkedObjectListWriteAccess().DeleteMark(nPos);
1586*cdf0e10cSrcweir 			}
1587*cdf0e10cSrcweir 		}
1588*cdf0e10cSrcweir 		if (!bImpNoSetMarkHdl) {
1589*cdf0e10cSrcweir 			MarkListHasChanged();
1590*cdf0e10cSrcweir 			AdjustMarkHdl(); //HMHTRUE);
1591*cdf0e10cSrcweir 			//HMHif (!bSomeObjChgdFlag) {
1592*cdf0e10cSrcweir 				// ShowMarkHdl kommt sonst mit dem AfterPaintTimer
1593*cdf0e10cSrcweir 				//HMHShowMarkHdl();
1594*cdf0e10cSrcweir 			//HMH}
1595*cdf0e10cSrcweir 		}
1596*cdf0e10cSrcweir 	}
1597*cdf0e10cSrcweir }
1598*cdf0e10cSrcweir 
1599*cdf0e10cSrcweir sal_Bool SdrMarkView::IsObjMarked(SdrObject* pObj) const
1600*cdf0e10cSrcweir {
1601*cdf0e10cSrcweir 	// nicht so ganz die feine Art: Da FindObject() nicht const ist
1602*cdf0e10cSrcweir 	// muss ich mich hier auf non-const casten.
1603*cdf0e10cSrcweir 	sal_uIntPtr nPos=((SdrMarkView*)this)->TryToFindMarkedObject(pObj);
1604*cdf0e10cSrcweir 	return nPos!=CONTAINER_ENTRY_NOTFOUND;
1605*cdf0e10cSrcweir }
1606*cdf0e10cSrcweir 
1607*cdf0e10cSrcweir sal_uInt16 SdrMarkView::GetMarkHdlSizePixel() const
1608*cdf0e10cSrcweir {
1609*cdf0e10cSrcweir 	return aHdl.GetHdlSize()*2+1;
1610*cdf0e10cSrcweir }
1611*cdf0e10cSrcweir 
1612*cdf0e10cSrcweir void SdrMarkView::SetSolidMarkHdl(sal_Bool bOn)
1613*cdf0e10cSrcweir {
1614*cdf0e10cSrcweir 	if (bOn!=aHdl.IsFineHdl()) {
1615*cdf0e10cSrcweir 		//HMHBOOL bMerk=IsMarkHdlShown();
1616*cdf0e10cSrcweir 		//HMHif (bMerk) HideMarkHdl();
1617*cdf0e10cSrcweir 		aHdl.SetFineHdl(bOn);
1618*cdf0e10cSrcweir 		//HMHif (bMerk) ShowMarkHdl();
1619*cdf0e10cSrcweir 	}
1620*cdf0e10cSrcweir }
1621*cdf0e10cSrcweir 
1622*cdf0e10cSrcweir void SdrMarkView::SetMarkHdlSizePixel(sal_uInt16 nSiz)
1623*cdf0e10cSrcweir {
1624*cdf0e10cSrcweir 	if (nSiz<3) nSiz=3;
1625*cdf0e10cSrcweir 	nSiz/=2;
1626*cdf0e10cSrcweir 	if (nSiz!=aHdl.GetHdlSize()) {
1627*cdf0e10cSrcweir 		//HMHBOOL bMerk=IsMarkHdlShown();
1628*cdf0e10cSrcweir 		//HMHif (bMerk) HideMarkHdl();
1629*cdf0e10cSrcweir 		aHdl.SetHdlSize(nSiz);
1630*cdf0e10cSrcweir 		//HMHif (bMerk) ShowMarkHdl();
1631*cdf0e10cSrcweir 	}
1632*cdf0e10cSrcweir }
1633*cdf0e10cSrcweir 
1634*cdf0e10cSrcweir #define SDRSEARCH_IMPISMASTER 0x80000000 /* MasterPage wird gerade durchsucht */
1635*cdf0e10cSrcweir SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay) const
1636*cdf0e10cSrcweir {
1637*cdf0e10cSrcweir 	if(((nOptions & SDRSEARCH_IMPISMASTER) && pObj->IsNotVisibleAsMaster()) || (!pObj->IsVisible()))
1638*cdf0e10cSrcweir     {
1639*cdf0e10cSrcweir 		return NULL;
1640*cdf0e10cSrcweir 	}
1641*cdf0e10cSrcweir 
1642*cdf0e10cSrcweir     const bool bCheckIfMarkable(nOptions & SDRSEARCH_TESTMARKABLE);
1643*cdf0e10cSrcweir 	const bool bDeep(nOptions & SDRSEARCH_DEEP);
1644*cdf0e10cSrcweir 	const bool bOLE(pObj->ISA(SdrOle2Obj));
1645*cdf0e10cSrcweir 	const bool bTXT(pObj->ISA(SdrTextObj) && ((SdrTextObj*)pObj)->IsTextFrame());
1646*cdf0e10cSrcweir 	SdrObject* pRet=NULL;
1647*cdf0e10cSrcweir 	Rectangle aRect(pObj->GetCurrentBoundRect());
1648*cdf0e10cSrcweir 	sal_uInt16 nTol2(nTol);
1649*cdf0e10cSrcweir 
1650*cdf0e10cSrcweir     // double tolerance for OLE, text frames and objects in
1651*cdf0e10cSrcweir     // active text edit
1652*cdf0e10cSrcweir 	if(bOLE || bTXT || pObj==((SdrObjEditView*)this)->GetTextEditObject())
1653*cdf0e10cSrcweir     {
1654*cdf0e10cSrcweir         nTol2*=2;
1655*cdf0e10cSrcweir     }
1656*cdf0e10cSrcweir 
1657*cdf0e10cSrcweir     aRect.Left  ()-=nTol2; // Einmal Toleranz drauf fuer alle Objekte
1658*cdf0e10cSrcweir 	aRect.Top   ()-=nTol2;
1659*cdf0e10cSrcweir 	aRect.Right ()+=nTol2;
1660*cdf0e10cSrcweir 	aRect.Bottom()+=nTol2;
1661*cdf0e10cSrcweir 
1662*cdf0e10cSrcweir     if (aRect.IsInside(rPnt))
1663*cdf0e10cSrcweir     {
1664*cdf0e10cSrcweir 		if ((!bCheckIfMarkable || IsObjMarkable(pObj,pPV)))
1665*cdf0e10cSrcweir         {
1666*cdf0e10cSrcweir 			SdrObjList* pOL=pObj->GetSubList();
1667*cdf0e10cSrcweir 
1668*cdf0e10cSrcweir             if (pOL!=NULL && pOL->GetObjCount()!=0)
1669*cdf0e10cSrcweir             {
1670*cdf0e10cSrcweir 				SdrObject* pTmpObj;
1671*cdf0e10cSrcweir                 // OD 30.06.2003 #108784# - adjustment hit point for virtual
1672*cdf0e10cSrcweir                 // objects.
1673*cdf0e10cSrcweir                 Point aPnt( rPnt );
1674*cdf0e10cSrcweir 
1675*cdf0e10cSrcweir                 if ( pObj->ISA(SdrVirtObj) )
1676*cdf0e10cSrcweir                 {
1677*cdf0e10cSrcweir                     Point aOffset = static_cast<SdrVirtObj*>(pObj)->GetOffset();
1678*cdf0e10cSrcweir                     aPnt.Move( -aOffset.X(), -aOffset.Y() );
1679*cdf0e10cSrcweir                 }
1680*cdf0e10cSrcweir 
1681*cdf0e10cSrcweir                 pRet=CheckSingleSdrObjectHit(aPnt,nTol,pOL,pPV,nOptions,pMVisLay,pTmpObj);
1682*cdf0e10cSrcweir 			}
1683*cdf0e10cSrcweir             else
1684*cdf0e10cSrcweir             {
1685*cdf0e10cSrcweir                 if(!pMVisLay || pMVisLay->IsSet(pObj->GetLayer()))
1686*cdf0e10cSrcweir 				{
1687*cdf0e10cSrcweir 					pRet = SdrObjectPrimitiveHit(*pObj, rPnt, nTol2, *pPV, &pPV->GetVisibleLayers(), false);
1688*cdf0e10cSrcweir 				}
1689*cdf0e10cSrcweir 			}
1690*cdf0e10cSrcweir 		}
1691*cdf0e10cSrcweir 	}
1692*cdf0e10cSrcweir 
1693*cdf0e10cSrcweir     if (!bDeep && pRet!=NULL)
1694*cdf0e10cSrcweir     {
1695*cdf0e10cSrcweir         pRet=pObj;
1696*cdf0e10cSrcweir     }
1697*cdf0e10cSrcweir 
1698*cdf0e10cSrcweir 	return pRet;
1699*cdf0e10cSrcweir }
1700*cdf0e10cSrcweir 
1701*cdf0e10cSrcweir SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObjList* pOL, SdrPageView* pPV, sal_uIntPtr nOptions, const SetOfByte* pMVisLay, SdrObject*& rpRootObj) const
1702*cdf0e10cSrcweir {
1703*cdf0e10cSrcweir 	sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD)!=0;
1704*cdf0e10cSrcweir 	SdrObject* pRet=NULL;
1705*cdf0e10cSrcweir 	rpRootObj=NULL;
1706*cdf0e10cSrcweir 	if (pOL!=NULL)
1707*cdf0e10cSrcweir 	{
1708*cdf0e10cSrcweir 		// #110988#
1709*cdf0e10cSrcweir 		sal_Bool bRemap(pOL->GetOwnerObj() && pOL->GetOwnerObj()->ISA(E3dScene));
1710*cdf0e10cSrcweir 		E3dScene* pRemapScene = (bRemap ? (E3dScene*)pOL->GetOwnerObj() : 0L);
1711*cdf0e10cSrcweir 
1712*cdf0e10cSrcweir 		sal_uIntPtr nObjAnz=pOL->GetObjCount();
1713*cdf0e10cSrcweir 		sal_uIntPtr nObjNum=bBack ? 0 : nObjAnz;
1714*cdf0e10cSrcweir 		while (pRet==NULL && (bBack ? nObjNum<nObjAnz : nObjNum>0)) {
1715*cdf0e10cSrcweir 			if (!bBack) nObjNum--;
1716*cdf0e10cSrcweir 			SdrObject* pObj;
1717*cdf0e10cSrcweir 
1718*cdf0e10cSrcweir 			// #110988#
1719*cdf0e10cSrcweir 			if(bRemap)
1720*cdf0e10cSrcweir 			{
1721*cdf0e10cSrcweir 				pObj = pOL->GetObj(pRemapScene->RemapOrdNum(nObjNum));
1722*cdf0e10cSrcweir 			}
1723*cdf0e10cSrcweir 			else
1724*cdf0e10cSrcweir 			{
1725*cdf0e10cSrcweir 				pObj = pOL->GetObj(nObjNum);
1726*cdf0e10cSrcweir 			}
1727*cdf0e10cSrcweir 
1728*cdf0e10cSrcweir 			pRet=CheckSingleSdrObjectHit(rPnt,nTol,pObj,pPV,nOptions,pMVisLay);
1729*cdf0e10cSrcweir 			if (pRet!=NULL) rpRootObj=pObj;
1730*cdf0e10cSrcweir 			if (bBack) nObjNum++;
1731*cdf0e10cSrcweir 		}
1732*cdf0e10cSrcweir 	}
1733*cdf0e10cSrcweir 	return pRet;
1734*cdf0e10cSrcweir }
1735*cdf0e10cSrcweir 
1736*cdf0e10cSrcweir sal_Bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr nOptions) const
1737*cdf0e10cSrcweir {
1738*cdf0e10cSrcweir 	return PickObj(rPnt,nTol,rpObj,rpPV,nOptions,NULL,NULL,NULL);
1739*cdf0e10cSrcweir }
1740*cdf0e10cSrcweir 
1741*cdf0e10cSrcweir sal_Bool SdrMarkView::PickObj(const Point& rPnt, short nTol, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr nOptions, SdrObject** ppRootObj, sal_uIntPtr* pnMarkNum, sal_uInt16* pnPassNum) const
1742*cdf0e10cSrcweir { // Fehlt noch Pass2,Pass3
1743*cdf0e10cSrcweir 	SortMarkedObjects();
1744*cdf0e10cSrcweir 	if (ppRootObj!=NULL) *ppRootObj=NULL;
1745*cdf0e10cSrcweir 	if (pnMarkNum!=NULL) *pnMarkNum=CONTAINER_ENTRY_NOTFOUND;
1746*cdf0e10cSrcweir 	if (pnPassNum!=NULL) *pnPassNum=0;
1747*cdf0e10cSrcweir 	rpObj=NULL;
1748*cdf0e10cSrcweir 	rpPV=NULL;
1749*cdf0e10cSrcweir 	sal_Bool bWholePage=(nOptions & SDRSEARCH_WHOLEPAGE) !=0;
1750*cdf0e10cSrcweir 	sal_Bool bMarked=(nOptions & SDRSEARCH_MARKED) !=0;
1751*cdf0e10cSrcweir 	sal_Bool bMasters=!bMarked && (nOptions & SDRSEARCH_ALSOONMASTER) !=0;
1752*cdf0e10cSrcweir 	sal_Bool bBack=(nOptions & SDRSEARCH_BACKWARD) !=0;
1753*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
1754*cdf0e10cSrcweir     sal_Bool bNext=(nOptions & SDRSEARCH_NEXT) !=0; (void)bNext; // n.i.
1755*cdf0e10cSrcweir     sal_Bool bBoundCheckOn2ndPass=(nOptions & SDRSEARCH_PASS2BOUND) !=0; (void)bBoundCheckOn2ndPass;// n.i.
1756*cdf0e10cSrcweir     sal_Bool bCheckNearestOn3rdPass=(nOptions & SDRSEARCH_PASS3NEAREST) !=0; (void)bCheckNearestOn3rdPass;// n.i.
1757*cdf0e10cSrcweir #endif
1758*cdf0e10cSrcweir 	if (nTol<0) nTol=ImpGetHitTolLogic(nTol,NULL);
1759*cdf0e10cSrcweir 	Point aPt(rPnt);
1760*cdf0e10cSrcweir 	SdrObject* pObj=NULL;
1761*cdf0e10cSrcweir 	SdrObject* pHitObj=NULL;
1762*cdf0e10cSrcweir 	SdrPageView* pPV=NULL;
1763*cdf0e10cSrcweir 	if (!bBack && ((SdrObjEditView*)this)->IsTextEditFrameHit(rPnt)) {
1764*cdf0e10cSrcweir 		pObj=((SdrObjEditView*)this)->GetTextEditObject();
1765*cdf0e10cSrcweir 		pHitObj=pObj;
1766*cdf0e10cSrcweir 		pPV=((SdrObjEditView*)this)->GetTextEditPageView();
1767*cdf0e10cSrcweir 	}
1768*cdf0e10cSrcweir 	if (bMarked) {
1769*cdf0e10cSrcweir 		sal_uIntPtr nMrkAnz=GetMarkedObjectCount();
1770*cdf0e10cSrcweir 		sal_uIntPtr nMrkNum=bBack ? 0 : nMrkAnz;
1771*cdf0e10cSrcweir 		while (pHitObj==NULL && (bBack ? nMrkNum<nMrkAnz : nMrkNum>0)) {
1772*cdf0e10cSrcweir 			if (!bBack) nMrkNum--;
1773*cdf0e10cSrcweir 			SdrMark* pM=GetSdrMarkByIndex(nMrkNum);
1774*cdf0e10cSrcweir 			pObj=pM->GetMarkedSdrObj();
1775*cdf0e10cSrcweir 			pPV=pM->GetPageView();
1776*cdf0e10cSrcweir 			pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,nOptions,NULL);
1777*cdf0e10cSrcweir 			if (bBack) nMrkNum++;
1778*cdf0e10cSrcweir 		}
1779*cdf0e10cSrcweir 	}
1780*cdf0e10cSrcweir 	else
1781*cdf0e10cSrcweir 	{
1782*cdf0e10cSrcweir 		pPV = GetSdrPageView();
1783*cdf0e10cSrcweir 
1784*cdf0e10cSrcweir 		if(pPV)
1785*cdf0e10cSrcweir 		{
1786*cdf0e10cSrcweir 			SdrPage* pPage=pPV->GetPage();
1787*cdf0e10cSrcweir 			sal_uInt16 nPgAnz=1;
1788*cdf0e10cSrcweir 
1789*cdf0e10cSrcweir 			if(bMasters && pPage->TRG_HasMasterPage())
1790*cdf0e10cSrcweir 			{
1791*cdf0e10cSrcweir 				nPgAnz++;
1792*cdf0e10cSrcweir 			}
1793*cdf0e10cSrcweir 
1794*cdf0e10cSrcweir 			sal_Bool bExtraPassForWholePage=bWholePage && pPage!=pPV->GetObjList();
1795*cdf0e10cSrcweir 			if (bExtraPassForWholePage) nPgAnz++; // Suche erst in AktObjList, dann auf der gesamten Page
1796*cdf0e10cSrcweir 			sal_uInt16 nPgNum=bBack ? 0 : nPgAnz;
1797*cdf0e10cSrcweir 			while (pHitObj==NULL && (bBack ? nPgNum<nPgAnz : nPgNum>0)) {
1798*cdf0e10cSrcweir 				sal_uIntPtr nTmpOptions=nOptions;
1799*cdf0e10cSrcweir 				if (!bBack) nPgNum--;
1800*cdf0e10cSrcweir 				const SetOfByte* pMVisLay=NULL;
1801*cdf0e10cSrcweir 				SdrObjList* pObjList=NULL;
1802*cdf0e10cSrcweir 				if (pnPassNum!=NULL) *pnPassNum&=~(SDRSEARCHPASS_MASTERPAGE|SDRSEARCHPASS_INACTIVELIST);
1803*cdf0e10cSrcweir 				if (nPgNum>=nPgAnz-1 || (bExtraPassForWholePage && nPgNum>=nPgAnz-2))
1804*cdf0e10cSrcweir 				{
1805*cdf0e10cSrcweir 					pObjList=pPV->GetObjList();
1806*cdf0e10cSrcweir 					if (bExtraPassForWholePage && nPgNum==nPgAnz-2) {
1807*cdf0e10cSrcweir 						pObjList=pPage;
1808*cdf0e10cSrcweir 						if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_INACTIVELIST;
1809*cdf0e10cSrcweir 					}
1810*cdf0e10cSrcweir 				}
1811*cdf0e10cSrcweir 				else
1812*cdf0e10cSrcweir 				{
1813*cdf0e10cSrcweir 					// sonst MasterPage
1814*cdf0e10cSrcweir 					SdrPage& rMasterPage = pPage->TRG_GetMasterPage();
1815*cdf0e10cSrcweir 					pMVisLay = &pPage->TRG_GetMasterPageVisibleLayers();
1816*cdf0e10cSrcweir 					pObjList = &rMasterPage;
1817*cdf0e10cSrcweir 
1818*cdf0e10cSrcweir 					if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_MASTERPAGE;
1819*cdf0e10cSrcweir 					nTmpOptions=nTmpOptions | SDRSEARCH_IMPISMASTER;
1820*cdf0e10cSrcweir 				}
1821*cdf0e10cSrcweir 				pHitObj=CheckSingleSdrObjectHit(aPt,nTol,pObjList,pPV,nTmpOptions,pMVisLay,pObj);
1822*cdf0e10cSrcweir 				if (bBack) nPgNum++;
1823*cdf0e10cSrcweir 			}
1824*cdf0e10cSrcweir 		}
1825*cdf0e10cSrcweir 	}
1826*cdf0e10cSrcweir 	if (pHitObj!=NULL) {
1827*cdf0e10cSrcweir 		if (ppRootObj!=NULL) *ppRootObj=pObj;
1828*cdf0e10cSrcweir 		if ((nOptions & SDRSEARCH_DEEP) !=0) pObj=pHitObj;
1829*cdf0e10cSrcweir 		if ((nOptions & SDRSEARCH_TESTTEXTEDIT) !=0) {
1830*cdf0e10cSrcweir 			if (!pObj->HasTextEdit() || pPV->GetLockedLayers().IsSet(pObj->GetLayer())) {
1831*cdf0e10cSrcweir 				pObj=NULL;
1832*cdf0e10cSrcweir 			}
1833*cdf0e10cSrcweir 		}
1834*cdf0e10cSrcweir 		if (pObj!=NULL && (nOptions & SDRSEARCH_TESTMACRO) !=0) {
1835*cdf0e10cSrcweir 			SdrObjMacroHitRec aHitRec;
1836*cdf0e10cSrcweir 			aHitRec.aPos=aPt;
1837*cdf0e10cSrcweir 			aHitRec.aDownPos=aPt;
1838*cdf0e10cSrcweir 			aHitRec.nTol=nTol;
1839*cdf0e10cSrcweir 			aHitRec.pVisiLayer=&pPV->GetVisibleLayers();
1840*cdf0e10cSrcweir 			aHitRec.pPageView=pPV;
1841*cdf0e10cSrcweir 			if (!pObj->HasMacro() || !pObj->IsMacroHit(aHitRec)) pObj=NULL;
1842*cdf0e10cSrcweir 		}
1843*cdf0e10cSrcweir 		if (pObj!=NULL && (nOptions & SDRSEARCH_WITHTEXT) !=0 && pObj->GetOutlinerParaObject()==NULL) pObj=NULL;
1844*cdf0e10cSrcweir 		if (pObj!=NULL && (nOptions & SDRSEARCH_TESTTEXTAREA) !=0)
1845*cdf0e10cSrcweir         {
1846*cdf0e10cSrcweir 			if(!SdrObjectPrimitiveHit(*pObj, aPt, 0, *pPV, 0, true))
1847*cdf0e10cSrcweir             {
1848*cdf0e10cSrcweir                 pObj = 0;
1849*cdf0e10cSrcweir             }
1850*cdf0e10cSrcweir 		}
1851*cdf0e10cSrcweir 		if (pObj!=NULL) {
1852*cdf0e10cSrcweir 			rpObj=pObj;
1853*cdf0e10cSrcweir 			rpPV=pPV;
1854*cdf0e10cSrcweir 			if (pnPassNum!=NULL) *pnPassNum|=SDRSEARCHPASS_DIRECT;
1855*cdf0e10cSrcweir 		}
1856*cdf0e10cSrcweir 	}
1857*cdf0e10cSrcweir 	return rpObj!=NULL;
1858*cdf0e10cSrcweir }
1859*cdf0e10cSrcweir 
1860*cdf0e10cSrcweir sal_Bool SdrMarkView::PickMarkedObj(const Point& rPnt, SdrObject*& rpObj, SdrPageView*& rpPV, sal_uIntPtr* pnMarkNum, sal_uIntPtr nOptions) const
1861*cdf0e10cSrcweir {
1862*cdf0e10cSrcweir 	SortMarkedObjects();
1863*cdf0e10cSrcweir 	sal_Bool bBoundCheckOn2ndPass=(nOptions & SDRSEARCH_PASS2BOUND) !=0;
1864*cdf0e10cSrcweir 	sal_Bool bCheckNearestOn3rdPass=(nOptions & SDRSEARCH_PASS3NEAREST) !=0;
1865*cdf0e10cSrcweir 	rpObj=NULL;
1866*cdf0e10cSrcweir 	rpPV=NULL;
1867*cdf0e10cSrcweir 	if (pnMarkNum!=NULL) *pnMarkNum=CONTAINER_ENTRY_NOTFOUND;
1868*cdf0e10cSrcweir 	Point aPt(rPnt);
1869*cdf0e10cSrcweir 	sal_uInt16 nTol=(sal_uInt16)nHitTolLog;
1870*cdf0e10cSrcweir 	sal_Bool bFnd=sal_False;
1871*cdf0e10cSrcweir 	sal_uIntPtr nMarkAnz=GetMarkedObjectCount();
1872*cdf0e10cSrcweir 	sal_uIntPtr nMarkNum;
1873*cdf0e10cSrcweir 	for (nMarkNum=nMarkAnz; nMarkNum>0 && !bFnd;) {
1874*cdf0e10cSrcweir 		nMarkNum--;
1875*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
1876*cdf0e10cSrcweir 		SdrPageView* pPV=pM->GetPageView();
1877*cdf0e10cSrcweir 		SdrObject* pObj=pM->GetMarkedSdrObj();
1878*cdf0e10cSrcweir 		bFnd = 0 != CheckSingleSdrObjectHit(aPt,nTol,pObj,pPV,SDRSEARCH_TESTMARKABLE,0);
1879*cdf0e10cSrcweir 		if (bFnd) {
1880*cdf0e10cSrcweir 			rpObj=pObj;
1881*cdf0e10cSrcweir 			rpPV=pPV;
1882*cdf0e10cSrcweir 			if (pnMarkNum!=NULL) *pnMarkNum=nMarkNum;
1883*cdf0e10cSrcweir 		}
1884*cdf0e10cSrcweir 	}
1885*cdf0e10cSrcweir 	if ((bBoundCheckOn2ndPass || bCheckNearestOn3rdPass) && !bFnd) {
1886*cdf0e10cSrcweir 		SdrObject* pBestObj=NULL;
1887*cdf0e10cSrcweir 		SdrPageView* pBestPV=NULL;
1888*cdf0e10cSrcweir 		sal_uIntPtr nBestMarkNum=0;
1889*cdf0e10cSrcweir 		sal_uIntPtr nBestDist=ULONG_MAX;
1890*cdf0e10cSrcweir 		for (nMarkNum=nMarkAnz; nMarkNum>0 && !bFnd;) {
1891*cdf0e10cSrcweir 			nMarkNum--;
1892*cdf0e10cSrcweir 			SdrMark* pM=GetSdrMarkByIndex(nMarkNum);
1893*cdf0e10cSrcweir 			SdrPageView* pPV=pM->GetPageView();
1894*cdf0e10cSrcweir 			SdrObject* pObj=pM->GetMarkedSdrObj();
1895*cdf0e10cSrcweir 			Rectangle aRect(pObj->GetCurrentBoundRect());
1896*cdf0e10cSrcweir 			aRect.Left  ()-=nTol;
1897*cdf0e10cSrcweir 			aRect.Top   ()-=nTol;
1898*cdf0e10cSrcweir 			aRect.Right ()+=nTol;
1899*cdf0e10cSrcweir 			aRect.Bottom()+=nTol;
1900*cdf0e10cSrcweir 			if (aRect.IsInside(aPt)) {
1901*cdf0e10cSrcweir 				bFnd=sal_True;
1902*cdf0e10cSrcweir 				rpObj=pObj;
1903*cdf0e10cSrcweir 				rpPV=pPV;
1904*cdf0e10cSrcweir 				if (pnMarkNum!=NULL) *pnMarkNum=nMarkNum;
1905*cdf0e10cSrcweir 			} else if (bCheckNearestOn3rdPass) {
1906*cdf0e10cSrcweir 				sal_uIntPtr nDist=0;
1907*cdf0e10cSrcweir 				if (aPt.X()<aRect.Left())   nDist+=aRect.Left()-aPt.X();
1908*cdf0e10cSrcweir 				if (aPt.X()>aRect.Right())  nDist+=aPt.X()-aRect.Right();
1909*cdf0e10cSrcweir 				if (aPt.Y()<aRect.Top())    nDist+=aRect.Top()-aPt.Y();
1910*cdf0e10cSrcweir 				if (aPt.Y()>aRect.Bottom()) nDist+=aPt.Y()-aRect.Bottom();
1911*cdf0e10cSrcweir 				if (nDist<nBestDist) {
1912*cdf0e10cSrcweir 					pBestObj=pObj;
1913*cdf0e10cSrcweir 					pBestPV=pPV;
1914*cdf0e10cSrcweir 					nBestMarkNum=nMarkNum;
1915*cdf0e10cSrcweir 				}
1916*cdf0e10cSrcweir 			}
1917*cdf0e10cSrcweir 		}
1918*cdf0e10cSrcweir 		if (bCheckNearestOn3rdPass && !bFnd) {
1919*cdf0e10cSrcweir 			rpObj=pBestObj;
1920*cdf0e10cSrcweir 			rpPV=pBestPV;
1921*cdf0e10cSrcweir 			if (pnMarkNum!=NULL) *pnMarkNum=nBestMarkNum;
1922*cdf0e10cSrcweir 			bFnd=pBestObj!=NULL;
1923*cdf0e10cSrcweir 		}
1924*cdf0e10cSrcweir 	}
1925*cdf0e10cSrcweir 	return bFnd;
1926*cdf0e10cSrcweir }
1927*cdf0e10cSrcweir 
1928*cdf0e10cSrcweir SdrHitKind SdrMarkView::PickSomething(const Point& rPnt, short nTol) const
1929*cdf0e10cSrcweir {
1930*cdf0e10cSrcweir 	nTol=ImpGetHitTolLogic(nTol,NULL);
1931*cdf0e10cSrcweir 	SdrHitKind eRet=SDRHIT_NONE;
1932*cdf0e10cSrcweir 	Point aPt(rPnt);
1933*cdf0e10cSrcweir 	SdrObject* pObj=NULL;
1934*cdf0e10cSrcweir 	SdrPageView* pPV=NULL;
1935*cdf0e10cSrcweir 	if (eRet==SDRHIT_NONE && PickObj(rPnt,sal_uInt16(nTol),pObj,pPV,SDRSEARCH_PICKMARKABLE)) {
1936*cdf0e10cSrcweir 		Rectangle aRct1(aPt-Point(nTol,nTol),aPt+Point(nTol,nTol)); // HitRect fuer Toleranz
1937*cdf0e10cSrcweir 		Rectangle aBR(pObj->GetCurrentBoundRect());
1938*cdf0e10cSrcweir 		if      (aRct1.IsInside(aBR.TopLeft()))      eRet=SDRHIT_BOUNDTL;
1939*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.TopCenter()))    eRet=SDRHIT_BOUNDTC;
1940*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.TopRight()))     eRet=SDRHIT_BOUNDTR;
1941*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.LeftCenter()))   eRet=SDRHIT_BOUNDCL;
1942*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.RightCenter()))  eRet=SDRHIT_BOUNDCR;
1943*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.BottomLeft()))   eRet=SDRHIT_BOUNDBL;
1944*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.BottomCenter())) eRet=SDRHIT_BOUNDBC;
1945*cdf0e10cSrcweir 		else if (aRct1.IsInside(aBR.BottomRight()))  eRet=SDRHIT_BOUNDBR;
1946*cdf0e10cSrcweir 		else eRet=SDRHIT_OBJECT;
1947*cdf0e10cSrcweir 	}
1948*cdf0e10cSrcweir 	return eRet;
1949*cdf0e10cSrcweir }
1950*cdf0e10cSrcweir 
1951*cdf0e10cSrcweir void SdrMarkView::UnmarkAllObj(SdrPageView* pPV)
1952*cdf0e10cSrcweir {
1953*cdf0e10cSrcweir 	if (GetMarkedObjectCount()!=0) {
1954*cdf0e10cSrcweir 		BrkAction();
1955*cdf0e10cSrcweir 		//HMHBOOL bVis=bHdlShown;
1956*cdf0e10cSrcweir 		//HMHif (bVis) HideMarkHdl();
1957*cdf0e10cSrcweir 		if (pPV!=NULL)
1958*cdf0e10cSrcweir 		{
1959*cdf0e10cSrcweir 			GetMarkedObjectListWriteAccess().DeletePageView(*pPV);
1960*cdf0e10cSrcweir 		}
1961*cdf0e10cSrcweir 		else
1962*cdf0e10cSrcweir 		{
1963*cdf0e10cSrcweir 			GetMarkedObjectListWriteAccess().Clear();
1964*cdf0e10cSrcweir 		}
1965*cdf0e10cSrcweir 		pMarkedObj=NULL;
1966*cdf0e10cSrcweir 		pMarkedPV=NULL;
1967*cdf0e10cSrcweir 		MarkListHasChanged();
1968*cdf0e10cSrcweir 		AdjustMarkHdl(); //HMHTRUE);
1969*cdf0e10cSrcweir 		//HMHif (bVis) ShowMarkHdl(); // ggf. fuer die RefPoints
1970*cdf0e10cSrcweir 	}
1971*cdf0e10cSrcweir }
1972*cdf0e10cSrcweir 
1973*cdf0e10cSrcweir void SdrMarkView::MarkAllObj(SdrPageView* _pPV)
1974*cdf0e10cSrcweir {
1975*cdf0e10cSrcweir 	BrkAction();
1976*cdf0e10cSrcweir 	//HMHHideMarkHdl();
1977*cdf0e10cSrcweir 
1978*cdf0e10cSrcweir 	if(!_pPV)
1979*cdf0e10cSrcweir 	{
1980*cdf0e10cSrcweir 		_pPV = GetSdrPageView();
1981*cdf0e10cSrcweir 	}
1982*cdf0e10cSrcweir 
1983*cdf0e10cSrcweir 	// #i69171# _pPV may still be NULL if there is no SDrPageView (!), e.g. when inserting
1984*cdf0e10cSrcweir 	// other files
1985*cdf0e10cSrcweir 	if(_pPV)
1986*cdf0e10cSrcweir 	{
1987*cdf0e10cSrcweir 		const bool bMarkChg(GetMarkedObjectListWriteAccess().InsertPageView(*_pPV));
1988*cdf0e10cSrcweir 
1989*cdf0e10cSrcweir 		if(bMarkChg)
1990*cdf0e10cSrcweir 		{
1991*cdf0e10cSrcweir 			MarkListHasChanged();
1992*cdf0e10cSrcweir 		}
1993*cdf0e10cSrcweir 	}
1994*cdf0e10cSrcweir 
1995*cdf0e10cSrcweir 	if(GetMarkedObjectCount())
1996*cdf0e10cSrcweir 	{
1997*cdf0e10cSrcweir 		AdjustMarkHdl(); //HMHTRUE);
1998*cdf0e10cSrcweir 		//HMHShowMarkHdl();
1999*cdf0e10cSrcweir 	}
2000*cdf0e10cSrcweir }
2001*cdf0e10cSrcweir 
2002*cdf0e10cSrcweir void SdrMarkView::AdjustMarkHdl() //HMHBOOL bRestraintPaint)
2003*cdf0e10cSrcweir {
2004*cdf0e10cSrcweir 	//HMHBOOL bVis=bHdlShown;
2005*cdf0e10cSrcweir 	//HMHif (bVis) HideMarkHdl();
2006*cdf0e10cSrcweir 	CheckMarked();
2007*cdf0e10cSrcweir 	SetMarkRects();
2008*cdf0e10cSrcweir 	SetMarkHandles();
2009*cdf0e10cSrcweir 	//HMHif(bRestraintPaint && bVis)
2010*cdf0e10cSrcweir 	//HMH{
2011*cdf0e10cSrcweir 	//HMH	ShowMarkHdl();
2012*cdf0e10cSrcweir 	//HMH}
2013*cdf0e10cSrcweir }
2014*cdf0e10cSrcweir 
2015*cdf0e10cSrcweir Rectangle SdrMarkView::GetMarkedObjBoundRect() const
2016*cdf0e10cSrcweir {
2017*cdf0e10cSrcweir 	Rectangle aRect;
2018*cdf0e10cSrcweir 	for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount(); nm++) {
2019*cdf0e10cSrcweir 		SdrMark* pM=GetSdrMarkByIndex(nm);
2020*cdf0e10cSrcweir 		SdrObject* pO=pM->GetMarkedSdrObj();
2021*cdf0e10cSrcweir 		Rectangle aR1(pO->GetCurrentBoundRect());
2022*cdf0e10cSrcweir 		if (aRect.IsEmpty()) aRect=aR1;
2023*cdf0e10cSrcweir 		else aRect.Union(aR1);
2024*cdf0e10cSrcweir 	}
2025*cdf0e10cSrcweir 	return aRect;
2026*cdf0e10cSrcweir }
2027*cdf0e10cSrcweir 
2028*cdf0e10cSrcweir const Rectangle& SdrMarkView::GetMarkedObjRect() const
2029*cdf0e10cSrcweir {
2030*cdf0e10cSrcweir 	if (bMarkedObjRectDirty) {
2031*cdf0e10cSrcweir 		((SdrMarkView*)this)->bMarkedObjRectDirty=sal_False;
2032*cdf0e10cSrcweir 		Rectangle aRect;
2033*cdf0e10cSrcweir 		for (sal_uIntPtr nm=0; nm<GetMarkedObjectCount(); nm++) {
2034*cdf0e10cSrcweir 			SdrMark* pM=GetSdrMarkByIndex(nm);
2035*cdf0e10cSrcweir 			SdrObject* pO=pM->GetMarkedSdrObj();
2036*cdf0e10cSrcweir 			Rectangle aR1(pO->GetSnapRect());
2037*cdf0e10cSrcweir 			if (aRect.IsEmpty()) aRect=aR1;
2038*cdf0e10cSrcweir 			else aRect.Union(aR1);
2039*cdf0e10cSrcweir 		}
2040*cdf0e10cSrcweir 		((SdrMarkView*)this)->aMarkedObjRect=aRect;
2041*cdf0e10cSrcweir 	}
2042*cdf0e10cSrcweir 	return aMarkedObjRect;
2043*cdf0e10cSrcweir }
2044*cdf0e10cSrcweir 
2045*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2046*cdf0e10cSrcweir 
2047*cdf0e10cSrcweir void SdrMarkView::ImpTakeDescriptionStr(sal_uInt16 nStrCacheID, XubString& rStr, sal_uInt16 nVal, sal_uInt16 nOpt) const
2048*cdf0e10cSrcweir {
2049*cdf0e10cSrcweir 	rStr = ImpGetResStr(nStrCacheID);
2050*cdf0e10cSrcweir 	xub_StrLen nPos = rStr.SearchAscii("%1");
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir 	if(nPos != STRING_NOTFOUND)
2053*cdf0e10cSrcweir 	{
2054*cdf0e10cSrcweir 		rStr.Erase(nPos, 2);
2055*cdf0e10cSrcweir 
2056*cdf0e10cSrcweir 		if(nOpt == IMPSDR_POINTSDESCRIPTION)
2057*cdf0e10cSrcweir 		{
2058*cdf0e10cSrcweir 			rStr.Insert(GetDescriptionOfMarkedPoints(), nPos);
2059*cdf0e10cSrcweir 		}
2060*cdf0e10cSrcweir 		else if(nOpt == IMPSDR_GLUEPOINTSDESCRIPTION)
2061*cdf0e10cSrcweir 		{
2062*cdf0e10cSrcweir 			rStr.Insert(GetDescriptionOfMarkedGluePoints(), nPos);
2063*cdf0e10cSrcweir 		}
2064*cdf0e10cSrcweir 		else
2065*cdf0e10cSrcweir 		{
2066*cdf0e10cSrcweir 			rStr.Insert(GetDescriptionOfMarkedObjects(), nPos);
2067*cdf0e10cSrcweir 		}
2068*cdf0e10cSrcweir 	}
2069*cdf0e10cSrcweir 
2070*cdf0e10cSrcweir 	nPos = rStr.SearchAscii("%2");
2071*cdf0e10cSrcweir 
2072*cdf0e10cSrcweir 	if(nPos != STRING_NOTFOUND)
2073*cdf0e10cSrcweir 	{
2074*cdf0e10cSrcweir 		rStr.Erase(nPos, 2);
2075*cdf0e10cSrcweir 		rStr.Insert(UniString::CreateFromInt32(nVal), nPos);
2076*cdf0e10cSrcweir 	}
2077*cdf0e10cSrcweir }
2078*cdf0e10cSrcweir 
2079*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2080*cdf0e10cSrcweir 
2081*cdf0e10cSrcweir sal_Bool SdrMarkView::EnterMarkedGroup()
2082*cdf0e10cSrcweir {
2083*cdf0e10cSrcweir 	sal_Bool bRet=sal_False;
2084*cdf0e10cSrcweir 	// Es wird nur die erste gefundene Gruppe (also nur in einer PageView) geentert
2085*cdf0e10cSrcweir 	// Weil PageView::EnterGroup ein AdjustMarkHdl ruft.
2086*cdf0e10cSrcweir 	// Das muss ich per Flag mal unterbinden  vvvvvvvv
2087*cdf0e10cSrcweir 	SdrPageView* pPV = GetSdrPageView();
2088*cdf0e10cSrcweir 
2089*cdf0e10cSrcweir 	if(pPV)
2090*cdf0e10cSrcweir 	{
2091*cdf0e10cSrcweir 		sal_Bool bEnter=sal_False;
2092*cdf0e10cSrcweir 		for (sal_uInt32 nm(GetMarkedObjectCount()); nm > 0 && !bEnter;)
2093*cdf0e10cSrcweir 		{
2094*cdf0e10cSrcweir 			nm--;
2095*cdf0e10cSrcweir 			SdrMark* pM=GetSdrMarkByIndex(nm);
2096*cdf0e10cSrcweir 			if (pM->GetPageView()==pPV) {
2097*cdf0e10cSrcweir 				SdrObject* pObj=pM->GetMarkedSdrObj();
2098*cdf0e10cSrcweir 				if (pObj->IsGroupObject()) {
2099*cdf0e10cSrcweir 					if (pPV->EnterGroup(pObj)) {
2100*cdf0e10cSrcweir 						bRet=sal_True;
2101*cdf0e10cSrcweir 						bEnter=sal_True;
2102*cdf0e10cSrcweir 					}
2103*cdf0e10cSrcweir 				}
2104*cdf0e10cSrcweir 			}
2105*cdf0e10cSrcweir 		}
2106*cdf0e10cSrcweir 	}
2107*cdf0e10cSrcweir 	return bRet;
2108*cdf0e10cSrcweir }
2109*cdf0e10cSrcweir 
2110*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2111*cdf0e10cSrcweir 
2112*cdf0e10cSrcweir void SdrMarkView::MarkListHasChanged()
2113*cdf0e10cSrcweir {
2114*cdf0e10cSrcweir 	GetMarkedObjectListWriteAccess().SetNameDirty();
2115*cdf0e10cSrcweir 	SetEdgesOfMarkedNodesDirty(); // bEdgesOfMarkedNodesDirty=sal_True;
2116*cdf0e10cSrcweir 
2117*cdf0e10cSrcweir 	bMarkedObjRectDirty=sal_True;
2118*cdf0e10cSrcweir 	bMarkedPointsRectsDirty=sal_True;
2119*cdf0e10cSrcweir #ifdef DBG_UTIL
2120*cdf0e10cSrcweir 	if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
2121*cdf0e10cSrcweir #endif
2122*cdf0e10cSrcweir 	sal_Bool bOneEdgeMarked=sal_False;
2123*cdf0e10cSrcweir 	if (GetMarkedObjectCount()==1) {
2124*cdf0e10cSrcweir 		const SdrObject* pObj=GetMarkedObjectByIndex(0);
2125*cdf0e10cSrcweir 		if (pObj->GetObjInventor()==SdrInventor) {
2126*cdf0e10cSrcweir 			sal_uInt16 nIdent=pObj->GetObjIdentifier();
2127*cdf0e10cSrcweir 			bOneEdgeMarked=nIdent==OBJ_EDGE;
2128*cdf0e10cSrcweir 		}
2129*cdf0e10cSrcweir 	}
2130*cdf0e10cSrcweir 	ImpSetGlueVisible4(bOneEdgeMarked);
2131*cdf0e10cSrcweir }
2132*cdf0e10cSrcweir 
2133*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2134*cdf0e10cSrcweir 
2135*cdf0e10cSrcweir void SdrMarkView::SetMoveOutside(sal_Bool bOn)
2136*cdf0e10cSrcweir {
2137*cdf0e10cSrcweir 	aHdl.SetMoveOutside(bOn);
2138*cdf0e10cSrcweir }
2139*cdf0e10cSrcweir 
2140*cdf0e10cSrcweir sal_Bool SdrMarkView::IsMoveOutside() const
2141*cdf0e10cSrcweir {
2142*cdf0e10cSrcweir 	return aHdl.IsMoveOutside();
2143*cdf0e10cSrcweir }
2144*cdf0e10cSrcweir 
2145*cdf0e10cSrcweir void SdrMarkView::SetDesignMode( sal_Bool _bOn )
2146*cdf0e10cSrcweir {
2147*cdf0e10cSrcweir     if ( bDesignMode != _bOn )
2148*cdf0e10cSrcweir 	{
2149*cdf0e10cSrcweir         bDesignMode = _bOn;
2150*cdf0e10cSrcweir 		SdrPageView* pPageView = GetSdrPageView();
2151*cdf0e10cSrcweir         if ( pPageView )
2152*cdf0e10cSrcweir             pPageView->SetDesignMode( _bOn );
2153*cdf0e10cSrcweir 	}
2154*cdf0e10cSrcweir }
2155*cdf0e10cSrcweir 
2156*cdf0e10cSrcweir // MarkHandles Objektaenderung:
2157*cdf0e10cSrcweir // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2158*cdf0e10cSrcweir // - Bei Notify mit HINT_OBJCHG (oder so) werden die Handles erstmal versteckt
2159*cdf0e10cSrcweir //   (wenn nicht schon wegen Dragging versteckt).
2160*cdf0e10cSrcweir // - XorHdl: Bei ModelHasChanged() werden sie dann wieder angezeigt.
2161*cdf0e10cSrcweir // - PaintEvents kommen nun durch.
2162*cdf0e10cSrcweir //   - Die XorHandles werden z.T. wieder uebermalt.
2163*cdf0e10cSrcweir //   - Xor:  Nach dem Painten werden die Handles im (vom PaintHandler gerufenen)
2164*cdf0e10cSrcweir //           CompleteRedraw per ToggleShownXor bei gesetzter ClipRegion nochmal gemalt
2165*cdf0e10cSrcweir //           und damit ist alles in Butter.
2166*cdf0e10cSrcweir //   - ToggleShownXor macht bei SolidHdl nix weil bHdlShown=FALSE
2167*cdf0e10cSrcweir //   - Der AfterPaintTimer wird gestartet.
2168*cdf0e10cSrcweir // - SolidHdl: Im AfterPaintHandler wird ShowMarkHdl gerufen.
2169*cdf0e10cSrcweir //   Da die Handles zu diesem Zeitpunkt nicht angezeigt sind wird:
2170*cdf0e10cSrcweir //   - SaveBackground durchgefuehrt.
2171*cdf0e10cSrcweir //   - DrawMarkHdl gerufen und bHdlShown gesetzt.
2172*cdf0e10cSrcweir //
2173*cdf0e10cSrcweir // MarkHandles bei sonstigem Invalidate:
2174*cdf0e10cSrcweir // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2175*cdf0e10cSrcweir // In diesem Fall bekomme ich kein Notify und beim Aufruf des
2176*cdf0e10cSrcweir // PaintHandlers->CompleteRedraw() sind auch die SolidHandles sichtbar.
2177*cdf0e10cSrcweir 
2178