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