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