LCOV - code coverage report
Current view: top level - svx/source/svdraw - svdmodel.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 663 1103 60.1 %
Date: 2015-06-13 12:38:46 Functions: 87 114 76.3 %
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/svdmodel.hxx>
      22             : 
      23             : #include <cassert>
      24             : #include <math.h>
      25             : 
      26             : #include <osl/endian.h>
      27             : #include <rtl/strbuf.hxx>
      28             : 
      29             : #include <com/sun/star/lang/XComponent.hpp>
      30             : #include <com/sun/star/document/XStorageBasedDocument.hpp>
      31             : #include <com/sun/star/embed/ElementModes.hpp>
      32             : 
      33             : #include <unotools/ucbstreamhelper.hxx>
      34             : 
      35             : #include <svl/whiter.hxx>
      36             : #include <svx/xit.hxx>
      37             : #include <svx/xbtmpit.hxx>
      38             : #include <svx/xlndsit.hxx>
      39             : #include <svx/xlnedit.hxx>
      40             : #include <svx/xflgrit.hxx>
      41             : #include <svx/xflftrit.hxx>
      42             : #include <svx/xflhtit.hxx>
      43             : #include <svx/xlnstit.hxx>
      44             : 
      45             : #include <editeng/editdata.hxx>
      46             : #include <editeng/editeng.hxx>
      47             : 
      48             : #include <svx/xtable.hxx>
      49             : 
      50             : #include "svx/svditer.hxx"
      51             : #include <svx/svdtrans.hxx>
      52             : #include <svx/svdpage.hxx>
      53             : #include <svx/svdlayer.hxx>
      54             : #include <svx/svdundo.hxx>
      55             : #include <svx/svdpool.hxx>
      56             : #include <svx/svdobj.hxx>
      57             : #include <svx/svdotext.hxx>
      58             : #include <svx/svdetc.hxx>
      59             : #include <svx/svdoutl.hxx>
      60             : #include <svx/svdoole2.hxx>
      61             : #include "svdglob.hxx"
      62             : #include "svx/svdstr.hrc"
      63             : #include "svdoutlinercache.hxx"
      64             : 
      65             : #include "svx/xflclit.hxx"
      66             : #include "svx/xlnclit.hxx"
      67             : 
      68             : #include "officecfg/Office/Common.hxx"
      69             : #include "editeng/fontitem.hxx"
      70             : #include <editeng/colritem.hxx>
      71             : #include <editeng/fhgtitem.hxx>
      72             : #include <svl/style.hxx>
      73             : #include <editeng/numitem.hxx>
      74             : #include <editeng/bulletitem.hxx>
      75             : #include <editeng/outlobj.hxx>
      76             : #include "editeng/forbiddencharacterstable.hxx"
      77             : #include <svl/zforlist.hxx>
      78             : #include <comphelper/servicehelper.hxx>
      79             : #include <comphelper/storagehelper.hxx>
      80             : 
      81             : #include <tools/tenccvt.hxx>
      82             : #include <unotools/syslocale.hxx>
      83             : 
      84             : #include <svx/sdr/properties/properties.hxx>
      85             : #include <editeng/eeitem.hxx>
      86             : #include <svl/itemset.hxx>
      87             : #include <vcl/settings.hxx>
      88             : #include <vcl/svapp.hxx>
      89             : #include <boost/scoped_array.hpp>
      90             : #include <libxml/xmlwriter.h>
      91             : 
      92             : using namespace ::com::sun::star;
      93             : using namespace ::com::sun::star::uno;
      94             : using namespace ::com::sun::star::lang;
      95             : 
      96             : 
      97             : 
      98             : struct SdrModelImpl
      99             : {
     100             :     SfxUndoManager* mpUndoManager;
     101             :     SdrUndoFactory* mpUndoFactory;
     102             : };
     103             : 
     104             : 
     105             : 
     106         981 : TYPEINIT1(SdrModel,SfxBroadcaster);
     107        4148 : void SdrModel::ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* _pEmbeddedHelper,
     108             :     bool bUseExtColorTable, bool bLoadRefCounts)
     109             : {
     110        4148 :     mpImpl = new SdrModelImpl;
     111        4148 :     mpImpl->mpUndoManager=0;
     112        4148 :     mpImpl->mpUndoFactory=0;
     113        4148 :     mbInDestruction = false;
     114        4148 :     aObjUnit=SdrEngineDefaults::GetMapFraction();
     115        4148 :     eObjUnit=SdrEngineDefaults::GetMapUnit();
     116        4148 :     eUIUnit=FUNIT_MM;
     117        4148 :     aUIScale=Fraction(1,1);
     118        4148 :     nUIUnitKomma=0;
     119        4148 :     bUIOnlyKomma=false;
     120        4148 :     pLayerAdmin=NULL;
     121        4148 :     pItemPool=pPool;
     122        4148 :     bMyPool=false;
     123        4148 :     m_pEmbeddedHelper=_pEmbeddedHelper;
     124        4148 :     pDrawOutliner=NULL;
     125        4148 :     pHitTestOutliner=NULL;
     126        4148 :     pRefOutDev=NULL;
     127        4148 :     mbTiledRendering = false;
     128        4148 :     mpLibreOfficeKitCallback = 0;
     129        4148 :     mpLibreOfficeKitData = 0;
     130        4148 :     nProgressAkt=0;
     131        4148 :     nProgressMax=0;
     132        4148 :     nProgressOfs=0;
     133        4148 :     pDefaultStyleSheet=NULL;
     134        4148 :     mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj = 0;
     135        4148 :     pLinkManager=NULL;
     136        4148 :     pUndoStack=NULL;
     137        4148 :     pRedoStack=NULL;
     138        4148 :     nMaxUndoCount=16;
     139        4148 :     mnUniqueCommentID=0;
     140        4148 :     pAktUndoGroup=NULL;
     141        4148 :     nUndoLevel=0;
     142        4148 :     mbUndoEnabled=true;
     143        4148 :     nProgressPercent=0;
     144        4148 :     nLoadVersion=0;
     145        4148 :     bExtColorTable=false;
     146        4148 :     mbChanged = false;
     147        4148 :     bInfoChanged=false;
     148        4148 :     bPagNumsDirty=false;
     149        4148 :     bMPgNumsDirty=false;
     150        4148 :     bPageNotValid=false;
     151        4148 :     bSavePortable=false;
     152        4148 :     bSaveCompressed=false;
     153        4148 :     bSaveNative=false;
     154        4148 :     bSwapGraphics=false;
     155        4148 :     nSwapGraphicsMode=SdrSwapGraphicsMode::DEFAULT;
     156        4148 :     bSaveOLEPreview=false;
     157        4148 :     bPasteResize=false;
     158        4148 :     bNoBitmapCaching=false;
     159        4148 :     bReadOnly=false;
     160        4148 :     nStreamNumberFormat=SvStreamEndian::BIG;
     161        4148 :     nDefaultTabulator=0;
     162        4148 :     mpNumberFormatter = NULL;
     163        4148 :     bTransparentTextFrames=false;
     164        4148 :     bStarDrawPreviewMode = false;
     165        4148 :     nStarDrawPreviewMasterPageNum = SDRPAGE_NOTFOUND;
     166        4148 :     mpForbiddenCharactersTable = NULL;
     167        4148 :     mbModelLocked = false;
     168        4148 :     mpOutlinerCache = NULL;
     169        4148 :     mbKernAsianPunctuation = false;
     170        4148 :     mbAddExtLeading = false;
     171        4148 :     mnHandoutPageCount = 0;
     172        4148 :     nReserveUInt6 = 0;
     173        4148 :     nReserveUInt7 = 0;
     174             : 
     175        4148 :     mbDisableTextEditUsesCommonUndoManager = false;
     176             : 
     177             :     mnCharCompressType =
     178             :         officecfg::Office::Common::AsianLayout::CompressCharacterDistance::
     179        4148 :         get();
     180             : 
     181             : #ifdef OSL_LITENDIAN
     182        4148 :     nStreamNumberFormat=SvStreamEndian::LITTLE;
     183             : #endif
     184        4148 :     bExtColorTable=bUseExtColorTable;
     185             : 
     186        4148 :     if ( pPool == NULL )
     187             :     {
     188        1190 :         pItemPool=new SdrItemPool(0L, bLoadRefCounts);
     189             :         // Outliner doesn't have its own Pool, so use the EditEngine's
     190        1190 :         SfxItemPool* pOutlPool=EditEngine::CreatePool( bLoadRefCounts );
     191             :         // OutlinerPool as SecondaryPool of SdrPool
     192        1190 :         pItemPool->SetSecondaryPool(pOutlPool);
     193             :         // remember that I created both pools myself
     194        1190 :         bMyPool=true;
     195             :     }
     196        4148 :     pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
     197             : 
     198             : // using static SdrEngineDefaults only if default SvxFontHeight item is not available
     199        4148 :     const SfxPoolItem* pPoolItem = pItemPool->GetPoolDefaultItem( EE_CHAR_FONTHEIGHT );
     200        4148 :     if ( pPoolItem )
     201        2958 :         nDefTextHgt = static_cast<const SvxFontHeightItem*>(pPoolItem)->GetHeight();
     202             :     else
     203        1190 :         nDefTextHgt = SdrEngineDefaults::GetFontHeight();
     204             : 
     205        4148 :     pItemPool->SetPoolDefaultItem( makeSdrTextWordWrapItem( false ) );
     206             : 
     207        4148 :     SetTextDefaults();
     208        4148 :     pLayerAdmin=new SdrLayerAdmin;
     209        4148 :     pLayerAdmin->SetModel(this);
     210        4148 :     ImpSetUIUnit();
     211             : 
     212             :     // can't create DrawOutliner OnDemand, because I can't get the Pool,
     213             :     // then (only from 302 onwards!)
     214        4148 :     pDrawOutliner = SdrMakeOutliner(OUTLINERMODE_TEXTOBJECT, *this);
     215        4148 :     ImpSetOutlinerDefaults(pDrawOutliner, true);
     216             : 
     217        4148 :     pHitTestOutliner = SdrMakeOutliner(OUTLINERMODE_TEXTOBJECT, *this);
     218        4148 :     ImpSetOutlinerDefaults(pHitTestOutliner, true);
     219             : 
     220        4148 :     ImpCreateTables();
     221        4148 : }
     222             : 
     223           0 : SdrModel::SdrModel():
     224             :     aReadDate( DateTime::EMPTY ),
     225             :     maMaPag(),
     226           0 :     maPages()
     227             : {
     228           0 :     ImpCtor(NULL, NULL, false, LOADREFCOUNTS);
     229           0 : }
     230             : 
     231           0 : SdrModel::SdrModel(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, bool bUseExtColorTable, bool bLoadRefCounts):
     232             :     aReadDate( DateTime::EMPTY ),
     233             :     maMaPag(),
     234           0 :     maPages()
     235             : {
     236           0 :     ImpCtor(pPool,pPers,bUseExtColorTable, bLoadRefCounts);
     237           0 : }
     238             : 
     239        4148 : SdrModel::SdrModel(const OUString& rPath, SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, bool bUseExtColorTable, bool bLoadRefCounts):
     240             :     aReadDate( DateTime::EMPTY ),
     241             :     maMaPag(),
     242             :     maPages(),
     243        4148 :     aTablePath(rPath)
     244             : {
     245        4148 :     ImpCtor(pPool,pPers,bUseExtColorTable, bLoadRefCounts);
     246        4148 : }
     247             : 
     248        8218 : SdrModel::~SdrModel()
     249             : {
     250             : 
     251        4109 :     mbInDestruction = true;
     252             : 
     253        4109 :     Broadcast(SdrHint(HINT_MODELCLEARED));
     254             : 
     255        4109 :     delete mpOutlinerCache;
     256             : 
     257        4109 :     ClearUndoBuffer();
     258             : #ifdef DBG_UTIL
     259             :     if(pAktUndoGroup)
     260             :     {
     261             :         OStringBuffer aStr("In the Dtor of the SdrModel there is an open Undo left: \"");
     262             :         aStr.append(OUStringToOString(pAktUndoGroup->GetComment(), osl_getThreadTextEncoding()))
     263             :             .append('\"');
     264             :         OSL_FAIL(aStr.getStr());
     265             :     }
     266             : #endif
     267        4109 :     delete pAktUndoGroup;
     268             : 
     269        4109 :     ClearModel(true);
     270             : 
     271        4109 :     delete pLayerAdmin;
     272             : 
     273             :     // Delete DrawOutliner only after deleting ItemPool, because ItemPool
     274             :     // references Items of the DrawOutliner!
     275        4109 :     delete pHitTestOutliner;
     276        4109 :     delete pDrawOutliner;
     277             : 
     278             :     // delete StyleSheetPool, derived classes should not do this since
     279             :     // the DrawingEngine may need it in its destructor
     280        4109 :     if( mxStyleSheetPool.is() )
     281             :     {
     282         315 :         Reference< XComponent > xComponent( dynamic_cast< cppu::OWeakObject* >( mxStyleSheetPool.get() ), UNO_QUERY );
     283         315 :         if( xComponent.is() ) try
     284             :         {
     285         315 :             xComponent->dispose();
     286             :         }
     287           0 :         catch( RuntimeException& )
     288             :         {
     289             :         }
     290         315 :         mxStyleSheetPool.clear();
     291             :     }
     292             : 
     293        4109 :     if (bMyPool)
     294             :     {
     295             :         // delete Pools if they're mine
     296        1160 :         SfxItemPool* pOutlPool=pItemPool->GetSecondaryPool();
     297        1160 :         SfxItemPool::Free(pItemPool);
     298             :         // OutlinerPool has to be deleted after deleting ItemPool, because
     299             :         // ItemPool contains SetItems that themselves reference Items from OutlinerPool.
     300        1160 :         SfxItemPool::Free(pOutlPool);
     301             :     }
     302             : 
     303        4109 :     if( mpForbiddenCharactersTable )
     304        3300 :         mpForbiddenCharactersTable->release();
     305             : 
     306        4109 :     delete mpNumberFormatter;
     307             : 
     308        4109 :     delete mpImpl->mpUndoFactory;
     309        4109 :     delete mpImpl;
     310        4109 : }
     311             : 
     312        3825 : void SdrModel::SetSwapGraphics( bool bSwap )
     313             : {
     314        3825 :     bSwapGraphics = bSwap;
     315        3825 : }
     316             : 
     317           2 : bool SdrModel::IsReadOnly() const
     318             : {
     319           2 :     return bReadOnly;
     320             : }
     321             : 
     322           0 : void SdrModel::SetReadOnly(bool bYes)
     323             : {
     324           0 :     bReadOnly=bYes;
     325           0 : }
     326             : 
     327             : 
     328             : 
     329        3804 : void SdrModel::SetMaxUndoActionCount(sal_uIntPtr nCount)
     330             : {
     331        3804 :     if (nCount<1) nCount=1;
     332        3804 :     nMaxUndoCount=nCount;
     333        3804 :     if (pUndoStack!=NULL) {
     334           0 :         while (pUndoStack->size()>nMaxUndoCount) {
     335           0 :             delete pUndoStack->back();
     336           0 :             pUndoStack->pop_back();
     337             :         }
     338             :     }
     339        3804 : }
     340             : 
     341        7913 : void SdrModel::ClearUndoBuffer()
     342             : {
     343        7913 :     if (pUndoStack!=NULL) {
     344           0 :         while (!pUndoStack->empty()) {
     345           0 :             delete pUndoStack->back();
     346           0 :             pUndoStack->pop_back();
     347             :         }
     348           0 :         delete pUndoStack;
     349           0 :         pUndoStack=NULL;
     350             :     }
     351        7913 :     if (pRedoStack!=NULL) {
     352           0 :         while (!pRedoStack->empty()) {
     353           0 :             delete pRedoStack->back();
     354           0 :             pRedoStack->pop_back();
     355             :         }
     356           0 :         delete pRedoStack;
     357           0 :         pRedoStack=NULL;
     358             :     }
     359        7913 : }
     360             : 
     361           0 : bool SdrModel::HasUndoActions() const
     362             : {
     363           0 :     return pUndoStack && !pUndoStack->empty();
     364             : }
     365             : 
     366           0 : bool SdrModel::HasRedoActions() const
     367             : {
     368           0 :     return pRedoStack && !pRedoStack->empty();
     369             : }
     370             : 
     371           0 : bool SdrModel::Undo()
     372             : {
     373           0 :     bool bRet = false;
     374           0 :     if( mpImpl->mpUndoManager )
     375             :     {
     376             :         OSL_FAIL("svx::SdrModel::Undo(), method not supported with application undo manager!");
     377             :     }
     378             :     else
     379             :     {
     380           0 :         SfxUndoAction* pDo = HasUndoActions() ? pUndoStack->front() : NULL;
     381           0 :         if(pDo!=NULL)
     382             :         {
     383           0 :             const bool bWasUndoEnabled = mbUndoEnabled;
     384           0 :             mbUndoEnabled = false;
     385           0 :             pDo->Undo();
     386           0 :             if(pRedoStack==NULL)
     387           0 :                 pRedoStack=new std::deque<SfxUndoAction*>;
     388           0 :             SfxUndoAction* p = pUndoStack->front();
     389           0 :             pUndoStack->pop_front();
     390           0 :             pRedoStack->push_front(p);
     391           0 :             mbUndoEnabled = bWasUndoEnabled;
     392             :         }
     393             :     }
     394           0 :     return bRet;
     395             : }
     396             : 
     397           0 : bool SdrModel::Redo()
     398             : {
     399           0 :     bool bRet = false;
     400           0 :     if( mpImpl->mpUndoManager )
     401             :     {
     402             :         OSL_FAIL("svx::SdrModel::Redo(), method not supported with application undo manager!");
     403             :     }
     404             :     else
     405             :     {
     406           0 :         SfxUndoAction* pDo = HasRedoActions() ? pRedoStack->front() : NULL;
     407           0 :         if(pDo!=NULL)
     408             :         {
     409           0 :             const bool bWasUndoEnabled = mbUndoEnabled;
     410           0 :             mbUndoEnabled = false;
     411           0 :             pDo->Redo();
     412           0 :             if(pUndoStack==NULL)
     413           0 :                 pUndoStack=new std::deque<SfxUndoAction*>;
     414           0 :             SfxUndoAction* p = pRedoStack->front();
     415           0 :             pRedoStack->pop_front();
     416           0 :             pUndoStack->push_front(p);
     417           0 :             mbUndoEnabled = bWasUndoEnabled;
     418             :         }
     419             :     }
     420           0 :     return bRet;
     421             : }
     422             : 
     423           0 : bool SdrModel::Repeat(SfxRepeatTarget& rView)
     424             : {
     425           0 :     bool bRet = false;
     426           0 :     if( mpImpl->mpUndoManager )
     427             :     {
     428             :         OSL_FAIL("svx::SdrModel::Redo(), method not supported with application undo manager!");
     429             :     }
     430             :     else
     431             :     {
     432           0 :         SfxUndoAction* pDo = HasUndoActions() ? pUndoStack->front() : NULL;
     433           0 :         if(pDo!=NULL)
     434             :         {
     435           0 :             if(pDo->CanRepeat(rView))
     436             :             {
     437           0 :                 pDo->Repeat(rView);
     438           0 :                 bRet = true;
     439             :             }
     440             :         }
     441             :     }
     442           0 :     return bRet;
     443             : }
     444             : 
     445        5701 : void SdrModel::ImpPostUndoAction(SdrUndoAction* pUndo)
     446             : {
     447             :     DBG_ASSERT( mpImpl->mpUndoManager == 0, "svx::SdrModel::ImpPostUndoAction(), method not supported with application undo manager!" );
     448        5701 :     if( IsUndoEnabled() )
     449             :     {
     450        5701 :         if (aUndoLink.IsSet())
     451             :         {
     452        5701 :             aUndoLink.Call(pUndo);
     453             :         }
     454             :         else
     455             :         {
     456           0 :             if (pUndoStack==NULL)
     457           0 :                 pUndoStack=new std::deque<SfxUndoAction*>;
     458           0 :             pUndoStack->push_front(pUndo);
     459           0 :             while (pUndoStack->size()>nMaxUndoCount)
     460             :             {
     461           0 :                 delete pUndoStack->back();
     462           0 :                 pUndoStack->pop_back();
     463             :             }
     464           0 :             if (pRedoStack!=NULL)
     465           0 :                 pRedoStack->clear();
     466             :         }
     467             :     }
     468             :     else
     469             :     {
     470           0 :         delete pUndo;
     471             :     }
     472        5701 : }
     473             : 
     474         136 : void SdrModel::BegUndo()
     475             : {
     476         136 :     if( mpImpl->mpUndoManager )
     477             :     {
     478           6 :         const OUString aEmpty;
     479           6 :         mpImpl->mpUndoManager->EnterListAction(aEmpty,aEmpty);
     480           6 :         nUndoLevel++;
     481             :     }
     482         130 :     else if( IsUndoEnabled() )
     483             :     {
     484         130 :         if(pAktUndoGroup==NULL)
     485             :         {
     486         129 :             pAktUndoGroup = new SdrUndoGroup(*this);
     487         129 :             nUndoLevel=1;
     488             :         }
     489             :         else
     490             :         {
     491           1 :             nUndoLevel++;
     492             :         }
     493             :     }
     494         136 : }
     495             : 
     496        1163 : void SdrModel::BegUndo(const OUString& rComment)
     497             : {
     498        1163 :     if( mpImpl->mpUndoManager )
     499             :     {
     500        1043 :         const OUString aEmpty;
     501        1043 :         mpImpl->mpUndoManager->EnterListAction( rComment, aEmpty );
     502        1043 :         nUndoLevel++;
     503             :     }
     504         120 :     else if( IsUndoEnabled() )
     505             :     {
     506         120 :         BegUndo();
     507         120 :         if (nUndoLevel==1)
     508             :         {
     509         120 :             pAktUndoGroup->SetComment(rComment);
     510             :         }
     511             :     }
     512        1163 : }
     513             : 
     514         799 : void SdrModel::BegUndo(const OUString& rComment, const OUString& rObjDescr, SdrRepeatFunc eFunc)
     515             : {
     516         799 :     if( mpImpl->mpUndoManager )
     517             :     {
     518         790 :         OUString aComment(rComment);
     519         790 :         if( !aComment.isEmpty() && !rObjDescr.isEmpty() )
     520             :         {
     521         775 :             aComment = aComment.replaceFirst("%1", rObjDescr);
     522             :         }
     523        1580 :         const OUString aEmpty;
     524         790 :         mpImpl->mpUndoManager->EnterListAction( aComment,aEmpty );
     525        1580 :         nUndoLevel++;
     526             :     }
     527           9 :     else if( IsUndoEnabled() )
     528             :     {
     529           9 :         BegUndo();
     530           9 :         if (nUndoLevel==1)
     531             :         {
     532           9 :             pAktUndoGroup->SetComment(rComment);
     533           9 :             pAktUndoGroup->SetObjDescription(rObjDescr);
     534           9 :             pAktUndoGroup->SetRepeatFunction(eFunc);
     535             :         }
     536             :     }
     537         799 : }
     538             : 
     539        1969 : void SdrModel::EndUndo()
     540             : {
     541             :     DBG_ASSERT(nUndoLevel!=0,"SdrModel::EndUndo(): UndoLevel is already 0!");
     542        1969 :     if( mpImpl->mpUndoManager )
     543             :     {
     544        1839 :         if( nUndoLevel )
     545             :         {
     546        1839 :             nUndoLevel--;
     547        1839 :             mpImpl->mpUndoManager->LeaveListAction();
     548             :         }
     549             :     }
     550             :     else
     551             :     {
     552         130 :         if(pAktUndoGroup!=NULL && IsUndoEnabled())
     553             :         {
     554         130 :             nUndoLevel--;
     555         130 :             if(nUndoLevel==0)
     556             :             {
     557         129 :                 if(pAktUndoGroup->GetActionCount()!=0)
     558             :                 {
     559         127 :                     SdrUndoAction* pUndo=pAktUndoGroup;
     560         127 :                     pAktUndoGroup=NULL;
     561         127 :                     ImpPostUndoAction(pUndo);
     562             :                 }
     563             :                 else
     564             :                 {
     565             :                     // was empty
     566           2 :                     delete pAktUndoGroup;
     567           2 :                     pAktUndoGroup=NULL;
     568             :                 }
     569             :             }
     570             :         }
     571             :     }
     572        1969 : }
     573             : 
     574           0 : void SdrModel::SetUndoComment(const OUString& rComment)
     575             : {
     576             :     DBG_ASSERT(nUndoLevel!=0,"SdrModel::SetUndoComment(): UndoLevel is already 0!");
     577             : 
     578           0 :     if( mpImpl->mpUndoManager )
     579             :     {
     580             :         OSL_FAIL("svx::SdrModel::SetUndoComment(), method not supported with application undo manager!" );
     581             :     }
     582           0 :     else if( IsUndoEnabled() )
     583             :     {
     584           0 :         if(nUndoLevel==1)
     585             :         {
     586           0 :             pAktUndoGroup->SetComment(rComment);
     587             :         }
     588             :     }
     589           0 : }
     590             : 
     591          17 : void SdrModel::SetUndoComment(const OUString& rComment, const OUString& rObjDescr)
     592             : {
     593             :     DBG_ASSERT(nUndoLevel!=0,"SdrModel::SetUndoComment(): UndoLevel is already 0!");
     594          17 :     if( mpImpl->mpUndoManager )
     595             :     {
     596             :         OSL_FAIL("svx::SdrModel::SetUndoComment(), method not supported with application undo manager!" );
     597             :     }
     598             :     else
     599             :     {
     600           2 :         if (nUndoLevel==1)
     601             :         {
     602           2 :             pAktUndoGroup->SetComment(rComment);
     603           2 :             pAktUndoGroup->SetObjDescription(rObjDescr);
     604             :         }
     605             :     }
     606          17 : }
     607             : 
     608        8371 : void SdrModel::AddUndo(SdrUndoAction* pUndo)
     609             : {
     610        8371 :     if( mpImpl->mpUndoManager )
     611             :     {
     612        2650 :         mpImpl->mpUndoManager->AddUndoAction( pUndo );
     613             :     }
     614        5721 :     else if( !IsUndoEnabled() )
     615             :     {
     616           0 :         delete pUndo;
     617             :     }
     618             :     else
     619             :     {
     620        5721 :         if (pAktUndoGroup!=NULL)
     621             :         {
     622         147 :             pAktUndoGroup->AddAction(pUndo);
     623             :         }
     624             :         else
     625             :         {
     626        5574 :             ImpPostUndoAction(pUndo);
     627             :         }
     628             :     }
     629        8371 : }
     630             : 
     631      107897 : void SdrModel::EnableUndo( bool bEnable )
     632             : {
     633      107897 :     if( mpImpl->mpUndoManager )
     634             :     {
     635         112 :         mpImpl->mpUndoManager->EnableUndo( bEnable );
     636             :     }
     637             :     else
     638             :     {
     639      107785 :         mbUndoEnabled = bEnable;
     640             :     }
     641      107897 : }
     642             : 
     643       67590 : bool SdrModel::IsUndoEnabled() const
     644             : {
     645       67590 :     if( mpImpl->mpUndoManager )
     646             :     {
     647        3506 :         return mpImpl->mpUndoManager->IsUndoEnabled();
     648             :     }
     649             :     else
     650             :     {
     651       64084 :         return mbUndoEnabled;
     652             :     }
     653             : }
     654             : 
     655        4148 : void SdrModel::ImpCreateTables()
     656             : {
     657       29036 :     for( int i = 0; i < XPROPERTY_LIST_COUNT; i++ )
     658             :     {
     659       24888 :         if( !bExtColorTable || i != XCOLOR_LIST )
     660       42762 :             maProperties[i] = XPropertyList::CreatePropertyList (
     661       21381 :                 (XPropertyListType) i, aTablePath, ""/*TODO?*/ );
     662             :     }
     663        4148 : }
     664             : 
     665        8453 : void SdrModel::ClearModel(bool bCalledFromDestructor)
     666             : {
     667        8453 :     if(bCalledFromDestructor)
     668             :     {
     669        8453 :         mbInDestruction = true;
     670             :     }
     671             : 
     672             :     sal_Int32 i;
     673             :     // delete all drawing pages
     674        8453 :     sal_Int32 nCount=GetPageCount();
     675       13561 :     for (i=nCount-1; i>=0; i--)
     676             :     {
     677        5108 :         DeletePage( (sal_uInt16)i );
     678             :     }
     679        8453 :     maPages.clear();
     680        8453 :     PageListChanged();
     681             : 
     682             :     // delete all Masterpages
     683        8453 :     nCount=GetMasterPageCount();
     684        9220 :     for(i=nCount-1; i>=0; i--)
     685             :     {
     686         767 :         DeleteMasterPage( (sal_uInt16)i );
     687             :     }
     688        8453 :     maMaPag.clear();
     689        8453 :     MasterPageListChanged();
     690             : 
     691        8453 :     pLayerAdmin->ClearLayer();
     692        8453 : }
     693             : 
     694           0 : SdrModel* SdrModel::AllocModel() const
     695             : {
     696           0 :     SdrModel* pModel=new SdrModel;
     697           0 :     pModel->SetScaleUnit(eObjUnit,aObjUnit);
     698           0 :     return pModel;
     699             : }
     700             : 
     701           0 : SdrPage* SdrModel::AllocPage(bool bMasterPage)
     702             : {
     703           0 :     return new SdrPage(*this,bMasterPage);
     704             : }
     705             : 
     706        4148 : void SdrModel::SetTextDefaults() const
     707             : {
     708        4148 :     SetTextDefaults( pItemPool, nDefTextHgt );
     709        4148 : }
     710             : 
     711        4666 : void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_uIntPtr nDefTextHgt )
     712             : {
     713             :     // set application-language specific dynamic pool language defaults
     714        4666 :     SvxFontItem aSvxFontItem( EE_CHAR_FONTINFO) ;
     715        9332 :     SvxFontItem aSvxFontItemCJK(EE_CHAR_FONTINFO_CJK);
     716        9332 :     SvxFontItem aSvxFontItemCTL(EE_CHAR_FONTINFO_CTL);
     717        4666 :     sal_uInt16 nLanguage(Application::GetSettings().GetLanguageTag().getLanguageType());
     718             : 
     719             :     // get DEFAULTFONT_LATIN_TEXT and set at pool as dynamic default
     720        9332 :     vcl::Font aFont(OutputDevice::GetDefaultFont(DefaultFontType::LATIN_TEXT, nLanguage, GetDefaultFontFlags::OnlyOne, 0));
     721        4666 :     aSvxFontItem.SetFamily(aFont.GetFamily());
     722        4666 :     aSvxFontItem.SetFamilyName(aFont.GetName());
     723        4666 :     aSvxFontItem.SetStyleName(OUString());
     724        4666 :     aSvxFontItem.SetPitch( aFont.GetPitch());
     725        4666 :     aSvxFontItem.SetCharSet( aFont.GetCharSet() );
     726        4666 :     pItemPool->SetPoolDefaultItem(aSvxFontItem);
     727             : 
     728             :     // get DEFAULTFONT_CJK_TEXT and set at pool as dynamic default
     729        9332 :     vcl::Font aFontCJK(OutputDevice::GetDefaultFont(DefaultFontType::CJK_TEXT, nLanguage, GetDefaultFontFlags::OnlyOne, 0));
     730        4666 :     aSvxFontItemCJK.SetFamily( aFontCJK.GetFamily());
     731        4666 :     aSvxFontItemCJK.SetFamilyName(aFontCJK.GetName());
     732        4666 :     aSvxFontItemCJK.SetStyleName(OUString());
     733        4666 :     aSvxFontItemCJK.SetPitch( aFontCJK.GetPitch());
     734        4666 :     aSvxFontItemCJK.SetCharSet( aFontCJK.GetCharSet());
     735        4666 :     pItemPool->SetPoolDefaultItem(aSvxFontItemCJK);
     736             : 
     737             :     // get DEFAULTFONT_CTL_TEXT and set at pool as dynamic default
     738        9332 :     vcl::Font aFontCTL(OutputDevice::GetDefaultFont(DefaultFontType::CTL_TEXT, nLanguage, GetDefaultFontFlags::OnlyOne, 0));
     739        4666 :     aSvxFontItemCTL.SetFamily(aFontCTL.GetFamily());
     740        4666 :     aSvxFontItemCTL.SetFamilyName(aFontCTL.GetName());
     741        4666 :     aSvxFontItemCTL.SetStyleName(OUString());
     742        4666 :     aSvxFontItemCTL.SetPitch( aFontCTL.GetPitch() );
     743        4666 :     aSvxFontItemCTL.SetCharSet( aFontCTL.GetCharSet());
     744        4666 :     pItemPool->SetPoolDefaultItem(aSvxFontItemCTL);
     745             : 
     746             :     // set dynamic FontHeight defaults
     747        4666 :     pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT ) );
     748        4666 :     pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CJK ) );
     749        4666 :     pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CTL ) );
     750             : 
     751             :     // set FontColor defaults
     752        9332 :     pItemPool->SetPoolDefaultItem( SvxColorItem(SdrEngineDefaults::GetFontColor(), EE_CHAR_COLOR) );
     753        4666 : }
     754             : 
     755      582109 : SdrOutliner& SdrModel::GetDrawOutliner(const SdrTextObj* pObj) const
     756             : {
     757      582109 :     pDrawOutliner->SetTextObj(pObj);
     758      582109 :     return *pDrawOutliner;
     759             : }
     760             : 
     761         652 : const SdrTextObj* SdrModel::GetFormattingTextObj() const
     762             : {
     763         652 :     if (pDrawOutliner!=NULL) {
     764         652 :         return pDrawOutliner->GetTextObj();
     765             :     }
     766           0 :     return NULL;
     767             : }
     768             : 
     769       36570 : void SdrModel::ImpSetOutlinerDefaults( SdrOutliner* pOutliner, bool bInit )
     770             : {
     771             :     // Initialization of the Outliners for drawing text and HitTest
     772       36570 :     if( bInit )
     773             :     {
     774        8296 :         pOutliner->EraseVirtualDevice();
     775        8296 :         pOutliner->SetUpdateMode(false);
     776        8296 :         pOutliner->SetEditTextObjectPool(pItemPool);
     777        8296 :         pOutliner->SetDefTab(nDefaultTabulator);
     778             :     }
     779             : 
     780       36570 :     pOutliner->SetRefDevice(GetRefDevice());
     781       36570 :     Outliner::SetForbiddenCharsTable(GetForbiddenCharsTable());
     782       36570 :     pOutliner->SetAsianCompressionMode( mnCharCompressType );
     783       36570 :     pOutliner->SetKernAsianPunctuation( IsKernAsianPunctuation() );
     784       36570 :     pOutliner->SetAddExtLeading( IsAddExtLeading() );
     785             : 
     786       36570 :     if ( !GetRefDevice() )
     787             :     {
     788       26686 :         MapMode aMapMode(eObjUnit, Point(0,0), aObjUnit, aObjUnit);
     789       26686 :         pOutliner->SetRefMapMode(aMapMode);
     790             :     }
     791       36570 : }
     792             : 
     793        4244 : void SdrModel::SetRefDevice(OutputDevice* pDev)
     794             : {
     795        4244 :     pRefOutDev=pDev;
     796        4244 :     ImpSetOutlinerDefaults( pDrawOutliner );
     797        4244 :     ImpSetOutlinerDefaults( pHitTestOutliner );
     798        4244 :     RefDeviceChanged();
     799        4244 : }
     800             : 
     801          19 : void SdrModel::setTiledRendering(bool bTiledRendering)
     802             : {
     803          19 :     mbTiledRendering = bTiledRendering;
     804          19 : }
     805             : 
     806      437847 : bool SdrModel::isTiledRendering() const
     807             : {
     808      437847 :     return mbTiledRendering;
     809             : }
     810             : 
     811           6 : void SdrModel::registerLibreOfficeKitCallback(LibreOfficeKitCallback pCallback, void* pData)
     812             : {
     813           6 :     mpLibreOfficeKitCallback = pCallback;
     814           6 :     mpLibreOfficeKitData = pData;
     815           6 : }
     816             : 
     817       70903 : void SdrModel::libreOfficeKitCallback(int nType, const char* pPayload) const
     818             : {
     819       70903 :     if (mpLibreOfficeKitCallback)
     820         290 :         mpLibreOfficeKitCallback(nType, pPayload, mpLibreOfficeKitData);
     821       70903 : }
     822             : 
     823           9 : LibreOfficeKitCallback SdrModel::getLibreOfficeKitCallback() const
     824             : {
     825           9 :     return mpLibreOfficeKitCallback;
     826             : }
     827             : 
     828           9 : void* SdrModel::getLibreOfficeKitData() const
     829             : {
     830           9 :     return mpLibreOfficeKitData;
     831             : }
     832             : 
     833        8765 : void SdrModel::ImpReformatAllTextObjects()
     834             : {
     835        8765 :     if( isLocked() )
     836        8892 :         return;
     837             : 
     838        8638 :     sal_uInt16 nCount=GetMasterPageCount();
     839             :     sal_uInt16 nNum;
     840        8638 :     for (nNum=0; nNum<nCount; nNum++) {
     841           0 :         GetMasterPage(nNum)->ReformatAllTextObjects();
     842             :     }
     843        8638 :     nCount=GetPageCount();
     844       13050 :     for (nNum=0; nNum<nCount; nNum++) {
     845        4412 :         GetPage(nNum)->ReformatAllTextObjects();
     846             :     }
     847             : }
     848             : 
     849             : /*  steps over all available pages and sends notify messages to
     850             :     all edge objects that are connected to other objects so that
     851             :     they may reposition themselves
     852             : */
     853        1897 : void SdrModel::ImpReformatAllEdgeObjects()
     854             : {
     855        1897 :     if( isLocked() )
     856        1897 :         return;
     857             : 
     858        1897 :     sal_uInt16 nCount=GetMasterPageCount();
     859             :     sal_uInt16 nNum;
     860        2652 :     for (nNum=0; nNum<nCount; nNum++)
     861             :     {
     862         755 :         GetMasterPage(nNum)->ReformatAllEdgeObjects();
     863             :     }
     864        1897 :     nCount=GetPageCount();
     865        4505 :     for (nNum=0; nNum<nCount; nNum++)
     866             :     {
     867        2608 :         GetPage(nNum)->ReformatAllEdgeObjects();
     868             :     }
     869             : }
     870             : 
     871          49 : uno::Reference<embed::XStorage> SdrModel::GetDocumentStorage() const
     872             : {
     873             :     uno::Reference<document::XStorageBasedDocument> const xSBD(
     874          49 :             const_cast<SdrModel*>(this)->getUnoModel(), uno::UNO_QUERY);
     875          49 :     if (!xSBD.is())
     876             :     {
     877             :         SAL_WARN("svx", "no UNO model");
     878           0 :         return 0;
     879             :     }
     880          49 :     return xSBD->getDocumentStorage();
     881             : }
     882             : 
     883             : uno::Reference<io::XInputStream>
     884          60 : SdrModel::GetDocumentStream( OUString const& rURL,
     885             :                 ::comphelper::LifecycleProxy & rProxy) const
     886             : {
     887          60 :     uno::Reference<embed::XStorage> const xStorage(GetDocumentStorage());
     888          60 :     if (!xStorage.is())
     889             :     {
     890             :         SAL_WARN("svx", "no storage?");
     891           0 :         return 0;
     892             :     }
     893             :     try {
     894             :         uno::Reference<io::XStream> const xStream(
     895             :             ::comphelper::OStorageHelper::GetStreamAtPackageURL(
     896          60 :                 xStorage, rURL, embed::ElementModes::READ, rProxy));
     897          57 :         return (xStream.is()) ? xStream->getInputStream() : 0;
     898             :     }
     899           0 :     catch (container::NoSuchElementException const&)
     900             :     {
     901             :         SAL_INFO("svx", "not found");
     902             :     }
     903           3 :     catch (uno::Exception const& e)
     904             :     {
     905             :         SAL_WARN("svx", "exception: '" << e.Message << "'");
     906             :     }
     907           3 :     return 0;
     908             : }
     909             : 
     910             : // convert template attributes from the string into "hard" attributes
     911           0 : void SdrModel::BurnInStyleSheetAttributes()
     912             : {
     913           0 :     sal_uInt16 nCount=GetMasterPageCount();
     914             :     sal_uInt16 nNum;
     915           0 :     for (nNum=0; nNum<nCount; nNum++) {
     916           0 :         GetMasterPage(nNum)->BurnInStyleSheetAttributes();
     917             :     }
     918           0 :     nCount=GetPageCount();
     919           0 :     for (nNum=0; nNum<nCount; nNum++) {
     920           0 :         GetPage(nNum)->BurnInStyleSheetAttributes();
     921             :     }
     922           0 : }
     923             : 
     924        4244 : void SdrModel::RefDeviceChanged()
     925             : {
     926        4244 :     Broadcast(SdrHint(HINT_REFDEVICECHG));
     927        4244 :     ImpReformatAllTextObjects();
     928        4244 : }
     929             : 
     930         641 : void SdrModel::SetDefaultFontHeight(sal_uIntPtr nVal)
     931             : {
     932         641 :     if (nVal!=nDefTextHgt) {
     933         321 :         nDefTextHgt=nVal;
     934         321 :         Broadcast(SdrHint(HINT_DEFFONTHGTCHG));
     935         321 :         ImpReformatAllTextObjects();
     936             :     }
     937         641 : }
     938             : 
     939         913 : void SdrModel::SetDefaultTabulator(sal_uInt16 nVal)
     940             : {
     941         913 :     if (nDefaultTabulator!=nVal) {
     942         880 :         nDefaultTabulator=nVal;
     943         880 :         Outliner& rOutliner=GetDrawOutliner();
     944         880 :         rOutliner.SetDefTab(nVal);
     945         880 :         Broadcast(SdrHint(HINT_DEFAULTTABCHG));
     946         880 :         ImpReformatAllTextObjects();
     947             :     }
     948         913 : }
     949             : 
     950        7426 : void SdrModel::ImpSetUIUnit()
     951             : {
     952        7426 :     if(0 == aUIScale.GetNumerator() || 0 == aUIScale.GetDenominator())
     953             :     {
     954           0 :         aUIScale = Fraction(1,1);
     955             :     }
     956             : 
     957             :     // set start values
     958        7426 :     nUIUnitKomma = 0;
     959        7426 :     sal_Int64 nMul(1);
     960        7426 :     sal_Int64 nDiv(1);
     961             : 
     962             :     // normalize on meters resp. inch
     963        7426 :     switch (eObjUnit)
     964             :     {
     965        4468 :         case MAP_100TH_MM   : nUIUnitKomma+=5; break;
     966           0 :         case MAP_10TH_MM    : nUIUnitKomma+=4; break;
     967           0 :         case MAP_MM         : nUIUnitKomma+=3; break;
     968           0 :         case MAP_CM         : nUIUnitKomma+=2; break;
     969           0 :         case MAP_1000TH_INCH: nUIUnitKomma+=3; break;
     970           0 :         case MAP_100TH_INCH : nUIUnitKomma+=2; break;
     971           0 :         case MAP_10TH_INCH  : nUIUnitKomma+=1; break;
     972           0 :         case MAP_INCH       : nUIUnitKomma+=0; break;
     973           0 :         case MAP_POINT      : nDiv=72;     break;          // 1Pt   = 1/72"
     974        2958 :         case MAP_TWIP       : nDiv=144; nUIUnitKomma++; break; // 1Twip = 1/1440"
     975           0 :         case MAP_PIXEL      : break;
     976           0 :         case MAP_SYSFONT    : break;
     977           0 :         case MAP_APPFONT    : break;
     978           0 :         case MAP_RELATIVE   : break;
     979           0 :         default: break;
     980             :     } // switch
     981             : 
     982             :     // 1 mile    =  8 furlong = 63.360" = 1.609.344,0mm
     983             :     // 1 furlong = 10 chains  =  7.920" =   201.168,0mm
     984             :     // 1 chain   =  4 poles   =    792" =    20.116,8mm
     985             :     // 1 pole    =  5 1/2 yd  =    198" =     5.029,2mm
     986             :     // 1 yd      =  3 ft      =     36" =       914,4mm
     987             :     // 1 ft      = 12 "       =      1" =       304,8mm
     988        7426 :     switch (eUIUnit)
     989             :     {
     990           0 :         case FUNIT_NONE   : break;
     991             :         // metric
     992           0 :         case FUNIT_100TH_MM: nUIUnitKomma-=5; break;
     993        7106 :         case FUNIT_MM     : nUIUnitKomma-=3; break;
     994           0 :         case FUNIT_CM     : nUIUnitKomma-=2; break;
     995           0 :         case FUNIT_M      : nUIUnitKomma+=0; break;
     996           0 :         case FUNIT_KM     : nUIUnitKomma+=3; break;
     997             :         // Inch
     998           0 :         case FUNIT_TWIP   : nMul=144; nUIUnitKomma--;  break;  // 1Twip = 1/1440"
     999           0 :         case FUNIT_POINT  : nMul=72;     break;            // 1Pt   = 1/72"
    1000           0 :         case FUNIT_PICA   : nMul=6;      break;            // 1Pica = 1/6"
    1001         320 :         case FUNIT_INCH   : break;                         // 1"    = 1"
    1002           0 :         case FUNIT_FOOT   : nDiv*=12;    break;            // 1Ft   = 12"
    1003           0 :         case FUNIT_MILE   : nDiv*=6336; nUIUnitKomma++; break; // 1mile = 63360"
    1004             :         // other
    1005           0 :         case FUNIT_CUSTOM : break;
    1006           0 :         case FUNIT_PERCENT: nUIUnitKomma+=2; break;
    1007             :         // TODO: Add code to handle the following if needed (added to remove warning)
    1008           0 :         case FUNIT_CHAR   : break;
    1009           0 :         case FUNIT_LINE   : break;
    1010           0 :         case FUNIT_PIXEL  : break;
    1011           0 :         case FUNIT_DEGREE : break;
    1012           0 :         case FUNIT_SECOND : break;
    1013           0 :         case FUNIT_MILLISECOND : break;
    1014             :     } // switch
    1015             : 
    1016             :     // check if mapping is from metric to inch and adapt
    1017        7426 :     const bool bMapInch(IsInch(eObjUnit));
    1018        7426 :     const bool bUIMetr(IsMetric(eUIUnit));
    1019             : 
    1020        7426 :     if (bMapInch && bUIMetr)
    1021             :     {
    1022        2958 :         nUIUnitKomma += 4;
    1023        2958 :         nMul *= 254;
    1024             :     }
    1025             : 
    1026             :     // check if mapping is from inch to metric and adapt
    1027        7426 :     const bool bMapMetr(IsMetric(eObjUnit));
    1028        7426 :     const bool bUIInch(IsInch(eUIUnit));
    1029             : 
    1030        7426 :     if (bMapMetr && bUIInch)
    1031             :     {
    1032         320 :         nUIUnitKomma -= 4;
    1033         320 :         nDiv *= 254;
    1034             :     }
    1035             : 
    1036             :     // use temporary fraction for reduction (fallback to 32bit here),
    1037             :     // may need to be changed in the future, too
    1038        7426 :     if(1 != nMul || 1 != nDiv)
    1039             :     {
    1040        3278 :         const Fraction aTemp(static_cast< long >(nMul), static_cast< long >(nDiv));
    1041        3278 :         nMul = aTemp.GetNumerator();
    1042        3278 :         nDiv = aTemp.GetDenominator();
    1043             :     }
    1044             : 
    1045             :     // #i89872# take Unit of Measurement into account
    1046        7426 :     if(1 != aUIScale.GetDenominator() || 1 != aUIScale.GetNumerator())
    1047             :     {
    1048             :         // divide by UIScale
    1049           0 :         nMul *= aUIScale.GetDenominator();
    1050           0 :         nDiv *= aUIScale.GetNumerator();
    1051             :     }
    1052             : 
    1053             :     // shorten trailing zeros for dividend
    1054       14852 :     while(0 == (nMul % 10))
    1055             :     {
    1056           0 :         nUIUnitKomma--;
    1057           0 :         nMul /= 10;
    1058             :     }
    1059             : 
    1060             :     // shorten trailing zeros for divisor
    1061       14852 :     while(0 == (nDiv % 10))
    1062             :     {
    1063           0 :         nUIUnitKomma++;
    1064           0 :         nDiv /= 10;
    1065             :     }
    1066             : 
    1067             :     // end preparations, set member values
    1068        7426 :     aUIUnitFact = Fraction(sal_Int32(nMul), sal_Int32(nDiv));
    1069        7426 :     bUIOnlyKomma = (nMul == nDiv);
    1070        7426 :     TakeUnitStr(eUIUnit, aUIUnitStr);
    1071        7426 : }
    1072             : 
    1073           0 : void SdrModel::SetScaleUnit(MapUnit eMap, const Fraction& rFrac)
    1074             : {
    1075           0 :     if (eObjUnit!=eMap || aObjUnit!=rFrac) {
    1076           0 :         eObjUnit=eMap;
    1077           0 :         aObjUnit=rFrac;
    1078           0 :         pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
    1079           0 :         ImpSetUIUnit();
    1080           0 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1081           0 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1082           0 :         ImpReformatAllTextObjects();
    1083             :     }
    1084           0 : }
    1085             : 
    1086        4148 : void SdrModel::SetScaleUnit(MapUnit eMap)
    1087             : {
    1088        4148 :     if (eObjUnit!=eMap) {
    1089        2958 :         eObjUnit=eMap;
    1090        2958 :         pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
    1091        2958 :         ImpSetUIUnit();
    1092        2958 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1093        2958 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1094        2958 :         ImpReformatAllTextObjects();
    1095             :     }
    1096        4148 : }
    1097             : 
    1098         641 : void SdrModel::SetScaleFraction(const Fraction& rFrac)
    1099             : {
    1100         641 :     if (aObjUnit!=rFrac) {
    1101           0 :         aObjUnit=rFrac;
    1102           0 :         ImpSetUIUnit();
    1103           0 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1104           0 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1105           0 :         ImpReformatAllTextObjects();
    1106             :     }
    1107         641 : }
    1108             : 
    1109           1 : void SdrModel::SetUIUnit(FieldUnit eUnit)
    1110             : {
    1111           1 :     if (eUIUnit!=eUnit) {
    1112           0 :         eUIUnit=eUnit;
    1113           0 :         ImpSetUIUnit();
    1114           0 :         ImpReformatAllTextObjects();
    1115             :     }
    1116           1 : }
    1117             : 
    1118           2 : void SdrModel::SetUIScale(const Fraction& rScale)
    1119             : {
    1120           2 :     if (aUIScale!=rScale) {
    1121           0 :         aUIScale=rScale;
    1122           0 :         ImpSetUIUnit();
    1123           0 :         ImpReformatAllTextObjects();
    1124             :     }
    1125           2 : }
    1126             : 
    1127         320 : void SdrModel::SetUIUnit(FieldUnit eUnit, const Fraction& rScale)
    1128             : {
    1129         320 :     if (eUIUnit!=eUnit || aUIScale!=rScale) {
    1130         320 :         eUIUnit=eUnit;
    1131         320 :         aUIScale=rScale;
    1132         320 :         ImpSetUIUnit();
    1133         320 :         ImpReformatAllTextObjects();
    1134             :     }
    1135         320 : }
    1136             : 
    1137        7543 : void SdrModel::TakeUnitStr(FieldUnit eUnit, OUString& rStr)
    1138             : {
    1139        7543 :     switch(eUnit)
    1140             :     {
    1141             :         default:
    1142             :         case FUNIT_NONE   :
    1143             :         case FUNIT_CUSTOM :
    1144             :         {
    1145           0 :             rStr.clear();
    1146           0 :             break;
    1147             :         }
    1148             :         case FUNIT_100TH_MM:
    1149             :         {
    1150           0 :             rStr = "/100mm";
    1151           0 :             break;
    1152             :         }
    1153             :         case FUNIT_MM     :
    1154             :         {
    1155        7223 :             rStr = "mm";
    1156        7223 :             break;
    1157             :         }
    1158             :         case FUNIT_CM     :
    1159             :         {
    1160           0 :             rStr = "cm";
    1161           0 :             break;
    1162             :         }
    1163             :         case FUNIT_M      :
    1164             :         {
    1165           0 :             rStr = "m";
    1166           0 :             break;
    1167             :         }
    1168             :         case FUNIT_KM     :
    1169             :         {
    1170           0 :             rStr ="km";
    1171           0 :             break;
    1172             :         }
    1173             :         case FUNIT_TWIP   :
    1174             :         {
    1175           0 :             rStr = "twip";
    1176           0 :             break;
    1177             :         }
    1178             :         case FUNIT_POINT  :
    1179             :         {
    1180           0 :             rStr = "pt";
    1181           0 :             break;
    1182             :         }
    1183             :         case FUNIT_PICA   :
    1184             :         {
    1185           0 :             rStr = "pica";
    1186           0 :             break;
    1187             :         }
    1188             :         case FUNIT_INCH   :
    1189             :         {
    1190         320 :             rStr = "\"";
    1191         320 :             break;
    1192             :         }
    1193             :         case FUNIT_FOOT   :
    1194             :         {
    1195           0 :             rStr = "ft";
    1196           0 :             break;
    1197             :         }
    1198             :         case FUNIT_MILE   :
    1199             :         {
    1200           0 :             rStr = "mile(s)";
    1201           0 :             break;
    1202             :         }
    1203             :         case FUNIT_PERCENT:
    1204             :         {
    1205           0 :             rStr = "%";
    1206           0 :             break;
    1207             :         }
    1208             :     }
    1209        7543 : }
    1210             : 
    1211         117 : void SdrModel::TakeMetricStr(long nVal, OUString& rStr, bool bNoUnitChars, sal_Int32 nNumDigits) const
    1212             : {
    1213             :     // #i22167#
    1214             :     // change to double precision usage to not lose decimal places
    1215         117 :     const bool bNegative(nVal < 0L);
    1216         117 :     SvtSysLocale aSysLoc;
    1217         117 :     const LocaleDataWrapper& rLoc(aSysLoc.GetLocaleData());
    1218         117 :     double fLocalValue(double(nVal) * double(aUIUnitFact));
    1219             : 
    1220         117 :     if(bNegative)
    1221             :     {
    1222           0 :         fLocalValue = -fLocalValue;
    1223             :     }
    1224             : 
    1225         117 :     if( -1 == nNumDigits )
    1226             :     {
    1227           0 :         nNumDigits = LocaleDataWrapper::getNumDigits();
    1228             :     }
    1229             : 
    1230         117 :     sal_Int32 nKomma(nUIUnitKomma);
    1231             : 
    1232         117 :     if(nKomma > nNumDigits)
    1233             :     {
    1234           0 :         const sal_Int32 nDiff(nKomma - nNumDigits);
    1235           0 :         const double fFactor(pow(10.0, static_cast<const int>(nDiff)));
    1236             : 
    1237           0 :         fLocalValue /= fFactor;
    1238           0 :         nKomma = nNumDigits;
    1239             :     }
    1240         117 :     else if(nKomma < nNumDigits)
    1241             :     {
    1242           0 :         const sal_Int32 nDiff(nNumDigits - nKomma);
    1243           0 :         const double fFactor(pow(10.0, static_cast<const int>(nDiff)));
    1244             : 
    1245           0 :         fLocalValue *= fFactor;
    1246           0 :         nKomma = nNumDigits;
    1247             :     }
    1248             : 
    1249         234 :     OUStringBuffer aBuf;
    1250         117 :     aBuf.append(static_cast<sal_Int32>(fLocalValue + 0.5));
    1251             : 
    1252         117 :     if(nKomma < 0)
    1253             :     {
    1254             :         // negative nKomma (decimal point) means: add zeros
    1255           0 :         sal_Int32 nCount(-nKomma);
    1256             : 
    1257           0 :         for(sal_Int32 i=0; i<nCount; i++)
    1258           0 :             aBuf.append('0');
    1259             : 
    1260           0 :         nKomma = 0;
    1261             :     }
    1262             : 
    1263             :     // the second condition needs to be <= since inside this loop
    1264             :     // also the leading zero is inserted.
    1265         117 :     if (nKomma > 0 && aBuf.getLength() <= nKomma)
    1266             :     {
    1267             :         // if necessary, add zeros before the decimal point
    1268          91 :         sal_Int32 nCount = nKomma - aBuf.getLength();
    1269             : 
    1270          91 :         if(nCount >= 0 && LocaleDataWrapper::isNumLeadingZero())
    1271          91 :             nCount++;
    1272             : 
    1273         182 :         for(sal_Int32 i=0; i<nCount; i++)
    1274          91 :             aBuf.insert(0, '0');
    1275             :     }
    1276             : 
    1277         117 :     sal_Unicode cDec( rLoc.getNumDecimalSep()[0] );
    1278             : 
    1279             :     // insert KommaChar (decimal point character)
    1280         117 :     sal_Int32 nVorKomma = aBuf.getLength() - nKomma;
    1281             : 
    1282         117 :     if(nKomma > 0)
    1283         117 :         aBuf.insert(nVorKomma, cDec);
    1284             : 
    1285         117 :     if(!LocaleDataWrapper::isNumTrailingZeros())
    1286             :     {
    1287             :         // Remove all trailing zeros.
    1288           0 :         while (!aBuf.isEmpty() && aBuf[aBuf.getLength()-1] == '0')
    1289           0 :             aBuf.remove(aBuf.getLength()-1, 1);
    1290             : 
    1291             :         // Remove decimal if it's the last character.
    1292           0 :         if (!aBuf.isEmpty() && aBuf[aBuf.getLength()-1] == cDec)
    1293           0 :             aBuf.remove(aBuf.getLength()-1, 1);
    1294             :     }
    1295             : 
    1296             :     // if necessary, add separators before every third digit
    1297         117 :     if( nVorKomma > 3 )
    1298             :     {
    1299           0 :         OUString aThoSep( rLoc.getNumThousandSep() );
    1300           0 :         if ( !aThoSep.isEmpty() )
    1301             :         {
    1302           0 :             sal_Unicode cTho( aThoSep[0] );
    1303           0 :             sal_Int32 i(nVorKomma - 3);
    1304             : 
    1305           0 :             while(i > 0)
    1306             :             {
    1307           0 :                 aBuf.insert(i, cTho);
    1308           0 :                 i -= 3;
    1309             :             }
    1310           0 :         }
    1311             :     }
    1312             : 
    1313         117 :     if (aBuf.isEmpty())
    1314           0 :         aBuf.append("0");
    1315             : 
    1316         117 :     if(bNegative)
    1317             :     {
    1318           0 :         aBuf.insert(0, "-");
    1319             :     }
    1320             : 
    1321         117 :     if(!bNoUnitChars)
    1322           0 :         aBuf.append(aUIUnitStr);
    1323             : 
    1324         234 :     rStr = aBuf.makeStringAndClear();
    1325         117 : }
    1326             : 
    1327           0 : void SdrModel::TakeAngleStr(long nAngle, OUString& rStr, bool bNoDegChar)
    1328             : {
    1329           0 :     bool bNeg = nAngle < 0;
    1330             : 
    1331           0 :     if(bNeg)
    1332           0 :         nAngle = -nAngle;
    1333             : 
    1334           0 :     OUStringBuffer aBuf;
    1335           0 :     aBuf.append(static_cast<sal_Int32>(nAngle));
    1336             : 
    1337           0 :     SvtSysLocale aSysLoc;
    1338           0 :     const LocaleDataWrapper& rLoc = aSysLoc.GetLocaleData();
    1339           0 :     sal_Int32 nCount = 2;
    1340             : 
    1341           0 :     if(LocaleDataWrapper::isNumLeadingZero())
    1342           0 :         nCount++;
    1343             : 
    1344           0 :     while(aBuf.getLength() < nCount)
    1345           0 :         aBuf.insert(0, '0');
    1346             : 
    1347           0 :     aBuf.insert(aBuf.getLength()-2, rLoc.getNumDecimalSep()[0]);
    1348             : 
    1349           0 :     if(bNeg)
    1350           0 :         aBuf.insert(0, '-');
    1351             : 
    1352           0 :     if(!bNoDegChar)
    1353           0 :         aBuf.append(DEGREE_CHAR);
    1354             : 
    1355           0 :     rStr = aBuf.makeStringAndClear();
    1356           0 : }
    1357             : 
    1358           0 : void SdrModel::TakePercentStr(const Fraction& rVal, OUString& rStr, bool bNoPercentChar)
    1359             : {
    1360           0 :     sal_Int32 nMul(rVal.GetNumerator());
    1361           0 :     sal_Int32 nDiv(rVal.GetDenominator());
    1362           0 :     bool bNeg(nMul < 0);
    1363             : 
    1364           0 :     if(nDiv < 0)
    1365           0 :         bNeg = !bNeg;
    1366             : 
    1367           0 :     if(nMul < 0)
    1368           0 :         nMul = -nMul;
    1369             : 
    1370           0 :     if(nDiv < 0)
    1371           0 :         nDiv = -nDiv;
    1372             : 
    1373           0 :     nMul *= 100;
    1374           0 :     nMul += nDiv/2;
    1375           0 :     nMul /= nDiv;
    1376             : 
    1377           0 :     rStr = OUString::number(nMul);
    1378             : 
    1379           0 :     if(bNeg)
    1380           0 :         rStr = "-" + rStr;
    1381             : 
    1382           0 :     if(!bNoPercentChar)
    1383           0 :         rStr += "%";
    1384           0 : }
    1385             : 
    1386     2798506 : void SdrModel::SetChanged(bool bFlg)
    1387             : {
    1388     2798506 :     mbChanged = bFlg;
    1389     2798506 : }
    1390             : 
    1391         351 : void SdrModel::RecalcPageNums(bool bMaster)
    1392             : {
    1393         351 :     if(bMaster)
    1394             :     {
    1395           5 :         sal_uInt16 nCount=sal_uInt16(maMaPag.size());
    1396             :         sal_uInt16 i;
    1397          42 :         for (i=0; i<nCount; i++) {
    1398          37 :             SdrPage* pPg=maMaPag[i];
    1399          37 :             pPg->SetPageNum(i);
    1400             :         }
    1401           5 :         bMPgNumsDirty=false;
    1402             :     }
    1403             :     else
    1404             :     {
    1405         346 :         sal_uInt16 nCount=sal_uInt16(maPages.size());
    1406             :         sal_uInt16 i;
    1407        1433 :         for (i=0; i<nCount; i++) {
    1408        1087 :             SdrPage* pPg=maPages[i];
    1409        1087 :             pPg->SetPageNum(i);
    1410             :         }
    1411         346 :         bPagNumsDirty=false;
    1412             :     }
    1413         351 : }
    1414             : 
    1415        5817 : void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos)
    1416             : {
    1417        5817 :     sal_uInt16 nCount=GetPageCount();
    1418        5817 :     if (nPos>nCount) nPos=nCount;
    1419        5817 :     maPages.insert(maPages.begin()+nPos,pPage);
    1420        5817 :     PageListChanged();
    1421        5817 :     pPage->SetInserted(true);
    1422        5817 :     pPage->SetPageNum(nPos);
    1423        5817 :     pPage->SetModel(this);
    1424        5817 :     if (nPos<nCount) bPagNumsDirty=true;
    1425        5817 :     SetChanged();
    1426        5817 :     SdrHint aHint(HINT_PAGEORDERCHG);
    1427        5817 :     aHint.SetPage(pPage);
    1428        5817 :     Broadcast(aHint);
    1429        5817 : }
    1430             : 
    1431        5112 : void SdrModel::DeletePage(sal_uInt16 nPgNum)
    1432             : {
    1433        5112 :     SdrPage* pPg=RemovePage(nPgNum);
    1434        5112 :     delete pPg;
    1435        5112 : }
    1436             : 
    1437        5756 : SdrPage* SdrModel::RemovePage(sal_uInt16 nPgNum)
    1438             : {
    1439        5756 :     SdrPage* pPg=maPages[nPgNum];
    1440        5756 :     maPages.erase(maPages.begin()+nPgNum);
    1441        5756 :     PageListChanged();
    1442        5756 :     if (pPg!=NULL) {
    1443        5756 :         pPg->SetInserted(false);
    1444             :     }
    1445        5756 :     bPagNumsDirty=true;
    1446        5756 :     SetChanged();
    1447        5756 :     SdrHint aHint(HINT_PAGEORDERCHG);
    1448        5756 :     aHint.SetPage(pPg);
    1449        5756 :     Broadcast(aHint);
    1450        5756 :     return pPg;
    1451             : }
    1452             : 
    1453           1 : void SdrModel::MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
    1454             : {
    1455           1 :     SdrPage* pPg=maPages[nPgNum];
    1456           1 :     if (pPg!=NULL) {
    1457           1 :         maPages.erase(maPages.begin()+nPgNum); // shortcut to avoid two broadcasts
    1458           1 :         PageListChanged();
    1459           1 :         pPg->SetInserted(false);
    1460           1 :         InsertPage(pPg,nNewPos);
    1461             :     }
    1462             :     else
    1463           0 :         RemovePage(nPgNum);
    1464           1 : }
    1465             : 
    1466         786 : void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos)
    1467             : {
    1468         786 :     sal_uInt16 nCount=GetMasterPageCount();
    1469         786 :     if (nPos>nCount) nPos=nCount;
    1470         786 :     maMaPag.insert(maMaPag.begin()+nPos,pPage);
    1471         786 :     MasterPageListChanged();
    1472         786 :     pPage->SetInserted(true);
    1473         786 :     pPage->SetPageNum(nPos);
    1474         786 :     pPage->SetModel(this);
    1475         786 :     if (nPos<nCount) {
    1476           2 :         bMPgNumsDirty=true;
    1477             :     }
    1478         786 :     SetChanged();
    1479         786 :     SdrHint aHint(HINT_PAGEORDERCHG);
    1480         786 :     aHint.SetPage(pPage);
    1481         786 :     Broadcast(aHint);
    1482         786 : }
    1483             : 
    1484         769 : void SdrModel::DeleteMasterPage(sal_uInt16 nPgNum)
    1485             : {
    1486         769 :     SdrPage* pPg=RemoveMasterPage(nPgNum);
    1487         769 :     delete pPg;
    1488         769 : }
    1489             : 
    1490         771 : SdrPage* SdrModel::RemoveMasterPage(sal_uInt16 nPgNum)
    1491             : {
    1492         771 :     SdrPage* pRetPg=maMaPag[nPgNum];
    1493         771 :     maMaPag.erase(maMaPag.begin()+nPgNum);
    1494         771 :     MasterPageListChanged();
    1495             : 
    1496         771 :     if(pRetPg)
    1497             :     {
    1498             :         // Now delete the links from the normal drawing pages to the deleted master page.
    1499         771 :         sal_uInt16 nPageAnz(GetPageCount());
    1500             : 
    1501         777 :         for(sal_uInt16 np(0); np < nPageAnz; np++)
    1502             :         {
    1503           6 :             GetPage(np)->TRG_ImpMasterPageRemoved(*pRetPg);
    1504             :         }
    1505             : 
    1506         771 :         pRetPg->SetInserted(false);
    1507             :     }
    1508             : 
    1509         771 :     bMPgNumsDirty=true;
    1510         771 :     SetChanged();
    1511         771 :     SdrHint aHint(HINT_PAGEORDERCHG);
    1512         771 :     aHint.SetPage(pRetPg);
    1513         771 :     Broadcast(aHint);
    1514         771 :     return pRetPg;
    1515             : }
    1516             : 
    1517           0 : void SdrModel::MoveMasterPage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
    1518             : {
    1519           0 :     SdrPage* pPg=maMaPag[nPgNum];
    1520           0 :     maMaPag.erase(maMaPag.begin()+nPgNum);
    1521           0 :     MasterPageListChanged();
    1522           0 :     if (pPg!=NULL) {
    1523           0 :         pPg->SetInserted(false);
    1524           0 :         maMaPag.insert(maMaPag.begin()+nNewPos,pPg);
    1525           0 :         MasterPageListChanged();
    1526             :     }
    1527           0 :     bMPgNumsDirty=true;
    1528           0 :     SetChanged();
    1529           0 :     SdrHint aHint(HINT_PAGEORDERCHG);
    1530           0 :     aHint.SetPage(pPg);
    1531           0 :     Broadcast(aHint);
    1532           0 : }
    1533             : 
    1534             : 
    1535             : 
    1536           0 : void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
    1537             :                          sal_uInt16 nDestPos,
    1538             :                          bool bUndo, bool bMoveNoCopy)
    1539             : {
    1540           0 :     if( bUndo && !IsUndoEnabled() )
    1541           0 :         bUndo = false;
    1542             : 
    1543           0 :     if( bUndo )
    1544           0 :         BegUndo(ImpGetResStr(STR_UndoMergeModel));
    1545             : 
    1546           0 :     sal_uInt16 nPageAnz=GetPageCount();
    1547           0 :     sal_uInt16 nMaxPage=nPageAnz;
    1548             : 
    1549           0 :     if (nMaxPage!=0)
    1550           0 :         nMaxPage--;
    1551           0 :     if (nFirstPageNum>nMaxPage)
    1552           0 :         nFirstPageNum=nMaxPage;
    1553           0 :     if (nLastPageNum>nMaxPage)
    1554           0 :         nLastPageNum =nMaxPage;
    1555           0 :     bool bReverse=nLastPageNum<nFirstPageNum;
    1556           0 :     if (nDestPos>nPageAnz)
    1557           0 :         nDestPos=nPageAnz;
    1558             : 
    1559             :     // at first, save the pointers of the affected pages in an array
    1560           0 :     sal_uInt16 nPageNum=nFirstPageNum;
    1561           0 :     sal_uInt16 nCopyAnz=((!bReverse)?(nLastPageNum-nFirstPageNum):(nFirstPageNum-nLastPageNum))+1;
    1562           0 :     boost::scoped_array<SdrPage*> pPagePtrs(new SdrPage*[nCopyAnz]);
    1563             :     sal_uInt16 nCopyNum;
    1564           0 :     for(nCopyNum=0; nCopyNum<nCopyAnz; nCopyNum++)
    1565             :     {
    1566           0 :         pPagePtrs[nCopyNum]=GetPage(nPageNum);
    1567           0 :         if (bReverse)
    1568           0 :             nPageNum--;
    1569             :         else
    1570           0 :             nPageNum++;
    1571             :     }
    1572             : 
    1573             :     // now copy the pages
    1574           0 :     sal_uInt16 nDestNum=nDestPos;
    1575           0 :     for (nCopyNum=0; nCopyNum<nCopyAnz; nCopyNum++)
    1576             :     {
    1577           0 :         SdrPage* pPg=pPagePtrs[nCopyNum];
    1578           0 :         sal_uInt16 nPageNum2=pPg->GetPageNum();
    1579           0 :         if (!bMoveNoCopy)
    1580             :         {
    1581           0 :             const SdrPage* pPg1=GetPage(nPageNum2);
    1582           0 :             pPg=pPg1->Clone();
    1583           0 :             InsertPage(pPg,nDestNum);
    1584           0 :             if (bUndo)
    1585           0 :                 AddUndo(GetSdrUndoFactory().CreateUndoCopyPage(*pPg));
    1586           0 :             nDestNum++;
    1587             :         }
    1588             :         else
    1589             :         {
    1590             :             // TODO: Move is untested!
    1591           0 :             if (nDestNum>nPageNum2)
    1592           0 :                 nDestNum--;
    1593             : 
    1594           0 :             if(bUndo)
    1595           0 :                 AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*GetPage(nPageNum2),nPageNum2,nDestNum));
    1596             : 
    1597           0 :             pPg=RemovePage(nPageNum2);
    1598           0 :             InsertPage(pPg,nDestNum);
    1599           0 :             nDestNum++;
    1600             :         }
    1601             : 
    1602           0 :         if(bReverse)
    1603           0 :             nPageNum2--;
    1604             :         else
    1605           0 :             nPageNum2++;
    1606             :     }
    1607             : 
    1608           0 :     pPagePtrs.reset();
    1609           0 :     if(bUndo)
    1610           0 :         EndUndo();
    1611           0 : }
    1612             : 
    1613           0 : void SdrModel::Merge(SdrModel& rSourceModel,
    1614             :                      sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
    1615             :                      sal_uInt16 nDestPos,
    1616             :                      bool bMergeMasterPages, bool bAllMasterPages,
    1617             :                      bool bUndo, bool bTreadSourceAsConst)
    1618             : {
    1619           0 :     if (&rSourceModel==this)
    1620             :     {
    1621           0 :         CopyPages(nFirstPageNum,nLastPageNum,nDestPos,bUndo,!bTreadSourceAsConst);
    1622           0 :         return;
    1623             :     }
    1624             : 
    1625           0 :     if( bUndo && !IsUndoEnabled() )
    1626           0 :         bUndo = false;
    1627             : 
    1628           0 :     if (bUndo)
    1629           0 :         BegUndo(ImpGetResStr(STR_UndoMergeModel));
    1630             : 
    1631           0 :     sal_uInt16 nSrcPageAnz=rSourceModel.GetPageCount();
    1632           0 :     sal_uInt16 nSrcMasterPageAnz=rSourceModel.GetMasterPageCount();
    1633           0 :     sal_uInt16 nDstMasterPageAnz=GetMasterPageCount();
    1634           0 :     bool bInsPages=(nFirstPageNum<nSrcPageAnz || nLastPageNum<nSrcPageAnz);
    1635           0 :     sal_uInt16 nMaxSrcPage=nSrcPageAnz; if (nMaxSrcPage!=0) nMaxSrcPage--;
    1636           0 :     if (nFirstPageNum>nMaxSrcPage) nFirstPageNum=nMaxSrcPage;
    1637           0 :     if (nLastPageNum>nMaxSrcPage)  nLastPageNum =nMaxSrcPage;
    1638           0 :     bool bReverse=nLastPageNum<nFirstPageNum;
    1639             : 
    1640           0 :     boost::scoped_array<sal_uInt16> pMasterMap;
    1641           0 :     boost::scoped_array<bool> pMasterNeed;
    1642           0 :     sal_uInt16    nMasterNeed=0;
    1643           0 :     if (bMergeMasterPages && nSrcMasterPageAnz!=0) {
    1644             :         // determine which MasterPages from rSrcModel we need
    1645           0 :         pMasterMap.reset(new sal_uInt16[nSrcMasterPageAnz]);
    1646           0 :         pMasterNeed.reset(new bool[nSrcMasterPageAnz]);
    1647           0 :         memset(pMasterMap.get(),0xFF,nSrcMasterPageAnz*sizeof(sal_uInt16));
    1648           0 :         if (bAllMasterPages) {
    1649           0 :             memset(pMasterNeed.get(), true, nSrcMasterPageAnz * sizeof(bool));
    1650             :         } else {
    1651           0 :             memset(pMasterNeed.get(), false, nSrcMasterPageAnz * sizeof(bool));
    1652           0 :             sal_uInt16 nAnf= bReverse ? nLastPageNum : nFirstPageNum;
    1653           0 :             sal_uInt16 nEnd= bReverse ? nFirstPageNum : nLastPageNum;
    1654           0 :             for (sal_uInt16 i=nAnf; i<=nEnd; i++) {
    1655           0 :                 const SdrPage* pPg=rSourceModel.GetPage(i);
    1656           0 :                 if(pPg->TRG_HasMasterPage())
    1657             :                 {
    1658           0 :                     SdrPage& rMasterPage = pPg->TRG_GetMasterPage();
    1659           0 :                     sal_uInt16 nMPgNum(rMasterPage.GetPageNum());
    1660             : 
    1661           0 :                     if(nMPgNum < nSrcMasterPageAnz)
    1662             :                     {
    1663           0 :                         pMasterNeed[nMPgNum] = true;
    1664             :                     }
    1665             :                 }
    1666             :             }
    1667             :         }
    1668             :         // now determine the Mapping of the MasterPages
    1669           0 :         sal_uInt16 nAktMaPagNum=nDstMasterPageAnz;
    1670           0 :         for (sal_uInt16 i=0; i<nSrcMasterPageAnz; i++) {
    1671           0 :             if (pMasterNeed[i]) {
    1672           0 :                 pMasterMap[i]=nAktMaPagNum;
    1673           0 :                 nAktMaPagNum++;
    1674           0 :                 nMasterNeed++;
    1675             :             }
    1676             :         }
    1677             :     }
    1678             : 
    1679             :     // get the MasterPages
    1680           0 :     if (pMasterMap && pMasterNeed && nMasterNeed!=0) {
    1681           0 :         for (sal_uInt16 i=nSrcMasterPageAnz; i>0;) {
    1682           0 :             i--;
    1683           0 :             if (pMasterNeed[i]) {
    1684           0 :                 SdrPage* pPg=NULL;
    1685           0 :                 if (bTreadSourceAsConst) {
    1686           0 :                     const SdrPage* pPg1=rSourceModel.GetMasterPage(i);
    1687           0 :                     pPg=pPg1->Clone();
    1688             :                 } else {
    1689           0 :                     pPg=rSourceModel.RemoveMasterPage(i);
    1690             :                 }
    1691           0 :                 if (pPg!=NULL) {
    1692             :                     // Now append all of them to the end of the DstModel.
    1693             :                     // Don't use InsertMasterPage(), because everything is
    1694             :                     // inconsistent until all are in.
    1695           0 :                     maMaPag.insert(maMaPag.begin()+nDstMasterPageAnz, pPg);
    1696           0 :                     MasterPageListChanged();
    1697           0 :                     pPg->SetInserted(true);
    1698           0 :                     pPg->SetModel(this);
    1699           0 :                     bMPgNumsDirty=true;
    1700           0 :                     if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg));
    1701             :                 } else {
    1702             :                     OSL_FAIL("SdrModel::Merge(): MasterPage not found in SourceModel.");
    1703             :                 }
    1704             :             }
    1705             :         }
    1706             :     }
    1707             : 
    1708             :     // get the drawing pages
    1709           0 :     if (bInsPages) {
    1710           0 :         sal_uInt16 nSourcePos=nFirstPageNum;
    1711           0 :         sal_uInt16 nMergeCount=sal_uInt16(std::abs((long)((long)nFirstPageNum-nLastPageNum))+1);
    1712           0 :         if (nDestPos>GetPageCount()) nDestPos=GetPageCount();
    1713           0 :         while (nMergeCount>0) {
    1714           0 :             SdrPage* pPg=NULL;
    1715           0 :             if (bTreadSourceAsConst) {
    1716           0 :                 const SdrPage* pPg1=rSourceModel.GetPage(nSourcePos);
    1717           0 :                 pPg=pPg1->Clone();
    1718             :             } else {
    1719           0 :                 pPg=rSourceModel.RemovePage(nSourcePos);
    1720             :             }
    1721           0 :             if (pPg!=NULL) {
    1722           0 :                 InsertPage(pPg,nDestPos);
    1723           0 :                 if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg));
    1724             : 
    1725           0 :                 if(pPg->TRG_HasMasterPage())
    1726             :                 {
    1727           0 :                     SdrPage& rMasterPage = pPg->TRG_GetMasterPage();
    1728           0 :                     sal_uInt16 nMaPgNum(rMasterPage.GetPageNum());
    1729             : 
    1730           0 :                     if (bMergeMasterPages)
    1731             :                     {
    1732           0 :                         sal_uInt16 nNeuNum(0xFFFF);
    1733             : 
    1734           0 :                         if(pMasterMap)
    1735             :                         {
    1736           0 :                             nNeuNum = pMasterMap[nMaPgNum];
    1737             :                         }
    1738             : 
    1739           0 :                         if(nNeuNum != 0xFFFF)
    1740             :                         {
    1741           0 :                             if(bUndo)
    1742             :                             {
    1743           0 :                                 AddUndo(GetSdrUndoFactory().CreateUndoPageChangeMasterPage(*pPg));
    1744             :                             }
    1745             : 
    1746           0 :                             pPg->TRG_SetMasterPage(*GetMasterPage(nNeuNum));
    1747             :                         }
    1748             :                         DBG_ASSERT(nNeuNum!=0xFFFF,"SdrModel::Merge(): Something is crooked with the mapping of the MasterPages.");
    1749             :                     } else {
    1750           0 :                         if (nMaPgNum>=nDstMasterPageAnz) {
    1751             :                             // This is outside of the original area of the MasterPage of the DstModel.
    1752           0 :                             pPg->TRG_ClearMasterPage();
    1753             :                         }
    1754             :                     }
    1755             :                 }
    1756             : 
    1757             :             } else {
    1758             :                 OSL_FAIL("SdrModel::Merge(): Drawing page not found in SourceModel.");
    1759             :             }
    1760           0 :             nDestPos++;
    1761           0 :             if (bReverse) nSourcePos--;
    1762           0 :             else if (bTreadSourceAsConst) nSourcePos++;
    1763           0 :             nMergeCount--;
    1764             :         }
    1765             :     }
    1766             : 
    1767           0 :     pMasterMap.reset();
    1768           0 :     pMasterNeed.reset();
    1769             : 
    1770           0 :     bMPgNumsDirty=true;
    1771           0 :     bPagNumsDirty=true;
    1772             : 
    1773           0 :     SetChanged();
    1774             :     // TODO: Missing: merging and mapping of layers
    1775             :     // at the objects as well as at the MasterPageDescriptors
    1776           0 :     if (bUndo) EndUndo();
    1777             : }
    1778             : 
    1779           0 : void SdrModel::SetStarDrawPreviewMode(bool bPreview)
    1780             : {
    1781           0 :     if (!bPreview && bStarDrawPreviewMode && GetPageCount())
    1782             :     {
    1783             :         // Resetting is not allowed, because the Model might not be loaded completely
    1784             :         DBG_ASSERT(false,"SdrModel::SetStarDrawPreviewMode(): Resetting not allowed, because Model might not be complete.");
    1785             :     }
    1786             :     else
    1787             :     {
    1788           0 :         bStarDrawPreviewMode = bPreview;
    1789             :     }
    1790           0 : }
    1791             : 
    1792        7130 : uno::Reference< uno::XInterface > SdrModel::getUnoModel()
    1793             : {
    1794        7130 :     if( !mxUnoModel.is() )
    1795         761 :         mxUnoModel = createUnoModel();
    1796             : 
    1797        7130 :     return mxUnoModel;
    1798             : }
    1799             : 
    1800           0 : void SdrModel::setUnoModel( ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xModel )
    1801             : {
    1802           0 :     mxUnoModel = xModel;
    1803           0 : }
    1804             : 
    1805           0 : uno::Reference< uno::XInterface > SdrModel::createUnoModel()
    1806             : {
    1807             :     OSL_FAIL( "SdrModel::createUnoModel() - base implementation should not be called!" );
    1808           0 :     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xInt;
    1809           0 :     return xInt;
    1810             : }
    1811             : 
    1812        4088 : void SdrModel::setLock( bool bLock )
    1813             : {
    1814        4088 :     if( mbModelLocked != bLock )
    1815             :     {
    1816             :         // #i120437# need to set first, else ImpReformatAllEdgeObjects will do nothing
    1817        3802 :         mbModelLocked = bLock;
    1818             : 
    1819        3802 :         if( !bLock )
    1820             :         {
    1821        1897 :             ImpReformatAllEdgeObjects();
    1822             :         }
    1823             :     }
    1824        4088 : }
    1825             : 
    1826             : 
    1827             : 
    1828       13072 : void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSet, SdrModel* pNewModel )
    1829             : {
    1830             :     assert(pNewModel != 0);
    1831       13072 :     if( pSourceSet && pDestSet && (pSourceSet != pDestSet ) )
    1832             :     {
    1833       13072 :         SfxWhichIter aWhichIter(*pSourceSet);
    1834       13072 :         sal_uInt16 nWhich(aWhichIter.FirstWhich());
    1835             :         const SfxPoolItem *pPoolItem;
    1836             : 
    1837     1834503 :         while(nWhich)
    1838             :         {
    1839     1808359 :             if(SfxItemState::SET == pSourceSet->GetItemState(nWhich, false, &pPoolItem))
    1840             :             {
    1841       67414 :                 const SfxPoolItem* pResultItem = NULL;
    1842             : 
    1843       67414 :                 switch( nWhich )
    1844             :                 {
    1845             :                 case XATTR_FILLBITMAP:
    1846           0 :                     pResultItem = static_cast<const XFillBitmapItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1847           0 :                     break;
    1848             :                 case XATTR_LINEDASH:
    1849         130 :                     pResultItem = static_cast<const XLineDashItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1850         130 :                     break;
    1851             :                 case XATTR_LINESTART:
    1852          62 :                     pResultItem = static_cast<const XLineStartItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1853          62 :                     break;
    1854             :                 case XATTR_LINEEND:
    1855          66 :                     pResultItem = static_cast<const XLineEndItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1856          66 :                     break;
    1857             :                 case XATTR_FILLGRADIENT:
    1858           1 :                     pResultItem = static_cast<const XFillGradientItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1859           1 :                     break;
    1860             :                 case XATTR_FILLFLOATTRANSPARENCE:
    1861             :                     // allow all kinds of XFillFloatTransparenceItem to be set
    1862           0 :                     pResultItem = static_cast<const XFillFloatTransparenceItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1863           0 :                     break;
    1864             :                 case XATTR_FILLHATCH:
    1865          32 :                     pResultItem = static_cast<const XFillHatchItem*>(pPoolItem)->checkForUniqueItem( pNewModel );
    1866          32 :                     break;
    1867             :                 }
    1868             : 
    1869             :                 // set item
    1870       67414 :                 if( pResultItem )
    1871             :                 {
    1872         107 :                     pDestSet->Put(*pResultItem);
    1873         107 :                     delete pResultItem;
    1874             :                 }
    1875             :                 else
    1876       67307 :                     pDestSet->Put(*pPoolItem);
    1877             :             }
    1878     1808359 :             nWhich = aWhichIter.NextWhich();
    1879       13072 :         }
    1880             :     }
    1881       13072 : }
    1882             : 
    1883             : 
    1884             : 
    1885        3947 : void SdrModel::SetForbiddenCharsTable( rtl::Reference<SvxForbiddenCharactersTable> xForbiddenChars )
    1886             : {
    1887        3947 :     if( mpForbiddenCharactersTable )
    1888          90 :         mpForbiddenCharactersTable->release();
    1889             : 
    1890        3947 :     mpForbiddenCharactersTable = xForbiddenChars.get();
    1891             : 
    1892        3947 :     if( mpForbiddenCharactersTable )
    1893        3405 :         mpForbiddenCharactersTable->acquire();
    1894             : 
    1895        3947 :     ImpSetOutlinerDefaults( pDrawOutliner );
    1896        3947 :     ImpSetOutlinerDefaults( pHitTestOutliner );
    1897        3947 : }
    1898             : 
    1899             : 
    1900        3570 : void SdrModel::SetCharCompressType( sal_uInt16 nType )
    1901             : {
    1902        3570 :     if( nType != mnCharCompressType )
    1903             :     {
    1904          19 :         mnCharCompressType = nType;
    1905          19 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1906          19 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1907             :     }
    1908        3570 : }
    1909             : 
    1910         595 : void SdrModel::SetKernAsianPunctuation( bool bEnabled )
    1911             : {
    1912         595 :     if( mbKernAsianPunctuation != bEnabled )
    1913             :     {
    1914           2 :         mbKernAsianPunctuation = bEnabled;
    1915           2 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1916           2 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1917             :     }
    1918         595 : }
    1919             : 
    1920        2968 : void SdrModel::SetAddExtLeading( bool bEnabled )
    1921             : {
    1922        2968 :     if( mbAddExtLeading != bEnabled )
    1923             :     {
    1924        2967 :         mbAddExtLeading = bEnabled;
    1925        2967 :         ImpSetOutlinerDefaults( pDrawOutliner );
    1926        2967 :         ImpSetOutlinerDefaults( pHitTestOutliner );
    1927             :     }
    1928        2968 : }
    1929             : 
    1930          42 : void SdrModel::ReformatAllTextObjects()
    1931             : {
    1932          42 :     ImpReformatAllTextObjects();
    1933          42 : }
    1934             : 
    1935       27149 : SdrOutliner* SdrModel::createOutliner( sal_uInt16 nOutlinerMode )
    1936             : {
    1937       27149 :     if( NULL == mpOutlinerCache )
    1938         882 :         mpOutlinerCache = new SdrOutlinerCache(this);
    1939             : 
    1940       27149 :     return mpOutlinerCache->createOutliner( nOutlinerMode );
    1941             : }
    1942             : 
    1943           0 : std::vector<SdrOutliner*> SdrModel::GetActiveOutliners() const
    1944             : {
    1945             :     std::vector<SdrOutliner*> aRet(mpOutlinerCache ?
    1946           0 :         mpOutlinerCache->GetActiveOutliners() : std::vector<SdrOutliner*>());
    1947             : 
    1948           0 :     aRet.push_back(pDrawOutliner);
    1949           0 :     aRet.push_back(pHitTestOutliner);
    1950             : 
    1951           0 :     return aRet;
    1952             : }
    1953             : 
    1954       26996 : void SdrModel::disposeOutliner( SdrOutliner* pOutliner )
    1955             : {
    1956       26996 :     if( mpOutlinerCache )
    1957             :     {
    1958       26996 :         mpOutlinerCache->disposeOutliner( pOutliner );
    1959             :     }
    1960             :     else
    1961             :     {
    1962           0 :         delete pOutliner;
    1963             :     }
    1964       26996 : }
    1965             : 
    1966           0 : SvxNumType SdrModel::GetPageNumType() const
    1967             : {
    1968           0 :     return SVX_ARABIC;
    1969             : }
    1970             : 
    1971        8706 : const SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum) const
    1972             : {
    1973             :     DBG_ASSERT(nPgNum < maPages.size(), "SdrModel::GetPage: Access out of range (!)");
    1974        8706 :     return nPgNum < maPages.size() ? maPages[nPgNum] : NULL;
    1975             : }
    1976             : 
    1977       54993 : SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum)
    1978             : {
    1979             :     DBG_ASSERT(nPgNum < maPages.size(), "SdrModel::GetPage: Access out of range (!)");
    1980       54993 :     return nPgNum < maPages.size() ? maPages[nPgNum] : NULL;
    1981             : }
    1982             : 
    1983       41841 : sal_uInt16 SdrModel::GetPageCount() const
    1984             : {
    1985       41841 :     return sal_uInt16(maPages.size());
    1986             : }
    1987             : 
    1988       16581 : void SdrModel::PageListChanged()
    1989             : {
    1990       16581 : }
    1991             : 
    1992        1464 : const SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) const
    1993             : {
    1994             :     DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)");
    1995        1464 :     return maMaPag[nPgNum];
    1996             : }
    1997             : 
    1998        3364 : SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum)
    1999             : {
    2000             :     DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)");
    2001        3364 :     return maMaPag[nPgNum];
    2002             : }
    2003             : 
    2004       22759 : sal_uInt16 SdrModel::GetMasterPageCount() const
    2005             : {
    2006       22759 :     return sal_uInt16(maMaPag.size());
    2007             : }
    2008             : 
    2009        8138 : void SdrModel::MasterPageListChanged()
    2010             : {
    2011        8138 : }
    2012             : 
    2013         631 : void SdrModel::SetSdrUndoManager( SfxUndoManager* pUndoManager )
    2014             : {
    2015         631 :     mpImpl->mpUndoManager = pUndoManager;
    2016         631 : }
    2017             : 
    2018          14 : SfxUndoManager* SdrModel::GetSdrUndoManager() const
    2019             : {
    2020          14 :     return mpImpl->mpUndoManager;
    2021             : }
    2022             : 
    2023        1843 : SdrUndoFactory& SdrModel::GetSdrUndoFactory() const
    2024             : {
    2025        1843 :     if( !mpImpl->mpUndoFactory )
    2026           4 :         mpImpl->mpUndoFactory = new SdrUndoFactory;
    2027        1843 :     return *mpImpl->mpUndoFactory;
    2028             : }
    2029             : 
    2030         318 : void SdrModel::SetSdrUndoFactory( SdrUndoFactory* pUndoFactory )
    2031             : {
    2032         318 :     if( pUndoFactory && (pUndoFactory != mpImpl->mpUndoFactory) )
    2033             :     {
    2034         318 :         delete mpImpl->mpUndoFactory;
    2035         318 :         mpImpl->mpUndoFactory = pUndoFactory;
    2036             :     }
    2037         318 : }
    2038             : 
    2039           0 : void SdrModel::dumpAsXml(xmlTextWriterPtr pWriter) const
    2040             : {
    2041           0 :     xmlTextWriterStartElement(pWriter, BAD_CAST("sdrModel"));
    2042           0 :     xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
    2043             : 
    2044           0 :     sal_uInt16 nPageCount = GetPageCount();
    2045           0 :     for (sal_uInt16 i = 0; i < nPageCount; ++i)
    2046             :     {
    2047           0 :         if (const SdrPage* pPage = GetPage(i))
    2048           0 :             pPage->dumpAsXml(pWriter);
    2049             :     }
    2050             : 
    2051           0 :     xmlTextWriterEndElement(pWriter);
    2052           0 : }
    2053             : 
    2054             : namespace
    2055             : {
    2056             :     class theSdrModelUnoTunnelImplementationId : public rtl::Static< UnoTunnelIdInit, theSdrModelUnoTunnelImplementationId > {};
    2057             : }
    2058             : 
    2059        6201 : const ::com::sun::star::uno::Sequence< sal_Int8 >& SdrModel::getUnoTunnelImplementationId()
    2060             : {
    2061        6201 :     return theSdrModelUnoTunnelImplementationId::get().getSeq();
    2062             : }
    2063             : 
    2064             : 
    2065             : 
    2066       51680 : SdrHint::SdrHint(SdrHintKind eNewHint)
    2067             : :   mpPage(0L),
    2068             :     mpObj(0L),
    2069             :     mpObjList(0L),
    2070       51680 :     meHint(eNewHint)
    2071             : {
    2072       51680 : }
    2073             : 
    2074      198177 : SdrHint::SdrHint(const SdrObject& rNewObj)
    2075      198177 : :   mpPage(rNewObj.GetPage()),
    2076             :     mpObj(&rNewObj),
    2077      198177 :     mpObjList(rNewObj.GetObjList()),
    2078      594531 :     meHint(HINT_OBJCHG)
    2079             : {
    2080      198177 :     maRectangle = rNewObj.GetLastBoundRect();
    2081      198177 : }
    2082             : 
    2083       23247 : void SdrHint::SetPage(const SdrPage* pNewPage)
    2084             : {
    2085       23247 :     mpPage = pNewPage;
    2086       23247 : }
    2087             : 
    2088           1 : void SdrHint::SetObject(const SdrObject* pNewObj)
    2089             : {
    2090           1 :     mpObj = pNewObj;
    2091           1 : }
    2092             : 
    2093      119111 : void SdrHint::SetKind(SdrHintKind eNewKind)
    2094             : {
    2095      119111 :     meHint = eNewKind;
    2096      119546 : }
    2097             : 
    2098             : 
    2099             : 
    2100             : 
    2101             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11