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