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