xref: /AOO41X/main/svx/source/svdraw/svdmark.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <svx/svdmark.hxx>
34*cdf0e10cSrcweir #include <svx/svdetc.hxx>
35*cdf0e10cSrcweir #include <svx/svdobj.hxx>
36*cdf0e10cSrcweir #include <svx/svdpage.hxx>
37*cdf0e10cSrcweir #include "svx/svditer.hxx"
38*cdf0e10cSrcweir #include <svx/svdpagv.hxx>
39*cdf0e10cSrcweir #include <svx/svdopath.hxx> // zur Abschaltung
40*cdf0e10cSrcweir #include <svx/svdogrp.hxx>  // des Cache bei
41*cdf0e10cSrcweir #include <svx/svdorect.hxx> // GetMarkDescription
42*cdf0e10cSrcweir #include "svx/svdstr.hrc"   // Namen aus der Resource
43*cdf0e10cSrcweir #include "svx/svdglob.hxx"  // StringCache
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
46*cdf0e10cSrcweir #include <svx/obj3d.hxx>
47*cdf0e10cSrcweir #include <svx/scene3d.hxx>
48*cdf0e10cSrcweir #include <svl/brdcst.hxx>
49*cdf0e10cSrcweir #include <svx/svdoedge.hxx>
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir class ImpSdrUShortContSorter: public ContainerSorter
54*cdf0e10cSrcweir {
55*cdf0e10cSrcweir public:
56*cdf0e10cSrcweir 	ImpSdrUShortContSorter(Container& rNewCont)
57*cdf0e10cSrcweir 	:	ContainerSorter(rNewCont)
58*cdf0e10cSrcweir 	{}
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir 	virtual int Compare(const void* pElem1, const void* pElem2) const;
61*cdf0e10cSrcweir };
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir int ImpSdrUShortContSorter::Compare(const void* pElem1, const void* pElem2) const
64*cdf0e10cSrcweir {
65*cdf0e10cSrcweir 	sal_uInt16 n1((sal_uInt16)((sal_uIntPtr)pElem1));
66*cdf0e10cSrcweir 	sal_uInt16 n2((sal_uInt16)((sal_uIntPtr)pElem2));
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir 	return ((n1 < n2) ? (-1) : (n1 > n2) ? (1) : (0));
69*cdf0e10cSrcweir }
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir void SdrUShortCont::Sort() const
72*cdf0e10cSrcweir {
73*cdf0e10cSrcweir 	ImpSdrUShortContSorter aSort(*((Container*)(&maArray)));
74*cdf0e10cSrcweir 	aSort.DoSort();
75*cdf0e10cSrcweir 	((SdrUShortCont*)this)->mbSorted = sal_True;
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir 	sal_uLong nNum(GetCount());
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir 	if(nNum > 1)
80*cdf0e10cSrcweir 	{
81*cdf0e10cSrcweir 		nNum--;
82*cdf0e10cSrcweir 		sal_uInt16 nVal0 = GetObject(nNum);
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir 		while(nNum > 0)
85*cdf0e10cSrcweir 		{
86*cdf0e10cSrcweir 			nNum--;
87*cdf0e10cSrcweir 			sal_uInt16 nVal1 = GetObject(nNum);
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir 			if(nVal1 == nVal0)
90*cdf0e10cSrcweir 			{
91*cdf0e10cSrcweir 				((SdrUShortCont*)this)->Remove(nNum);
92*cdf0e10cSrcweir 			}
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 			nVal0 = nVal1;
95*cdf0e10cSrcweir 		}
96*cdf0e10cSrcweir 	}
97*cdf0e10cSrcweir }
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir void SdrUShortCont::CheckSort(sal_uLong nPos)
100*cdf0e10cSrcweir {
101*cdf0e10cSrcweir 	sal_uLong nAnz(maArray.Count());
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 	if(nPos > nAnz)
104*cdf0e10cSrcweir 		nPos = nAnz;
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir 	sal_uInt16 nAktVal = GetObject(nPos);
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 	if(nPos > 0)
109*cdf0e10cSrcweir 	{
110*cdf0e10cSrcweir 		sal_uInt16 nPrevVal = GetObject(nPos - 1);
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir 		if(nPrevVal >= nAktVal)
113*cdf0e10cSrcweir 			mbSorted = sal_False;
114*cdf0e10cSrcweir 	}
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 	if(nPos < nAnz - 1)
117*cdf0e10cSrcweir 	{
118*cdf0e10cSrcweir 		sal_uInt16 nNextVal = GetObject(nPos + 1);
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 		if(nNextVal <= nAktVal)
121*cdf0e10cSrcweir 			mbSorted = sal_False;
122*cdf0e10cSrcweir 	}
123*cdf0e10cSrcweir }
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir std::set< sal_uInt16 > SdrUShortCont::getContainer()
126*cdf0e10cSrcweir {
127*cdf0e10cSrcweir 	std::set< sal_uInt16 > aSet;
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir 	sal_uInt32 nAnz = maArray.Count();
130*cdf0e10cSrcweir 	while(nAnz)
131*cdf0e10cSrcweir 		aSet.insert( GetObject(--nAnz) );
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 	return aSet;
134*cdf0e10cSrcweir }
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir SdrMark::SdrMark(SdrObject* pNewObj, SdrPageView* pNewPageView)
139*cdf0e10cSrcweir :	mpSelectedSdrObject(pNewObj),
140*cdf0e10cSrcweir 	mpPageView(pNewPageView),
141*cdf0e10cSrcweir 	mpPoints(0L),
142*cdf0e10cSrcweir 	mpLines(0L),
143*cdf0e10cSrcweir 	mpGluePoints(0L),
144*cdf0e10cSrcweir 	mbCon1(sal_False),
145*cdf0e10cSrcweir 	mbCon2(sal_False),
146*cdf0e10cSrcweir 	mnUser(0)
147*cdf0e10cSrcweir {
148*cdf0e10cSrcweir 	if(mpSelectedSdrObject)
149*cdf0e10cSrcweir 	{
150*cdf0e10cSrcweir 		mpSelectedSdrObject->AddObjectUser( *this );
151*cdf0e10cSrcweir 	}
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir SdrMark::SdrMark(const SdrMark& rMark)
155*cdf0e10cSrcweir :	ObjectUser(),
156*cdf0e10cSrcweir     mpSelectedSdrObject(0L),
157*cdf0e10cSrcweir 	mpPageView(0L),
158*cdf0e10cSrcweir 	mpPoints(0L),
159*cdf0e10cSrcweir 	mpLines(0L),
160*cdf0e10cSrcweir 	mpGluePoints(0L),
161*cdf0e10cSrcweir 	mbCon1(sal_False),
162*cdf0e10cSrcweir 	mbCon2(sal_False),
163*cdf0e10cSrcweir 	mnUser(0)
164*cdf0e10cSrcweir {
165*cdf0e10cSrcweir 	*this = rMark;
166*cdf0e10cSrcweir }
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir SdrMark::~SdrMark()
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir 	if(mpSelectedSdrObject)
171*cdf0e10cSrcweir 	{
172*cdf0e10cSrcweir 		mpSelectedSdrObject->RemoveObjectUser( *this );
173*cdf0e10cSrcweir 	}
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 	if(mpPoints)
176*cdf0e10cSrcweir 	{
177*cdf0e10cSrcweir 		delete mpPoints;
178*cdf0e10cSrcweir 	}
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir 	if(mpLines)
181*cdf0e10cSrcweir 	{
182*cdf0e10cSrcweir 		delete mpLines;
183*cdf0e10cSrcweir 	}
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir 	if(mpGluePoints)
186*cdf0e10cSrcweir 	{
187*cdf0e10cSrcweir 		delete mpGluePoints;
188*cdf0e10cSrcweir 	}
189*cdf0e10cSrcweir }
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir void SdrMark::ObjectInDestruction(const SdrObject& rObject)
192*cdf0e10cSrcweir {
193*cdf0e10cSrcweir     (void) rObject; // avoid warnings
194*cdf0e10cSrcweir 	OSL_ENSURE(mpSelectedSdrObject && mpSelectedSdrObject == &rObject, "SdrMark::ObjectInDestruction: called form object different from hosted one (!)");
195*cdf0e10cSrcweir 	OSL_ENSURE(mpSelectedSdrObject, "SdrMark::ObjectInDestruction: still seleceted SdrObject is deleted, deselect first (!)");
196*cdf0e10cSrcweir 	mpSelectedSdrObject = 0L;
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir void SdrMark::SetMarkedSdrObj(SdrObject* pNewObj)
200*cdf0e10cSrcweir {
201*cdf0e10cSrcweir 	if(mpSelectedSdrObject)
202*cdf0e10cSrcweir 	{
203*cdf0e10cSrcweir 		mpSelectedSdrObject->RemoveObjectUser( *this );
204*cdf0e10cSrcweir 	}
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir 	mpSelectedSdrObject = pNewObj;
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir 	if(mpSelectedSdrObject)
209*cdf0e10cSrcweir 	{
210*cdf0e10cSrcweir 		mpSelectedSdrObject->AddObjectUser( *this );
211*cdf0e10cSrcweir 	}
212*cdf0e10cSrcweir }
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir SdrObject* SdrMark::GetMarkedSdrObj() const
215*cdf0e10cSrcweir {
216*cdf0e10cSrcweir 	return mpSelectedSdrObject;
217*cdf0e10cSrcweir }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir SdrMark& SdrMark::operator=(const SdrMark& rMark)
220*cdf0e10cSrcweir {
221*cdf0e10cSrcweir 	SetMarkedSdrObj(rMark.mpSelectedSdrObject);
222*cdf0e10cSrcweir 	mpPageView = rMark.mpPageView;
223*cdf0e10cSrcweir 	mbCon1 = rMark.mbCon1;
224*cdf0e10cSrcweir 	mbCon2 = rMark.mbCon2;
225*cdf0e10cSrcweir 	mnUser = rMark.mnUser;
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 	if(!rMark.mpPoints)
228*cdf0e10cSrcweir 	{
229*cdf0e10cSrcweir 		if(mpPoints)
230*cdf0e10cSrcweir 		{
231*cdf0e10cSrcweir 			delete mpPoints;
232*cdf0e10cSrcweir 			mpPoints = 0L;
233*cdf0e10cSrcweir 		}
234*cdf0e10cSrcweir 	}
235*cdf0e10cSrcweir 	else
236*cdf0e10cSrcweir 	{
237*cdf0e10cSrcweir 		if(!mpPoints)
238*cdf0e10cSrcweir 		{
239*cdf0e10cSrcweir 			mpPoints = new SdrUShortCont(*rMark.mpPoints);
240*cdf0e10cSrcweir 		}
241*cdf0e10cSrcweir 		else
242*cdf0e10cSrcweir 		{
243*cdf0e10cSrcweir 			*mpPoints = *rMark.mpPoints;
244*cdf0e10cSrcweir 		}
245*cdf0e10cSrcweir 	}
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir 	if(!rMark.mpLines)
248*cdf0e10cSrcweir 	{
249*cdf0e10cSrcweir 		if(mpLines)
250*cdf0e10cSrcweir 		{
251*cdf0e10cSrcweir 			delete mpLines;
252*cdf0e10cSrcweir 			mpLines = 0L;
253*cdf0e10cSrcweir 		}
254*cdf0e10cSrcweir 	}
255*cdf0e10cSrcweir 	else
256*cdf0e10cSrcweir 	{
257*cdf0e10cSrcweir 		if(!mpLines)
258*cdf0e10cSrcweir 		{
259*cdf0e10cSrcweir 			mpLines = new SdrUShortCont(*rMark.mpLines);
260*cdf0e10cSrcweir 		}
261*cdf0e10cSrcweir 		else
262*cdf0e10cSrcweir 		{
263*cdf0e10cSrcweir 			*mpLines = *rMark.mpLines;
264*cdf0e10cSrcweir 		}
265*cdf0e10cSrcweir 	}
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir 	if(!rMark.mpGluePoints)
268*cdf0e10cSrcweir 	{
269*cdf0e10cSrcweir 		if(mpGluePoints)
270*cdf0e10cSrcweir 		{
271*cdf0e10cSrcweir 			delete mpGluePoints;
272*cdf0e10cSrcweir 			mpGluePoints = 0L;
273*cdf0e10cSrcweir 		}
274*cdf0e10cSrcweir 	}
275*cdf0e10cSrcweir 	else
276*cdf0e10cSrcweir 	{
277*cdf0e10cSrcweir 		if(!mpGluePoints)
278*cdf0e10cSrcweir 		{
279*cdf0e10cSrcweir 			mpGluePoints = new SdrUShortCont(*rMark.mpGluePoints);
280*cdf0e10cSrcweir 		}
281*cdf0e10cSrcweir 		else
282*cdf0e10cSrcweir 		{
283*cdf0e10cSrcweir 			*mpGluePoints = *rMark.mpGluePoints;
284*cdf0e10cSrcweir 		}
285*cdf0e10cSrcweir 	}
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir 	return *this;
288*cdf0e10cSrcweir }
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir sal_Bool SdrMark::operator==(const SdrMark& rMark) const
291*cdf0e10cSrcweir {
292*cdf0e10cSrcweir 	sal_Bool bRet(mpSelectedSdrObject == rMark.mpSelectedSdrObject && mpPageView == rMark.mpPageView && mbCon1 == rMark.mbCon1 && mbCon2 == rMark.mbCon2 && mnUser == rMark.mnUser);
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir 	if((mpPoints != 0L) != (rMark.mpPoints != 0L))
295*cdf0e10cSrcweir 		bRet = sal_False;
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir 	if((mpLines != 0L) != (rMark.mpLines != 0L))
298*cdf0e10cSrcweir 		bRet = sal_False;
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir 	if((mpGluePoints != 0L) != (rMark.mpGluePoints != 0L))
301*cdf0e10cSrcweir 		bRet = sal_False;
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir 	if(bRet && mpPoints && *mpPoints != *rMark.mpPoints)
304*cdf0e10cSrcweir 		bRet = sal_False;
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	if(bRet && mpLines && *mpLines != *rMark.mpLines)
307*cdf0e10cSrcweir 		bRet = sal_False;
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir 	if(bRet && mpGluePoints && *mpGluePoints != *rMark.mpGluePoints)
310*cdf0e10cSrcweir 		bRet = sal_False;
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir 	return bRet;
313*cdf0e10cSrcweir }
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir SdrPage* SdrMark::GetPage() const
316*cdf0e10cSrcweir {
317*cdf0e10cSrcweir 	return (mpSelectedSdrObject ? mpSelectedSdrObject->GetPage() : 0);
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir SdrObjList* SdrMark::GetObjList() const
321*cdf0e10cSrcweir {
322*cdf0e10cSrcweir 	return (mpSelectedSdrObject ? mpSelectedSdrObject->GetObjList() : 0);
323*cdf0e10cSrcweir }
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir class ImpSdrMarkListSorter: public ContainerSorter
328*cdf0e10cSrcweir {
329*cdf0e10cSrcweir public:
330*cdf0e10cSrcweir 	ImpSdrMarkListSorter(Container& rNewCont)
331*cdf0e10cSrcweir         :	ContainerSorter(rNewCont)
332*cdf0e10cSrcweir 	{}
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir 	virtual int Compare(const void* pElem1, const void* pElem2) const;
335*cdf0e10cSrcweir };
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir int ImpSdrMarkListSorter::Compare(const void* pElem1, const void* pElem2) const
338*cdf0e10cSrcweir {
339*cdf0e10cSrcweir 	SdrObject* pObj1 = ((SdrMark*)pElem1)->GetMarkedSdrObj();
340*cdf0e10cSrcweir 	SdrObject* pObj2 = ((SdrMark*)pElem2)->GetMarkedSdrObj();
341*cdf0e10cSrcweir 	SdrObjList* pOL1 = (pObj1) ? pObj1->GetObjList() : 0L;
342*cdf0e10cSrcweir 	SdrObjList* pOL2 = (pObj2) ? pObj2->GetObjList() : 0L;
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir 	if (pOL1 == pOL2)
345*cdf0e10cSrcweir     {
346*cdf0e10cSrcweir         // AF: Note that I reverted a change from sal_uInt32 to sal_uLong (made
347*cdf0e10cSrcweir         // for 64bit compliance, #i78198#) because internally in SdrObject
348*cdf0e10cSrcweir         // both nOrdNum and mnNavigationPosition are stored as sal_uInt32.
349*cdf0e10cSrcweir         sal_uInt32 nObjOrd1((pObj1) ? pObj1->GetNavigationPosition() : 0);
350*cdf0e10cSrcweir         sal_uInt32 nObjOrd2((pObj2) ? pObj2->GetNavigationPosition() : 0);
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir         return (nObjOrd1 < nObjOrd2 ? -1 : 1);
353*cdf0e10cSrcweir     }
354*cdf0e10cSrcweir 	else
355*cdf0e10cSrcweir 	{
356*cdf0e10cSrcweir 		return ((long)pOL1 < (long)pOL2) ? -1 : 1;
357*cdf0e10cSrcweir 	}
358*cdf0e10cSrcweir }
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir void SdrMarkList::ForceSort() const
363*cdf0e10cSrcweir {
364*cdf0e10cSrcweir 	if(!mbSorted)
365*cdf0e10cSrcweir 	{
366*cdf0e10cSrcweir 		((SdrMarkList*)this)->ImpForceSort();
367*cdf0e10cSrcweir 	}
368*cdf0e10cSrcweir }
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir void SdrMarkList::ImpForceSort()
371*cdf0e10cSrcweir {
372*cdf0e10cSrcweir 	if(!mbSorted)
373*cdf0e10cSrcweir 	{
374*cdf0e10cSrcweir 		mbSorted = sal_True;
375*cdf0e10cSrcweir 		sal_uLong nAnz = maList.Count();
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir 		// remove invalid
378*cdf0e10cSrcweir 		if(nAnz > 0 )
379*cdf0e10cSrcweir 		{
380*cdf0e10cSrcweir 			SdrMark* pAkt = (SdrMark*)maList.First();
381*cdf0e10cSrcweir 			while( pAkt )
382*cdf0e10cSrcweir 			{
383*cdf0e10cSrcweir 				if(pAkt->GetMarkedSdrObj() == 0)
384*cdf0e10cSrcweir 				{
385*cdf0e10cSrcweir 					maList.Remove();
386*cdf0e10cSrcweir 					delete pAkt;
387*cdf0e10cSrcweir 				}
388*cdf0e10cSrcweir 				pAkt= (SdrMark*)maList.Next();
389*cdf0e10cSrcweir 			}
390*cdf0e10cSrcweir 			nAnz = maList.Count();
391*cdf0e10cSrcweir 		}
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir 		if(nAnz > 1)
394*cdf0e10cSrcweir 		{
395*cdf0e10cSrcweir 			ImpSdrMarkListSorter aSort(maList);
396*cdf0e10cSrcweir 			aSort.DoSort();
397*cdf0e10cSrcweir 
398*cdf0e10cSrcweir 			// remove duplicates
399*cdf0e10cSrcweir 			if(maList.Count() > 1)
400*cdf0e10cSrcweir 			{
401*cdf0e10cSrcweir 				SdrMark* pAkt = (SdrMark*)maList.Last();
402*cdf0e10cSrcweir 				SdrMark* pCmp = (SdrMark*)maList.Prev();
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir 				while(pCmp)
405*cdf0e10cSrcweir 				{
406*cdf0e10cSrcweir 					if(pAkt->GetMarkedSdrObj() == pCmp->GetMarkedSdrObj() && pAkt->GetMarkedSdrObj())
407*cdf0e10cSrcweir 					{
408*cdf0e10cSrcweir 						// Con1/Con2 Merging
409*cdf0e10cSrcweir 						if(pCmp->IsCon1())
410*cdf0e10cSrcweir 							pAkt->SetCon1(sal_True);
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir 						if(pCmp->IsCon2())
413*cdf0e10cSrcweir 							pAkt->SetCon2(sal_True);
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir 						// pCmp loeschen.
416*cdf0e10cSrcweir 						maList.Remove();
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir 						delete pCmp;
419*cdf0e10cSrcweir 					}
420*cdf0e10cSrcweir 					else
421*cdf0e10cSrcweir 					{
422*cdf0e10cSrcweir 						pAkt = pCmp;
423*cdf0e10cSrcweir 					}
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir 					pCmp = (SdrMark*)maList.Prev();
426*cdf0e10cSrcweir 				}
427*cdf0e10cSrcweir 			}
428*cdf0e10cSrcweir 		}
429*cdf0e10cSrcweir 	}
430*cdf0e10cSrcweir }
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir void SdrMarkList::Clear()
433*cdf0e10cSrcweir {
434*cdf0e10cSrcweir 	for(sal_uLong i(0L); i < GetMarkCount(); i++)
435*cdf0e10cSrcweir 	{
436*cdf0e10cSrcweir 		SdrMark* pMark = GetMark(i);
437*cdf0e10cSrcweir 		delete pMark;
438*cdf0e10cSrcweir 	}
439*cdf0e10cSrcweir 
440*cdf0e10cSrcweir 	maList.Clear();
441*cdf0e10cSrcweir 	SetNameDirty();
442*cdf0e10cSrcweir }
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir void SdrMarkList::operator=(const SdrMarkList& rLst)
445*cdf0e10cSrcweir {
446*cdf0e10cSrcweir 	Clear();
447*cdf0e10cSrcweir 
448*cdf0e10cSrcweir 	for(sal_uLong i(0L); i < rLst.GetMarkCount(); i++)
449*cdf0e10cSrcweir 	{
450*cdf0e10cSrcweir 		SdrMark* pMark = rLst.GetMark(i);
451*cdf0e10cSrcweir 		SdrMark* pNeuMark = new SdrMark(*pMark);
452*cdf0e10cSrcweir 		maList.Insert(pNeuMark, CONTAINER_APPEND);
453*cdf0e10cSrcweir 	}
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 	maMarkName = rLst.maMarkName;
456*cdf0e10cSrcweir 	mbNameOk = rLst.mbNameOk;
457*cdf0e10cSrcweir 	maPointName = rLst.maPointName;
458*cdf0e10cSrcweir 	mbPointNameOk = rLst.mbPointNameOk;
459*cdf0e10cSrcweir 	maGluePointName = rLst.maGluePointName;
460*cdf0e10cSrcweir 	mbGluePointNameOk = rLst.mbGluePointNameOk;
461*cdf0e10cSrcweir 	mbSorted = rLst.mbSorted;
462*cdf0e10cSrcweir }
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir sal_uLong SdrMarkList::FindObject(const SdrObject* pObj) const
465*cdf0e10cSrcweir {
466*cdf0e10cSrcweir 	// #109658#
467*cdf0e10cSrcweir 	//
468*cdf0e10cSrcweir 	// Since relying on OrdNums is not allowed for the selection because objects in the
469*cdf0e10cSrcweir 	// selection may not be inserted in a list if they are e.g. modified ATM, i changed
470*cdf0e10cSrcweir 	// this loop to just look if the object pointer is in the selection.
471*cdf0e10cSrcweir 	//
472*cdf0e10cSrcweir 	// Problem is that GetOrdNum() which is const, internally casts to non-const and
473*cdf0e10cSrcweir 	// hardly sets the OrdNum member of the object (nOrdNum) to 0 (ZERO) if the object
474*cdf0e10cSrcweir 	// is not inserted in a object list.
475*cdf0e10cSrcweir 	// Since this may be by purpose and necessary somewhere else i decided that it is
476*cdf0e10cSrcweir 	// less dangerous to change this method then changing SdrObject::GetOrdNum().
477*cdf0e10cSrcweir 	if(pObj && maList.Count())
478*cdf0e10cSrcweir 	{
479*cdf0e10cSrcweir 		for(sal_uLong a(0L); a < maList.Count(); a++)
480*cdf0e10cSrcweir 		{
481*cdf0e10cSrcweir 			if(((SdrMark*)(maList.GetObject(a)))->GetMarkedSdrObj() == pObj)
482*cdf0e10cSrcweir 			{
483*cdf0e10cSrcweir 				return a;
484*cdf0e10cSrcweir 			}
485*cdf0e10cSrcweir 		}
486*cdf0e10cSrcweir 	}
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir 	return CONTAINER_ENTRY_NOTFOUND;
489*cdf0e10cSrcweir }
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir void SdrMarkList::InsertEntry(const SdrMark& rMark, sal_Bool bChkSort)
492*cdf0e10cSrcweir {
493*cdf0e10cSrcweir 	SetNameDirty();
494*cdf0e10cSrcweir 	sal_uLong nAnz(maList.Count());
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir 	if(!bChkSort || !mbSorted || nAnz == 0)
497*cdf0e10cSrcweir 	{
498*cdf0e10cSrcweir 		if(!bChkSort)
499*cdf0e10cSrcweir 			mbSorted = sal_False;
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir 		maList.Insert(new SdrMark(rMark), CONTAINER_APPEND);
502*cdf0e10cSrcweir 	}
503*cdf0e10cSrcweir 	else
504*cdf0e10cSrcweir 	{
505*cdf0e10cSrcweir 		SdrMark* pLast = GetMark(sal_uLong(nAnz - 1));
506*cdf0e10cSrcweir 		const SdrObject* pLastObj = pLast->GetMarkedSdrObj();
507*cdf0e10cSrcweir 		const SdrObject* pNeuObj = rMark.GetMarkedSdrObj();
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir 		if(pLastObj == pNeuObj)
510*cdf0e10cSrcweir 		{
511*cdf0e10cSrcweir 			// Aha, den gibt's schon
512*cdf0e10cSrcweir 			// Con1/Con2 Merging
513*cdf0e10cSrcweir 			if(rMark.IsCon1())
514*cdf0e10cSrcweir 				pLast->SetCon1(sal_True);
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir 			if(rMark.IsCon2())
517*cdf0e10cSrcweir 				pLast->SetCon2(sal_True);
518*cdf0e10cSrcweir 		}
519*cdf0e10cSrcweir 		else
520*cdf0e10cSrcweir 		{
521*cdf0e10cSrcweir 			SdrMark* pKopie = new SdrMark(rMark);
522*cdf0e10cSrcweir 			maList.Insert(pKopie, CONTAINER_APPEND);
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir 			// und nun checken, ob die Sortierung noch ok ist
525*cdf0e10cSrcweir 			const SdrObjList* pLastOL = pLastObj!=0L ? pLastObj->GetObjList() : 0L;
526*cdf0e10cSrcweir 			const SdrObjList* pNeuOL = pNeuObj !=0L ? pNeuObj ->GetObjList() : 0L;
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir 			if(pLastOL == pNeuOL)
529*cdf0e10cSrcweir 			{
530*cdf0e10cSrcweir 				const sal_uLong nLastNum(pLastObj!=0L ? pLastObj->GetOrdNum() : 0);
531*cdf0e10cSrcweir 				const sal_uLong nNeuNum(pNeuObj !=0L ? pNeuObj ->GetOrdNum() : 0);
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir 				if(nNeuNum < nLastNum)
534*cdf0e10cSrcweir 				{
535*cdf0e10cSrcweir 					// irgendwann muss mal sortiert werden
536*cdf0e10cSrcweir 					mbSorted = sal_False;
537*cdf0e10cSrcweir 				}
538*cdf0e10cSrcweir 			}
539*cdf0e10cSrcweir 			else
540*cdf0e10cSrcweir 			{
541*cdf0e10cSrcweir 				// irgendwann muss mal sortiert werden
542*cdf0e10cSrcweir 				mbSorted = sal_False;
543*cdf0e10cSrcweir 			}
544*cdf0e10cSrcweir 		}
545*cdf0e10cSrcweir 	}
546*cdf0e10cSrcweir 
547*cdf0e10cSrcweir 	return;
548*cdf0e10cSrcweir }
549*cdf0e10cSrcweir 
550*cdf0e10cSrcweir void SdrMarkList::DeleteMark(sal_uLong nNum)
551*cdf0e10cSrcweir {
552*cdf0e10cSrcweir 	SdrMark* pMark = GetMark(nNum);
553*cdf0e10cSrcweir 	DBG_ASSERT(pMark!=0L,"DeleteMark: MarkEntry nicht gefunden");
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir 	if(pMark)
556*cdf0e10cSrcweir 	{
557*cdf0e10cSrcweir 		maList.Remove(nNum);
558*cdf0e10cSrcweir 		delete pMark;
559*cdf0e10cSrcweir 		SetNameDirty();
560*cdf0e10cSrcweir 	}
561*cdf0e10cSrcweir }
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir void SdrMarkList::ReplaceMark(const SdrMark& rNewMark, sal_uLong nNum)
564*cdf0e10cSrcweir {
565*cdf0e10cSrcweir 	SdrMark* pMark = GetMark(nNum);
566*cdf0e10cSrcweir 	DBG_ASSERT(pMark!=0L,"ReplaceMark: MarkEntry nicht gefunden");
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir 	if(pMark)
569*cdf0e10cSrcweir 	{
570*cdf0e10cSrcweir 		delete pMark;
571*cdf0e10cSrcweir 		SetNameDirty();
572*cdf0e10cSrcweir 		SdrMark* pKopie = new SdrMark(rNewMark);
573*cdf0e10cSrcweir 		maList.Replace(pKopie, nNum);
574*cdf0e10cSrcweir 		mbSorted = sal_False;
575*cdf0e10cSrcweir 	}
576*cdf0e10cSrcweir }
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir void SdrMarkList::Merge(const SdrMarkList& rSrcList, sal_Bool bReverse)
579*cdf0e10cSrcweir {
580*cdf0e10cSrcweir 	sal_uLong nAnz(rSrcList.maList.Count());
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir 	if(rSrcList.mbSorted)
583*cdf0e10cSrcweir 	{
584*cdf0e10cSrcweir 		// Merging ohne ein Sort bei rSrcList zu erzwingen
585*cdf0e10cSrcweir 		bReverse = sal_False;
586*cdf0e10cSrcweir 	}
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir 	if(!bReverse)
589*cdf0e10cSrcweir 	{
590*cdf0e10cSrcweir 		for(sal_uLong i(0L); i < nAnz; i++)
591*cdf0e10cSrcweir 		{
592*cdf0e10cSrcweir 			SdrMark* pM = (SdrMark*)(rSrcList.maList.GetObject(i));
593*cdf0e10cSrcweir 			InsertEntry(*pM);
594*cdf0e10cSrcweir 		}
595*cdf0e10cSrcweir 	}
596*cdf0e10cSrcweir 	else
597*cdf0e10cSrcweir 	{
598*cdf0e10cSrcweir 		for(sal_uLong i(nAnz); i > 0;)
599*cdf0e10cSrcweir 		{
600*cdf0e10cSrcweir 			i--;
601*cdf0e10cSrcweir 			SdrMark* pM = (SdrMark*)(rSrcList.maList.GetObject(i));
602*cdf0e10cSrcweir 			InsertEntry(*pM);
603*cdf0e10cSrcweir 		}
604*cdf0e10cSrcweir 	}
605*cdf0e10cSrcweir }
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir sal_Bool SdrMarkList::DeletePageView(const SdrPageView& rPV)
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir 	sal_Bool bChgd(sal_False);
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir 	for(sal_uLong i(GetMarkCount()); i > 0; )
612*cdf0e10cSrcweir 	{
613*cdf0e10cSrcweir 		i--;
614*cdf0e10cSrcweir 		SdrMark* pMark = GetMark(i);
615*cdf0e10cSrcweir 
616*cdf0e10cSrcweir 		if(pMark->GetPageView()==&rPV)
617*cdf0e10cSrcweir 		{
618*cdf0e10cSrcweir 			maList.Remove(i);
619*cdf0e10cSrcweir 			delete pMark;
620*cdf0e10cSrcweir 			SetNameDirty();
621*cdf0e10cSrcweir 			bChgd = sal_True;
622*cdf0e10cSrcweir 		}
623*cdf0e10cSrcweir 	}
624*cdf0e10cSrcweir 
625*cdf0e10cSrcweir 	return bChgd;
626*cdf0e10cSrcweir }
627*cdf0e10cSrcweir 
628*cdf0e10cSrcweir sal_Bool SdrMarkList::InsertPageView(const SdrPageView& rPV)
629*cdf0e10cSrcweir {
630*cdf0e10cSrcweir 	sal_Bool bChgd(sal_False);
631*cdf0e10cSrcweir 	DeletePageView(rPV); // erstmal alle raus, dann die ganze Seite hinten dran
632*cdf0e10cSrcweir 	SdrObject* pObj;
633*cdf0e10cSrcweir 	const SdrObjList* pOL = rPV.GetObjList();
634*cdf0e10cSrcweir 	sal_uLong nObjAnz(pOL->GetObjCount());
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir 	for(sal_uLong nO(0L); nO < nObjAnz; nO++)
637*cdf0e10cSrcweir 	{
638*cdf0e10cSrcweir 		pObj = pOL->GetObj(nO);
639*cdf0e10cSrcweir 		sal_Bool bDoIt(rPV.IsObjMarkable(pObj));
640*cdf0e10cSrcweir 
641*cdf0e10cSrcweir 		if(bDoIt)
642*cdf0e10cSrcweir 		{
643*cdf0e10cSrcweir 			SdrMark* pM = new SdrMark(pObj, (SdrPageView*)&rPV);
644*cdf0e10cSrcweir 			maList.Insert(pM, CONTAINER_APPEND);
645*cdf0e10cSrcweir 			SetNameDirty();
646*cdf0e10cSrcweir 			bChgd = sal_True;
647*cdf0e10cSrcweir 		}
648*cdf0e10cSrcweir 	}
649*cdf0e10cSrcweir 
650*cdf0e10cSrcweir 	return bChgd;
651*cdf0e10cSrcweir }
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir const XubString& SdrMarkList::GetMarkDescription() const
654*cdf0e10cSrcweir {
655*cdf0e10cSrcweir 	sal_uLong nAnz(GetMarkCount());
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir 	if(mbNameOk && 1L == nAnz)
658*cdf0e10cSrcweir 	{
659*cdf0e10cSrcweir 		// Bei Einfachselektion nur Textrahmen cachen
660*cdf0e10cSrcweir 		const SdrObject* pObj = GetMark(0)->GetMarkedSdrObj();
661*cdf0e10cSrcweir 		const SdrTextObj* pTextObj = PTR_CAST(SdrTextObj, pObj);
662*cdf0e10cSrcweir 
663*cdf0e10cSrcweir 		if(!pTextObj || !pTextObj->IsTextFrame())
664*cdf0e10cSrcweir 		{
665*cdf0e10cSrcweir 			((SdrMarkList*)(this))->mbNameOk = sal_False;
666*cdf0e10cSrcweir 		}
667*cdf0e10cSrcweir 	}
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir 	if(!mbNameOk)
670*cdf0e10cSrcweir 	{
671*cdf0e10cSrcweir 		SdrMark* pMark = GetMark(0);
672*cdf0e10cSrcweir 		XubString aNam;
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir 		if(!nAnz)
675*cdf0e10cSrcweir 		{
676*cdf0e10cSrcweir 			((SdrMarkList*)(this))->maMarkName = ImpGetResStr(STR_ObjNameNoObj);
677*cdf0e10cSrcweir 		}
678*cdf0e10cSrcweir 		else if(1L == nAnz)
679*cdf0e10cSrcweir 		{
680*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
681*cdf0e10cSrcweir 			{
682*cdf0e10cSrcweir 				pMark->GetMarkedSdrObj()->TakeObjNameSingul(aNam);
683*cdf0e10cSrcweir 			}
684*cdf0e10cSrcweir 		}
685*cdf0e10cSrcweir 		else
686*cdf0e10cSrcweir 		{
687*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
688*cdf0e10cSrcweir 			{
689*cdf0e10cSrcweir 				pMark->GetMarkedSdrObj()->TakeObjNamePlural(aNam);
690*cdf0e10cSrcweir 				XubString aStr1;
691*cdf0e10cSrcweir 				sal_Bool bEq(sal_True);
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir 				for(sal_uLong i = 1; i < GetMarkCount() && bEq; i++)
694*cdf0e10cSrcweir 				{
695*cdf0e10cSrcweir 					SdrMark* pMark2 = GetMark(i);
696*cdf0e10cSrcweir 					pMark2->GetMarkedSdrObj()->TakeObjNamePlural(aStr1);
697*cdf0e10cSrcweir 					bEq = aNam.Equals(aStr1);
698*cdf0e10cSrcweir 				}
699*cdf0e10cSrcweir 
700*cdf0e10cSrcweir 				if(!bEq)
701*cdf0e10cSrcweir 				{
702*cdf0e10cSrcweir 					aNam = ImpGetResStr(STR_ObjNamePlural);
703*cdf0e10cSrcweir 				}
704*cdf0e10cSrcweir 			}
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir 			aNam.Insert(sal_Unicode(' '), 0);
707*cdf0e10cSrcweir 			aNam.Insert(UniString::CreateFromInt32(nAnz), 0);
708*cdf0e10cSrcweir 		}
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir 		((SdrMarkList*)(this))->maMarkName = aNam;
711*cdf0e10cSrcweir 		((SdrMarkList*)(this))->mbNameOk = sal_True;
712*cdf0e10cSrcweir 	}
713*cdf0e10cSrcweir 
714*cdf0e10cSrcweir 	return maMarkName;
715*cdf0e10cSrcweir }
716*cdf0e10cSrcweir 
717*cdf0e10cSrcweir const XubString& SdrMarkList::GetPointMarkDescription(sal_Bool bGlue) const
718*cdf0e10cSrcweir {
719*cdf0e10cSrcweir 	sal_Bool& rNameOk = (sal_Bool&)(bGlue ? mbGluePointNameOk : mbPointNameOk);
720*cdf0e10cSrcweir 	XubString& rName = (XubString&)(bGlue ? maGluePointName : maPointName);
721*cdf0e10cSrcweir 	sal_uLong nMarkAnz(GetMarkCount());
722*cdf0e10cSrcweir 	sal_uLong nMarkPtAnz(0L);
723*cdf0e10cSrcweir 	sal_uLong nMarkPtObjAnz(0L);
724*cdf0e10cSrcweir 	sal_uLong n1stMarkNum(ULONG_MAX);
725*cdf0e10cSrcweir 
726*cdf0e10cSrcweir 	for(sal_uLong nMarkNum(0L); nMarkNum < nMarkAnz; nMarkNum++)
727*cdf0e10cSrcweir 	{
728*cdf0e10cSrcweir 		const SdrMark* pMark = GetMark(nMarkNum);
729*cdf0e10cSrcweir 		const SdrUShortCont* pPts = bGlue ? pMark->GetMarkedGluePoints() : pMark->GetMarkedPoints();
730*cdf0e10cSrcweir 		sal_uLong nAnz(pPts ? pPts->GetCount() : 0);
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir 		if(nAnz)
733*cdf0e10cSrcweir 		{
734*cdf0e10cSrcweir 			if(n1stMarkNum == ULONG_MAX)
735*cdf0e10cSrcweir 			{
736*cdf0e10cSrcweir 				n1stMarkNum = nMarkNum;
737*cdf0e10cSrcweir 			}
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir 			nMarkPtAnz += nAnz;
740*cdf0e10cSrcweir 			nMarkPtObjAnz++;
741*cdf0e10cSrcweir 		}
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir 		if(nMarkPtObjAnz > 1 && rNameOk)
744*cdf0e10cSrcweir 		{
745*cdf0e10cSrcweir 			// vorzeitige Entscheidung
746*cdf0e10cSrcweir 			return rName;
747*cdf0e10cSrcweir 		}
748*cdf0e10cSrcweir 	}
749*cdf0e10cSrcweir 
750*cdf0e10cSrcweir 	if(rNameOk && 1L == nMarkPtObjAnz)
751*cdf0e10cSrcweir 	{
752*cdf0e10cSrcweir 		// Bei Einfachselektion nur Textrahmen cachen
753*cdf0e10cSrcweir 		const SdrObject* pObj = GetMark(0)->GetMarkedSdrObj();
754*cdf0e10cSrcweir 		const SdrTextObj* pTextObj = PTR_CAST(SdrTextObj,pObj);
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir 		if(!pTextObj || !pTextObj->IsTextFrame())
757*cdf0e10cSrcweir 		{
758*cdf0e10cSrcweir 			rNameOk = sal_False;
759*cdf0e10cSrcweir 		}
760*cdf0e10cSrcweir 	}
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir 	if(!nMarkPtObjAnz)
763*cdf0e10cSrcweir 	{
764*cdf0e10cSrcweir 		rName.Erase();
765*cdf0e10cSrcweir 		rNameOk = sal_True;
766*cdf0e10cSrcweir 	}
767*cdf0e10cSrcweir 	else if(!rNameOk)
768*cdf0e10cSrcweir 	{
769*cdf0e10cSrcweir 		const SdrMark* pMark = GetMark(n1stMarkNum);
770*cdf0e10cSrcweir 		XubString aNam;
771*cdf0e10cSrcweir 
772*cdf0e10cSrcweir 		if(1L == nMarkPtObjAnz)
773*cdf0e10cSrcweir 		{
774*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
775*cdf0e10cSrcweir 			{
776*cdf0e10cSrcweir 				pMark->GetMarkedSdrObj()->TakeObjNameSingul(aNam);
777*cdf0e10cSrcweir 			}
778*cdf0e10cSrcweir 		}
779*cdf0e10cSrcweir 		else
780*cdf0e10cSrcweir 		{
781*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
782*cdf0e10cSrcweir 			{
783*cdf0e10cSrcweir 				pMark->GetMarkedSdrObj()->TakeObjNamePlural(aNam);
784*cdf0e10cSrcweir 			}
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir 			XubString aStr1;
787*cdf0e10cSrcweir 			sal_Bool bEq(sal_True);
788*cdf0e10cSrcweir 
789*cdf0e10cSrcweir 			for(sal_uLong i(n1stMarkNum + 1L); i < GetMarkCount() && bEq; i++)
790*cdf0e10cSrcweir 			{
791*cdf0e10cSrcweir 				const SdrMark* pMark2 = GetMark(i);
792*cdf0e10cSrcweir 				const SdrUShortCont* pPts = bGlue ? pMark2->GetMarkedGluePoints() : pMark2->GetMarkedPoints();
793*cdf0e10cSrcweir 
794*cdf0e10cSrcweir 				if(pPts && pPts->GetCount() && pMark2->GetMarkedSdrObj())
795*cdf0e10cSrcweir 				{
796*cdf0e10cSrcweir 					pMark2->GetMarkedSdrObj()->TakeObjNamePlural(aStr1);
797*cdf0e10cSrcweir 					bEq = aNam.Equals(aStr1);
798*cdf0e10cSrcweir 				}
799*cdf0e10cSrcweir 			}
800*cdf0e10cSrcweir 
801*cdf0e10cSrcweir 			if(!bEq)
802*cdf0e10cSrcweir 			{
803*cdf0e10cSrcweir 				aNam = ImpGetResStr(STR_ObjNamePlural);
804*cdf0e10cSrcweir 			}
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir 			aNam.Insert(sal_Unicode(' '), 0);
807*cdf0e10cSrcweir 			aNam.Insert(UniString::CreateFromInt32(nMarkPtObjAnz), 0);
808*cdf0e10cSrcweir 		}
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir 		XubString aStr1;
811*cdf0e10cSrcweir 
812*cdf0e10cSrcweir 		if(1L == nMarkPtAnz)
813*cdf0e10cSrcweir 		{
814*cdf0e10cSrcweir 			aStr1 = (ImpGetResStr(bGlue ? STR_ViewMarkedGluePoint : STR_ViewMarkedPoint));
815*cdf0e10cSrcweir 		}
816*cdf0e10cSrcweir 		else
817*cdf0e10cSrcweir 		{
818*cdf0e10cSrcweir 			aStr1 = (ImpGetResStr(bGlue ? STR_ViewMarkedGluePoints : STR_ViewMarkedPoints));
819*cdf0e10cSrcweir 			aStr1.SearchAndReplaceAscii("%2", UniString::CreateFromInt32(nMarkPtAnz));
820*cdf0e10cSrcweir 		}
821*cdf0e10cSrcweir 
822*cdf0e10cSrcweir 		aStr1.SearchAndReplaceAscii("%1", aNam);
823*cdf0e10cSrcweir 		rName = aStr1;
824*cdf0e10cSrcweir 		rNameOk = sal_True;
825*cdf0e10cSrcweir 	}
826*cdf0e10cSrcweir 
827*cdf0e10cSrcweir 	return rName;
828*cdf0e10cSrcweir }
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir sal_Bool SdrMarkList::TakeBoundRect(SdrPageView* pPV, Rectangle& rRect) const
831*cdf0e10cSrcweir {
832*cdf0e10cSrcweir 	sal_Bool bFnd(sal_False);
833*cdf0e10cSrcweir 	Rectangle aR;
834*cdf0e10cSrcweir 
835*cdf0e10cSrcweir 	for(sal_uLong i(0L); i < GetMarkCount(); i++)
836*cdf0e10cSrcweir 	{
837*cdf0e10cSrcweir 		SdrMark* pMark = GetMark(i);
838*cdf0e10cSrcweir 
839*cdf0e10cSrcweir 		if(!pPV || pMark->GetPageView() == pPV)
840*cdf0e10cSrcweir 		{
841*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
842*cdf0e10cSrcweir 			{
843*cdf0e10cSrcweir 				aR = pMark->GetMarkedSdrObj()->GetCurrentBoundRect();
844*cdf0e10cSrcweir 
845*cdf0e10cSrcweir 				if(bFnd)
846*cdf0e10cSrcweir 				{
847*cdf0e10cSrcweir 					rRect.Union(aR);
848*cdf0e10cSrcweir 				}
849*cdf0e10cSrcweir 				else
850*cdf0e10cSrcweir 				{
851*cdf0e10cSrcweir 					rRect = aR;
852*cdf0e10cSrcweir 					bFnd = sal_True;
853*cdf0e10cSrcweir 				}
854*cdf0e10cSrcweir 			}
855*cdf0e10cSrcweir 		}
856*cdf0e10cSrcweir 	}
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir 	return bFnd;
859*cdf0e10cSrcweir }
860*cdf0e10cSrcweir 
861*cdf0e10cSrcweir sal_Bool SdrMarkList::TakeSnapRect(SdrPageView* pPV, Rectangle& rRect) const
862*cdf0e10cSrcweir {
863*cdf0e10cSrcweir 	sal_Bool bFnd(sal_False);
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir 	for(sal_uLong i(0L); i < GetMarkCount(); i++)
866*cdf0e10cSrcweir 	{
867*cdf0e10cSrcweir 		SdrMark* pMark = GetMark(i);
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir 		if(!pPV || pMark->GetPageView() == pPV)
870*cdf0e10cSrcweir 		{
871*cdf0e10cSrcweir 			if(pMark->GetMarkedSdrObj())
872*cdf0e10cSrcweir 			{
873*cdf0e10cSrcweir 				Rectangle aR(pMark->GetMarkedSdrObj()->GetSnapRect());
874*cdf0e10cSrcweir 
875*cdf0e10cSrcweir 				if(bFnd)
876*cdf0e10cSrcweir 				{
877*cdf0e10cSrcweir 					rRect.Union(aR);
878*cdf0e10cSrcweir 				}
879*cdf0e10cSrcweir 				else
880*cdf0e10cSrcweir 				{
881*cdf0e10cSrcweir 					rRect = aR;
882*cdf0e10cSrcweir 					bFnd = sal_True;
883*cdf0e10cSrcweir 				}
884*cdf0e10cSrcweir 			}
885*cdf0e10cSrcweir 		}
886*cdf0e10cSrcweir 	}
887*cdf0e10cSrcweir 
888*cdf0e10cSrcweir 	return bFnd;
889*cdf0e10cSrcweir }
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
892*cdf0e10cSrcweir 
893*cdf0e10cSrcweir namespace sdr
894*cdf0e10cSrcweir {
895*cdf0e10cSrcweir 	ViewSelection::ViewSelection()
896*cdf0e10cSrcweir 	:	mbEdgesOfMarkedNodesDirty(sal_False)
897*cdf0e10cSrcweir 	{
898*cdf0e10cSrcweir 	}
899*cdf0e10cSrcweir 
900*cdf0e10cSrcweir 	void ViewSelection::SetEdgesOfMarkedNodesDirty()
901*cdf0e10cSrcweir 	{
902*cdf0e10cSrcweir 		if(!mbEdgesOfMarkedNodesDirty)
903*cdf0e10cSrcweir 		{
904*cdf0e10cSrcweir 			mbEdgesOfMarkedNodesDirty = sal_True;
905*cdf0e10cSrcweir 			maEdgesOfMarkedNodes.Clear();
906*cdf0e10cSrcweir 			maMarkedEdgesOfMarkedNodes.Clear();
907*cdf0e10cSrcweir 			maAllMarkedObjects.Clear();
908*cdf0e10cSrcweir 		}
909*cdf0e10cSrcweir 	}
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir 	const SdrMarkList& ViewSelection::GetEdgesOfMarkedNodes() const
912*cdf0e10cSrcweir 	{
913*cdf0e10cSrcweir 		if(mbEdgesOfMarkedNodesDirty)
914*cdf0e10cSrcweir 		{
915*cdf0e10cSrcweir 			((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes();
916*cdf0e10cSrcweir 		}
917*cdf0e10cSrcweir 
918*cdf0e10cSrcweir 		return maEdgesOfMarkedNodes;
919*cdf0e10cSrcweir 	}
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir 	const SdrMarkList& ViewSelection::GetMarkedEdgesOfMarkedNodes() const
922*cdf0e10cSrcweir 	{
923*cdf0e10cSrcweir 		if(mbEdgesOfMarkedNodesDirty)
924*cdf0e10cSrcweir 		{
925*cdf0e10cSrcweir 			((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes();
926*cdf0e10cSrcweir 		}
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir 		return maMarkedEdgesOfMarkedNodes;
929*cdf0e10cSrcweir 	}
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir 	const List& ViewSelection::GetAllMarkedObjects() const
932*cdf0e10cSrcweir 	{
933*cdf0e10cSrcweir 		if(mbEdgesOfMarkedNodesDirty)
934*cdf0e10cSrcweir 		{
935*cdf0e10cSrcweir 			((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes();
936*cdf0e10cSrcweir 		}
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir 		return maAllMarkedObjects;
939*cdf0e10cSrcweir 	}
940*cdf0e10cSrcweir 
941*cdf0e10cSrcweir 	void ViewSelection::ImplCollectCompleteSelection(SdrObject* pObj)
942*cdf0e10cSrcweir 	{
943*cdf0e10cSrcweir 		if(pObj)
944*cdf0e10cSrcweir 		{
945*cdf0e10cSrcweir 			sal_Bool bIsGroup(pObj->IsGroupObject());
946*cdf0e10cSrcweir 
947*cdf0e10cSrcweir 			if(bIsGroup && pObj->ISA(E3dObject) && !pObj->ISA(E3dScene))
948*cdf0e10cSrcweir 			{
949*cdf0e10cSrcweir 				bIsGroup = sal_False;
950*cdf0e10cSrcweir 			}
951*cdf0e10cSrcweir 
952*cdf0e10cSrcweir 			if(bIsGroup)
953*cdf0e10cSrcweir 			{
954*cdf0e10cSrcweir 				SdrObjList* pList = pObj->GetSubList();
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir 				for(sal_uLong a(0L); a < pList->GetObjCount(); a++)
957*cdf0e10cSrcweir 				{
958*cdf0e10cSrcweir 					SdrObject* pObj2 = pList->GetObj(a);
959*cdf0e10cSrcweir 					ImplCollectCompleteSelection(pObj2);
960*cdf0e10cSrcweir 				}
961*cdf0e10cSrcweir 			}
962*cdf0e10cSrcweir 
963*cdf0e10cSrcweir 			maAllMarkedObjects.Insert(pObj, LIST_APPEND);
964*cdf0e10cSrcweir 		}
965*cdf0e10cSrcweir 	}
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir 	void ViewSelection::ImpForceEdgesOfMarkedNodes()
968*cdf0e10cSrcweir 	{
969*cdf0e10cSrcweir 		if(mbEdgesOfMarkedNodesDirty)
970*cdf0e10cSrcweir 		{
971*cdf0e10cSrcweir 			mbEdgesOfMarkedNodesDirty = sal_False;
972*cdf0e10cSrcweir 			maMarkedObjectList.ForceSort();
973*cdf0e10cSrcweir 			maEdgesOfMarkedNodes.Clear();
974*cdf0e10cSrcweir 			maMarkedEdgesOfMarkedNodes.Clear();
975*cdf0e10cSrcweir 			maAllMarkedObjects.Clear();
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir 			// #126320# GetMarkCount after ForceSort
978*cdf0e10cSrcweir 			const sal_uLong nMarkAnz(maMarkedObjectList.GetMarkCount());
979*cdf0e10cSrcweir 
980*cdf0e10cSrcweir 			for(sal_uLong a(0L); a < nMarkAnz; a++)
981*cdf0e10cSrcweir 			{
982*cdf0e10cSrcweir 				SdrObject* pCandidate = maMarkedObjectList.GetMark(a)->GetMarkedSdrObj();
983*cdf0e10cSrcweir 
984*cdf0e10cSrcweir 				if(pCandidate)
985*cdf0e10cSrcweir 				{
986*cdf0e10cSrcweir 					// build transitive hull
987*cdf0e10cSrcweir 					ImplCollectCompleteSelection(pCandidate);
988*cdf0e10cSrcweir 
989*cdf0e10cSrcweir 					if(pCandidate->IsNode())
990*cdf0e10cSrcweir 					{
991*cdf0e10cSrcweir 						// travel over broadcaster/listener to access edges connected to the selected object
992*cdf0e10cSrcweir 						const SfxBroadcaster* pBC = pCandidate->GetBroadcaster();
993*cdf0e10cSrcweir 
994*cdf0e10cSrcweir 						if(pBC)
995*cdf0e10cSrcweir 						{
996*cdf0e10cSrcweir 							sal_uInt16 nLstAnz(pBC->GetListenerCount());
997*cdf0e10cSrcweir 
998*cdf0e10cSrcweir 							for(sal_uInt16 nl(0); nl < nLstAnz; nl++)
999*cdf0e10cSrcweir 							{
1000*cdf0e10cSrcweir 								SfxListener* pLst = pBC->GetListener(nl);
1001*cdf0e10cSrcweir 								SdrEdgeObj* pEdge = PTR_CAST(SdrEdgeObj, pLst);
1002*cdf0e10cSrcweir 
1003*cdf0e10cSrcweir 								if(pEdge && pEdge->IsInserted() && pEdge->GetPage() == pCandidate->GetPage())
1004*cdf0e10cSrcweir 								{
1005*cdf0e10cSrcweir 									SdrMark aM(pEdge, maMarkedObjectList.GetMark(a)->GetPageView());
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir 									if(pEdge->GetConnectedNode(sal_True) == pCandidate)
1008*cdf0e10cSrcweir 									{
1009*cdf0e10cSrcweir 										aM.SetCon1(sal_True);
1010*cdf0e10cSrcweir 									}
1011*cdf0e10cSrcweir 
1012*cdf0e10cSrcweir 									if(pEdge->GetConnectedNode(sal_False) == pCandidate)
1013*cdf0e10cSrcweir 									{
1014*cdf0e10cSrcweir 										aM.SetCon2(sal_True);
1015*cdf0e10cSrcweir 									}
1016*cdf0e10cSrcweir 
1017*cdf0e10cSrcweir 									if(CONTAINER_ENTRY_NOTFOUND == maMarkedObjectList.FindObject(pEdge))
1018*cdf0e10cSrcweir 									{
1019*cdf0e10cSrcweir 										// nachsehen, ob er selbst markiert ist
1020*cdf0e10cSrcweir 										maEdgesOfMarkedNodes.InsertEntry(aM);
1021*cdf0e10cSrcweir 									}
1022*cdf0e10cSrcweir 									else
1023*cdf0e10cSrcweir 									{
1024*cdf0e10cSrcweir 										maMarkedEdgesOfMarkedNodes.InsertEntry(aM);
1025*cdf0e10cSrcweir 									}
1026*cdf0e10cSrcweir 								}
1027*cdf0e10cSrcweir 							}
1028*cdf0e10cSrcweir 						}
1029*cdf0e10cSrcweir 					}
1030*cdf0e10cSrcweir 				}
1031*cdf0e10cSrcweir 			}
1032*cdf0e10cSrcweir 
1033*cdf0e10cSrcweir 			maEdgesOfMarkedNodes.ForceSort();
1034*cdf0e10cSrcweir 			maMarkedEdgesOfMarkedNodes.ForceSort();
1035*cdf0e10cSrcweir 		}
1036*cdf0e10cSrcweir 	}
1037*cdf0e10cSrcweir } // end of namespace sdr
1038*cdf0e10cSrcweir 
1039*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1040*cdf0e10cSrcweir // eof
1041