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