LCOV - code coverage report
Current view: top level - libreoffice/svx/source/svdraw - svdpage.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 437 844 51.8 %
Date: 2012-12-27 Functions: 79 125 63.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <svx/svdpage.hxx>
      22             : 
      23             : // HACK
      24             : #include <sot/storage.hxx>
      25             : #include <sot/clsids.hxx>
      26             : #include <svx/svdview.hxx>
      27             : #include <string.h>
      28             : #ifndef _STRING_H
      29             : #define _STRING_H
      30             : #endif
      31             : #include <vcl/svapp.hxx>
      32             : 
      33             : #include <tools/diagnose_ex.h>
      34             : #include <tools/helpers.hxx>
      35             : 
      36             : #include <svx/svdetc.hxx>
      37             : #include <svx/svdobj.hxx>
      38             : #include <svx/svdogrp.hxx>
      39             : #include <svx/svdograf.hxx> // for SwapInAll()
      40             : #include <svx/svdoedge.hxx> // for copying the connectors
      41             : #include <svx/svdoole2.hxx> // special case OLE at SdrExchangeFormat
      42             : #include "svx/svditer.hxx"
      43             : #include <svx/svdmodel.hxx>
      44             : #include <svx/svdlayer.hxx>
      45             : #include <svx/svdotext.hxx>
      46             : #include <svx/svdpagv.hxx>
      47             : #include <svx/svdundo.hxx>
      48             : #include <svx/fmglob.hxx>
      49             : #include <svx/polysc3d.hxx>
      50             : 
      51             : #include <svx/fmdpage.hxx>
      52             : 
      53             : #include <sfx2/objsh.hxx>
      54             : #include <svx/sdr/contact/viewcontactofsdrpage.hxx>
      55             : #include <svx/sdr/contact/viewobjectcontact.hxx>
      56             : #include <svx/sdr/contact/displayinfo.hxx>
      57             : #include <algorithm>
      58             : #include <svl/smplhint.hxx>
      59             : #include <rtl/strbuf.hxx>
      60             : 
      61             : using namespace ::com::sun::star;
      62             : 
      63           0 : class SdrObjList::WeakSdrObjectContainerType
      64             :     : public ::std::vector<SdrObjectWeakRef>
      65             : {
      66             : public:
      67           0 :     WeakSdrObjectContainerType (const sal_Int32 nInitialSize)
      68           0 :         : ::std::vector<SdrObjectWeakRef>(nInitialSize) {};
      69             : };
      70             : 
      71             : 
      72             : 
      73             : static const sal_Int32 InitialObjectContainerCapacity (64);
      74             : DBG_NAME(SdrObjList)
      75             : 
      76       13008 : TYPEINIT0(SdrObjList);
      77             : 
      78        1844 : SdrObjList::SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage, SdrObjList* pNewUpList):
      79             :     maList(),
      80             :     mpNavigationOrder(),
      81        1844 :     mbIsNavigationOrderDirty(false)
      82             : {
      83             :     DBG_CTOR(SdrObjList,NULL);
      84        1844 :     maList.reserve(InitialObjectContainerCapacity);
      85        1844 :     pModel=pNewModel;
      86        1844 :     pPage=pNewPage;
      87        1844 :     pUpList=pNewUpList;
      88        1844 :     bObjOrdNumsDirty=sal_False;
      89        1844 :     bRectsDirty=sal_False;
      90        1844 :     pOwnerObj=NULL;
      91        1844 :     eListKind=SDROBJLIST_UNKNOWN;
      92        1844 : }
      93             : 
      94           0 : SdrObjList::SdrObjList(const SdrObjList& rSrcList):
      95             :     maList(),
      96             :     mpNavigationOrder(),
      97           0 :     mbIsNavigationOrderDirty(false)
      98             : {
      99             :     DBG_CTOR(SdrObjList,NULL);
     100           0 :     maList.reserve(InitialObjectContainerCapacity);
     101           0 :     pModel=NULL;
     102           0 :     pPage=NULL;
     103           0 :     pUpList=NULL;
     104           0 :     bObjOrdNumsDirty=sal_False;
     105           0 :     bRectsDirty=sal_False;
     106           0 :     pOwnerObj=NULL;
     107           0 :     eListKind=SDROBJLIST_UNKNOWN;
     108           0 :     *this=rSrcList;
     109           0 : }
     110             : 
     111        4584 : SdrObjList::~SdrObjList()
     112             : {
     113             :     DBG_DTOR(SdrObjList,NULL);
     114             : 
     115             :     // To avoid that the Clear() method will broadcast changes when in destruction
     116             :     // which would call virtual methos (not allowed in destructor), the model is set
     117             :     // to NULL here.
     118        1648 :     pModel = 0L;
     119             : 
     120        1648 :     Clear(); // delete contents of container
     121        2936 : }
     122             : 
     123           0 : void SdrObjList::operator=(const SdrObjList& rSrcList)
     124             : {
     125           0 :     Clear();
     126           0 :     eListKind=rSrcList.eListKind;
     127           0 :     CopyObjects(rSrcList);
     128           0 : }
     129             : 
     130           0 : void SdrObjList::CopyObjects(const SdrObjList& rSrcList)
     131             : {
     132           0 :     Clear();
     133           0 :     bObjOrdNumsDirty=sal_False;
     134           0 :     bRectsDirty     =sal_False;
     135           0 :     sal_uIntPtr nCloneErrCnt=0;
     136           0 :     sal_uIntPtr nAnz=rSrcList.GetObjCount();
     137           0 :     SdrInsertReason aReason(SDRREASON_COPY);
     138             :     sal_uIntPtr no;
     139           0 :     for (no=0; no<nAnz; no++) {
     140           0 :         SdrObject* pSO=rSrcList.GetObj(no);
     141             : 
     142           0 :         SdrObject* pDO = pSO->Clone();
     143             : 
     144           0 :         if (pDO!=NULL) {
     145           0 :             pDO->SetModel(pModel);
     146           0 :             pDO->SetPage(pPage);
     147           0 :             NbcInsertObject(pDO,CONTAINER_APPEND,&aReason);
     148             :         } else {
     149           0 :             nCloneErrCnt++;
     150             :         }
     151             :     }
     152             : 
     153             :     // and now for the Connectors
     154             :     // The new objects would be shown in the rSrcList
     155             :     // and then the object connections are made.
     156             :     // Similar implementation are setup as the following:
     157             :     //    void SdrObjList::CopyObjects(const SdrObjList& rSrcList)
     158             :     //    SdrModel* SdrExchangeView::GetMarkedObjModel() const
     159             :     //    BOOL SdrExchangeView::Paste(const SdrModel& rMod,...)
     160             :     //    void SdrEditView::CopyMarked()
     161           0 :     if (nCloneErrCnt==0) {
     162           0 :         for (no=0; no<nAnz; no++) {
     163           0 :             const SdrObject* pSrcOb=rSrcList.GetObj(no);
     164           0 :             SdrEdgeObj* pSrcEdge=PTR_CAST(SdrEdgeObj,pSrcOb);
     165           0 :             if (pSrcEdge!=NULL) {
     166           0 :                 SdrObject* pSrcNode1=pSrcEdge->GetConnectedNode(sal_True);
     167           0 :                 SdrObject* pSrcNode2=pSrcEdge->GetConnectedNode(sal_False);
     168           0 :                 if (pSrcNode1!=NULL && pSrcNode1->GetObjList()!=pSrcEdge->GetObjList()) pSrcNode1=NULL; // can't do this
     169           0 :                 if (pSrcNode2!=NULL && pSrcNode2->GetObjList()!=pSrcEdge->GetObjList()) pSrcNode2=NULL; // across all lists (yet)
     170           0 :                 if (pSrcNode1!=NULL || pSrcNode2!=NULL) {
     171           0 :                     SdrObject* pEdgeObjTmp=GetObj(no);
     172           0 :                     SdrEdgeObj* pDstEdge=PTR_CAST(SdrEdgeObj,pEdgeObjTmp);
     173           0 :                     if (pDstEdge!=NULL) {
     174           0 :                         if (pSrcNode1!=NULL) {
     175           0 :                             sal_uIntPtr nDstNode1=pSrcNode1->GetOrdNum();
     176           0 :                             SdrObject* pDstNode1=GetObj(nDstNode1);
     177           0 :                             if (pDstNode1!=NULL) { // else we get an error!
     178           0 :                                 pDstEdge->ConnectToNode(sal_True,pDstNode1);
     179             :                             } else {
     180             :                                 OSL_FAIL("SdrObjList::operator=(): pDstNode1==NULL!");
     181             :                             }
     182             :                         }
     183           0 :                         if (pSrcNode2!=NULL) {
     184           0 :                             sal_uIntPtr nDstNode2=pSrcNode2->GetOrdNum();
     185           0 :                             SdrObject* pDstNode2=GetObj(nDstNode2);
     186           0 :                             if (pDstNode2!=NULL) { // else the node was probably not selected
     187           0 :                                 pDstEdge->ConnectToNode(sal_False,pDstNode2);
     188             :                             } else {
     189             :                                 OSL_FAIL("SdrObjList::operator=(): pDstNode2==NULL!");
     190             :                             }
     191             :                         }
     192             :                     } else {
     193             :                         OSL_FAIL("SdrObjList::operator=(): pDstEdge==NULL!");
     194             :                     }
     195             :                 }
     196             :             }
     197             :         }
     198             :     } else {
     199             : #ifdef DBG_UTIL
     200             :         rtl::OStringBuffer aStr(RTL_CONSTASCII_STRINGPARAM(
     201             :             "SdrObjList::operator=(): Error when cloning "));
     202             : 
     203             :         if(nCloneErrCnt == 1)
     204             :         {
     205             :             aStr.append(RTL_CONSTASCII_STRINGPARAM("a drawing object."));
     206             :         }
     207             :         else
     208             :         {
     209             :             aStr.append(static_cast<sal_Int32>(nCloneErrCnt));
     210             :             aStr.append(RTL_CONSTASCII_STRINGPARAM(" drawing objects."));
     211             :         }
     212             : 
     213             :         aStr.append(RTL_CONSTASCII_STRINGPARAM(
     214             :             " Not copying connectors."));
     215             : 
     216             :         OSL_FAIL(aStr.getStr());
     217             : #endif
     218             :     }
     219           0 : }
     220             : 
     221        1648 : void SdrObjList::Clear()
     222             : {
     223        1648 :     sal_Bool bObjectsRemoved(sal_False);
     224             : 
     225        7757 :     while( ! maList.empty())
     226             :     {
     227             :         // remove last object from list
     228        4461 :         SdrObject* pObj = maList.back();
     229        4461 :         RemoveObjectFromContainer(maList.size()-1);
     230             : 
     231             :         // flushViewObjectContacts() is done since SdrObject::Free is not guaranteed
     232             :         // to delete the object and thus refresh visualisations
     233        4461 :         pObj->GetViewContact().flushViewObjectContacts(true);
     234             : 
     235        4461 :         bObjectsRemoved = sal_True;
     236             : 
     237             :         // sent remove hint (after removal, see RemoveObject())
     238        4461 :         if(pModel)
     239             :         {
     240           0 :             SdrHint aHint(*pObj);
     241           0 :             aHint.SetKind(HINT_OBJREMOVED);
     242           0 :             aHint.SetPage(pPage);
     243           0 :             pModel->Broadcast(aHint);
     244             :         }
     245             : 
     246             :         // delete the object itself
     247        4461 :         SdrObject::Free( pObj );
     248             :     }
     249             : 
     250        1648 :     if(pModel && bObjectsRemoved)
     251             :     {
     252           0 :         pModel->SetChanged();
     253             :     }
     254        1648 : }
     255             : 
     256           0 : SdrPage* SdrObjList::GetPage() const
     257             : {
     258           0 :     return pPage;
     259             : }
     260             : 
     261        2722 : void SdrObjList::SetPage(SdrPage* pNewPage)
     262             : {
     263        2722 :     if (pPage!=pNewPage) {
     264        1480 :         pPage=pNewPage;
     265        1480 :         sal_uIntPtr nAnz=GetObjCount();
     266        1774 :         for (sal_uIntPtr no=0; no<nAnz; no++) {
     267         294 :             SdrObject* pObj=GetObj(no);
     268         294 :             pObj->SetPage(pPage);
     269             :         }
     270             :     }
     271        2722 : }
     272             : 
     273       23213 : SdrModel* SdrObjList::GetModel() const
     274             : {
     275       23213 :     return pModel;
     276             : }
     277             : 
     278        1812 : void SdrObjList::SetModel(SdrModel* pNewModel)
     279             : {
     280        1812 :     if (pModel!=pNewModel) {
     281        1258 :         pModel=pNewModel;
     282        1258 :         sal_uIntPtr nAnz=GetObjCount();
     283        1412 :         for (sal_uIntPtr i=0; i<nAnz; i++) {
     284         154 :             SdrObject* pObj=GetObj(i);
     285         154 :             pObj->SetModel(pModel);
     286             :         }
     287             :     }
     288        1812 : }
     289             : 
     290         812 : void SdrObjList::RecalcObjOrdNums()
     291             : {
     292         812 :     sal_uIntPtr nAnz=GetObjCount();
     293        3209 :     for (sal_uIntPtr no=0; no<nAnz; no++) {
     294        2397 :         SdrObject* pObj=GetObj(no);
     295        2397 :         pObj->SetOrdNum(no);
     296             :     }
     297         812 :     bObjOrdNumsDirty=sal_False;
     298         812 : }
     299             : 
     300        2136 : void SdrObjList::RecalcRects()
     301             : {
     302        2136 :     aOutRect=Rectangle();
     303        2136 :     aSnapRect=aOutRect;
     304        2136 :     sal_uIntPtr nAnz=GetObjCount();
     305             :     sal_uIntPtr i;
     306        5182 :     for (i=0; i<nAnz; i++) {
     307        3046 :         SdrObject* pObj=GetObj(i);
     308        3046 :         if (i==0) {
     309        1321 :             aOutRect=pObj->GetCurrentBoundRect();
     310        1321 :             aSnapRect=pObj->GetSnapRect();
     311             :         } else {
     312        1725 :             aOutRect.Union(pObj->GetCurrentBoundRect());
     313        1725 :             aSnapRect.Union(pObj->GetSnapRect());
     314             :         }
     315             :     }
     316        2136 : }
     317             : 
     318      115600 : void SdrObjList::SetRectsDirty()
     319             : {
     320      115600 :     bRectsDirty=sal_True;
     321      115600 :     if (pUpList!=NULL) pUpList->SetRectsDirty();
     322      115600 : }
     323             : 
     324        5535 : void SdrObjList::impChildInserted(SdrObject& rChild) const
     325             : {
     326        5535 :     sdr::contact::ViewContact* pParent = rChild.GetViewContact().GetParentContact();
     327             : 
     328        5535 :     if(pParent)
     329             :     {
     330        5535 :         pParent->ActionChildInserted(rChild.GetViewContact());
     331             :     }
     332        5535 : }
     333             : 
     334        5500 : void SdrObjList::NbcInsertObject(SdrObject* pObj, sal_uIntPtr nPos, const SdrInsertReason* /*pReason*/)
     335             : {
     336             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::NbcInsertObject(NULL)");
     337        5500 :     if (pObj!=NULL) {
     338             :         DBG_ASSERT(!pObj->IsInserted(),"ZObjekt already has the status Inserted.");
     339        5500 :         sal_uIntPtr nAnz=GetObjCount();
     340        5500 :         if (nPos>nAnz) nPos=nAnz;
     341        5500 :         InsertObjectIntoContainer(*pObj,nPos);
     342             : 
     343        5500 :         if (nPos<nAnz) bObjOrdNumsDirty=sal_True;
     344        5500 :         pObj->SetOrdNum(nPos);
     345        5500 :         pObj->SetObjList(this);
     346        5500 :         pObj->SetPage(pPage);
     347             : 
     348             :         // Inform the parent about change to allow invalidations at
     349             :         // evtl. existing parent visualisations
     350        5500 :         impChildInserted(*pObj);
     351             : 
     352        5500 :         if (!bRectsDirty) {
     353        2551 :             aOutRect.Union(pObj->GetCurrentBoundRect());
     354        2551 :             aSnapRect.Union(pObj->GetSnapRect());
     355             :         }
     356        5500 :         pObj->SetInserted(sal_True); // calls the UserCall (among others)
     357             :     }
     358        5500 : }
     359             : 
     360        4112 : void SdrObjList::InsertObject(SdrObject* pObj, sal_uIntPtr nPos, const SdrInsertReason* pReason)
     361             : {
     362             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::InsertObject(NULL)");
     363             : 
     364        4112 :     if(pObj)
     365             :     {
     366             :         // if anchor is used, reset it before grouping
     367        4112 :         if(GetOwnerObj())
     368             :         {
     369        3301 :             const Point& rAnchorPos = pObj->GetAnchorPos();
     370        3301 :             if(rAnchorPos.X() || rAnchorPos.Y())
     371           0 :                 pObj->NbcSetAnchorPos(Point());
     372             :         }
     373             : 
     374             :         // do insert to new group
     375        4112 :         NbcInsertObject(pObj, nPos, pReason);
     376             : 
     377             :         // In case the object is inserted into a group and doesn't overlap with
     378             :         // the group's other members, it needs an own repaint.
     379        4112 :         if(pOwnerObj)
     380             :         {
     381             :             // only repaint here
     382        3301 :             pOwnerObj->ActionChanged();
     383             :         }
     384             : 
     385        4112 :         if(pModel)
     386             :         {
     387             :             // TODO: We need a different broadcast here!
     388             :             // Repaint from object number ... (heads-up: GroupObj)
     389        4112 :             if(pObj->GetPage())
     390             :             {
     391        4112 :                 SdrHint aHint(*pObj);
     392             : 
     393        4112 :                 aHint.SetKind(HINT_OBJINSERTED);
     394        4112 :                 pModel->Broadcast(aHint);
     395             :             }
     396             : 
     397        4112 :             pModel->SetChanged();
     398             :         }
     399             :     }
     400        4112 : }
     401             : 
     402         533 : SdrObject* SdrObjList::NbcRemoveObject(sal_uIntPtr nObjNum)
     403             : {
     404         533 :     if (nObjNum >= maList.size())
     405             :     {
     406             :         OSL_ASSERT(nObjNum<maList.size());
     407           0 :         return NULL;
     408             :     }
     409             : 
     410         533 :     sal_uIntPtr nAnz=GetObjCount();
     411         533 :     SdrObject* pObj=maList[nObjNum];
     412         533 :     RemoveObjectFromContainer(nObjNum);
     413             : 
     414             :     DBG_ASSERT(pObj!=NULL,"Could not find object to remove.");
     415         533 :     if (pObj!=NULL) {
     416             :         // flushViewObjectContacts() clears the VOC's and those invalidate
     417         533 :         pObj->GetViewContact().flushViewObjectContacts(true);
     418             : 
     419             :         DBG_ASSERT(pObj->IsInserted(),"ZObjekt does not have the status Inserted.");
     420         533 :         pObj->SetInserted(sal_False); // Ruft u.a. den UserCall
     421         533 :         pObj->SetObjList(NULL);
     422         533 :         pObj->SetPage(NULL);
     423         533 :         if (!bObjOrdNumsDirty) { // optimizing for the case that the last object has to be removed
     424           0 :             if (nObjNum!=sal_uIntPtr(nAnz-1)) {
     425           0 :                 bObjOrdNumsDirty=sal_True;
     426             :             }
     427             :         }
     428         533 :         SetRectsDirty();
     429             :     }
     430         533 :     return pObj;
     431             : }
     432             : 
     433         293 : SdrObject* SdrObjList::RemoveObject(sal_uIntPtr nObjNum)
     434             : {
     435         293 :     if (nObjNum >= maList.size())
     436             :     {
     437             :         OSL_ASSERT(nObjNum<maList.size());
     438           0 :         return NULL;
     439             :     }
     440             : 
     441         293 :     sal_uIntPtr nAnz=GetObjCount();
     442         293 :     SdrObject* pObj=maList[nObjNum];
     443         293 :     RemoveObjectFromContainer(nObjNum);
     444             : 
     445             :     DBG_ASSERT(pObj!=NULL,"Object to remove not found.");
     446         293 :     if(pObj)
     447             :     {
     448             :         // flushViewObjectContacts() clears the VOC's and those invalidate
     449         293 :         pObj->GetViewContact().flushViewObjectContacts(true);
     450             : 
     451             :         DBG_ASSERT(pObj->IsInserted(),"ZObjekt does not have the status Inserted.");
     452         293 :         if (pModel!=NULL) {
     453             :             // TODO: We need a different broadcast here.
     454         293 :             if (pObj->GetPage()!=NULL) {
     455         293 :                 SdrHint aHint(*pObj);
     456         293 :                 aHint.SetKind(HINT_OBJREMOVED);
     457         293 :                 pModel->Broadcast(aHint);
     458             :             }
     459         293 :             pModel->SetChanged();
     460             :         }
     461         293 :         pObj->SetInserted(sal_False); // calls, among other things, the UserCall
     462         293 :         pObj->SetObjList(NULL);
     463         293 :         pObj->SetPage(NULL);
     464         293 :         if (!bObjOrdNumsDirty) { // optimization for the case that the last object is removed
     465           0 :             if (nObjNum!=sal_uIntPtr(nAnz-1)) {
     466           0 :                 bObjOrdNumsDirty=sal_True;
     467             :             }
     468             :         }
     469         293 :         SetRectsDirty();
     470             : 
     471         293 :         if(pOwnerObj && !GetObjCount())
     472             :         {
     473             :             // empty group created; it needs to be repainted since it's
     474             :             // visualization changes
     475           0 :             pOwnerObj->ActionChanged();
     476             :         }
     477             :     }
     478         293 :     return pObj;
     479             : }
     480             : 
     481           0 : SdrObject* SdrObjList::NbcReplaceObject(SdrObject* pNewObj, sal_uIntPtr nObjNum)
     482             : {
     483           0 :     if (nObjNum >= maList.size() || pNewObj == NULL)
     484             :     {
     485             :         OSL_ASSERT(nObjNum<maList.size());
     486             :         OSL_ASSERT(pNewObj!=NULL);
     487           0 :         return NULL;
     488             :     }
     489             : 
     490           0 :     SdrObject* pObj=maList[nObjNum];
     491             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::ReplaceObject: Could not find object to remove.");
     492           0 :     if (pObj!=NULL) {
     493             :         DBG_ASSERT(pObj->IsInserted(),"SdrObjList::ReplaceObject: ZObjekt does not have status Inserted.");
     494           0 :         pObj->SetInserted(sal_False);
     495           0 :         pObj->SetObjList(NULL);
     496           0 :         pObj->SetPage(NULL);
     497           0 :         ReplaceObjectInContainer(*pNewObj,nObjNum);
     498             : 
     499             :         // flushViewObjectContacts() clears the VOC's and those invalidate
     500           0 :         pObj->GetViewContact().flushViewObjectContacts(true);
     501             : 
     502           0 :         pNewObj->SetOrdNum(nObjNum);
     503           0 :         pNewObj->SetObjList(this);
     504           0 :         pNewObj->SetPage(pPage);
     505             : 
     506             :         // Inform the parent about change to allow invalidations at
     507             :         // evtl. existing parent visualisations
     508           0 :         impChildInserted(*pNewObj);
     509             : 
     510           0 :         pNewObj->SetInserted(sal_True);
     511           0 :         SetRectsDirty();
     512             :     }
     513           0 :     return pObj;
     514             : }
     515             : 
     516          35 : SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, sal_uIntPtr nObjNum)
     517             : {
     518          35 :     if (nObjNum >= maList.size())
     519             :     {
     520             :         OSL_ASSERT(nObjNum<maList.size());
     521           0 :         return NULL;
     522             :     }
     523          35 :     if (pNewObj == NULL)
     524             :     {
     525             :         OSL_ASSERT(pNewObj!=NULL);
     526           0 :         return NULL;
     527             :     }
     528             : 
     529          35 :     SdrObject* pObj=maList[nObjNum];
     530             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::ReplaceObject: Could not find object to remove.");
     531          35 :     if (pObj!=NULL) {
     532             :         DBG_ASSERT(pObj->IsInserted(),"SdrObjList::ReplaceObject: ZObjekt does not have status Inserted.");
     533          35 :         if (pModel!=NULL) {
     534             :             // TODO: We need a different broadcast here.
     535          35 :             if (pObj->GetPage()!=NULL) {
     536          35 :                 SdrHint aHint(*pObj);
     537          35 :                 aHint.SetKind(HINT_OBJREMOVED);
     538          35 :                 pModel->Broadcast(aHint);
     539             :             }
     540             :         }
     541          35 :         pObj->SetInserted(sal_False);
     542          35 :         pObj->SetObjList(NULL);
     543          35 :         pObj->SetPage(NULL);
     544          35 :         ReplaceObjectInContainer(*pNewObj,nObjNum);
     545             : 
     546             :         // flushViewObjectContacts() clears the VOC's and those invalidate
     547          35 :         pObj->GetViewContact().flushViewObjectContacts(true);
     548             : 
     549          35 :         pNewObj->SetOrdNum(nObjNum);
     550          35 :         pNewObj->SetObjList(this);
     551          35 :         pNewObj->SetPage(pPage);
     552             : 
     553             :         // Inform the parent about change to allow invalidations at
     554             :         // evtl. existing parent visualisations
     555          35 :         impChildInserted(*pNewObj);
     556             : 
     557          35 :         pNewObj->SetInserted(sal_True);
     558          35 :         if (pModel!=NULL) {
     559             :             // TODO: We need a different broadcast here.
     560          35 :             if (pNewObj->GetPage()!=NULL) {
     561          35 :                 SdrHint aHint(*pNewObj);
     562          35 :                 aHint.SetKind(HINT_OBJINSERTED);
     563          35 :                 pModel->Broadcast(aHint);
     564             :             }
     565          35 :             pModel->SetChanged();
     566             :         }
     567          35 :         SetRectsDirty();
     568             :     }
     569          35 :     return pObj;
     570             : }
     571             : 
     572           0 : SdrObject* SdrObjList::NbcSetObjectOrdNum(sal_uIntPtr nOldObjNum, sal_uIntPtr nNewObjNum)
     573             : {
     574           0 :     if (nOldObjNum >= maList.size() || nNewObjNum >= maList.size())
     575             :     {
     576             :         OSL_ASSERT(nOldObjNum<maList.size());
     577             :         OSL_ASSERT(nNewObjNum<maList.size());
     578           0 :         return NULL;
     579             :     }
     580             : 
     581           0 :     SdrObject* pObj=maList[nOldObjNum];
     582           0 :     if (nOldObjNum==nNewObjNum) return pObj;
     583             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::NbcSetObjectOrdNum: Object not found.");
     584           0 :     if (pObj!=NULL) {
     585             :         DBG_ASSERT(pObj->IsInserted(),"SdrObjList::NbcSetObjectOrdNum: ZObjekt does not have status Inserted.");
     586           0 :         RemoveObjectFromContainer(nOldObjNum);
     587             : 
     588           0 :         InsertObjectIntoContainer(*pObj,nNewObjNum);
     589             : 
     590             :         // No need to delete visualisation data since same object
     591             :         // gets inserted again. Also a single ActionChanged is enough
     592           0 :         pObj->ActionChanged();
     593             : 
     594           0 :         pObj->SetOrdNum(nNewObjNum);
     595           0 :         bObjOrdNumsDirty=sal_True;
     596             :     }
     597           0 :     return pObj;
     598             : }
     599             : 
     600         512 : SdrObject* SdrObjList::SetObjectOrdNum(sal_uIntPtr nOldObjNum, sal_uIntPtr nNewObjNum)
     601             : {
     602         512 :     if (nOldObjNum >= maList.size() || nNewObjNum >= maList.size())
     603             :     {
     604             :         OSL_ASSERT(nOldObjNum<maList.size());
     605             :         OSL_ASSERT(nNewObjNum<maList.size());
     606           0 :         return NULL;
     607             :     }
     608             : 
     609         512 :     SdrObject* pObj=maList[nOldObjNum];
     610         512 :     if (nOldObjNum==nNewObjNum) return pObj;
     611             :     DBG_ASSERT(pObj!=NULL,"SdrObjList::SetObjectOrdNum: Object not found.");
     612         376 :     if (pObj!=NULL) {
     613             :         DBG_ASSERT(pObj->IsInserted(),"SdrObjList::SetObjectOrdNum: ZObjekt does not have status Inserted.");
     614         376 :         RemoveObjectFromContainer(nOldObjNum);
     615         376 :         InsertObjectIntoContainer(*pObj,nNewObjNum);
     616             : 
     617             :         // No need to delete visualisation data since same object
     618             :         // gets inserted again. Also a single ActionChanged is enough
     619         376 :         pObj->ActionChanged();
     620             : 
     621         376 :         pObj->SetOrdNum(nNewObjNum);
     622         376 :         bObjOrdNumsDirty=sal_True;
     623         376 :         if (pModel!=NULL)
     624             :         {
     625             :             // TODO: We need a different broadcast here.
     626         376 :             if (pObj->GetPage()!=NULL) pModel->Broadcast(SdrHint(*pObj));
     627         376 :             pModel->SetChanged();
     628             :         }
     629             :     }
     630         376 :     return pObj;
     631             : }
     632             : 
     633        1992 : const Rectangle& SdrObjList::GetAllObjSnapRect() const
     634             : {
     635        1992 :     if (bRectsDirty) {
     636         264 :         ((SdrObjList*)this)->RecalcRects();
     637         264 :         ((SdrObjList*)this)->bRectsDirty=sal_False;
     638             :     }
     639        1992 :     return aSnapRect;
     640             : }
     641             : 
     642        1999 : const Rectangle& SdrObjList::GetAllObjBoundRect() const
     643             : {
     644             :     // #i106183# for deep group hierarchies like in chart2, the invalidates
     645             :     // through the hierarchy are not correct; use a 2nd hint for the needed
     646             :     // recalculation. Future versions will have no bool flag at all, but
     647             :     // just aOutRect in empty state to represent an invalid state, thus
     648             :     // it's a step in the right direction.
     649        1999 :     if (bRectsDirty || aOutRect.IsEmpty())
     650             :     {
     651        1872 :         ((SdrObjList*)this)->RecalcRects();
     652        1872 :         ((SdrObjList*)this)->bRectsDirty=sal_False;
     653             :     }
     654        1999 :     return aOutRect;
     655             : }
     656             : 
     657         392 : void SdrObjList::NbcReformatAllTextObjects()
     658             : {
     659         392 :     sal_uIntPtr nAnz=GetObjCount();
     660         392 :     sal_uIntPtr nNum=0;
     661             : 
     662         792 :     while (nNum<nAnz)
     663             :     {
     664           8 :         SdrObject* pObj = GetObj(nNum);
     665             : 
     666           8 :         pObj->NbcReformatText();
     667           8 :         nAnz=GetObjCount();             // ReformatText may delete an object
     668           8 :         nNum++;
     669             :     }
     670             : 
     671         392 : }
     672             : 
     673         392 : void SdrObjList::ReformatAllTextObjects()
     674             : {
     675         392 :     NbcReformatAllTextObjects();
     676         392 : }
     677             : 
     678             : /** steps over all available objects and reformats all
     679             :     edge objects that are connected to other objects so that
     680             :     they may reposition themselves.
     681             : */
     682           0 : void SdrObjList::ReformatAllEdgeObjects()
     683             : {
     684           0 :     const sal_uInt32 nCount=GetObjCount();
     685             :     sal_uInt32 nObj;
     686             : 
     687           0 :     for( nObj = 0; nObj < nCount; nObj++ )
     688             :     {
     689           0 :         SdrObject* pObj = GetObj(nObj);
     690           0 :         if( pObj->ISA(SdrEdgeObj) )
     691           0 :             static_cast<SdrEdgeObj*>(pObj)->Reformat();
     692             :     }
     693           0 : }
     694             : 
     695           0 : void SdrObjList::BurnInStyleSheetAttributes()
     696             : {
     697           0 :     for(sal_uInt32 a(0L); a < GetObjCount(); a++)
     698             :     {
     699           0 :         GetObj(a)->BurnInStyleSheetAttributes();
     700             :     }
     701           0 : }
     702             : 
     703       48984 : sal_uIntPtr SdrObjList::GetObjCount() const
     704             : {
     705       48984 :     return maList.size();
     706             : }
     707             : 
     708             : 
     709             : 
     710             : 
     711       34790 : SdrObject* SdrObjList::GetObj(sal_uIntPtr nNum) const
     712             : {
     713       34790 :     if (nNum >= maList.size())
     714             :     {
     715             :         OSL_ASSERT(nNum<maList.size());
     716           0 :         return NULL;
     717             :     }
     718             :     else
     719       34790 :         return maList[nNum];
     720             : }
     721             : 
     722             : 
     723             : 
     724             : 
     725           0 : bool SdrObjList::IsReadOnly() const
     726             : {
     727           0 :     bool bRet = false;
     728           0 :     if (pPage!=NULL && pPage!=this) bRet=pPage->IsReadOnly();
     729           0 :     return bRet;
     730             : }
     731             : 
     732           0 : sal_uIntPtr SdrObjList::CountAllObjects() const
     733             : {
     734           0 :     sal_uIntPtr nCnt=GetObjCount();
     735           0 :     sal_uIntPtr nAnz=nCnt;
     736           0 :     for (sal_uInt16 nNum=0; nNum<nAnz; nNum++) {
     737           0 :         SdrObjList* pSubOL=GetObj(nNum)->GetSubList();
     738           0 :         if (pSubOL!=NULL) {
     739           0 :             nCnt+=pSubOL->CountAllObjects();
     740             :         }
     741             :     }
     742           0 :     return nCnt;
     743             : }
     744             : 
     745           0 : void SdrObjList::ForceSwapInObjects() const
     746             : {
     747           0 :     sal_uIntPtr nObjAnz=GetObjCount();
     748           0 :     for (sal_uIntPtr nObjNum=nObjAnz; nObjNum>0;) {
     749           0 :         SdrObject* pObj=GetObj(--nObjNum);
     750           0 :         SdrGrafObj* pGrafObj=PTR_CAST(SdrGrafObj,pObj);
     751           0 :         if (pGrafObj!=NULL) {
     752           0 :             pGrafObj->ForceSwapIn();
     753             :         }
     754           0 :         SdrObjList* pOL=pObj->GetSubList();
     755           0 :         if (pOL!=NULL) {
     756           0 :             pOL->ForceSwapInObjects();
     757             :         }
     758             :     }
     759           0 : }
     760             : 
     761           0 : void SdrObjList::ForceSwapOutObjects() const
     762             : {
     763           0 :     sal_uIntPtr nObjAnz=GetObjCount();
     764           0 :     for (sal_uIntPtr nObjNum=nObjAnz; nObjNum>0;) {
     765           0 :         SdrObject* pObj=GetObj(--nObjNum);
     766           0 :         SdrGrafObj* pGrafObj=PTR_CAST(SdrGrafObj,pObj);
     767           0 :         if (pGrafObj!=NULL) {
     768           0 :             pGrafObj->ForceSwapOut();
     769             :         }
     770           0 :         SdrObjList* pOL=pObj->GetSubList();
     771           0 :         if (pOL!=NULL) {
     772           0 :             pOL->ForceSwapOutObjects();
     773             :         }
     774             :     }
     775           0 : }
     776             : 
     777           0 : void SdrObjList::FlattenGroups()
     778             : {
     779           0 :     sal_Int32 nObj = GetObjCount();
     780             :     sal_Int32 i;
     781           0 :     for( i=nObj-1; i>=0; --i)
     782           0 :         UnGroupObj(i);
     783           0 : }
     784             : 
     785           0 : void SdrObjList::UnGroupObj( sal_uIntPtr nObjNum )
     786             : {
     787             :     // if the given object is no group, this method is a noop
     788           0 :     SdrObject* pUngroupObj = GetObj( nObjNum );
     789           0 :     if( pUngroupObj )
     790             :     {
     791           0 :         SdrObjList* pSrcLst = pUngroupObj->GetSubList();
     792           0 :         if( pUngroupObj->ISA( SdrObjGroup ) && pSrcLst )
     793             :         {
     794           0 :             SdrObjGroup* pUngroupGroup = static_cast< SdrObjGroup* > (pUngroupObj);
     795             : 
     796             :             // ungroup recursively (has to be head recursion,
     797             :             // otherwise our indices will get trashed when doing it in
     798             :             // the loop)
     799           0 :             pSrcLst->FlattenGroups();
     800             : 
     801             :             // the position at which we insert the members of rUngroupGroup
     802           0 :             sal_Int32 nInsertPos( pUngroupGroup->GetOrdNum() );
     803             : 
     804             :             SdrObject* pObj;
     805           0 :             sal_Int32 i, nAnz = pSrcLst->GetObjCount();
     806           0 :             for( i=0; i<nAnz; ++i )
     807             :             {
     808           0 :                 pObj = pSrcLst->RemoveObject(0);
     809           0 :                 SdrInsertReason aReason(SDRREASON_VIEWCALL, pUngroupGroup);
     810           0 :                 InsertObject(pObj, nInsertPos, &aReason);
     811           0 :                 ++nInsertPos;
     812             :             }
     813             : 
     814           0 :             RemoveObject(nInsertPos);
     815             :         }
     816             :     }
     817             : #ifdef DBG_UTIL
     818             :     else
     819             :         OSL_FAIL("SdrObjList::UnGroupObj: object index invalid");
     820             : #endif
     821           0 : }
     822             : 
     823             : 
     824             : 
     825             : 
     826       11574 : bool SdrObjList::HasObjectNavigationOrder (void) const
     827             : {
     828       11574 :     return mpNavigationOrder.get() != NULL;
     829             : }
     830             : 
     831             : 
     832             : 
     833             : 
     834           0 : void SdrObjList::SetObjectNavigationPosition (
     835             :     SdrObject& rObject,
     836             :     const sal_uInt32 nNewPosition)
     837             : {
     838             :     // When the navigation order container has not yet been created then
     839             :     // create one now.  It is initialized with the z-order taken from
     840             :     // maList.
     841           0 :     if (mpNavigationOrder.get() == NULL)
     842             :     {
     843           0 :         mpNavigationOrder.reset(new WeakSdrObjectContainerType(maList.size()));
     844             :         ::std::copy(
     845             :             maList.begin(),
     846             :             maList.end(),
     847           0 :             mpNavigationOrder->begin());
     848             :     }
     849             :     OSL_ASSERT(mpNavigationOrder.get()!=NULL);
     850             :     OSL_ASSERT( mpNavigationOrder->size() == maList.size());
     851             : 
     852           0 :     SdrObjectWeakRef aReference (&rObject);
     853             : 
     854             :     // Look up the object whose navigation position is to be changed.
     855             :     WeakSdrObjectContainerType::iterator iObject (::std::find(
     856           0 :         mpNavigationOrder->begin(),
     857           0 :         mpNavigationOrder->end(),
     858           0 :         aReference));
     859           0 :     if (iObject == mpNavigationOrder->end())
     860             :     {
     861             :         // The given object is not a member of the navigation order.
     862           0 :         return;
     863             :     }
     864             : 
     865             :     // Move the object to its new position.
     866           0 :     const sal_uInt32 nOldPosition = ::std::distance(mpNavigationOrder->begin(), iObject);
     867           0 :     if (nOldPosition != nNewPosition)
     868             :     {
     869           0 :         mpNavigationOrder->erase(iObject);
     870           0 :         sal_uInt32 nInsertPosition (nNewPosition);
     871             :         // Adapt insertion position for the just erased object.
     872           0 :         if (nNewPosition >= nOldPosition)
     873           0 :             nInsertPosition -= 1;
     874           0 :         if (nInsertPosition >= mpNavigationOrder->size())
     875           0 :             mpNavigationOrder->push_back(aReference);
     876             :         else
     877           0 :             mpNavigationOrder->insert(mpNavigationOrder->begin()+nInsertPosition, aReference);
     878             : 
     879           0 :         mbIsNavigationOrderDirty = true;
     880             : 
     881             :         // The navigation order is written out to file so mark the model as modified.
     882           0 :         if (pModel != NULL)
     883           0 :             pModel->SetChanged();
     884           0 :     }
     885             : }
     886             : 
     887             : 
     888             : 
     889             : 
     890           0 : SdrObject* SdrObjList::GetObjectForNavigationPosition (const sal_uInt32 nNavigationPosition) const
     891             : {
     892           0 :     if (HasObjectNavigationOrder())
     893             :     {
     894             :         // There is a user defined navigation order. Make sure the object
     895             :         // index is correct and look up the object in mpNavigationOrder.
     896           0 :         if (nNavigationPosition >= mpNavigationOrder->size())
     897             :         {
     898             :             OSL_ASSERT(nNavigationPosition < mpNavigationOrder->size());
     899             :         }
     900             :         else
     901           0 :             return (*mpNavigationOrder)[nNavigationPosition].get();
     902             :     }
     903             :     else
     904             :     {
     905             :         // There is no user defined navigation order. Use the z-order
     906             :         // instead.
     907           0 :         if (nNavigationPosition >= maList.size())
     908             :         {
     909             :             OSL_ASSERT(nNavigationPosition < maList.size());
     910             :         }
     911             :         else
     912           0 :             return maList[nNavigationPosition];
     913             :     }
     914           0 :     return NULL;
     915             : }
     916             : 
     917             : 
     918             : 
     919             : 
     920           0 : void SdrObjList::ClearObjectNavigationOrder (void)
     921             : {
     922           0 :     mpNavigationOrder.reset();
     923           0 :     mbIsNavigationOrderDirty = true;
     924           0 : }
     925             : 
     926             : 
     927             : 
     928             : 
     929          77 : bool SdrObjList::RecalcNavigationPositions (void)
     930             : {
     931          77 :     if (mbIsNavigationOrderDirty)
     932             :     {
     933           0 :         if (mpNavigationOrder.get() != NULL)
     934             :         {
     935           0 :             mbIsNavigationOrderDirty = false;
     936             : 
     937           0 :             WeakSdrObjectContainerType::iterator iObject;
     938           0 :             WeakSdrObjectContainerType::const_iterator iEnd (mpNavigationOrder->end());
     939           0 :             sal_uInt32 nIndex (0);
     940           0 :             for (iObject=mpNavigationOrder->begin(); iObject!=iEnd; ++iObject,++nIndex)
     941           0 :                 (*iObject)->SetNavigationPosition(nIndex);
     942             :         }
     943             :     }
     944             : 
     945          77 :     return mpNavigationOrder.get() != NULL;
     946             : }
     947             : 
     948             : 
     949             : 
     950             : 
     951           0 : void SdrObjList::SetNavigationOrder (const uno::Reference<container::XIndexAccess>& rxOrder)
     952             : {
     953           0 :     if (rxOrder.is())
     954             :     {
     955           0 :         const sal_Int32 nCount = rxOrder->getCount();
     956           0 :         if ((sal_uInt32)nCount != maList.size())
     957           0 :             return;
     958             : 
     959           0 :         if (mpNavigationOrder.get() == NULL)
     960           0 :             mpNavigationOrder.reset(new WeakSdrObjectContainerType(nCount));
     961             : 
     962           0 :         for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
     963             :         {
     964           0 :             uno::Reference<uno::XInterface> xShape (rxOrder->getByIndex(nIndex), uno::UNO_QUERY);
     965           0 :             SdrObject* pObject = SdrObject::getSdrObjectFromXShape(xShape);
     966           0 :             if (pObject == NULL)
     967             :                 break;
     968           0 :             (*mpNavigationOrder)[nIndex] = pObject;
     969           0 :         }
     970             : 
     971           0 :         mbIsNavigationOrderDirty = true;
     972             :     }
     973             :     else
     974           0 :         ClearObjectNavigationOrder();
     975             : }
     976             : 
     977             : 
     978             : 
     979             : 
     980        5876 : void SdrObjList::InsertObjectIntoContainer (
     981             :     SdrObject& rObject,
     982             :     const sal_uInt32 nInsertPosition)
     983             : {
     984             :     OSL_ASSERT(nInsertPosition<=maList.size());
     985             : 
     986             :     // Update the navigation positions.
     987        5876 :     if (HasObjectNavigationOrder())
     988             :     {
     989             :         // The new object does not have a user defined position so append it
     990             :         // to the list.
     991           0 :         rObject.SetNavigationPosition(mpNavigationOrder->size());
     992           0 :         mpNavigationOrder->push_back(&rObject);
     993             :     }
     994             : 
     995             :     // Insert object into object list.  Because the insert() method requires
     996             :     // a valid iterator as insertion position, we have to use push_back() to
     997             :     // insert at the end of the list.
     998        5876 :     if (nInsertPosition >= maList.size())
     999        5453 :         maList.push_back(&rObject);
    1000             :     else
    1001         423 :         maList.insert(maList.begin()+nInsertPosition, &rObject);
    1002        5876 :     bObjOrdNumsDirty=sal_True;
    1003        5876 : }
    1004             : 
    1005             : 
    1006             : 
    1007             : 
    1008          35 : void SdrObjList::ReplaceObjectInContainer (
    1009             :     SdrObject& rNewObject,
    1010             :     const sal_uInt32 nObjectPosition)
    1011             : {
    1012          35 :     if (nObjectPosition >= maList.size())
    1013             :     {
    1014             :         OSL_ASSERT(nObjectPosition<maList.size());
    1015          35 :         return;
    1016             :     }
    1017             : 
    1018             :     // Update the navigation positions.
    1019          35 :     if (HasObjectNavigationOrder())
    1020             :     {
    1021             :         // A user defined position of the object that is to be replaced is
    1022             :         // not transferred to the new object so erase the former and append
    1023             :         // the later object from/to the navigation order.
    1024             :         OSL_ASSERT(nObjectPosition < maList.size());
    1025           0 :         SdrObjectWeakRef aReference (maList[nObjectPosition]);
    1026             :         WeakSdrObjectContainerType::iterator iObject (::std::find(
    1027           0 :             mpNavigationOrder->begin(),
    1028           0 :             mpNavigationOrder->end(),
    1029           0 :             aReference));
    1030           0 :         if (iObject != mpNavigationOrder->end())
    1031           0 :             mpNavigationOrder->erase(iObject);
    1032             : 
    1033           0 :         mpNavigationOrder->push_back(&rNewObject);
    1034             : 
    1035           0 :         mbIsNavigationOrderDirty = true;
    1036             :     }
    1037             : 
    1038          35 :     maList[nObjectPosition] = &rNewObject;
    1039          35 :     bObjOrdNumsDirty=sal_True;
    1040             : }
    1041             : 
    1042             : 
    1043             : 
    1044             : 
    1045        5663 : void SdrObjList::RemoveObjectFromContainer (
    1046             :     const sal_uInt32 nObjectPosition)
    1047             : {
    1048        5663 :     if (nObjectPosition >= maList.size())
    1049             :     {
    1050             :         OSL_ASSERT(nObjectPosition<maList.size());
    1051        5663 :         return;
    1052             :     }
    1053             : 
    1054             :     // Update the navigation positions.
    1055        5663 :     if (HasObjectNavigationOrder())
    1056             :     {
    1057           0 :         SdrObjectWeakRef aReference (maList[nObjectPosition]);
    1058             :         WeakSdrObjectContainerType::iterator iObject (::std::find(
    1059           0 :             mpNavigationOrder->begin(),
    1060           0 :             mpNavigationOrder->end(),
    1061           0 :             aReference));
    1062           0 :         if (iObject != mpNavigationOrder->end())
    1063           0 :             mpNavigationOrder->erase(iObject);
    1064           0 :         mbIsNavigationOrderDirty = true;
    1065             :     }
    1066             : 
    1067        5663 :     maList.erase(maList.begin()+nObjectPosition);
    1068        5663 :     bObjOrdNumsDirty=sal_True;
    1069             : }
    1070             : 
    1071             : 
    1072             : 
    1073             : 
    1074             : ////////////////////////////////////////////////////////////////////////////////////////////////////
    1075             : 
    1076           0 : void SdrPageGridFrameList::Clear()
    1077             : {
    1078           0 :     sal_uInt16 nAnz=GetCount();
    1079           0 :     for (sal_uInt16 i=0; i<nAnz; i++) {
    1080           0 :         delete GetObject(i);
    1081             :     }
    1082           0 :     aList.clear();
    1083           0 : }
    1084             : 
    1085             : //////////////////////////////////////////////////////////////////////////////
    1086             : // PageUser section
    1087             : 
    1088         191 : void SdrPage::AddPageUser(sdr::PageUser& rNewUser)
    1089             : {
    1090         191 :     maPageUsers.push_back(&rNewUser);
    1091         191 : }
    1092             : 
    1093         183 : void SdrPage::RemovePageUser(sdr::PageUser& rOldUser)
    1094             : {
    1095         183 :     const ::sdr::PageUserVector::iterator aFindResult = ::std::find(maPageUsers.begin(), maPageUsers.end(), &rOldUser);
    1096         183 :     if(aFindResult != maPageUsers.end())
    1097             :     {
    1098         183 :         maPageUsers.erase(aFindResult);
    1099             :     }
    1100         183 : }
    1101             : 
    1102             : //////////////////////////////////////////////////////////////////////////////
    1103             : // DrawContact section
    1104             : 
    1105         535 : sdr::contact::ViewContact* SdrPage::CreateObjectSpecificViewContact()
    1106             : {
    1107         535 :     return new sdr::contact::ViewContactOfSdrPage(*this);
    1108             : }
    1109             : 
    1110        5781 : sdr::contact::ViewContact& SdrPage::GetViewContact() const
    1111             : {
    1112        5781 :     if(!mpViewContact)
    1113             :     {
    1114             :         const_cast< SdrPage* >(this)->mpViewContact =
    1115         535 :             const_cast< SdrPage* >(this)->CreateObjectSpecificViewContact();
    1116             :     }
    1117             : 
    1118        5781 :     return *mpViewContact;
    1119             : }
    1120             : 
    1121             : ////////////////////////////////////////////////////////////////////////////////////////////////////
    1122             : 
    1123         371 : void SdrPageProperties::ImpRemoveStyleSheet()
    1124             : {
    1125         371 :     if(mpStyleSheet)
    1126             :     {
    1127           9 :         EndListening(*mpStyleSheet);
    1128           9 :         mpProperties->SetParent(0);
    1129           9 :         mpStyleSheet = 0;
    1130             :     }
    1131         371 : }
    1132             : 
    1133          62 : void SdrPageProperties::ImpAddStyleSheet(SfxStyleSheet& rNewStyleSheet)
    1134             : {
    1135          62 :     if(mpStyleSheet != &rNewStyleSheet)
    1136             :     {
    1137          11 :         ImpRemoveStyleSheet();
    1138          11 :         mpStyleSheet = &rNewStyleSheet;
    1139          11 :         StartListening(rNewStyleSheet);
    1140          11 :         mpProperties->SetParent(&rNewStyleSheet.GetItemSet());
    1141             :     }
    1142          62 : }
    1143             : 
    1144         249 : void ImpPageChange(SdrPage& rSdrPage)
    1145             : {
    1146         249 :     rSdrPage.ActionChanged();
    1147             : 
    1148         249 :     if(rSdrPage.GetModel())
    1149             :     {
    1150         249 :         rSdrPage.GetModel()->SetChanged(true);
    1151         249 :         SdrHint aHint(HINT_PAGEORDERCHG);
    1152         249 :         aHint.SetPage(&rSdrPage);
    1153         249 :         rSdrPage.GetModel()->Broadcast(aHint);
    1154             :     }
    1155         249 : }
    1156             : 
    1157         553 : SdrPageProperties::SdrPageProperties(SdrPage& rSdrPage)
    1158             : :   SfxListener(),
    1159             :     mpSdrPage(&rSdrPage),
    1160             :     mpStyleSheet(0),
    1161         553 :     mpProperties(new SfxItemSet(mpSdrPage->GetModel()->GetItemPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST))
    1162             : {
    1163         553 :     if(!rSdrPage.IsMasterPage())
    1164             :     {
    1165         519 :         mpProperties->Put(XFillStyleItem(XFILL_NONE));
    1166             :     }
    1167         553 : }
    1168             : 
    1169        1080 : SdrPageProperties::~SdrPageProperties()
    1170             : {
    1171         360 :     ImpRemoveStyleSheet();
    1172         360 :     delete mpProperties;
    1173         720 : }
    1174             : 
    1175          14 : void SdrPageProperties::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint)
    1176             : {
    1177          14 :     const SfxSimpleHint* pSimpleHint = dynamic_cast< const SfxSimpleHint* >(&rHint);
    1178             : 
    1179          14 :     if(pSimpleHint)
    1180             :     {
    1181          14 :         switch(pSimpleHint->GetId())
    1182             :         {
    1183             :             case SFX_HINT_DATACHANGED :
    1184             :             {
    1185             :                 // notify change, broadcast
    1186          14 :                 ImpPageChange(*mpSdrPage);
    1187          14 :                 break;
    1188             :             }
    1189             :             case SFX_HINT_DYING :
    1190             :             {
    1191             :                 // Style needs to be forgotten
    1192           0 :                 ImpRemoveStyleSheet();
    1193           0 :                 break;
    1194             :             }
    1195             :         }
    1196             :     }
    1197          14 : }
    1198             : 
    1199           0 : const SfxItemSet& SdrPageProperties::GetItemSet() const
    1200             : {
    1201           0 :     return *mpProperties;
    1202             : }
    1203             : 
    1204          51 : void SdrPageProperties::PutItemSet(const SfxItemSet& rSet)
    1205             : {
    1206             :     OSL_ENSURE(!mpSdrPage->IsMasterPage(), "Item set at MasterPage Attributes (!)");
    1207          51 :     mpProperties->Put(rSet);
    1208          51 :     ImpPageChange(*mpSdrPage);
    1209          51 : }
    1210             : 
    1211           9 : void SdrPageProperties::PutItem(const SfxPoolItem& rItem)
    1212             : {
    1213             :     OSL_ENSURE(!mpSdrPage->IsMasterPage(), "Item set at MasterPage Attributes (!)");
    1214           9 :     mpProperties->Put(rItem);
    1215           9 :     ImpPageChange(*mpSdrPage);
    1216           9 : }
    1217             : 
    1218         113 : void SdrPageProperties::ClearItem(const sal_uInt16 nWhich)
    1219             : {
    1220         113 :     mpProperties->ClearItem(nWhich);
    1221         113 :     ImpPageChange(*mpSdrPage);
    1222         113 : }
    1223             : 
    1224          62 : void SdrPageProperties::SetStyleSheet(SfxStyleSheet* pStyleSheet)
    1225             : {
    1226          62 :     if(pStyleSheet)
    1227             :     {
    1228          62 :         ImpAddStyleSheet(*pStyleSheet);
    1229             :     }
    1230             :     else
    1231             :     {
    1232           0 :         ImpRemoveStyleSheet();
    1233             :     }
    1234             : 
    1235          62 :     ImpPageChange(*mpSdrPage);
    1236          62 : }
    1237             : 
    1238           0 : SfxStyleSheet* SdrPageProperties::GetStyleSheet() const
    1239             : {
    1240           0 :     return mpStyleSheet;
    1241             : }
    1242             : 
    1243             : ////////////////////////////////////////////////////////////////////////////////////////////////////
    1244             : 
    1245       10422 : TYPEINIT1(SdrPage,SdrObjList);
    1246             : DBG_NAME(SdrPage)
    1247         553 : SdrPage::SdrPage(SdrModel& rNewModel, bool bMasterPage)
    1248             : :   SdrObjList(&rNewModel, this),
    1249             :     mpViewContact(0L),
    1250             :     nWdt(10L),
    1251             :     nHgt(10L),
    1252             :     nBordLft(0L),
    1253             :     nBordUpp(0L),
    1254             :     nBordRgt(0L),
    1255             :     nBordLwr(0L),
    1256         553 :     pLayerAdmin(new SdrLayerAdmin(&rNewModel.GetLayerAdmin())),
    1257             :     mpSdrPageProperties(0),
    1258             :     mpMasterPageDescriptor(0L),
    1259             :     nPageNum(0L),
    1260             :     mbMaster(bMasterPage),
    1261             :     mbInserted(false),
    1262             :     mbObjectsNotPersistent(false),
    1263             :     mbSwappingLocked(false),
    1264        1106 :     mbPageBorderOnlyLeftRight(false)
    1265             : {
    1266             :     DBG_CTOR(SdrPage,NULL);
    1267         553 :     aPrefVisiLayers.SetAll();
    1268         553 :     eListKind = (bMasterPage) ? SDROBJLIST_MASTERPAGE : SDROBJLIST_DRAWPAGE;
    1269             : 
    1270         553 :     mpSdrPageProperties = new SdrPageProperties(*this);
    1271         553 : }
    1272             : 
    1273           0 : SdrPage::SdrPage(const SdrPage& rSrcPage)
    1274             : :   SdrObjList(rSrcPage.pModel, this),
    1275             :     tools::WeakBase< SdrPage >(),
    1276             :     mpViewContact(0L),
    1277             :     nWdt(rSrcPage.nWdt),
    1278             :     nHgt(rSrcPage.nHgt),
    1279             :     nBordLft(rSrcPage.nBordLft),
    1280             :     nBordUpp(rSrcPage.nBordUpp),
    1281             :     nBordRgt(rSrcPage.nBordRgt),
    1282             :     nBordLwr(rSrcPage.nBordLwr),
    1283           0 :     pLayerAdmin(new SdrLayerAdmin(rSrcPage.pModel->GetLayerAdmin())),
    1284             :     mpSdrPageProperties(0),
    1285             :     mpMasterPageDescriptor(0L),
    1286             :     nPageNum(rSrcPage.nPageNum),
    1287             :     mbMaster(rSrcPage.mbMaster),
    1288             :     mbInserted(false),
    1289             :     mbObjectsNotPersistent(rSrcPage.mbObjectsNotPersistent),
    1290             :     mbSwappingLocked(rSrcPage.mbSwappingLocked),
    1291           0 :     mbPageBorderOnlyLeftRight(rSrcPage.mbPageBorderOnlyLeftRight)
    1292             : {
    1293             :     DBG_CTOR(SdrPage,NULL);
    1294           0 :     aPrefVisiLayers.SetAll();
    1295           0 :     eListKind = (mbMaster) ? SDROBJLIST_MASTERPAGE : SDROBJLIST_DRAWPAGE;
    1296             : 
    1297             :     // copy things from source
    1298             :     // Warning: this leads to slicing (see issue 93186) and has to be
    1299             :     // removed as soon as possible.
    1300           0 :     *this = rSrcPage;
    1301             :     OSL_ENSURE(mpSdrPageProperties,
    1302             :         "SdrPage::SdrPage: operator= did not create needed SdrPageProperties (!)");
    1303             : 
    1304             :     // be careful and correct eListKind, a member of SdrObjList which
    1305             :     // will be changed by the SdrOIbjList::operator= before...
    1306           0 :     eListKind = (mbMaster) ? SDROBJLIST_MASTERPAGE : SDROBJLIST_DRAWPAGE;
    1307             : 
    1308             :     // The previous assignment to *this may have resulted in a call to
    1309             :     // createUnoPage at a partially initialized (sliced) SdrPage object.
    1310             :     // Due to the vtable being not yet fully set-up at this stage,
    1311             :     // createUnoPage() may have been called at the wrong class.
    1312             :     // To force a call to the right createUnoPage() at a later time when the
    1313             :     // new object is full constructed mxUnoPage is disposed now.
    1314           0 :     uno::Reference<lang::XComponent> xComponent (mxUnoPage, uno::UNO_QUERY);
    1315           0 :     if (xComponent.is())
    1316             :     {
    1317           0 :         mxUnoPage = NULL;
    1318           0 :         xComponent->dispose();
    1319           0 :     }
    1320           0 : }
    1321             : 
    1322         761 : SdrPage::~SdrPage()
    1323             : {
    1324         360 :     if( mxUnoPage.is() ) try
    1325             :     {
    1326         161 :         uno::Reference< lang::XComponent > xPageComponent( mxUnoPage, uno::UNO_QUERY_THROW );
    1327         161 :         mxUnoPage.clear();
    1328         161 :         xPageComponent->dispose();
    1329             :     }
    1330           0 :     catch( const uno::Exception& )
    1331             :     {
    1332             :         DBG_UNHANDLED_EXCEPTION();
    1333             :     }
    1334             : 
    1335             :     // tell all the registered PageUsers that the page is in destruction
    1336             :     // This causes some (all?) PageUsers to remove themselves from the list
    1337             :     // of page users.  Therefore we have to use a copy of the list for the
    1338             :     // iteration.
    1339         360 :     ::sdr::PageUserVector aListCopy (maPageUsers.begin(), maPageUsers.end());
    1340         360 :     for(::sdr::PageUserVector::iterator aIterator = aListCopy.begin(); aIterator != aListCopy.end(); ++aIterator)
    1341             :     {
    1342           0 :         sdr::PageUser* pPageUser = *aIterator;
    1343             :         DBG_ASSERT(pPageUser, "SdrPage::~SdrPage: corrupt PageUser list (!)");
    1344           0 :         pPageUser->PageInDestruction(*this);
    1345             :     }
    1346             : 
    1347             :     // Clear the vector. This means that user do not need to call RemovePageUser()
    1348             :     // when they get called from PageInDestruction().
    1349         360 :     maPageUsers.clear();
    1350             : 
    1351         360 :     delete pLayerAdmin;
    1352             : 
    1353         360 :     TRG_ClearMasterPage();
    1354             : 
    1355         360 :     if(mpViewContact)
    1356             :     {
    1357         342 :         delete mpViewContact;
    1358         342 :         mpViewContact = 0L;
    1359             :     }
    1360             : 
    1361             :     {
    1362         360 :         delete mpSdrPageProperties;
    1363         360 :         mpSdrPageProperties = 0;
    1364             :     }
    1365             : 
    1366         360 :     DBG_DTOR(SdrPage,NULL);
    1367         401 : }
    1368             : 
    1369           0 : SdrPage& SdrPage::operator=(const SdrPage& rSrcPage)
    1370             : {
    1371           0 :     if( this == &rSrcPage )
    1372           0 :         return *this;
    1373           0 :     if(mpViewContact)
    1374             :     {
    1375           0 :         delete mpViewContact;
    1376           0 :         mpViewContact = 0L;
    1377             :     }
    1378             : 
    1379             :     // Joe also sets some parameters for the class this one
    1380             :     // is derived from. SdrObjList does the same bad handling of
    1381             :     // copy constructor and operator=, so i better let it stand here.
    1382           0 :     pPage = this;
    1383             : 
    1384             :     // copy all the local parameters to make this instance
    1385             :     // a valid copy of source page before copying and inserting
    1386             :     // the contained objects
    1387           0 :     mbMaster = rSrcPage.mbMaster;
    1388           0 :     mbSwappingLocked = rSrcPage.mbSwappingLocked;
    1389           0 :     mbPageBorderOnlyLeftRight = rSrcPage.mbPageBorderOnlyLeftRight;
    1390           0 :     aPrefVisiLayers = rSrcPage.aPrefVisiLayers;
    1391           0 :     nWdt = rSrcPage.nWdt;
    1392           0 :     nHgt = rSrcPage.nHgt;
    1393           0 :     nBordLft = rSrcPage.nBordLft;
    1394           0 :     nBordUpp = rSrcPage.nBordUpp;
    1395           0 :     nBordRgt = rSrcPage.nBordRgt;
    1396           0 :     nBordLwr = rSrcPage.nBordLwr;
    1397           0 :     nPageNum = rSrcPage.nPageNum;
    1398             : 
    1399           0 :     if(rSrcPage.TRG_HasMasterPage())
    1400             :     {
    1401           0 :         TRG_SetMasterPage(rSrcPage.TRG_GetMasterPage());
    1402           0 :         TRG_SetMasterPageVisibleLayers(rSrcPage.TRG_GetMasterPageVisibleLayers());
    1403             :     }
    1404             :     else
    1405             :     {
    1406           0 :         TRG_ClearMasterPage();
    1407             :     }
    1408             : 
    1409           0 :     mbObjectsNotPersistent = rSrcPage.mbObjectsNotPersistent;
    1410             : 
    1411             :     {
    1412             :         // #i111122# delete SdrPageProperties when model is different
    1413           0 :         if(mpSdrPageProperties && GetModel() != rSrcPage.GetModel())
    1414             :         {
    1415           0 :             delete mpSdrPageProperties;
    1416           0 :             mpSdrPageProperties = 0;
    1417             :         }
    1418             : 
    1419           0 :         if(!mpSdrPageProperties)
    1420             :         {
    1421           0 :             mpSdrPageProperties = new SdrPageProperties(*this);
    1422             :         }
    1423             :         else
    1424             :         {
    1425           0 :             mpSdrPageProperties->ClearItem(0);
    1426             :         }
    1427             : 
    1428           0 :         if(!IsMasterPage())
    1429             :         {
    1430           0 :             mpSdrPageProperties->PutItemSet(rSrcPage.getSdrPageProperties().GetItemSet());
    1431             :         }
    1432             : 
    1433           0 :         mpSdrPageProperties->SetStyleSheet(rSrcPage.getSdrPageProperties().GetStyleSheet());
    1434             :     }
    1435             : 
    1436             :     // Now copy the contained objects (by cloning them)
    1437           0 :     SdrObjList::operator=(rSrcPage);
    1438           0 :     return *this;
    1439             : }
    1440             : 
    1441           0 : SdrPage* SdrPage::Clone() const
    1442             : {
    1443           0 :     return Clone(NULL);
    1444             : }
    1445             : 
    1446           0 : SdrPage* SdrPage::Clone(SdrModel* pNewModel) const
    1447             : {
    1448           0 :     if (pNewModel==NULL) pNewModel=pModel;
    1449           0 :     SdrPage* pPage2=new SdrPage(*pNewModel);
    1450           0 :     *pPage2=*this;
    1451           0 :     return pPage2;
    1452             : }
    1453             : 
    1454        1020 : void SdrPage::SetSize(const Size& aSiz)
    1455             : {
    1456        1020 :     bool bChanged(false);
    1457             : 
    1458        1020 :     if(aSiz.Width() != nWdt)
    1459             :     {
    1460         944 :         nWdt = aSiz.Width();
    1461         944 :         bChanged = true;
    1462             :     }
    1463             : 
    1464        1020 :     if(aSiz.Height() != nHgt)
    1465             :     {
    1466         952 :         nHgt = aSiz.Height();
    1467         952 :         bChanged = true;
    1468             :     }
    1469             : 
    1470        1020 :     if(bChanged)
    1471             :     {
    1472        1020 :         SetChanged();
    1473             :     }
    1474        1020 : }
    1475             : 
    1476        1129 : Size SdrPage::GetSize() const
    1477             : {
    1478        1129 :     return Size(nWdt,nHgt);
    1479             : }
    1480             : 
    1481        1088 : sal_Int32 SdrPage::GetWdt() const
    1482             : {
    1483        1088 :     return nWdt;
    1484             : }
    1485             : 
    1486           0 : void SdrPage::SetOrientation(Orientation eOri)
    1487             : {
    1488             :     // square: handle like portrait format
    1489           0 :     Size aSiz(GetSize());
    1490           0 :     if (aSiz.Width()!=aSiz.Height()) {
    1491           0 :         if ((eOri==ORIENTATION_PORTRAIT) == (aSiz.Width()>aSiz.Height())) {
    1492           0 :             SetSize(Size(aSiz.Height(),aSiz.Width()));
    1493             :         }
    1494             :     }
    1495           0 : }
    1496             : 
    1497           0 : Orientation SdrPage::GetOrientation() const
    1498             : {
    1499             :     // square: handle like portrait format
    1500           0 :     Orientation eRet=ORIENTATION_PORTRAIT;
    1501           0 :     Size aSiz(GetSize());
    1502           0 :     if (aSiz.Width()>aSiz.Height()) eRet=ORIENTATION_LANDSCAPE;
    1503           0 :     return eRet;
    1504             : }
    1505             : 
    1506        1088 : sal_Int32 SdrPage::GetHgt() const
    1507             : {
    1508        1088 :     return nHgt;
    1509             : }
    1510             : 
    1511           0 : void  SdrPage::SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 nLwr)
    1512             : {
    1513           0 :     bool bChanged(false);
    1514             : 
    1515           0 :     if(nBordLft != nLft)
    1516             :     {
    1517           0 :         nBordLft = nLft;
    1518           0 :         bChanged = true;
    1519             :     }
    1520             : 
    1521           0 :     if(nBordUpp != nUpp)
    1522             :     {
    1523           0 :         nBordUpp = nUpp;
    1524           0 :         bChanged = true;
    1525             :     }
    1526             : 
    1527           0 :     if(nBordRgt != nRgt)
    1528             :     {
    1529           0 :         nBordRgt = nRgt;
    1530           0 :         bChanged = true;
    1531             :     }
    1532             : 
    1533           0 :     if(nBordLwr != nLwr)
    1534             :     {
    1535           0 :         nBordLwr =  nLwr;
    1536           0 :         bChanged = true;
    1537             :     }
    1538             : 
    1539           0 :     if(bChanged)
    1540             :     {
    1541           0 :         SetChanged();
    1542             :     }
    1543           0 : }
    1544             : 
    1545           2 : void  SdrPage::SetLftBorder(sal_Int32 nBorder)
    1546             : {
    1547           2 :     if(nBordLft != nBorder)
    1548             :     {
    1549           2 :         nBordLft = nBorder;
    1550           2 :         SetChanged();
    1551             :     }
    1552           2 : }
    1553             : 
    1554           2 : void  SdrPage::SetUppBorder(sal_Int32 nBorder)
    1555             : {
    1556           2 :     if(nBordUpp != nBorder)
    1557             :     {
    1558           2 :         nBordUpp = nBorder;
    1559           2 :         SetChanged();
    1560             :     }
    1561           2 : }
    1562             : 
    1563           2 : void  SdrPage::SetRgtBorder(sal_Int32 nBorder)
    1564             : {
    1565           2 :     if(nBordRgt != nBorder)
    1566             :     {
    1567           2 :         nBordRgt=nBorder;
    1568           2 :         SetChanged();
    1569             :     }
    1570           2 : }
    1571             : 
    1572           2 : void  SdrPage::SetLwrBorder(sal_Int32 nBorder)
    1573             : {
    1574           2 :     if(nBordLwr != nBorder)
    1575             :     {
    1576           2 :         nBordLwr=nBorder;
    1577           2 :         SetChanged();
    1578             :     }
    1579           2 : }
    1580             : 
    1581         839 : sal_Int32 SdrPage::GetLftBorder() const
    1582             : {
    1583         839 :     return nBordLft;
    1584             : }
    1585             : 
    1586         839 : sal_Int32 SdrPage::GetUppBorder() const
    1587             : {
    1588         839 :     return nBordUpp;
    1589             : }
    1590             : 
    1591         304 : sal_Int32 SdrPage::GetRgtBorder() const
    1592             : {
    1593         304 :     return nBordRgt;
    1594             : }
    1595             : 
    1596         304 : sal_Int32 SdrPage::GetLwrBorder() const
    1597             : {
    1598         304 :     return nBordLwr;
    1599             : }
    1600             : 
    1601         554 : void SdrPage::SetModel(SdrModel* pNewModel)
    1602             : {
    1603         554 :     SdrModel* pOldModel=pModel;
    1604         554 :     SdrObjList::SetModel(pNewModel);
    1605         554 :     if (pNewModel!=pOldModel)
    1606             :     {
    1607           0 :         if (pNewModel!=NULL) {
    1608           0 :             pLayerAdmin->SetParent(&pNewModel->GetLayerAdmin());
    1609             :         } else {
    1610           0 :             pLayerAdmin->SetParent(NULL);
    1611             :         }
    1612           0 :         pLayerAdmin->SetModel(pNewModel);
    1613             : 
    1614             :         // create new SdrPageProperties with new model (due to SfxItemSet there)
    1615             :         // and copy ItemSet and StyleSheet
    1616           0 :         SdrPageProperties *pNew = new SdrPageProperties(*this);
    1617             : 
    1618           0 :         if(!IsMasterPage())
    1619             :         {
    1620           0 :             pNew->PutItemSet(getSdrPageProperties().GetItemSet());
    1621             :         }
    1622             : 
    1623           0 :         pNew->SetStyleSheet(getSdrPageProperties().GetStyleSheet());
    1624             : 
    1625           0 :         delete mpSdrPageProperties;
    1626           0 :         mpSdrPageProperties = pNew;
    1627             :     }
    1628             : 
    1629             :     // update listeners at possible API wrapper object
    1630         554 :     if( pOldModel != pNewModel )
    1631             :     {
    1632           0 :         if( mxUnoPage.is() )
    1633             :         {
    1634           0 :             SvxDrawPage* pPage2 = SvxDrawPage::getImplementation( mxUnoPage );
    1635           0 :             if( pPage2 )
    1636           0 :                 pPage2->ChangeModel( pNewModel );
    1637             :         }
    1638             :     }
    1639         554 : }
    1640             : 
    1641             : ////////////////////////////////////////////////////////////////////////////////////////////////////
    1642             : 
    1643             : // #i68775# React on PageNum changes (from Model in most cases)
    1644         554 : void SdrPage::SetPageNum(sal_uInt16 nNew)
    1645             : {
    1646         554 :     if(nNew != nPageNum)
    1647             :     {
    1648             :         // change
    1649         188 :         nPageNum = nNew;
    1650             : 
    1651             :         // notify visualisations, also notifies e.g. buffered MasterPages
    1652         188 :         ActionChanged();
    1653             :     }
    1654         554 : }
    1655             : 
    1656         192 : sal_uInt16 SdrPage::GetPageNum() const
    1657             : {
    1658         192 :     if (!mbInserted)
    1659          27 :         return 0;
    1660             : 
    1661         165 :     if (mbMaster) {
    1662          54 :         if (pModel && pModel->IsMPgNumsDirty())
    1663           0 :             ((SdrModel*)pModel)->RecalcPageNums(sal_True);
    1664             :     } else {
    1665         111 :         if (pModel && pModel->IsPagNumsDirty())
    1666           0 :             ((SdrModel*)pModel)->RecalcPageNums(sal_False);
    1667             :     }
    1668         165 :     return nPageNum;
    1669             : }
    1670             : 
    1671        1365 : void SdrPage::SetChanged()
    1672             : {
    1673             :     // For test purposes, use the new ViewContact for change
    1674             :     // notification now.
    1675        1365 :     ActionChanged();
    1676             : 
    1677        1365 :     if( pModel )
    1678             :     {
    1679        1365 :         pModel->SetChanged();
    1680             :     }
    1681        1365 : }
    1682             : 
    1683             : ////////////////////////////////////////////////////////////////////////////////////////////////////
    1684             : // MasterPage interface
    1685             : 
    1686         179 : void SdrPage::TRG_SetMasterPage(SdrPage& rNew)
    1687             : {
    1688         179 :     if(mpMasterPageDescriptor && &(mpMasterPageDescriptor->GetUsedPage()) == &rNew)
    1689         231 :         return;
    1690             : 
    1691         127 :     if(mpMasterPageDescriptor)
    1692           0 :         TRG_ClearMasterPage();
    1693             : 
    1694         127 :     mpMasterPageDescriptor = new ::sdr::MasterPageDescriptor(*this, rNew);
    1695         127 :     GetViewContact().ActionChanged();
    1696             : }
    1697             : 
    1698         386 : void SdrPage::TRG_ClearMasterPage()
    1699             : {
    1700         386 :     if(mpMasterPageDescriptor)
    1701             :     {
    1702         121 :         SetChanged();
    1703             : 
    1704             :         // the flushViewObjectContacts() will do needed invalidates by deleting the involved VOCs
    1705         121 :         mpMasterPageDescriptor->GetUsedPage().GetViewContact().flushViewObjectContacts(true);
    1706             : 
    1707         121 :         delete mpMasterPageDescriptor;
    1708         121 :         mpMasterPageDescriptor = 0L;
    1709             :     }
    1710         386 : }
    1711             : 
    1712         318 : SdrPage& SdrPage::TRG_GetMasterPage() const
    1713             : {
    1714             :     DBG_ASSERT(mpMasterPageDescriptor != 0L, "TRG_GetMasterPage(): No MasterPage available. Use TRG_HasMasterPage() before access (!)");
    1715         318 :     return mpMasterPageDescriptor->GetUsedPage();
    1716             : }
    1717             : 
    1718          23 : const SetOfByte& SdrPage::TRG_GetMasterPageVisibleLayers() const
    1719             : {
    1720             :     DBG_ASSERT(mpMasterPageDescriptor != 0L, "TRG_GetMasterPageVisibleLayers(): No MasterPage available. Use TRG_HasMasterPage() before access (!)");
    1721          23 :     return mpMasterPageDescriptor->GetVisibleLayers();
    1722             : }
    1723             : 
    1724          23 : void SdrPage::TRG_SetMasterPageVisibleLayers(const SetOfByte& rNew)
    1725             : {
    1726             :     DBG_ASSERT(mpMasterPageDescriptor != 0L, "TRG_SetMasterPageVisibleLayers(): No MasterPage available. Use TRG_HasMasterPage() before access (!)");
    1727          23 :     mpMasterPageDescriptor->SetVisibleLayers(rNew);
    1728          23 : }
    1729             : 
    1730        1467 : sdr::contact::ViewContact& SdrPage::TRG_GetMasterPageDescriptorViewContact() const
    1731             : {
    1732             :     DBG_ASSERT(mpMasterPageDescriptor != 0L, "TRG_GetMasterPageDescriptorViewContact(): No MasterPage available. Use TRG_HasMasterPage() before access (!)");
    1733        1467 :     return mpMasterPageDescriptor->GetViewContact();
    1734             : }
    1735             : 
    1736             : // used from SdrModel::RemoveMasterPage
    1737           0 : void SdrPage::TRG_ImpMasterPageRemoved(const SdrPage& rRemovedPage)
    1738             : {
    1739           0 :     if(TRG_HasMasterPage())
    1740             :     {
    1741           0 :         if(&TRG_GetMasterPage() == &rRemovedPage)
    1742             :         {
    1743           0 :             TRG_ClearMasterPage();
    1744             :         }
    1745             :     }
    1746           0 : }
    1747             : 
    1748           0 : const SdrPageGridFrameList* SdrPage::GetGridFrameList(const SdrPageView* /*pPV*/, const Rectangle* /*pRect*/) const
    1749             : {
    1750           0 :     return NULL;
    1751             : }
    1752             : 
    1753           0 : OUString SdrPage::GetLayoutName() const
    1754             : {
    1755           0 :     return OUString();
    1756             : }
    1757             : 
    1758         915 : void SdrPage::SetInserted( bool bIns )
    1759             : {
    1760         915 :     if( (bool) mbInserted != bIns )
    1761             :     {
    1762         915 :         mbInserted = bIns;
    1763             : 
    1764         915 :         SdrObjListIter aIter( *this, IM_FLAT );
    1765        2522 :          while ( aIter.IsMore() )
    1766             :         {
    1767         692 :             SdrObject* pObj = aIter.Next();
    1768         692 :             if ( pObj->ISA(SdrOle2Obj) )
    1769             :             {
    1770          47 :                 if( mbInserted )
    1771           0 :                     ( (SdrOle2Obj*) pObj)->Connect();
    1772             :                 else
    1773          47 :                     ( (SdrOle2Obj*) pObj)->Disconnect();
    1774             :             }
    1775         915 :         }
    1776             :     }
    1777         915 : }
    1778             : 
    1779           0 : void SdrPage::SetUnoPage(uno::Reference<drawing::XDrawPage> const& xNewPage)
    1780             : {
    1781           0 :     mxUnoPage = xNewPage;
    1782           0 : }
    1783             : 
    1784        5633 : uno::Reference< uno::XInterface > SdrPage::getUnoPage()
    1785             : {
    1786        5633 :     if( !mxUnoPage.is() )
    1787             :     {
    1788             :         // create one
    1789         309 :         mxUnoPage = createUnoPage();
    1790             :     }
    1791             : 
    1792        5633 :     return mxUnoPage;
    1793             : }
    1794             : 
    1795          41 : uno::Reference< uno::XInterface > SdrPage::createUnoPage()
    1796             : {
    1797             :     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xInt =
    1798          41 :         static_cast<cppu::OWeakObject*>( new SvxFmDrawPage( this ) );
    1799          41 :     return xInt;
    1800             : }
    1801             : 
    1802        1100 : SfxStyleSheet* SdrPage::GetTextStyleSheetForObject( SdrObject* pObj ) const
    1803             : {
    1804        1100 :     return pObj->GetStyleSheet();
    1805             : }
    1806             : 
    1807             : /** returns an averaged background color of this page */
    1808             : // #i75566# GetBackgroundColor -> GetPageBackgroundColor and bScreenDisplay hint value
    1809           0 : Color SdrPage::GetPageBackgroundColor( SdrPageView* pView, bool bScreenDisplay ) const
    1810             : {
    1811           0 :     Color aColor;
    1812             : 
    1813           0 :     if(bScreenDisplay && (!pView || pView->GetApplicationDocumentColor() == COL_AUTO))
    1814             :     {
    1815           0 :         svtools::ColorConfig aColorConfig;
    1816           0 :         aColor = aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor;
    1817             :     }
    1818             :     else
    1819             :     {
    1820           0 :         aColor = pView->GetApplicationDocumentColor();
    1821             :     }
    1822             : 
    1823           0 :     const SfxItemSet* pBackgroundFill = &getSdrPageProperties().GetItemSet();
    1824             : 
    1825           0 :     if(!IsMasterPage() && TRG_HasMasterPage())
    1826             :     {
    1827           0 :         if(XFILL_NONE == ((const XFillStyleItem&)pBackgroundFill->Get(XATTR_FILLSTYLE)).GetValue())
    1828             :         {
    1829           0 :             pBackgroundFill = &TRG_GetMasterPage().getSdrPageProperties().GetItemSet();
    1830             :         }
    1831             :     }
    1832             : 
    1833           0 :     GetDraftFillColor(*pBackgroundFill, aColor);
    1834             : 
    1835           0 :     return aColor;
    1836             : }
    1837             : 
    1838             : /** *deprecated, use GetBackgroundColor with SdrPageView */
    1839           0 : Color SdrPage::GetPageBackgroundColor() const
    1840             : // #i75566# GetBackgroundColor -> GetPageBackgroundColor
    1841             : {
    1842           0 :     return GetPageBackgroundColor( NULL, true );
    1843             : }
    1844             : 
    1845             : /** this method returns true if the object from the ViewObjectContact should
    1846             :     be visible on this page while rendering.
    1847             :     bEdit selects if visibility test is for an editing view or a final render,
    1848             :     like printing.
    1849             : */
    1850           0 : bool SdrPage::checkVisibility(
    1851             :     const sdr::contact::ViewObjectContact& /*rOriginal*/,
    1852             :     const sdr::contact::DisplayInfo& /*rDisplayInfo*/,
    1853             :     bool /*bEdit*/)
    1854             : {
    1855             :     // this will be handled in the application if needed
    1856           0 :     return true;
    1857             : }
    1858             : 
    1859             : // DrawContact support: Methods for handling Page changes
    1860        1886 : void SdrPage::ActionChanged() const
    1861             : {
    1862             :     // Do necessary ViewContact actions
    1863        1886 :     GetViewContact().ActionChanged();
    1864             : 
    1865             :     // #i48535# also handle MasterPage change
    1866        1886 :     if(TRG_HasMasterPage())
    1867             :     {
    1868         562 :         TRG_GetMasterPageDescriptorViewContact().ActionChanged();
    1869             :     }
    1870        1886 : }
    1871             : 
    1872             : //////////////////////////////////////////////////////////////////////////////
    1873             : // sdr::Comment interface
    1874             : 
    1875           0 : const SdrPageProperties* SdrPage::getCorrectSdrPageProperties() const
    1876             : {
    1877           0 :     if(mpMasterPageDescriptor)
    1878             :     {
    1879           0 :         return mpMasterPageDescriptor->getCorrectSdrPageProperties();
    1880             :     }
    1881             :     else
    1882             :     {
    1883           0 :         return &getSdrPageProperties();
    1884             :     }
    1885             : }
    1886             : 
    1887             : //////////////////////////////////////////////////////////////////////////////
    1888             : // use new redirector instead of pPaintProc
    1889             : 
    1890           0 : StandardCheckVisisbilityRedirector::StandardCheckVisisbilityRedirector()
    1891           0 : :   ViewObjectContactRedirector()
    1892             : {
    1893           0 : }
    1894             : 
    1895           0 : StandardCheckVisisbilityRedirector::~StandardCheckVisisbilityRedirector()
    1896             : {
    1897           0 : }
    1898             : 
    1899           0 : drawinglayer::primitive2d::Primitive2DSequence StandardCheckVisisbilityRedirector::createRedirectedPrimitive2DSequence(
    1900             :     const sdr::contact::ViewObjectContact& rOriginal,
    1901             :     const sdr::contact::DisplayInfo& rDisplayInfo)
    1902             : {
    1903           0 :     SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
    1904             : 
    1905           0 :     if(pObject)
    1906             :     {
    1907           0 :         if(pObject->GetPage())
    1908             :         {
    1909           0 :             if(pObject->GetPage()->checkVisibility(rOriginal, rDisplayInfo, false))
    1910             :             {
    1911           0 :                 return ::sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
    1912             :             }
    1913             :         }
    1914             : 
    1915           0 :         return drawinglayer::primitive2d::Primitive2DSequence();
    1916             :     }
    1917             :     else
    1918             :     {
    1919             :         // not an object, maybe a page
    1920           0 :         return ::sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
    1921             :     }
    1922             : }
    1923             : 
    1924             : 
    1925             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10