diff options
author | Rüdiger Timm <rt@openoffice.org> | 2004-07-12 13:46:24 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2004-07-12 13:46:24 +0000 |
commit | 7296bb3001863cc22557938a5d85ef330d0eb978 (patch) | |
tree | 24ff1ad76182204dd1f92a40e4ffdde8dfe11e88 /svx/source/svdraw/svdmark.cxx | |
parent | 5f7df1948d97e7631f24629f8ae9cfa07c2c6168 (diff) |
INTEGRATION: CWS aw013 (1.3.294); FILE MERGED
2004/06/29 10:10:24 aw 1.3.294.3: #i29181#
2004/06/28 14:55:03 aw 1.3.294.2: #117254#
2004/06/24 09:26:38 aw 1.3.294.1: #i29181#
Diffstat (limited to 'svx/source/svdraw/svdmark.cxx')
-rw-r--r-- | svx/source/svdraw/svdmark.cxx | 872 |
1 files changed, 575 insertions, 297 deletions
diff --git a/svx/source/svdraw/svdmark.cxx b/svx/source/svdraw/svdmark.cxx index 5e1e773df7d9..fc1d7cbe6b8e 100644 --- a/svx/source/svdraw/svdmark.cxx +++ b/svx/source/svdraw/svdmark.cxx @@ -2,9 +2,9 @@ * * $RCSfile: svdmark.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: rt $ $Date: 2003-11-24 16:55:25 $ + * last change: $Author: rt $ $Date: 2004-07-12 14:46:24 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,6 +59,8 @@ * ************************************************************************/ +//////////////////////////////////////////////////////////////////////////////////////////////////// + #include "svdmark.hxx" #include "svdetc.hxx" #include "svdobj.hxx" @@ -73,62 +75,93 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// +#ifndef _E3D_OBJ3D_HXX //autogen +#include <obj3d.hxx> +#endif + +#ifndef _E3D_SCENE3D_HXX +#include <scene3d.hxx> +#endif + +#ifndef _SFXBRDCST_HXX //autogen +#include <svtools/brdcst.hxx> +#endif + +#ifndef _SVDOEDGE_HXX +#include <svdoedge.hxx> +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////// + class ImpSdrUShortContSorter: public ContainerSorter { public: - ImpSdrUShortContSorter(Container& rNewCont): ContainerSorter(rNewCont) {} + ImpSdrUShortContSorter(Container& rNewCont) + : ContainerSorter(rNewCont) + {} + virtual int Compare(const void* pElem1, const void* pElem2) const; }; int ImpSdrUShortContSorter::Compare(const void* pElem1, const void* pElem2) const { - USHORT n1=USHORT(ULONG(pElem1)); - USHORT n2=USHORT(ULONG(pElem2)); - return n1<n2 ? -1 : n1>n2 ? 1 : 0; + sal_uInt16 n1((sal_uInt16)((sal_uInt32)pElem1)); + sal_uInt16 n2((sal_uInt16)((sal_uInt32)pElem2)); + + return ((n1 < n2) ? (-1) : (n1 > n2) ? (1) : (0)); } -void SdrUShortCont::Sort() +void SdrUShortCont::Sort() const { - ImpSdrUShortContSorter aSort(aArr); + ImpSdrUShortContSorter aSort(*((Container*)(&maArray))); aSort.DoSort(); - bSorted=TRUE; - if (bDelDups) { - ULONG nNum=GetCount(); - if (nNum>1) { + ((SdrUShortCont*)this)->mbSorted = sal_True; + + sal_uInt32 nNum(GetCount()); + + if(nNum > 1) + { + nNum--; + sal_uInt16 nVal0 = GetObject(nNum); + + while(nNum > 0) + { nNum--; - USHORT nVal0=GetObject(nNum); - while (nNum>0) { - nNum--; - USHORT nVal1=GetObject(nNum); - if (nVal1==nVal0) { - Remove(nNum); - } - nVal0=nVal1; + sal_uInt16 nVal1 = GetObject(nNum); + + if(nVal1 == nVal0) + { + ((SdrUShortCont*)this)->Remove(nNum); } + + nVal0 = nVal1; } } } -void SdrUShortCont::CheckSort(ULONG nPos) +void SdrUShortCont::CheckSort(sal_uInt32 nPos) { - ULONG nAnz=aArr.Count(); - if (nPos>nAnz) nPos=nAnz; - USHORT nAktVal=GetObject(nPos); - if (nPos>0) { - USHORT nPrevVal=GetObject(nPos-1); - if (bDelDups) { - if (nPrevVal>=nAktVal) bSorted=FALSE; - } else { - if (nPrevVal>nAktVal) bSorted=FALSE; - } + sal_uInt32 nAnz(maArray.Count()); + + if(nPos > nAnz) + nPos = nAnz; + + sal_uInt16 nAktVal = GetObject(nPos); + + if(nPos > 0) + { + sal_uInt16 nPrevVal = GetObject(nPos - 1); + + if(nPrevVal >= nAktVal) + mbSorted = sal_False; } - if (nPos<nAnz-1) { - USHORT nNextVal=GetObject(nPos+1); - if (bDelDups) { - if (nNextVal<=nAktVal) bSorted=FALSE; - } else { - if (nNextVal<nAktVal) bSorted=FALSE; - } + + if(nPos < nAnz - 1) + { + sal_uInt16 nNextVal = GetObject(nPos + 1); + + if(nNextVal <= nAktVal) + mbSorted = sal_False; } } @@ -136,70 +169,108 @@ void SdrUShortCont::CheckSort(ULONG nPos) SdrMark& SdrMark::operator=(const SdrMark& rMark) { - pObj=rMark.pObj; - pPageView=rMark.pPageView; - bCon1=rMark.bCon1; - bCon2=rMark.bCon2; - nUser=rMark.nUser; - if (rMark.pPoints==NULL) { - if (pPoints!=NULL) { - delete pPoints; - pPoints=NULL; - } - } else { - if (pPoints==NULL) { - pPoints=new SdrUShortCont(*rMark.pPoints); - } else { - *pPoints=*rMark.pPoints; - } - } - if (rMark.pLines==NULL) { - if (pLines!=NULL) { - delete pLines; - pLines=NULL; - } - } else { - if (pLines==NULL) { - pLines=new SdrUShortCont(*rMark.pLines); - } else { - *pLines=*rMark.pLines; - } - } - if (rMark.pGluePoints==NULL) { - if (pGluePoints!=NULL) { - delete pGluePoints; - pGluePoints=NULL; - } - } else { - if (pGluePoints==NULL) { - pGluePoints=new SdrUShortCont(*rMark.pGluePoints); - } else { - *pGluePoints=*rMark.pGluePoints; + mpObj = rMark.mpObj; + mpPageView = rMark.mpPageView; + mbCon1 = rMark.mbCon1; + mbCon2 = rMark.mbCon2; + mnUser = rMark.mnUser; + + if(!rMark.mpPoints) + { + if(mpPoints) + { + delete mpPoints; + mpPoints = 0L; + } + } + else + { + if(!mpPoints) + { + mpPoints = new SdrUShortCont(*rMark.mpPoints); + } + else + { + *mpPoints = *rMark.mpPoints; + } + } + + if(!rMark.mpLines) + { + if(mpLines) + { + delete mpLines; + mpLines = 0L; + } + } + else + { + if(!mpLines) + { + mpLines = new SdrUShortCont(*rMark.mpLines); + } + else + { + *mpLines = *rMark.mpLines; + } + } + + if(!rMark.mpGluePoints) + { + if(mpGluePoints) + { + delete mpGluePoints; + mpGluePoints = 0L; + } + } + else + { + if(!mpGluePoints) + { + mpGluePoints = new SdrUShortCont(*rMark.mpGluePoints); + } + else + { + *mpGluePoints = *rMark.mpGluePoints; } } + return *this; } -FASTBOOL SdrMark::operator==(const SdrMark& rMark) const +sal_Bool SdrMark::operator==(const SdrMark& rMark) const { - FASTBOOL bRet=pObj==rMark.pObj && pPageView==rMark.pPageView && bCon1==rMark.bCon1 && bCon2==rMark.bCon2 && nUser==rMark.nUser; - if ((pPoints!=NULL) != (rMark.pPoints!=NULL)) bRet=FALSE; - if ((pLines !=NULL) != (rMark.pLines !=NULL)) bRet=FALSE; - if ((pGluePoints!=NULL) != (rMark.pGluePoints!=NULL)) bRet=FALSE; - if (bRet && pPoints!=NULL && *pPoints!=*rMark.pPoints) bRet=FALSE; - if (bRet && pLines !=NULL && *pLines !=*rMark.pLines ) bRet=FALSE; - if (bRet && pGluePoints!=NULL && *pGluePoints!=*rMark.pGluePoints) bRet=FALSE; + sal_Bool bRet(mpObj == rMark.mpObj && mpPageView == rMark.mpPageView && mbCon1 == rMark.mbCon1 && mbCon2 == rMark.mbCon2 && mnUser == rMark.mnUser); + + if((mpPoints != 0L) != (rMark.mpPoints != 0L)) + bRet = sal_False; + + if((mpLines != 0L) != (rMark.mpLines != 0L)) + bRet = sal_False; + + if((mpGluePoints != 0L) != (rMark.mpGluePoints != 0L)) + bRet = sal_False; + + if(bRet && mpPoints && *mpPoints != *rMark.mpPoints) + bRet = sal_False; + + if(bRet && mpLines && *mpLines != *rMark.mpLines) + bRet = sal_False; + + if(bRet && mpGluePoints && *mpGluePoints != *rMark.mpGluePoints) + bRet = sal_False; + return bRet; } SdrPage* SdrMark::GetPage() const { - return (pObj!=NULL ? pObj->GetPage() : NULL); + return (mpObj ? mpObj->GetPage() : 0L); } SdrObjList* SdrMark::GetObjList() const { - return (pObj!=NULL ? pObj->GetObjList() : NULL); + return (mpObj ? mpObj->GetObjList() : 0L); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -207,52 +278,83 @@ SdrObjList* SdrMark::GetObjList() const class ImpSdrMarkListSorter: public ContainerSorter { public: - ImpSdrMarkListSorter(Container& rNewCont): ContainerSorter(rNewCont) {} + ImpSdrMarkListSorter(Container& rNewCont) + : ContainerSorter(rNewCont) + {} + virtual int Compare(const void* pElem1, const void* pElem2) const; }; int ImpSdrMarkListSorter::Compare(const void* pElem1, const void* pElem2) const { - const SdrObject* pObj1=((SdrMark*)pElem1)->GetObj(); - const SdrObject* pObj2=((SdrMark*)pElem2)->GetObj(); - const SdrObjList* pOL1=pObj1!=NULL ? pObj1->GetObjList() : NULL; - const SdrObjList* pOL2=pObj2!=NULL ? pObj2->GetObjList() : NULL; - if (pOL1==pOL2) { - ULONG nObjOrd1=pObj1!=NULL ? pObj1->GetOrdNum() : 0; - ULONG nObjOrd2=pObj2!=NULL ? pObj2->GetOrdNum() : 0; - return nObjOrd1<nObjOrd2 ? -1 : 1; - } else { - return (long)pOL1<(long)pOL2 ? -1 : 1; + const SdrObject* pObj1 = ((SdrMark*)pElem1)->GetObj(); + const SdrObject* pObj2 = ((SdrMark*)pElem2)->GetObj(); + const SdrObjList* pOL1 = (pObj1) ? pObj1->GetObjList() : 0L; + const SdrObjList* pOL2 = (pObj2) ? pObj2->GetObjList() : 0L; + + if(pOL1 == pOL2) + { + sal_uInt32 nObjOrd1((pObj1) ? pObj1->GetOrdNum() : 0); + sal_uInt32 nObjOrd2((pObj2) ? pObj2->GetOrdNum() : 0); + + return (nObjOrd1 < nObjOrd2 ? -1 : 1); + } + else + { + return ((long)pOL1 < (long)pOL2) ? -1 : 1; } } //////////////////////////////////////////////////////////////////////////////////////////////////// -void SdrMarkList::ForceSort() +void SdrMarkList::ForceSort() const +{ + if(!mbSorted) + { + ((SdrMarkList*)this)->ImpForceSort(); + } +} + +void SdrMarkList::ImpForceSort() { - if (!bSorted) { - bSorted=TRUE; - ULONG nAnz=aList.Count(); - if (nAnz>1) { - ImpSdrMarkListSorter aSort(aList); + if(!mbSorted) + { + mbSorted = sal_True; + sal_uInt32 nAnz = maList.Count(); + + if(nAnz > 1) + { + ImpSdrMarkListSorter aSort(maList); aSort.DoSort(); + // und nun doppelte rauswerfen - if (aList.Count()>1) { - SdrMark* pAkt=(SdrMark*)aList.Last(); - SdrMark* pCmp=(SdrMark*)aList.Prev(); - while (pCmp!=NULL) { - if (pAkt->GetObj()==pCmp->GetObj()) { + if(maList.Count() > 1) + { + SdrMark* pAkt = (SdrMark*)maList.Last(); + SdrMark* pCmp = (SdrMark*)maList.Prev(); + + while(pCmp) + { + if(pAkt->GetObj() == pCmp->GetObj()) + { // Con1/Con2 Merging - if (pCmp->IsCon1()) pAkt->SetCon1(TRUE); - if (pCmp->IsCon2()) pAkt->SetCon2(TRUE); + if(pCmp->IsCon1()) + pAkt->SetCon1(sal_True); + + if(pCmp->IsCon2()) + pAkt->SetCon2(sal_True); + // pCmp loeschen. - aList.Remove(); + maList.Remove(); + delete pCmp; - // Aktueller Entry im Container ist nun pAkt! - } else { - pAkt=pCmp; } - pCmp=(SdrMark*)aList.Prev(); + else + { + pAkt = pCmp; + } + + pCmp = (SdrMark*)maList.Prev(); } } } @@ -261,32 +363,37 @@ void SdrMarkList::ForceSort() void SdrMarkList::Clear() { - for (ULONG i=0; i<GetMarkCount(); i++) { - SdrMark* pMark=GetMark(i); + for(sal_uInt32 i(0L); i < GetMarkCount(); i++) + { + SdrMark* pMark = GetMark(i); delete pMark; } - aList.Clear(); + + maList.Clear(); SetNameDirty(); } void SdrMarkList::operator=(const SdrMarkList& rLst) { Clear(); - for (ULONG i=0; i<rLst.GetMarkCount(); i++) { - SdrMark* pMark=rLst.GetMark(i); - SdrMark* pNeuMark=new SdrMark(*pMark); - aList.Insert(pNeuMark,CONTAINER_APPEND); - } - aMarkName=rLst.aMarkName; - bNameOk=rLst.bNameOk; - aPointName=rLst.aPointName; - bPointNameOk=rLst.bPointNameOk; - aGluePointName=rLst.aGluePointName; - bGluePointNameOk=rLst.bGluePointNameOk; - bSorted=rLst.bSorted; + + for(sal_uInt32 i(0L); i < rLst.GetMarkCount(); i++) + { + SdrMark* pMark = rLst.GetMark(i); + SdrMark* pNeuMark = new SdrMark(*pMark); + maList.Insert(pNeuMark, CONTAINER_APPEND); + } + + maMarkName = rLst.maMarkName; + mbNameOk = rLst.mbNameOk; + maPointName = rLst.maPointName; + mbPointNameOk = rLst.mbPointNameOk; + maGluePointName = rLst.maGluePointName; + mbGluePointNameOk = rLst.mbGluePointNameOk; + mbSorted = rLst.mbSorted; } -ULONG SdrMarkList::FindObject(const SdrObject* pObj) +sal_uInt32 SdrMarkList::FindObject(const SdrObject* pObj) const { // #109658# // @@ -294,16 +401,16 @@ ULONG SdrMarkList::FindObject(const SdrObject* pObj) // selection may not be inserted in a list if they are e.g. modified ATM, i changed // this loop to just look if the object pointer is in the selection. // - // Problem is that GetOrdNum() which is const, internally casts no non-const and + // Problem is that GetOrdNum() which is const, internally casts to non-const and // hardly sets the OrdNum member of the object (nOrdNum) to 0 (ZERO) if the object // is not inserted in a object list. // Since this may be by purpose and necessary somewhere else i decided that it is // less dangerous to change this method then changing SdrObject::GetOrdNum(). - if(pObj && aList.Count()) + if(pObj && maList.Count()) { - for(sal_uInt32 a(0L); a < aList.Count(); a++) + for(sal_uInt32 a(0L); a < maList.Count(); a++) { - if(((SdrMark*)(aList.GetObject(a)))->GetObj() == pObj) + if(((SdrMark*)(maList.GetObject(a)))->GetObj() == pObj) { return a; } @@ -311,179 +418,199 @@ ULONG SdrMarkList::FindObject(const SdrObject* pObj) } return CONTAINER_ENTRY_NOTFOUND; - - /* - ForceSort(); - if (pObj==NULL || aList.Count()==0) return CONTAINER_ENTRY_NOTFOUND; - const SdrObjList* pOL=pObj->GetObjList(); - ULONG nObjOrd=pObj->GetOrdNum(); - ULONG nL=0; - ULONG nR=aList.Count(); - if (GetMark(nL)->GetObj()==pObj) return nL; - while (nL+1<nR) { // Der Gesuchte befindet sich zwischen, nicht auf den Grenzen! - ULONG nMid=(nL+nR)/2; - const SdrObject* pMidObj=GetMark(nMid)->GetObj(); - if (pMidObj==pObj) return nMid; // Hurra, gefunden! - const SdrObjList* pMidOL=pMidObj!=NULL ? pMidObj->GetObjList() : NULL; - ULONG nMidObjOrd=pMidObj!=NULL ? pMidObj->GetOrdNum() : 0; - if (pMidOL==pOL) { - if (nMidObjOrd<nObjOrd) nL=nMid; - else if (nMidObjOrd>nObjOrd) nR=nMid; - else { - DBG_ASSERT(FALSE,"SdrMarkList::FindObject(): Anderes Objekt mit gleicher OrdNum gefunden!"); - return CONTAINER_ENTRY_NOTFOUND; - } - } else if ((long)pMidOL<(long)pOL) nL=nMid; - else nR=nMid; - } - return CONTAINER_ENTRY_NOTFOUND; - */ } -void SdrMarkList::InsertEntry(const SdrMark& rMark, FASTBOOL bChkSort) +void SdrMarkList::InsertEntry(const SdrMark& rMark, sal_Bool bChkSort) { SetNameDirty(); - ULONG nAnz=aList.Count(); - if (!bChkSort || !bSorted || nAnz==0) { - if (!bChkSort) bSorted=FALSE; - aList.Insert(new SdrMark(rMark),CONTAINER_APPEND); - } else { - SdrMark* pLast=GetMark(ULONG(nAnz-1)); - const SdrObject* pLastObj=pLast->GetObj(); - const SdrObject* pNeuObj=rMark.GetObj(); - if (pLastObj==pNeuObj) { // Aha, den gibt's schon + sal_uInt32 nAnz(maList.Count()); + + if(!bChkSort || !mbSorted || nAnz == 0) + { + if(!bChkSort) + mbSorted = sal_False; + + maList.Insert(new SdrMark(rMark), CONTAINER_APPEND); + } + else + { + SdrMark* pLast = GetMark(sal_uInt32(nAnz - 1)); + const SdrObject* pLastObj = pLast->GetObj(); + const SdrObject* pNeuObj = rMark.GetObj(); + + if(pLastObj == pNeuObj) + { + // Aha, den gibt's schon // Con1/Con2 Merging - if (rMark.IsCon1()) pLast->SetCon1(TRUE); - if (rMark.IsCon2()) pLast->SetCon2(TRUE); - } else { - SdrMark* pKopie=new SdrMark(rMark); - aList.Insert(pKopie,CONTAINER_APPEND); + if(rMark.IsCon1()) + pLast->SetCon1(sal_True); + + if(rMark.IsCon2()) + pLast->SetCon2(sal_True); + } + else + { + SdrMark* pKopie = new SdrMark(rMark); + maList.Insert(pKopie, CONTAINER_APPEND); + // und nun checken, ob die Sortierung noch ok ist - const SdrObjList* pLastOL=pLastObj!=NULL ? pLastObj->GetObjList() : NULL; - const SdrObjList* pNeuOL =pNeuObj !=NULL ? pNeuObj ->GetObjList() : NULL; - if (pLastOL==pNeuOL) { - ULONG nLastNum=pLastObj!=NULL ? pLastObj->GetOrdNum() : 0; - ULONG nNeuNum =pNeuObj !=NULL ? pNeuObj ->GetOrdNum() : 0; - if (nNeuNum<nLastNum) { - bSorted=FALSE; // irgendwann muss mal sortiert werden + const SdrObjList* pLastOL = pLastObj!=0L ? pLastObj->GetObjList() : 0L; + const SdrObjList* pNeuOL = pNeuObj !=0L ? pNeuObj ->GetObjList() : 0L; + + if(pLastOL == pNeuOL) + { + sal_uInt32 nLastNum(pLastObj!=0L ? pLastObj->GetOrdNum() : 0); + sal_uInt32 nNeuNum(pNeuObj !=0L ? pNeuObj ->GetOrdNum() : 0); + + if(nNeuNum < nLastNum) + { + // irgendwann muss mal sortiert werden + mbSorted = sal_False; } - } else { - if ((long)pNeuOL<(long)pLastOL) { - bSorted=FALSE; // irgendwann muss mal sortiert werden + } + else + { + if((long)pNeuOL < (long)pLastOL) + { + // irgendwann muss mal sortiert werden + mbSorted = sal_False; } } } } + return; } -void SdrMarkList::DeleteMark(ULONG nNum) +void SdrMarkList::DeleteMark(sal_uInt32 nNum) { - //ForceSort(); - SdrMark* pMark=GetMark(nNum); - DBG_ASSERT(pMark!=NULL,"DeleteMark: MarkEntry nicht gefunden"); - if (pMark!=NULL) { - aList.Remove(nNum); + SdrMark* pMark = GetMark(nNum); + DBG_ASSERT(pMark!=0L,"DeleteMark: MarkEntry nicht gefunden"); + + if(pMark) + { + maList.Remove(nNum); delete pMark; SetNameDirty(); } } -void SdrMarkList::ReplaceMark(const SdrMark& rNewMark, ULONG nNum) +void SdrMarkList::ReplaceMark(const SdrMark& rNewMark, sal_uInt32 nNum) { - SdrMark* pMark=GetMark(nNum); - DBG_ASSERT(pMark!=NULL,"ReplaceMark: MarkEntry nicht gefunden"); - if (pMark!=NULL) { + SdrMark* pMark = GetMark(nNum); + DBG_ASSERT(pMark!=0L,"ReplaceMark: MarkEntry nicht gefunden"); + + if(pMark) + { delete pMark; SetNameDirty(); - SdrMark* pKopie=new SdrMark(rNewMark); - aList.Replace(pKopie,nNum); - bSorted=FALSE; - // Checken, ob bSorted wirklich gesetzt werden muss + SdrMark* pKopie = new SdrMark(rNewMark); + maList.Replace(pKopie, nNum); + mbSorted = sal_False; } } -void SdrMarkList::Merge(const SdrMarkList& rSrcList, FASTBOOL bReverse) +void SdrMarkList::Merge(const SdrMarkList& rSrcList, sal_Bool bReverse) { - // Merging ohne ein Sort bei rSrcList zu erzwingen - if (rSrcList.bSorted) bReverse=FALSE; - ULONG nAnz=rSrcList.aList.Count(); - if (!bReverse) { - for (ULONG i=0; i<nAnz; i++) { - SdrMark* pM=(SdrMark*)(rSrcList.aList.GetObject(i)); + sal_uInt32 nAnz(rSrcList.maList.Count()); + + if(rSrcList.mbSorted) + { + // Merging ohne ein Sort bei rSrcList zu erzwingen + bReverse = sal_False; + } + + if(!bReverse) + { + for(sal_uInt32 i(0L); i < nAnz; i++) + { + SdrMark* pM = (SdrMark*)(rSrcList.maList.GetObject(i)); InsertEntry(*pM); } - } else { - for (ULONG i=nAnz; i>0;) { + } + else + { + for(sal_uInt32 i(nAnz); i > 0;) + { i--; - SdrMark* pM=(SdrMark*)(rSrcList.aList.GetObject(i)); + SdrMark* pM = (SdrMark*)(rSrcList.maList.GetObject(i)); InsertEntry(*pM); } } } -FASTBOOL SdrMarkList::DeletePageView(const SdrPageView& rPV) +sal_Bool SdrMarkList::DeletePageView(const SdrPageView& rPV) { - FASTBOOL bChgd=FALSE; - for (ULONG i=GetMarkCount(); i>0;) { + sal_Bool bChgd(sal_False); + + for(sal_uInt32 i(GetMarkCount()); i > 0; ) + { i--; - SdrMark* pMark=GetMark(i); - if (pMark->GetPageView()==&rPV) { - aList.Remove(i); + SdrMark* pMark = GetMark(i); + + if(pMark->GetPageView()==&rPV) + { + maList.Remove(i); delete pMark; SetNameDirty(); - bChgd=TRUE; + bChgd = sal_True; } } + return bChgd; } -FASTBOOL SdrMarkList::InsertPageView(const SdrPageView& rPV) +sal_Bool SdrMarkList::InsertPageView(const SdrPageView& rPV) { - FASTBOOL bChgd=FALSE; + sal_Bool bChgd(sal_False); DeletePageView(rPV); // erstmal alle raus, dann die ganze Seite hinten dran SdrObject* pObj; - const SdrObjList* pOL=rPV.GetObjList(); - ULONG nObjAnz=pOL->GetObjCount(); - for (ULONG nO=0; nO<nObjAnz; nO++) { - pObj=pOL->GetObj(nO); - FASTBOOL bDoIt=rPV.IsObjMarkable(pObj); - if (bDoIt) { - SdrMark* pM=new SdrMark(pObj,(SdrPageView*)&rPV); - aList.Insert(pM,CONTAINER_APPEND); + const SdrObjList* pOL = rPV.GetObjList(); + sal_uInt32 nObjAnz(pOL->GetObjCount()); + + for(sal_uInt32 nO(0L); nO < nObjAnz; nO++) + { + pObj = pOL->GetObj(nO); + sal_Bool bDoIt(rPV.IsObjMarkable(pObj)); + + if(bDoIt) + { + SdrMark* pM = new SdrMark(pObj, (SdrPageView*)&rPV); + maList.Insert(pM, CONTAINER_APPEND); SetNameDirty(); - bChgd=TRUE; + bChgd = sal_True; } } + return bChgd; } const XubString& SdrMarkList::GetMarkDescription() const { - UINT32 nAnz(GetMarkCount()); + sal_uInt32 nAnz(GetMarkCount()); - if(bNameOk && nAnz==1) + if(mbNameOk && 1L == nAnz) { // Bei Einfachselektion nur Textrahmen cachen SdrObject* pObj = GetMark(0)->GetObj(); - SdrTextObj* pTextObj = PTR_CAST(SdrTextObj,pObj); + SdrTextObj* pTextObj = PTR_CAST(SdrTextObj, pObj); if(!pTextObj || !pTextObj->IsTextFrame()) { - ((SdrMarkList*)(this))->bNameOk = FALSE; + ((SdrMarkList*)(this))->mbNameOk = sal_False; } } - if(!bNameOk) + if(!mbNameOk) { SdrMark* pMark = GetMark(0); XubString aNam; if(!nAnz) { - ((SdrMarkList*)(this))->aMarkName = ImpGetResStr(STR_ObjNameNoObj); + ((SdrMarkList*)(this))->maMarkName = ImpGetResStr(STR_ObjNameNoObj); } - else if(nAnz == 1) + else if(1L == nAnz) { pMark->GetObj()->TakeObjNameSingul(aNam); } @@ -491,9 +618,9 @@ const XubString& SdrMarkList::GetMarkDescription() const { pMark->GetObj()->TakeObjNamePlural(aNam); XubString aStr1; - BOOL bEq(TRUE); + sal_Bool bEq(sal_True); - for(UINT32 i = 1; i < GetMarkCount() && bEq; i++) + for(sal_uInt32 i = 1; i < GetMarkCount() && bEq; i++) { SdrMark* pMark = GetMark(i); pMark->GetObj()->TakeObjNamePlural(aStr1); @@ -501,49 +628,55 @@ const XubString& SdrMarkList::GetMarkDescription() const } if(!bEq) + { aNam = ImpGetResStr(STR_ObjNamePlural); + } aNam.Insert(sal_Unicode(' '), 0); aNam.Insert(UniString::CreateFromInt32(nAnz), 0); } - ((SdrMarkList*)(this))->aMarkName = aNam; - ((SdrMarkList*)(this))->bNameOk = TRUE; + ((SdrMarkList*)(this))->maMarkName = aNam; + ((SdrMarkList*)(this))->mbNameOk = sal_True; } - return aMarkName; + return maMarkName; } -const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const +const XubString& SdrMarkList::GetPointMarkDescription(sal_Bool bGlue) const { - FASTBOOL& rNameOk = (FASTBOOL&)(bGlue ? bGluePointNameOk : bPointNameOk); - XubString& rName = (XubString&)(bGlue ? aGluePointName : aPointName); - UINT32 nMarkAnz(GetMarkCount()); - UINT32 nMarkPtAnz(0); - UINT32 nMarkPtObjAnz(0); - UINT32 n1stMarkNum(0xFFFFFFFF); - - for(UINT32 nMarkNum = 0; nMarkNum < nMarkAnz; nMarkNum++) + sal_Bool& rNameOk = (sal_Bool&)(bGlue ? mbGluePointNameOk : mbPointNameOk); + XubString& rName = (XubString&)(bGlue ? maGluePointName : maPointName); + sal_uInt32 nMarkAnz(GetMarkCount()); + sal_uInt32 nMarkPtAnz(0L); + sal_uInt32 nMarkPtObjAnz(0L); + sal_uInt32 n1stMarkNum(0xFFFFFFFF); + + for(sal_uInt32 nMarkNum(0L); nMarkNum < nMarkAnz; nMarkNum++) { const SdrMark* pMark = GetMark(nMarkNum); const SdrUShortCont* pPts = bGlue ? pMark->GetMarkedGluePoints() : pMark->GetMarkedPoints(); - UINT32 nAnz(pPts ? pPts->GetCount() : 0); + sal_uInt32 nAnz(pPts ? pPts->GetCount() : 0); if(nAnz) { if(n1stMarkNum == 0xFFFFFFFF) + { n1stMarkNum = nMarkNum; + } nMarkPtAnz += nAnz; nMarkPtObjAnz++; } if(nMarkPtObjAnz > 1 && rNameOk) + { // vorzeitige Entscheidung return rName; + } } - if(rNameOk && nMarkPtObjAnz == 1) + if(rNameOk && 1L == nMarkPtObjAnz) { // Bei Einfachselektion nur Textrahmen cachen SdrObject* pObj = GetMark(0)->GetObj(); @@ -551,21 +684,21 @@ const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const if(!pTextObj || !pTextObj->IsTextFrame()) { - rNameOk = FALSE; + rNameOk = sal_False; } } if(!nMarkPtObjAnz) { rName.Erase(); - rNameOk = TRUE; + rNameOk = sal_True; } else if(!rNameOk) { const SdrMark* pMark = GetMark(n1stMarkNum); XubString aNam; - if(nMarkPtObjAnz == 1) + if(1L == nMarkPtObjAnz) { pMark->GetObj()->TakeObjNameSingul(aNam); } @@ -573,9 +706,9 @@ const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const { pMark->GetObj()->TakeObjNamePlural(aNam); XubString aStr1; - BOOL bEq(TRUE); + sal_Bool bEq(sal_True); - for(UINT32 i = n1stMarkNum + 1; i < GetMarkCount() && bEq; i++) + for(sal_uInt32 i(n1stMarkNum + 1L); i < GetMarkCount() && bEq; i++) { const SdrMark* pMark = GetMark(i); const SdrUShortCont* pPts = bGlue ? pMark->GetMarkedGluePoints() : pMark->GetMarkedPoints(); @@ -588,7 +721,9 @@ const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const } if(!bEq) + { aNam = ImpGetResStr(STR_ObjNamePlural); + } aNam.Insert(sal_Unicode(' '), 0); aNam.Insert(UniString::CreateFromInt32(nMarkPtObjAnz), 0); @@ -596,7 +731,7 @@ const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const XubString aStr1; - if(nMarkPtAnz == 1) + if(1L == nMarkPtAnz) { aStr1 = (ImpGetResStr(bGlue ? STR_ViewMarkedGluePoint : STR_ViewMarkedPoint)); } @@ -608,67 +743,210 @@ const XubString& SdrMarkList::GetPointMarkDescription(FASTBOOL bGlue) const aStr1.SearchAndReplaceAscii("%O", aNam); rName = aStr1; - rNameOk = TRUE; + rNameOk = sal_True; } return rName; } -USHORT SdrMarkList::GetPageViewAnz() const +sal_Bool SdrMarkList::TakeBoundRect(SdrPageView* pPV, Rectangle& rRect) const { - USHORT nAnz=0; - SdrPageView* pPV=NULL; - for (ULONG i=0; i<GetMarkCount(); i++) { - SdrMark* pMark=GetMark(i); - if (pMark->GetPageView()!=pPV) { - pPV=pMark->GetPageView(); - nAnz++; - } - } - return nAnz; -} + sal_Bool bFnd(sal_False); + Rectangle aR; -SdrPageView* SdrMarkList::GetPageView(USHORT nNum) const -{ - return NULL; -} + for(sal_uInt32 i(0L); i < GetMarkCount(); i++) + { + SdrMark* pMark = GetMark(i); -FASTBOOL SdrMarkList::TakeBoundRect(SdrPageView* pPV, Rectangle& rRect) const -{ - FASTBOOL bFnd=FALSE; - Rectangle aR; + if(!pPV || pMark->GetPageView() == pPV) + { + aR = pMark->GetObj()->GetCurrentBoundRect(); - for (ULONG i=0; i<GetMarkCount(); i++) { - SdrMark* pMark=GetMark(i); - if (pPV==NULL || pMark->GetPageView()==pPV) { - aR=pMark->GetObj()->GetCurrentBoundRect(); - if (bFnd) { + if(bFnd) + { rRect.Union(aR); - } else { - rRect=aR; - bFnd=TRUE; + } + else + { + rRect = aR; + bFnd = sal_True; } } } + return bFnd; } -FASTBOOL SdrMarkList::TakeSnapRect(SdrPageView* pPV, Rectangle& rRect) const +sal_Bool SdrMarkList::TakeSnapRect(SdrPageView* pPV, Rectangle& rRect) const { - FASTBOOL bFnd=FALSE; + sal_Bool bFnd(sal_False); + + for(sal_uInt32 i(0L); i < GetMarkCount(); i++) + { + SdrMark* pMark = GetMark(i); - for (ULONG i=0; i<GetMarkCount(); i++) { - SdrMark* pMark=GetMark(i); - if (pPV==NULL || pMark->GetPageView()==pPV) { + if(!pPV || pMark->GetPageView() == pPV) + { Rectangle aR(pMark->GetObj()->GetSnapRect()); - if (bFnd) { + + if(bFnd) + { rRect.Union(aR); - } else { - rRect=aR; - bFnd=TRUE; + } + else + { + rRect = aR; + bFnd = sal_True; } } } + return bFnd; } +//////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace sdr +{ + ViewSelection::ViewSelection() + : mbEdgesOfMarkedNodesDirty(sal_False) + { + } + + void ViewSelection::SetEdgesOfMarkedNodesDirty() + { + if(!mbEdgesOfMarkedNodesDirty) + { + mbEdgesOfMarkedNodesDirty = sal_True; + maEdgesOfMarkedNodes.Clear(); + maMarkedEdgesOfMarkedNodes.Clear(); + maAllMarkedObjects.Clear(); + } + } + + const SdrMarkList& ViewSelection::GetEdgesOfMarkedNodes() const + { + if(mbEdgesOfMarkedNodesDirty) + { + ((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes(); + } + + return maEdgesOfMarkedNodes; + } + + const SdrMarkList& ViewSelection::GetMarkedEdgesOfMarkedNodes() const + { + if(mbEdgesOfMarkedNodesDirty) + { + ((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes(); + } + + return maMarkedEdgesOfMarkedNodes; + } + + const List& ViewSelection::GetAllMarkedObjects() const + { + if(mbEdgesOfMarkedNodesDirty) + { + ((ViewSelection*)this)->ImpForceEdgesOfMarkedNodes(); + } + + return maAllMarkedObjects; + } + + void ViewSelection::ImplCollectCompleteSelection(SdrObject* pObj) + { + sal_Bool bIsGroup(pObj->IsGroupObject()); + + if(bIsGroup && pObj->ISA(E3dObject) && !pObj->ISA(E3dScene)) + { + bIsGroup = sal_False; + } + + if(bIsGroup) + { + SdrObjList* pList = pObj->GetSubList(); + + for(sal_uInt32 a(0L); a < pList->GetObjCount(); a++) + { + SdrObject* pObj2 = pList->GetObj(a); + ImplCollectCompleteSelection(pObj2); + } + } + + maAllMarkedObjects.Insert(pObj, LIST_APPEND); + } + + void ViewSelection::ImpForceEdgesOfMarkedNodes() + { + if(mbEdgesOfMarkedNodesDirty) + { + const sal_uInt32 nMarkAnz(maMarkedObjectList.GetMarkCount()); + sal_uInt32 a; + + maEdgesOfMarkedNodes.Clear(); + maMarkedEdgesOfMarkedNodes.Clear(); + maAllMarkedObjects.Clear(); + + for(a = 0L; a < nMarkAnz; a++) + { + SdrObject* pObj = maMarkedObjectList.GetMark(a)->GetObj(); + ImplCollectCompleteSelection(pObj); + } + + mbEdgesOfMarkedNodesDirty = sal_False; + maMarkedObjectList.ForceSort(); + + for(a = 0L; a < nMarkAnz; a++) + { + SdrObject* pNode = maMarkedObjectList.GetMark(a)->GetObj(); + const SfxBroadcaster* pBC = pNode->GetBroadcaster(); + + if(pNode->IsNode()) + { + if(pBC) + { + sal_uInt16 nLstAnz(pBC->GetListenerCount()); + + for(sal_uInt16 nl(0); nl < nLstAnz; nl++) + { + SfxListener* pLst = pBC->GetListener(nl); + SdrEdgeObj* pEdge = PTR_CAST(SdrEdgeObj, pLst); + + if(pEdge && pEdge->IsInserted() && pEdge->GetPage() == pNode->GetPage()) + { + SdrMark aM(pEdge, maMarkedObjectList.GetMark(a)->GetPageView()); + + if(pEdge->GetConnectedNode(sal_True) == pNode) + { + aM.SetCon1(sal_True); + } + + if(pEdge->GetConnectedNode(sal_False) == pNode) + { + aM.SetCon2(sal_True); + } + + if(CONTAINER_ENTRY_NOTFOUND == maMarkedObjectList.FindObject(pEdge)) + { + // nachsehen, ob er selbst markiert ist + maEdgesOfMarkedNodes.InsertEntry(aM); + } + else + { + maMarkedEdgesOfMarkedNodes.InsertEntry(aM); + } + } + } + } + } + } + + maEdgesOfMarkedNodes.ForceSort(); + maMarkedEdgesOfMarkedNodes.ForceSort(); + } + } +} // end of namespace sdr + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// eof |