diff options
author | Rüdiger Timm <rt@openoffice.org> | 2003-11-24 16:00:10 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2003-11-24 16:00:10 +0000 |
commit | d31efe02805b45ec94de7206f45803fbf14a2a76 (patch) | |
tree | e15bb8c7d9e05aa23109db1c4fffc05eae8f695b /svx/source/svdraw/svdpage.cxx | |
parent | d5ec1259ca4af3c3436da87421a06c7171fa87ff (diff) |
INTEGRATION: CWS aw003 (1.35.42); FILE MERGED
2003/10/23 14:37:48 aw 1.35.42.11: #111111#
Changed GetBoundRect() to GetCurrentBoundRect() and GetLastBoundRect()
2003/10/07 12:22:19 aw 1.35.42.10: #111097#
2003/08/19 16:45:37 aw 1.35.42.9: #111096#
2003/08/01 10:14:24 aw 1.35.42.8: #111111#
Fix in SdrEditView::CombineMarkedObjects()
2003/08/01 08:21:42 aw 1.35.42.7: #111111#
Changes to SdrPageObj and SdrPage
2003/07/25 10:15:52 aw 1.35.42.6: #110094#
Further changes; corrected error in ActionChanged()
2003/07/24 14:39:09 aw 1.35.42.5: #110094# Adaptions for DrawingLayer changes
2003/06/30 13:28:49 aw 1.35.42.4: #110094#
2003/06/06 12:59:42 aw 1.35.42.3: #109820#
2nd run of changes for ItemSet isolation
2003/05/21 14:35:54 aw 1.35.42.2: RESYNC: (1.35-1.36); FILE MERGED
2003/05/21 11:47:43 aw 1.35.42.1: #109820#
Diffstat (limited to 'svx/source/svdraw/svdpage.cxx')
-rw-r--r-- | svx/source/svdraw/svdpage.cxx | 1095 |
1 files changed, 694 insertions, 401 deletions
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 64aa61166d19..6033ee961f91 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -2,9 +2,9 @@ * * $RCSfile: svdpage.cxx,v $ * - * $Revision: 1.36 $ + * $Revision: 1.37 $ * - * last change: $Author: rt $ $Date: 2003-04-24 14:49:49 $ + * last change: $Author: rt $ $Date: 2003-11-24 17:00:10 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -118,6 +118,19 @@ #include <vcl/salbtype.hxx> // FRound #endif +// #110094# +#ifndef _SDR_CONTACT_VIEWCONTACTOFSDRPAGE_HXX +#include <svx/sdr/contact/viewcontactofsdrpage.hxx> +#endif + +// #110094# +#ifndef _SDR_CONTACT_VIEWCONTACTOFMASTERPAGE_HXX +#include <svx/sdr/contact/viewcontactofmasterpage.hxx> +#endif + +// #111111# +#include <algorithm> + using namespace ::com::sun::star; DBG_NAME(SdrObjList); @@ -125,7 +138,7 @@ DBG_NAME(SdrObjList); TYPEINIT0(SdrObjList); SdrObjList::SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage, SdrObjList* pNewUpList): - aList(1024,64,64) + maList(1024,64,64) { DBG_CTOR(SdrObjList,NULL); pModel=pNewModel; @@ -138,7 +151,7 @@ SdrObjList::SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage, SdrObjList* pNewU } SdrObjList::SdrObjList(const SdrObjList& rSrcList): - aList(1024,64,64) + maList(1024,64,64) { DBG_CTOR(SdrObjList,NULL); pModel=NULL; @@ -154,6 +167,13 @@ SdrObjList::SdrObjList(const SdrObjList& rSrcList): SdrObjList::~SdrObjList() { DBG_DTOR(SdrObjList,NULL); + + // #111111# + // To avoid that the Clear() method will broadcast changes when in destruction + // which would call virtual methos (not allowed in destructor), the model is set + // to NULL here. + pModel = 0L; + Clear(); // Containerinhalt loeschen! } @@ -251,29 +271,60 @@ void SdrObjList::CopyObjects(const SdrObjList& rSrcList) void SdrObjList::Clear() { - ULONG nAnz=GetObjCount(); + // #110094#-9 + sal_Bool bObjectsRemoved(sal_False); - if(pModel!=NULL && nAnz!=0) + while(maList.Count()) { - SdrHint aHint(HINT_OBJLISTCLEAR); - aHint.SetPage(pPage); - aHint.SetObjList(this); - pModel->Broadcast(aHint); - } + // remove last object from list + SdrObject* pObj = (SdrObject*)maList.Remove(maList.Count() - 1L); - for (ULONG no=0; no<nAnz; no++) { - SdrObject* pObj=GetObj(no); + // #110094# + pObj->ActionRemoved(); + + bObjectsRemoved = sal_True; + + // sent remove hint (after removal, see RemoveObject()) + if(pModel) + { + SdrHint aHint(*pObj); + aHint.SetKind(HINT_OBJREMOVED); + aHint.SetPage(pPage); + pModel->Broadcast(aHint); + } + + // delete the object itself delete pObj; } - aList.Clear(); - if (pModel!=NULL && nAnz!=0) + + if(pModel && bObjectsRemoved) { pModel->SetChanged(); - SdrHint aHint(HINT_OBJLISTCLEARED); - aHint.SetPage(pPage); - aHint.SetObjList(this); - pModel->Broadcast(aHint); } + +// ULONG nAnz=GetObjCount(); +// +// if(pModel!=NULL && nAnz!=0) +// { +// SdrHint aHint(HINT_OBJLISTCLEAR); +// aHint.SetPage(pPage); +// aHint.SetObjList(this); +// pModel->Broadcast(aHint); +// } +// +// for (ULONG no=0; no<nAnz; no++) { +// SdrObject* pObj=GetObj(no); +// delete pObj; +// } +// maList.Clear(); +// if (pModel!=NULL && nAnz!=0) +// { +// pModel->SetChanged(); +// SdrHint aHint(HINT_OBJLISTCLEARED); +// aHint.SetPage(pPage); +// aHint.SetObjList(this); +// pModel->Broadcast(aHint); +// } } SdrPage* SdrObjList::GetPage() const @@ -329,10 +380,10 @@ void SdrObjList::RecalcRects() for (i=0; i<nAnz; i++) { SdrObject* pObj=GetObj(i); if (i==0) { - aOutRect=pObj->GetBoundRect(); + aOutRect=pObj->GetCurrentBoundRect(); aSnapRect=pObj->GetSnapRect(); } else { - aOutRect.Union(pObj->GetBoundRect()); + aOutRect.Union(pObj->GetCurrentBoundRect()); aSnapRect.Union(pObj->GetSnapRect()); } } @@ -351,13 +402,17 @@ void SdrObjList::NbcInsertObject(SdrObject* pObj, ULONG nPos, const SdrInsertRea DBG_ASSERT(!pObj->IsInserted(),"ZObjekt hat bereits Inserted-Status"); ULONG nAnz=GetObjCount(); if (nPos>nAnz) nPos=nAnz; - aList.Insert(pObj,nPos); + maList.Insert(pObj,nPos); if (nPos<nAnz) bObjOrdNumsDirty=TRUE; pObj->SetOrdNum(nPos); pObj->SetObjList(this); pObj->SetPage(pPage); + + // #110094# + pObj->ActionInserted(); + if (!bRectsDirty) { - aOutRect.Union(pObj->GetBoundRect()); + aOutRect.Union(pObj->GetCurrentBoundRect()); aSnapRect.Union(pObj->GetSnapRect()); } pObj->SetInserted(TRUE); // Ruft u.a. den UserCall @@ -370,11 +425,13 @@ void SdrObjList::InsertObject(SdrObject* pObj, ULONG nPos, const SdrInsertReason if(pObj) { - if(pOwnerObj && !GetObjCount()) - { - // damit der graue Rahmen des leeren Gruppenobjekts korrekt weggemalt wird - pOwnerObj->SendRepaintBroadcast(); - } + //if(pOwnerObj && !GetObjCount()) + //{ + // // only repaint here to get rid of the grey border at empty + // // group objects + // pOwnerObj->ActionChanged(); + // // pOwnerObj->BroadcastObjectChange(); + //} // #69055# if anchor is used, reset it before grouping if(GetOwnerObj()) @@ -392,7 +449,9 @@ void SdrObjList::InsertObject(SdrObject* pObj, ULONG nPos, const SdrInsertReason // einen eigenen Redraw bekommen if(pOwnerObj) { - pOwnerObj->SendRepaintBroadcast(); + // only repaint here + pOwnerObj->ActionChanged(); + // pOwnerObj->BroadcastObjectChange(); } if(pModel) @@ -415,7 +474,11 @@ void SdrObjList::InsertObject(SdrObject* pObj, ULONG nPos, const SdrInsertReason SdrObject* SdrObjList::NbcRemoveObject(ULONG nObjNum) { ULONG nAnz=GetObjCount(); - SdrObject* pObj=(SdrObject*)aList.Remove(nObjNum); + SdrObject* pObj=(SdrObject*)maList.Remove(nObjNum); + + // #110094# + pObj->ActionRemoved(); + DBG_ASSERT(pObj!=NULL,"Object zum Removen nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"ZObjekt hat keinen Inserted-Status"); @@ -435,7 +498,11 @@ SdrObject* SdrObjList::NbcRemoveObject(ULONG nObjNum) SdrObject* SdrObjList::RemoveObject(ULONG nObjNum) { ULONG nAnz=GetObjCount(); - SdrObject* pObj=(SdrObject*)aList.Remove(nObjNum); + SdrObject* pObj=(SdrObject*)maList.Remove(nObjNum); + + // #110094# + pObj->ActionRemoved(); + DBG_ASSERT(pObj!=NULL,"Object zum Removen nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"ZObjekt hat keinen Inserted-Status"); @@ -457,9 +524,11 @@ SdrObject* SdrObjList::RemoveObject(ULONG nObjNum) } } SetRectsDirty(); - if (pOwnerObj!=NULL && GetObjCount()==0) { - // damit der graue Rahmen des leeren Gruppenobjekts korrekt gemalt wird - pOwnerObj->SendRepaintBroadcast(); + if (pOwnerObj!=NULL && GetObjCount()==0) + { + // only repaint here + pOwnerObj->ActionChanged(); + // pOwnerObj->BroadcastObjectChange(); } } return pObj; @@ -467,17 +536,25 @@ SdrObject* SdrObjList::RemoveObject(ULONG nObjNum) SdrObject* SdrObjList::NbcReplaceObject(SdrObject* pNewObj, ULONG nObjNum) { - SdrObject* pObj=(SdrObject*)aList.GetObject(nObjNum); + SdrObject* pObj=(SdrObject*)maList.GetObject(nObjNum); DBG_ASSERT(pObj!=NULL,"SdrObjList::ReplaceObject: Object zum Removen nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"SdrObjList::ReplaceObject: ZObjekt hat keinen Inserted-Status"); pObj->SetInserted(FALSE); pObj->SetObjList(NULL); pObj->SetPage(NULL); - aList.Replace(pNewObj,nObjNum); + maList.Replace(pNewObj,nObjNum); + + // #110094# + pObj->ActionRemoved(); + pNewObj->SetOrdNum(nObjNum); pNewObj->SetObjList(this); pNewObj->SetPage(pPage); + + // #110094# + pNewObj->ActionInserted(); + pNewObj->SetInserted(TRUE); SetRectsDirty(); } @@ -487,7 +564,7 @@ SdrObject* SdrObjList::NbcReplaceObject(SdrObject* pNewObj, ULONG nObjNum) SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, ULONG nObjNum) { //ULONG nAnz=GetObjCount(); - SdrObject* pObj=(SdrObject*)aList.GetObject(nObjNum); + SdrObject* pObj=(SdrObject*)maList.GetObject(nObjNum); DBG_ASSERT(pObj!=NULL,"SdrObjList::ReplaceObject: Object zum Removen nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"SdrObjList::ReplaceObject: ZObjekt hat keinen Inserted-Status"); @@ -502,10 +579,18 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, ULONG nObjNum) pObj->SetInserted(FALSE); pObj->SetObjList(NULL); pObj->SetPage(NULL); - aList.Replace(pNewObj,nObjNum); + maList.Replace(pNewObj,nObjNum); + + // #110094# + pObj->ActionRemoved(); + pNewObj->SetOrdNum(nObjNum); pNewObj->SetObjList(this); pNewObj->SetPage(pPage); + + // #110094# + pNewObj->ActionInserted(); + pNewObj->SetInserted(TRUE); if (pModel!=NULL) { // Hier muss ein anderer Broadcast her! @@ -523,13 +608,21 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, ULONG nObjNum) SdrObject* SdrObjList::NbcSetObjectOrdNum(ULONG nOldObjNum, ULONG nNewObjNum) { - SdrObject* pObj=(SdrObject*)aList.GetObject(nOldObjNum); + SdrObject* pObj=(SdrObject*)maList.GetObject(nOldObjNum); if (nOldObjNum==nNewObjNum) return pObj; DBG_ASSERT(pObj!=NULL,"SdrObjList::NbcSetObjectOrdNum: Object nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"SdrObjList::NbcSetObjectOrdNum: ZObjekt hat keinen Inserted-Status"); - aList.Remove(nOldObjNum); - aList.Insert(pObj,nNewObjNum); + maList.Remove(nOldObjNum); + + // #110094# + pObj->ActionRemoved(); + + maList.Insert(pObj,nNewObjNum); + + // #110094# + pObj->ActionInserted(); + pObj->SetOrdNum(nNewObjNum); bObjOrdNumsDirty=TRUE; } @@ -538,17 +631,21 @@ SdrObject* SdrObjList::NbcSetObjectOrdNum(ULONG nOldObjNum, ULONG nNewObjNum) SdrObject* SdrObjList::SetObjectOrdNum(ULONG nOldObjNum, ULONG nNewObjNum) { - SdrObject* pObj=(SdrObject*)aList.GetObject(nOldObjNum); + SdrObject* pObj=(SdrObject*)maList.GetObject(nOldObjNum); if (nOldObjNum==nNewObjNum) return pObj; DBG_ASSERT(pObj!=NULL,"SdrObjList::SetObjectOrdNum: Object nicht gefunden"); if (pObj!=NULL) { DBG_ASSERT(pObj->IsInserted(),"SdrObjList::SetObjectOrdNum: ZObjekt hat keinen Inserted-Status"); - /*if (pModel!=NULL) { - // Hier muss ein anderer Broadcast her! - if (pObj->GetPage()!=NULL) pModel->Broadcast(SdrHint(*pObj)); - }*/ - aList.Remove(nOldObjNum); - aList.Insert(pObj,nNewObjNum); + maList.Remove(nOldObjNum); + + // #110094# + pObj->ActionRemoved(); + + maList.Insert(pObj,nNewObjNum); + + // #110094# + pObj->ActionInserted(); + pObj->SetOrdNum(nNewObjNum); bObjOrdNumsDirty=TRUE; if (pModel!=NULL) { @@ -578,305 +675,398 @@ const Rectangle& SdrObjList::GetAllObjBoundRect() const return aOutRect; } -FASTBOOL SdrObjList::Paint(ExtOutputDevice& rXOut, const SdrPaintInfoRec& rInfoRec, FASTBOOL bRestoreColors) const -{ - BOOL bOk(TRUE); - BOOL bWasNotActive = rInfoRec.bNotActive; - BOOL bIsEnteredGroup(FALSE); - UINT32 nWasDrawMode = rXOut.GetOutDev()->GetDrawMode(); - - if(!rInfoRec.bOriginalDrawModeSet) - { - // Original-Paintmode retten - ((SdrPaintInfoRec&)rInfoRec).bOriginalDrawModeSet = TRUE; - ((SdrPaintInfoRec&)rInfoRec).nOriginalDrawMode = rXOut.GetOutDev()->GetDrawMode(); - } - - if((rInfoRec.pPV && rInfoRec.pPV->GetObjList() == this) - || (rInfoRec.nPaintMode & SDRPAINTMODE_MASTERPAGE)) - { - bIsEnteredGroup = TRUE; - } - - if(bIsEnteredGroup && bWasNotActive) - { - // auf aktive Elemente schalten - ((SdrPaintInfoRec&)rInfoRec).bNotActive = FALSE; - } - - if(rInfoRec.pPV && rInfoRec.bNotActive) - { - if(rInfoRec.pPV->GetView().DoVisualizeEnteredGroup()) - { - // Darstellung schmal - rXOut.GetOutDev()->SetDrawMode(nWasDrawMode | ( - DRAWMODE_GHOSTEDLINE|DRAWMODE_GHOSTEDFILL|DRAWMODE_GHOSTEDTEXT|DRAWMODE_GHOSTEDBITMAP|DRAWMODE_GHOSTEDGRADIENT)); - } - } - else - { - // Darstellung normal - rXOut.GetOutDev()->SetDrawMode(rInfoRec.nOriginalDrawMode); - } - - bOk = Paint(rXOut, rInfoRec, bRestoreColors, IMP_PAGEPAINT_NORMAL); - - if(bIsEnteredGroup && bWasNotActive) - { - // Zurueck auf Ursprung, Zustand wieder verlassen - ((SdrPaintInfoRec&)rInfoRec).bNotActive = TRUE; - } - - // Darstellung restaurieren - rXOut.GetOutDev()->SetDrawMode(nWasDrawMode); - - return bOk; -} - -FASTBOOL SdrObjList::Paint(ExtOutputDevice& rXOut, const SdrPaintInfoRec& rInfoRec, FASTBOOL bRestoreColors, USHORT nImpMode) const -{ - FASTBOOL bOk=TRUE; - FASTBOOL bBrk=FALSE; - ULONG nObjAnz=GetObjCount(); - if (nObjAnz==0) return TRUE; - USHORT nEvent=rInfoRec.nBrkEvent; - const SetOfByte* pVisiLayer=&rInfoRec.aPaintLayer; - FASTBOOL bPrinter=rInfoRec.bPrinter; - OutputDevice* pOut=rXOut.GetOutDev(); - Rectangle aCheckRect(rInfoRec.aCheckRect); - FASTBOOL bDrawAll=aCheckRect.IsEmpty(); - ImpSdrHdcMerk aHDCMerk(*pOut,SDRHDC_SAVEPENANDBRUSHANDFONT,bRestoreColors); - FASTBOOL bColorsDirty=FALSE; - if (bDrawAll || aCheckRect.IsOver(GetAllObjBoundRect())) { - Application* pAppPtr=NULL; - if (nEvent!=0) pAppPtr=GetpApp(); - SetOfByte aPaintLayer(*pVisiLayer); - USHORT nPaintCycles = 1; - SdrLayerID nLayerId = 0; - - // #85670# if pModel is NULL, try to get model of list owner - SdrModel *pLocalModel = pModel; - if(!pLocalModel && GetOwnerObj()) - pLocalModel = GetOwnerObj()->GetModel(); - - // #85670# use correct model to get layer ID - if(pLocalModel) - { - const SdrLayerAdmin& rLayerAdmin = pLocalModel->GetLayerAdmin(); - nLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), FALSE); - } - - if( pPage == NULL || ( !pPage->IsMasterPage() && aPaintLayer.IsSet( nLayerId ) ) ) - { - // Der ControlLayer soll gezeichnet werden - // Wenn Controls existieren, wird der ControlLayer als letztes gezeichnet - SetOfByte aTestLayerSet = aPaintLayer; - aTestLayerSet.Clear(nLayerId); - - if (!aTestLayerSet.IsEmpty()) - { - // Es soll nicht nur der ControlLayer gezeichnet werden - ULONG nObjNum=0; - while (nObjNum<nObjAnz && nPaintCycles < 2) - { - if (GetObj(nObjNum)->GetLayer() == nLayerId) - { - // Objekt auf ControlLayer gefunden - // Der ControlLayer wird ersteinmal unsichtbar geschaltet - nPaintCycles = 2; - aPaintLayer.Clear(nLayerId); - } - - nObjNum++; - } - } - } - - for (USHORT nCycle = 1; nCycle <= nPaintCycles; nCycle++) - { - USHORT nPaintImpMode = nImpMode; - FASTBOOL bNormal = ( nPaintImpMode == IMP_PAGEPAINT_NORMAL ); - FASTBOOL bCachePrepare = ( nPaintImpMode == IMP_PAGEPAINT_PREPARE_CACHE ); - FASTBOOL bBGCachePrepare = ( nPaintImpMode == IMP_PAGEPAINT_PREPARE_BG_CACHE ); - FASTBOOL bCachePaint = ( nPaintImpMode == IMP_PAGEPAINT_PAINT_CACHE ); - FASTBOOL bBGCachePaint = ( nPaintImpMode == IMP_PAGEPAINT_PAINT_BG_CACHE ); - FASTBOOL bPaintFlag = ( bNormal || bCachePrepare || bBGCachePrepare ); - - if( nCycle == 2 ) - { - // Im zweiten Durchgang nur den ControlLayer zeichnen - aPaintLayer.ClearAll(); - aPaintLayer.Set(nLayerId); - } - - ULONG nObjNum = 0UL; - - while( ( nObjNum < nObjAnz ) && !bBrk ) - { - SdrObject* pObj = GetObj( nObjNum ); - - if( nObjNum == 0 && eListKind == SDROBJLIST_MASTERPAGE && - pPage && pPage->IsMasterPage() && rInfoRec.pPV ) - { - // painting pages background obj instead of masterpages background obj - SdrPage* pPg = rInfoRec.pPV->GetPage(); - SdrObject* pBackgroundObj = pPg ? pPg->GetBackgroundObj() : NULL; - if( pBackgroundObj ) - { - if( rXOut.GetOutDev()->GetDrawMode() == DRAWMODE_DEFAULT ) - { - pObj = pBackgroundObj; - Point aPos ( pPage->GetLftBorder(), pPage->GetUppBorder() ); - Size aSize ( pPage->GetSize() ); - aSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder() - 1; - aSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder() - 1; - Rectangle aLogicRect( aPos, aSize ); - - if( pBackgroundObj->GetLogicRect() != aLogicRect ) - { - pBackgroundObj->SetLogicRect( aLogicRect ); - pBackgroundObj->RecalcBoundRect(); - } - } - else - pObj = NULL; - - } - } - - if( pObj && ( bDrawAll || aCheckRect.IsOver( pObj->GetBoundRect() ) ) ) - { - SdrObjList* pSubList = pObj->GetSubList(); - - // Gruppenobjekte beruecksichtigen sichtbare Layer selbst (Ansonsten nur Painten, wenn Layer sichtbar) - if( pSubList!=NULL || ((!bPrinter || pObj->IsPrintable()) && aPaintLayer.IsSet(pObj->GetLayer())) ) - { - // #108937# - // IsMasterCachable() does not visit groups automatically. Since - // this mechanism should be changed to set information at the page - // (counter?) later, i will fix that with a SdrObjListIter here. - sal_Bool bHierarchyIsMasterPageCachable(pObj->IsMasterCachable()); - - if(bHierarchyIsMasterPageCachable && pObj->IsGroupObject()) - { - SdrObjListIter aIter(*pObj, IM_DEEPNOGROUPS); - - while(bHierarchyIsMasterPageCachable && aIter.IsMore()) - { - SdrObject* pNestedObj = aIter.Next(); - - if(!pNestedObj->IsMasterCachable()) - { - bHierarchyIsMasterPageCachable = sal_False; - } - } - } - - if( !bNormal && !bHierarchyIsMasterPageCachable) - { - if( bCachePrepare || bBGCachePrepare ) - bBrk = TRUE, bPaintFlag = FALSE; - else if( bCachePaint || bBGCachePaint ) - { - bPaintFlag = bNormal = TRUE; - } - } - - if( bPaintFlag ) - { - if( pObj->IsNeedColorRestore() ) - { - if (bColorsDirty && bRestoreColors) - aHDCMerk.Restore(*pOut); - - bColorsDirty=FALSE; - } - else - bColorsDirty=TRUE; // andere aendern die Farben - - if( rInfoRec.pPaintProc!=NULL ) - { - SdrPaintProcRec aRec(pObj,rXOut,rInfoRec); - Link aLink(*rInfoRec.pPaintProc); - aLink.Call(&aRec); // sollte mal 'nen ReturnCode liefern - } - else - { - bOk=pObj->Paint(rXOut,rInfoRec); - -////////////////////////////////////////////////////////////////////////////// +//#110094# +// Paint() in SdrObjList is no longer used - try to remove it +//FASTBOOL SdrObjList::Paint(ExtOutputDevice& rXOut, const SdrPaintInfoRec& rInfoRec, FASTBOOL bRestoreColors) const +//{ +// BOOL bOk(TRUE); +// BOOL bWasNotActive = rInfoRec.bNotActive; +// BOOL bIsEnteredGroup(FALSE); +// UINT32 nWasDrawMode = rXOut.GetOutDev()->GetDrawMode(); // -// Vector2D aTRScale; -// double fTRShear; -// double fTRRotate; -// Vector2D aTRTranslate; -// Matrix3D aOrigMat; -// XPolyPolygon aTRPolyPolygon; +// if(!rInfoRec.bOriginalDrawModeSet) +// { +// // Original-Paintmode retten +// ((SdrPaintInfoRec&)rInfoRec).bOriginalDrawModeSet = TRUE; +// ((SdrPaintInfoRec&)rInfoRec).nOriginalDrawMode = rXOut.GetOutDev()->GetDrawMode(); +// } // -// BOOL bIsPath = pObj->TRGetBaseGeometry(aOrigMat, aTRPolyPolygon); -// aOrigMat.DecomposeAndCorrect(aTRScale, fTRShear, fTRRotate, aTRTranslate); -// Vector2D aVectorTranslate; -// aVectorTranslate.X() = FRound(aTRTranslate.X()); -// aVectorTranslate.Y() = FRound(aTRTranslate.Y()); +// if((rInfoRec.pPV && rInfoRec.pPV->GetObjList() == this) +// || (rInfoRec.nPaintMode & SDRPAINTMODE_MASTERPAGE)) +// { +// bIsEnteredGroup = TRUE; +// } // -// Point aPoint(aVectorTranslate.X(), aVectorTranslate.Y()); -// Rectangle aTRBaseRect( -// aPoint, -// Size(FRound(aTRScale.X()), FRound(aTRScale.Y()))); +// if(bIsEnteredGroup && bWasNotActive) +// { +// // auf aktive Elemente schalten +// ((SdrPaintInfoRec&)rInfoRec).bNotActive = FALSE; +// } // -// Color aLineColorMerk(rXOut.GetOutDev()->GetLineColor()); -// Color aFillColorMerk(rXOut.GetOutDev()->GetFillColor()); -// rXOut.GetOutDev()->SetFillColor(); +// if(rInfoRec.pPV && rInfoRec.bNotActive) +// { +// if(rInfoRec.pPV->GetView().DoVisualizeEnteredGroup()) +// { +// // Darstellung schmal +// rXOut.GetOutDev()->SetDrawMode(nWasDrawMode | ( +// DRAWMODE_GHOSTEDLINE|DRAWMODE_GHOSTEDFILL|DRAWMODE_GHOSTEDTEXT|DRAWMODE_GHOSTEDBITMAP|DRAWMODE_GHOSTEDGRADIENT)); +// } +// } +// else +// { +// // Darstellung normal +// rXOut.GetOutDev()->SetDrawMode(rInfoRec.nOriginalDrawMode); +// } // -// rXOut.GetOutDev()->SetLineColor(COL_BLACK); -// rXOut.GetOutDev()->DrawRect(aTRBaseRect); +// bOk = Paint(rXOut, rInfoRec, bRestoreColors, IMP_PAGEPAINT_NORMAL); // -// if(bIsPath) +// if(bIsEnteredGroup && bWasNotActive) // { -// rXOut.GetOutDev()->SetLineColor(COL_LIGHTRED); -// XPolyPolygon aTRPoPo(aTRPolyPolygon); -// aTRPoPo.Move(aTRBaseRect.Left(), aTRBaseRect.Top()); -// sal_uInt16 nCount(aTRPoPo.Count()); -// for(sal_uInt16 a(0); a < nCount; a++) -// rXOut.GetOutDev()->DrawPolygon(XOutCreatePolygon(aTRPoPo[a], rXOut.GetOutDev())); +// // Zurueck auf Ursprung, Zustand wieder verlassen +// ((SdrPaintInfoRec&)rInfoRec).bNotActive = TRUE; // } // -// rXOut.GetOutDev()->SetLineColor(aLineColorMerk); -// rXOut.GetOutDev()->SetFillColor(aFillColorMerk); +// // Darstellung restaurieren +// rXOut.GetOutDev()->SetDrawMode(nWasDrawMode); // -// static BOOL bDoTestSetAllGeometry(FALSE); -// if(bDoTestSetAllGeometry) -// pObj->TRSetBaseGeometry(aOrigMat, aTRPolyPolygon); +// return bOk; +//} + +//FASTBOOL SdrObjList::Paint(ExtOutputDevice& rXOut, const SdrPaintInfoRec& rInfoRec, FASTBOOL bRestoreColors, USHORT nImpMode) const +//{ +// FASTBOOL bOk=TRUE; +// FASTBOOL bBrk=FALSE; +// ULONG nObjAnz=GetObjCount(); +// if (nObjAnz==0) return TRUE; // +// // #110094#-5 +// // USHORT nEvent=rInfoRec.nBrkEvent; // -////////////////////////////////////////////////////////////////////////////// - } - - // nach dem ersten Objekt bei reinem Hintergrundcache - // sollen die folgenden Objekte natuerlich nicht gezeichnet werden - if( bBGCachePrepare ) - bPaintFlag = FALSE; - } - else if( bBGCachePaint ) - bPaintFlag = TRUE; - } - - if( bOk && nEvent != 0 ) - bOk = !pAppPtr->AnyInput( nEvent ); - - if( !bOk ) - bBrk = TRUE; - } - nObjNum++; - } - } - } - - if (bColorsDirty && bRestoreColors) - aHDCMerk.Restore(*pOut); - - return bOk; -} +// const SetOfByte* pVisiLayer=&rInfoRec.aPaintLayer; +// FASTBOOL bPrinter=rInfoRec.bPrinter; +// OutputDevice* pOut=rXOut.GetOutDev(); +// Rectangle aCheckRect(rInfoRec.aCheckRect); +// FASTBOOL bDrawAll=aCheckRect.IsEmpty(); +// ImpSdrHdcMerk aHDCMerk(*pOut,SDRHDC_SAVEPENANDBRUSHANDFONT,bRestoreColors); +// FASTBOOL bColorsDirty=FALSE; +// if (bDrawAll || aCheckRect.IsOver(GetAllObjBoundRect())) +// { +// // #110094#-5 +// //Application* pAppPtr=NULL; +// //if (nEvent!=0) pAppPtr=GetpApp(); +// +// SetOfByte aPaintLayer(*pVisiLayer); +// USHORT nPaintCycles = 1; +// SdrLayerID nLayerId = 0; +// +// // #85670# if pModel is NULL, try to get model of list owner +// SdrModel *pLocalModel = pModel; +// if(!pLocalModel && GetOwnerObj()) +// pLocalModel = GetOwnerObj()->GetModel(); +// +// // #85670# use correct model to get layer ID +// if(pLocalModel) +// { +// const SdrLayerAdmin& rLayerAdmin = pLocalModel->GetLayerAdmin(); +// nLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), FALSE); +// } +// +// if( pPage == NULL || ( !pPage->IsMasterPage() && aPaintLayer.IsSet( nLayerId ) ) ) +// { +// // Der ControlLayer soll gezeichnet werden +// // Wenn Controls existieren, wird der ControlLayer als letztes gezeichnet +// SetOfByte aTestLayerSet = aPaintLayer; +// aTestLayerSet.Clear(nLayerId); +// +// if (!aTestLayerSet.IsEmpty()) +// { +// // Es soll nicht nur der ControlLayer gezeichnet werden +// ULONG nObjNum=0; +// while (nObjNum<nObjAnz && nPaintCycles < 2) +// { +// if (GetObj(nObjNum)->GetLayer() == nLayerId) +// { +// // Objekt auf ControlLayer gefunden +// // Der ControlLayer wird ersteinmal unsichtbar geschaltet +// nPaintCycles = 2; +// aPaintLayer.Clear(nLayerId); +// } +// +// nObjNum++; +// } +// } +// } +// +// for (USHORT nCycle = 1; nCycle <= nPaintCycles; nCycle++) +// { +// USHORT nPaintImpMode = nImpMode; +// FASTBOOL bNormal = ( nPaintImpMode == IMP_PAGEPAINT_NORMAL ); +// FASTBOOL bCachePrepare = ( nPaintImpMode == IMP_PAGEPAINT_PREPARE_CACHE ); +// FASTBOOL bBGCachePrepare = ( nPaintImpMode == IMP_PAGEPAINT_PREPARE_BG_CACHE ); +// FASTBOOL bCachePaint = ( nPaintImpMode == IMP_PAGEPAINT_PAINT_CACHE ); +// FASTBOOL bBGCachePaint = ( nPaintImpMode == IMP_PAGEPAINT_PAINT_BG_CACHE ); +// FASTBOOL bPaintFlag = ( bNormal || bCachePrepare || bBGCachePrepare ); +// +// if( nCycle == 2 ) +// { +// // Im zweiten Durchgang nur den ControlLayer zeichnen +// aPaintLayer.ClearAll(); +// aPaintLayer.Set(nLayerId); +// } +// +// ULONG nObjNum = 0UL; +// +// while( ( nObjNum < nObjAnz ) && !bBrk ) +// { +// SdrObject* pObj = GetObj( nObjNum ); +// +// if( nObjNum == 0 && eListKind == SDROBJLIST_MASTERPAGE && +// pPage && pPage->IsMasterPage() && rInfoRec.pPV ) +// { +// // painting pages background obj instead of masterpages background obj +// SdrPage* pPg = rInfoRec.pPV->GetPage(); +// SdrObject* pBackgroundObj = pPg ? pPg->GetBackgroundObj() : NULL; +// if( pBackgroundObj ) +// { +// if( rXOut.GetOutDev()->GetDrawMode() == DRAWMODE_DEFAULT ) +// { +// pObj = pBackgroundObj; +// Point aPos ( pPage->GetLftBorder(), pPage->GetUppBorder() ); +// Size aSize ( pPage->GetSize() ); +// aSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder() - 1; +// aSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder() - 1; +// Rectangle aLogicRect( aPos, aSize ); +// +// if( pBackgroundObj->GetLogicRect() != aLogicRect ) +// { +// pBackgroundObj->SetLogicRect( aLogicRect ); +// pBackgroundObj->RecalcBoundRect(); +// } +// } +// else +// pObj = NULL; +// +// } +// } +// +// if( pObj && ( bDrawAll || aCheckRect.IsOver( pObj->GetBoundRect() ) ) ) +// { +// SdrObjList* pSubList = pObj->GetSubList(); +// +// // Gruppenobjekte beruecksichtigen sichtbare Layer selbst (Ansonsten nur Painten, wenn Layer sichtbar) +// if( pSubList!=NULL || ((!bPrinter || pObj->IsPrintable()) && aPaintLayer.IsSet(pObj->GetLayer())) ) +// { +// // #108937# +// // IsMasterCachable() does not visit groups automatically. Since +// // this mechanism should be changed to set information at the page +// // (counter?) later, i will fix that with a SdrObjListIter here. +// sal_Bool bHierarchyIsMasterPageCachable(pObj->IsMasterCachable()); +// +// if(bHierarchyIsMasterPageCachable && pObj->IsGroupObject()) +// { +// SdrObjListIter aIter(*pObj, IM_DEEPNOGROUPS); +// +// while(bHierarchyIsMasterPageCachable && aIter.IsMore()) +// { +// SdrObject* pNestedObj = aIter.Next(); +// +// if(!pNestedObj->IsMasterCachable()) +// { +// bHierarchyIsMasterPageCachable = sal_False; +// } +// } +// } +// +// if( !bNormal && !bHierarchyIsMasterPageCachable) +// { +// if( bCachePrepare || bBGCachePrepare ) +// bBrk = TRUE, bPaintFlag = FALSE; +// else if( bCachePaint || bBGCachePaint ) +// { +// bPaintFlag = bNormal = TRUE; +// } +// } +// +// if( bPaintFlag ) +// { +// if( pObj->IsNeedColorRestore() ) +// { +// if (bColorsDirty && bRestoreColors) +// aHDCMerk.Restore(*pOut); +// +// bColorsDirty=FALSE; +// } +// else +// bColorsDirty=TRUE; // andere aendern die Farben +// +// if( rInfoRec.pPaintProc!=NULL ) +// { +// SdrPaintProcRec aRec(pObj,rXOut,rInfoRec); +// Link aLink(*rInfoRec.pPaintProc); +// aLink.Call(&aRec); // sollte mal 'nen ReturnCode liefern +// } +// else +// { +// // #109985# +// // New methodology to test for the new SC drawing flags (SDRPAINTMODE_SC_) +// sal_Bool bDoPaint(sal_True); +// sal_Bool bDoDraft(sal_False); +// +// // #109985# +// // Something to evaluate at all? +// if(rInfoRec.nPaintMode & (SDRPAINTMODE_SC_ALL_HIDE|SDRPAINTMODE_SC_ALL_DRAFT)) +// { +// if(OBJ_OLE2 == pObj->GetObjIdentifier()) +// { +// if(((SdrOle2Obj*)pObj)->IsChart()) +// { +// // chart +// if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_HIDE_CHART) +// { +// bDoPaint = sal_False; +// } +// else if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_DRAFT_CHART) +// { +// bDoPaint = sal_False; +// bDoDraft = sal_True; +// } +// } +// else +// { +// // OLE +// if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_HIDE_OLE) +// { +// bDoPaint = sal_False; +// } +// else if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_DRAFT_OLE) +// { +// bDoPaint = sal_False; +// bDoDraft = sal_True; +// } +// } +// } +// else if(OBJ_GRAF == pObj->GetObjIdentifier()) +// { +// // graphic (like OLE) +// if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_HIDE_OLE) +// { +// bDoPaint = sal_False; +// } +// else if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_DRAFT_OLE) +// { +// bDoPaint = sal_False; +// bDoDraft = sal_True; +// } +// } +// else +// { +// // any other draw object +// if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_HIDE_DRAW) +// { +// bDoPaint = sal_False; +// } +// else if(rInfoRec.nPaintMode & SDRPAINTMODE_SC_DRAFT_DRAW) +// { +// bDoPaint = sal_False; +// bDoDraft = sal_True; +// } +// } +// } +// +// // #109985# +// if(bDoPaint) +// { +// // as usual +// bOk = pObj->Paint(rXOut, rInfoRec); +// } +// else +// { +// if(bDoDraft) +// { +// Rectangle aObjRect = pObj->GetBoundRect(); +// +// pOut->SetFillColor(COL_LIGHTGRAY); +// pOut->SetLineColor(COL_BLACK); +// pOut->DrawRect( aObjRect ); +// } +// +// bOk = TRUE; +// } +// +//////////////////////////////////////////////////////////////////////////////// +//// +//// Vector2D aTRScale; +//// double fTRShear; +//// double fTRRotate; +//// Vector2D aTRTranslate; +//// Matrix3D aOrigMat; +//// XPolyPolygon aTRPolyPolygon; +//// +//// BOOL bIsPath = pObj->TRGetBaseGeometry(aOrigMat, aTRPolyPolygon); +//// aOrigMat.DecomposeAndCorrect(aTRScale, fTRShear, fTRRotate, aTRTranslate); +//// Vector2D aVectorTranslate; +//// aVectorTranslate.X() = FRound(aTRTranslate.X()); +//// aVectorTranslate.Y() = FRound(aTRTranslate.Y()); +//// +//// Point aPoint(aVectorTranslate.X(), aVectorTranslate.Y()); +//// Rectangle aTRBaseRect( +//// aPoint, +//// Size(FRound(aTRScale.X()), FRound(aTRScale.Y()))); +//// +//// Color aLineColorMerk(rXOut.GetOutDev()->GetLineColor()); +//// Color aFillColorMerk(rXOut.GetOutDev()->GetFillColor()); +//// rXOut.GetOutDev()->SetFillColor(); +//// +//// rXOut.GetOutDev()->SetLineColor(COL_BLACK); +//// rXOut.GetOutDev()->DrawRect(aTRBaseRect); +//// +//// if(bIsPath) +//// { +//// rXOut.GetOutDev()->SetLineColor(COL_LIGHTRED); +//// XPolyPolygon aTRPoPo(aTRPolyPolygon); +//// aTRPoPo.Move(aTRBaseRect.Left(), aTRBaseRect.Top()); +//// sal_uInt16 nCount(aTRPoPo.Count()); +//// for(sal_uInt16 a(0); a < nCount; a++) +//// rXOut.GetOutDev()->DrawPolygon(XOutCreatePolygon(aTRPoPo[a], rXOut.GetOutDev())); +//// } +//// +//// rXOut.GetOutDev()->SetLineColor(aLineColorMerk); +//// rXOut.GetOutDev()->SetFillColor(aFillColorMerk); +//// +//// static BOOL bDoTestSetAllGeometry(FALSE); +//// if(bDoTestSetAllGeometry) +//// pObj->TRSetBaseGeometry(aOrigMat, aTRPolyPolygon); +//// +//// +//////////////////////////////////////////////////////////////////////////////// +// } +// +// // nach dem ersten Objekt bei reinem Hintergrundcache +// // sollen die folgenden Objekte natuerlich nicht gezeichnet werden +// if( bBGCachePrepare ) +// bPaintFlag = FALSE; +// } +// else if( bBGCachePaint ) +// bPaintFlag = TRUE; +// } +// +// // #110094#-5 +// //if( bOk && nEvent != 0 ) +// // bOk = !pAppPtr->AnyInput( nEvent ); +// +// if( !bOk ) +// bBrk = TRUE; +// } +// nObjNum++; +// } +// } +// } +// +// if (bColorsDirty && bRestoreColors) +// aHDCMerk.Restore(*pOut); +// +// return bOk; +//} SdrObject* SdrObjList::CheckHit(const Point& rPnt, USHORT nTol, const SetOfByte* pVisiLayer, FASTBOOL bBackward) const { @@ -888,7 +1078,7 @@ SdrObject* SdrObjList::CheckHit(const Point& rPnt, USHORT nTol, const SetOfByte* while (pHit==NULL && (bBackward ? nObjNum<nObjAnz : nObjNum>0)) { if (!bBackward) nObjNum--; SdrObject* pObj=GetObj(nObjNum); - if (R.IsOver(pObj->GetBoundRect())) { + if (R.IsOver(pObj->GetCurrentBoundRect())) { SdrObjList* pSubList=pObj->GetSubList(); if (pSubList!=NULL || pVisiLayer==NULL) { // Gruppenobjekte beruecksichtigen sichtbare Layer selbst pHit=pObj->CheckHit(rPnt,nTol,pVisiLayer/*,bBackward*/); @@ -1003,17 +1193,9 @@ void SdrObjList::ReformatAllEdgeObjects() void SdrObjList::BurnInStyleSheetAttributes( BOOL bPseudoSheetsOnly ) { - ULONG nAnz=GetObjCount(); - ULONG nNum=0; - while (nNum<nAnz) + for(sal_uInt32 a(0L); a < GetObjCount(); a++) { - SdrObject* pObj = GetObj(nNum); - if( pObj->ISA( SdrAttrObj ) && !pObj->ISA( E3dPolyScene ) ) - ( (SdrAttrObj*) pObj )->BurnInStyleSheetAttributes( bPseudoSheetsOnly ); - else if( pObj->ISA( SdrObjGroup ) ) - ( (SdrObjGroup*) pObj )->BurnInStyleSheetAttributes( bPseudoSheetsOnly ); - - nNum++; + GetObj(a)->BurnInStyleSheetAttributes(bPseudoSheetsOnly); } } @@ -1040,23 +1222,13 @@ void SdrObjList::RemoveNotPersistentObjects(FASTBOOL bNoBroadcast) } } -void SdrObjList::RestartAllAnimations(SdrPageView* pPageView) const -{ - ULONG nAnz=GetObjCount(); - ULONG nNum=0; - while (nNum<nAnz) { - GetObj(nNum)->RestartAnimation(pPageView); - nNum++; - } -} - FASTBOOL SdrObjList::ImpGetFillColor(SdrObject* pObj, Color& rCol) const { - return GetDraftFillColor(pObj->GetItemSet(),rCol); + return GetDraftFillColor(pObj->GetMergedItemSet(), rCol); } FASTBOOL SdrObjList::GetFillColor(const Point& rPnt, const SetOfByte& rVisLayers, - FASTBOOL bLayerSorted, Color& rCol) const + /*FASTBOOL bLayerSorted,*/ Color& rCol) const { if (pModel==NULL) return FALSE; FASTBOOL bRet=FALSE; @@ -1066,7 +1238,7 @@ FASTBOOL SdrObjList::GetFillColor(const Point& rPnt, const SetOfByte& rVisLayers SdrObject* pObj=GetObj(no); SdrObjList* pOL=pObj->GetSubList(); if (pOL!=NULL) { // Aha, Gruppenobjekt - bRet=pOL->GetFillColor(rPnt,rVisLayers,bLayerSorted,rCol); + bRet=pOL->GetFillColor(rPnt,rVisLayers,/*bLayerSorted,*/rCol); } else { SdrTextObj* pTextObj=PTR_CAST(SdrTextObj,pObj); // #108867# Exclude zero master page object (i.e. background @@ -1074,7 +1246,7 @@ FASTBOOL SdrObjList::GetFillColor(const Point& rPnt, const SetOfByte& rVisLayers if (pTextObj!=NULL && pObj->IsClosedObj() && rVisLayers.IsSet(pObj->GetLayer()) && (!bMaster || (!pObj->IsNotVisibleAsMaster() && no!=0)) && - pObj->GetBoundRect().IsInside(rPnt) && + pObj->GetCurrentBoundRect().IsInside(rPnt) && !pTextObj->IsHideContour() && pObj->IsHit(rPnt,0,NULL)) { // Nachfolgend extra Funktion um Stack zu sparen, // da diese Methode hier rekursiv ist. @@ -1431,13 +1603,57 @@ void SdrPageGridFrameList::Clear() aList.Clear(); } +////////////////////////////////////////////////////////////////////////////// +// #111111# PageUser section + +void SdrPage::AddPageUser(SdrPageUser& rNewUser) +{ + maPageUsers.push_back(&rNewUser); +} + +void SdrPage::RemovePageUser(SdrPageUser& rOldUser) +{ + const PageUserVector::iterator aFindResult = ::std::find(maPageUsers.begin(), maPageUsers.end(), &rOldUser); + if(aFindResult != maPageUsers.end()) + { + maPageUsers.erase(aFindResult); + } +} + +////////////////////////////////////////////////////////////////////////////// +// #110094# DrawContact section + +sdr::contact::ViewContact* SdrPage::CreateObjectSpecificViewContact() +{ + if(IsMasterPage()) + { + return new sdr::contact::ViewContactOfMasterPage(*this); + } + else + { + return new sdr::contact::ViewContactOfSdrPage(*this); + } +} + +sdr::contact::ViewContact& SdrPage::GetViewContact() const +{ + if(!mpViewContact) + { + ((SdrPage*)this)->mpViewContact = ((SdrPage*)this)->CreateObjectSpecificViewContact(); + } + + return *mpViewContact; +} + //////////////////////////////////////////////////////////////////////////////////////////////////// TYPEINIT1(SdrPage,SdrObjList); SdrPage::SdrPage(SdrModel& rNewModel, FASTBOOL bMasterPage): SdrObjList(&rNewModel,this), - pBackgroundObj( NULL ) + pBackgroundObj( NULL ), + // #110094# + mpViewContact(0L) { pLayerAdmin=new SdrLayerAdmin(&rNewModel.GetLayerAdmin()); bMaster=bMasterPage; @@ -1457,7 +1673,9 @@ SdrPage::SdrPage(SdrModel& rNewModel, FASTBOOL bMasterPage): SdrPage::SdrPage(const SdrPage& rSrcPage): SdrObjList(rSrcPage.pModel,this), - pBackgroundObj( NULL ) + pBackgroundObj( NULL ), + // #110094# + mpViewContact(0L) { pLayerAdmin=new SdrLayerAdmin(rSrcPage.pModel->GetLayerAdmin()); *this=rSrcPage; @@ -1466,12 +1684,41 @@ SdrPage::SdrPage(const SdrPage& rSrcPage): SdrPage::~SdrPage() { + // #111111# + // tell all the registered PageUsers that the page is in destruction + for(PageUserVector::iterator aIterator = maPageUsers.begin(); aIterator != maPageUsers.end(); aIterator++) + { + SdrPageUser* pPageUser = *aIterator; + DBG_ASSERT(pPageUser, "SdrPage::~SdrPage: corrupt PageUser list (!)"); + pPageUser->PageInDestruction(*this); + } + + // #111111# + // Clear the vector. This means that user do not need to call RemovePageUser() + // when they get called from PageInDestruction(). + maPageUsers.clear(); + delete pBackgroundObj; delete pLayerAdmin; + + // #110094# + if(mpViewContact) + { + mpViewContact->PrepareDelete(); + delete mpViewContact; + mpViewContact = 0L; + } } void SdrPage::operator=(const SdrPage& rSrcPage) { + // #110094# + if(mpViewContact) + { + delete mpViewContact; + mpViewContact = 0L; + } + SdrObjList::operator=(rSrcPage); pPage=this; bMaster =rSrcPage.bMaster ; @@ -1517,8 +1764,7 @@ void SdrPage::SetSize(const Size& aSiz) { nWdt=aSiz.Width(); nHgt=aSiz.Height(); - if( pModel ) - pModel->SetChanged(); + SetChanged(); } Size SdrPage::GetSize() const @@ -1562,36 +1808,31 @@ void SdrPage::SetBorder(INT32 nLft, INT32 nUpp, INT32 nRgt, INT32 nLwr) nBordUpp=nUpp; nBordRgt=nRgt; nBordLwr=nLwr; - if( pModel ) - pModel->SetChanged(); + SetChanged(); } void SdrPage::SetLftBorder(INT32 nBorder) { nBordLft=nBorder; - if( pModel ) - pModel->SetChanged(); + SetChanged(); } void SdrPage::SetUppBorder(INT32 nBorder) { nBordUpp=nBorder; - if( pModel ) - pModel->SetChanged(); + SetChanged(); } void SdrPage::SetRgtBorder(INT32 nBorder) { nBordRgt=nBorder; - if( pModel ) - pModel->SetChanged(); + SetChanged(); } void SdrPage::SetLwrBorder(INT32 nBorder) { nBordLwr=nBorder; - if( pModel ) - pModel->SetChanged(); + SetChanged(); } INT32 SdrPage::GetLftBorder() const @@ -1656,17 +1897,32 @@ USHORT SdrPage::GetPageNum() const void SdrPage::SetChanged() { + // #110094#-11 + // For test purposes, use the new ViewContact for change + // notification now. + ActionChanged(); + if( pModel ) + { pModel->SetChanged(); + } } //////////////////////////////////////////////////////////////////////////////////////////////////// -void SdrPage::SendRepaintBroadcast() const +void SdrPage::BroadcastPageChange() const { - if (bInserted && pModel!=NULL) pModel->Broadcast(SdrHint(*this)); + if(bInserted && pModel) + { + pModel->Broadcast(SdrHint(*this)); + } } +//void SdrPage::SendRepaintBroadcast() const +//{ +// if (bInserted && pModel!=NULL) pModel->Broadcast(SdrHint(*this)); +//} + USHORT SdrPage::GetMasterPagePos(USHORT nPgNum) const { USHORT nAnz=aMasters.GetCount(); @@ -1681,14 +1937,17 @@ void SdrPage::InsertMasterPage(USHORT nPgNum, USHORT nPos) { aMasters.Insert(nPgNum,nPos); SetChanged(); - SendRepaintBroadcast(); + + GetViewContact().ActionInserted(); + + BroadcastPageChange(); } void SdrPage::InsertMasterPage(const SdrMasterPageDescriptor& rMPD, USHORT nPos) { aMasters.Insert(rMPD,nPos); SetChanged(); - SendRepaintBroadcast(); + BroadcastPageChange(); } void SdrPage::RemoveMasterPage(USHORT nPos) @@ -1696,15 +1955,19 @@ void SdrPage::RemoveMasterPage(USHORT nPos) if (nPos<aMasters.GetCount()) { aMasters.Remove(nPos); SetChanged(); - SendRepaintBroadcast(); + BroadcastPageChange(); } } void SdrPage::MoveMasterPage(USHORT nPos, USHORT nNewPos) { - if (nPos<aMasters.GetCount()) { + if(nPos < aMasters.GetCount()) + { aMasters.Move(nPos,nNewPos); - SendRepaintBroadcast(); + + // Do necessary ViewContact actions + ActionChanged(); + // BroadcastPageChange(); } } @@ -1720,25 +1983,37 @@ SdrPage* SdrPage::GetMasterPage(USHORT nPos) const void SdrPage::SetMasterPageNum(USHORT nPgNum, USHORT nPos) { aMasters[nPos].SetPageNum(nPgNum); - SendRepaintBroadcast(); + + // Do necessary ViewContact actions + ActionChanged(); + // BroadcastPageChange(); } void SdrPage::SetMasterPageVisibleLayers(const SetOfByte& rVL, USHORT nPos) { aMasters[nPos].SetVisibleLayers(rVL); - SendRepaintBroadcast(); + + // Do necessary ViewContact actions + ActionChanged(); + // BroadcastPageChange(); } void SdrPage::SetMasterPageDescriptor(const SdrMasterPageDescriptor& rMPD, USHORT nPos) { aMasters[nPos]=rMPD; - SendRepaintBroadcast(); + + // Do necessary ViewContact actions + ActionChanged(); + // BroadcastPageChange(); } void SdrPage::SetMasterPageDescriptorList(const SdrMasterPageDescriptorList& rMPDL) { aMasters=rMPDL; - SendRepaintBroadcast(); + + // Do necessary ViewContact actions + ActionChanged(); + // BroadcastPageChange(); } void SdrPage::ImpMasterPageRemoved(USHORT nMasterPageNum) @@ -1747,7 +2022,14 @@ void SdrPage::ImpMasterPageRemoved(USHORT nMasterPageNum) for (USHORT nm=nMasterAnz; nm>0;) { nm--; USHORT nNum=aMasters[nm].GetPageNum(); - if (nNum==nMasterPageNum) { RemoveMasterPage(nm); SendRepaintBroadcast(); } + if (nNum==nMasterPageNum) + { + RemoveMasterPage(nm); + + // Do necessary ViewContact actions + ActionChanged(); + //BroadcastPageChange(); + } if (nNum>nMasterPageNum) { // Hintere anpassen wegen Verschiebung durch entfernen aMasters[nm].SetPageNum(USHORT(nNum-1)); @@ -1789,10 +2071,10 @@ void SdrPage::ImpMasterPageMoved(USHORT nMasterPageNum, USHORT nNewMasterPageNum //////////////////////////////////////////////////////////////////////////////////////////////////// FASTBOOL SdrPage::ImplGetFillColor(const Point& rPnt, const SetOfByte& rVisLayers, - FASTBOOL bLayerSorted, Color& rCol, FASTBOOL bSkipBackgroundShape) const + /* FASTBOOL bLayerSorted,*/ Color& rCol, FASTBOOL bSkipBackgroundShape) const { if (pModel==NULL) return FALSE; - FASTBOOL bRet=SdrObjList::GetFillColor(rPnt,rVisLayers,bLayerSorted,rCol); + FASTBOOL bRet=SdrObjList::GetFillColor(rPnt,rVisLayers,/*bLayerSorted,*/rCol); if (!bRet && !bMaster) { // nun zu den Masterpages USHORT nMasterAnz=GetMasterPageCount(); @@ -1810,7 +2092,7 @@ FASTBOOL SdrPage::ImplGetFillColor(const Point& rPnt, const SetOfByte& rVisLayer // the silly ordering: 1. shapes, 2. master page // shapes, 3. page background, 4. master page // background. - bRet=pMaster->ImplGetFillColor(rPnt,aSet,bLayerSorted,rCol,TRUE); + bRet=pMaster->ImplGetFillColor(rPnt,aSet,/*bLayerSorted,*/rCol,TRUE); } } } @@ -1827,12 +2109,12 @@ FASTBOOL SdrPage::ImplGetFillColor(const Point& rPnt, const SetOfByte& rVisLayer //////////////////////////////////////////////////////////////////////////////////////////////////// FASTBOOL SdrPage::GetFillColor(const Point& rPnt, const SetOfByte& rVisLayers, - FASTBOOL bLayerSorted, Color& rCol) const + /*FASTBOOL bLayerSorted,*/ Color& rCol) const { // #108867# Wrapper for ImplGetFillColor. Used to properly set the // bSkipBackgroundShape parameter. Never skip background shape on // first level of recursion - return ImplGetFillColor(rPnt,rVisLayers,bLayerSorted,rCol,FALSE); + return ImplGetFillColor(rPnt,rVisLayers,/*bLayerSorted,*/rCol,FALSE); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1889,12 +2171,15 @@ void SdrPage::ReadData(const SdrIOHeader& rHead, SvStream& rIn) SdrLayer* pLay=new SdrLayer; // Layerdefinition lesen rIn>>*pLay; pLayerAdmin->InsertLayer(pLay); - } else - if (aHead.IsID(SdrIOLSetID)) { - SdrLayerSet* pSet=new SdrLayerSet; // Layersetdefinition lesen - rIn>>*pSet; - pLayerAdmin->InsertLayerSet(pSet); - } else + } + //#110094#-10 + //else if (aHead.IsID(SdrIOLSetID)) + //{ + // SdrLayerSet* pSet=new SdrLayerSet; // Layersetdefinition lesen + // rIn>>*pSet; + // pLayerAdmin->InsertLayerSet(pSet); + //} + else // Fuer den Fall der Faelle kann hier ww. MPgDscr oder MPgDscrList stehen if (aHead.IsID(SdrIOMPgDID)) { // Masterpagedescriptor SdrMasterPageDescriptor aDscr; @@ -1985,9 +2270,10 @@ void SdrPage::WriteData(SvStream& rOut) const for (i=0; i<pLayerAdmin->GetLayerCount(); i++) { rOut<<*pLayerAdmin->GetLayer(i); } - for (i=0; i<pLayerAdmin->GetLayerSetCount(); i++) { - rOut<<*pLayerAdmin->GetLayerSet(i); - } + //#110094#-10 + //for (i=0; i<pLayerAdmin->GetLayerSetCount(); i++) { + // rOut<<*pLayerAdmin->GetLayerSet(i); + //} rOut<<aMasters; SdrObjList::Save(rOut); @@ -2137,7 +2423,7 @@ Color SdrPage::GetBackgroundColor( SdrPageView* pView ) const if( pBackgroundObj ) { - const SfxItemSet& rSet = pBackgroundObj->GetItemSet(); + const SfxItemSet& rSet = pBackgroundObj->GetMergedItemSet(); GetDraftFillColor( rSet, aColor ); } @@ -2150,6 +2436,13 @@ Color SdrPage::GetBackgroundColor() const return GetBackgroundColor( NULL ); } +// #110094# DrawContact support: Methods for handling Page changes +void SdrPage::ActionChanged() const +{ + // Do necessary ViewContact actions + GetViewContact().ActionChanged(); +} + #ifdef GCC // Dummy-Implementationen fuer Deklarationen in svdpage.hxx Bitmap SdrPage::GetBitmap(const SetOfByte& rVisibleLayers, FASTBOOL bTrimBorders=TRUE) const {} |