xref: /AOO41X/main/svx/source/svdraw/svdmodel.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <svx/svdmodel.hxx>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <rtl/uuid.h>
34*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
35*cdf0e10cSrcweir #include <osl/endian.h>
36*cdf0e10cSrcweir #include <rtl/logfile.hxx>
37*cdf0e10cSrcweir #include <math.h>
38*cdf0e10cSrcweir #include <tools/urlobj.hxx>
39*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #include <tools/string.hxx>
42*cdf0e10cSrcweir #include <svl/whiter.hxx>
43*cdf0e10cSrcweir #include <svx/xit.hxx>
44*cdf0e10cSrcweir #include <svx/xbtmpit.hxx>
45*cdf0e10cSrcweir #include <svx/xlndsit.hxx>
46*cdf0e10cSrcweir #include <svx/xlnedit.hxx>
47*cdf0e10cSrcweir #include <svx/xflgrit.hxx>
48*cdf0e10cSrcweir #include <svx/xflftrit.hxx>
49*cdf0e10cSrcweir #include <svx/xflhtit.hxx>
50*cdf0e10cSrcweir #include <svx/xlnstit.hxx>
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir #include "svx/svditext.hxx"
53*cdf0e10cSrcweir #include <editeng/editeng.hxx>   // Fuer EditEngine::CreatePool()
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir #include <svx/xtable.hxx>
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir #include "svx/svditer.hxx"
58*cdf0e10cSrcweir #include <svx/svdtrans.hxx>
59*cdf0e10cSrcweir #include <svx/svdpage.hxx>
60*cdf0e10cSrcweir #include <svx/svdlayer.hxx>
61*cdf0e10cSrcweir #include <svx/svdundo.hxx>
62*cdf0e10cSrcweir #include <svx/svdpool.hxx>
63*cdf0e10cSrcweir #include <svx/svdobj.hxx>
64*cdf0e10cSrcweir #include <svx/svdotext.hxx>  // fuer ReformatAllTextObjects und CalcFieldValue
65*cdf0e10cSrcweir #include <svx/svdetc.hxx>
66*cdf0e10cSrcweir #include <svx/svdoutl.hxx>
67*cdf0e10cSrcweir #include <svx/svdoole2.hxx>
68*cdf0e10cSrcweir #include "svx/svdglob.hxx"  // Stringcache
69*cdf0e10cSrcweir #include "svx/svdstr.hrc"   // Objektname
70*cdf0e10cSrcweir #include "svdoutlinercache.hxx"
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir #include "svx/xflclit.hxx"
73*cdf0e10cSrcweir #include "svx/xflhtit.hxx"
74*cdf0e10cSrcweir #include "svx/xlnclit.hxx"
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir #include <svl/asiancfg.hxx>
77*cdf0e10cSrcweir #include "editeng/fontitem.hxx"
78*cdf0e10cSrcweir #include <editeng/colritem.hxx>
79*cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
80*cdf0e10cSrcweir #include <svl/style.hxx>
81*cdf0e10cSrcweir #include <tools/bigint.hxx>
82*cdf0e10cSrcweir #include <editeng/numitem.hxx>
83*cdf0e10cSrcweir #include <editeng/bulitem.hxx>
84*cdf0e10cSrcweir #include <editeng/outlobj.hxx>
85*cdf0e10cSrcweir #include "editeng/forbiddencharacterstable.hxx"
86*cdf0e10cSrcweir #include <svl/zforlist.hxx>
87*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir // #90477#
90*cdf0e10cSrcweir #include <tools/tenccvt.hxx>
91*cdf0e10cSrcweir #include <unotools/syslocale.hxx>
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir // #95114#
94*cdf0e10cSrcweir #include <vcl/svapp.hxx>
95*cdf0e10cSrcweir #include <svx/sdr/properties/properties.hxx>
96*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
97*cdf0e10cSrcweir #include <svl/itemset.hxx>
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir using namespace ::com::sun::star;
100*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
101*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir struct SdrModelImpl
106*cdf0e10cSrcweir {
107*cdf0e10cSrcweir 	SfxUndoManager*	mpUndoManager;
108*cdf0e10cSrcweir 	SdrUndoFactory* mpUndoFactory;
109*cdf0e10cSrcweir 	bool mbAllowShapePropertyChangeListener;
110*cdf0e10cSrcweir };
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir DBG_NAME(SdrModel)
115*cdf0e10cSrcweir TYPEINIT1(SdrModel,SfxBroadcaster);
116*cdf0e10cSrcweir void SdrModel::ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* _pEmbeddedHelper,
117*cdf0e10cSrcweir 	bool bUseExtColorTable, bool bLoadRefCounts)
118*cdf0e10cSrcweir {
119*cdf0e10cSrcweir 	mpImpl = new SdrModelImpl;
120*cdf0e10cSrcweir 	mpImpl->mpUndoManager=0;
121*cdf0e10cSrcweir 	mpImpl->mpUndoFactory=0;
122*cdf0e10cSrcweir 	mpImpl->mbAllowShapePropertyChangeListener=false;
123*cdf0e10cSrcweir 	mbInDestruction=false;
124*cdf0e10cSrcweir 	aObjUnit=SdrEngineDefaults::GetMapFraction();
125*cdf0e10cSrcweir 	eObjUnit=SdrEngineDefaults::GetMapUnit();
126*cdf0e10cSrcweir 	eUIUnit=FUNIT_MM;
127*cdf0e10cSrcweir 	aUIScale=Fraction(1,1);
128*cdf0e10cSrcweir 	nUIUnitKomma=0;
129*cdf0e10cSrcweir 	bUIOnlyKomma=sal_False;
130*cdf0e10cSrcweir 	pLayerAdmin=NULL;
131*cdf0e10cSrcweir 	pItemPool=pPool;
132*cdf0e10cSrcweir 	bMyPool=sal_False;
133*cdf0e10cSrcweir 	m_pEmbeddedHelper=_pEmbeddedHelper;
134*cdf0e10cSrcweir 	pDrawOutliner=NULL;
135*cdf0e10cSrcweir 	pHitTestOutliner=NULL;
136*cdf0e10cSrcweir 	pRefOutDev=NULL;
137*cdf0e10cSrcweir 	nProgressAkt=0;
138*cdf0e10cSrcweir 	nProgressMax=0;
139*cdf0e10cSrcweir 	nProgressOfs=0;
140*cdf0e10cSrcweir 	pDefaultStyleSheet=NULL;
141*cdf0e10cSrcweir 	pLinkManager=NULL;
142*cdf0e10cSrcweir 	pUndoStack=NULL;
143*cdf0e10cSrcweir 	pRedoStack=NULL;
144*cdf0e10cSrcweir 	nMaxUndoCount=16;
145*cdf0e10cSrcweir 	pAktUndoGroup=NULL;
146*cdf0e10cSrcweir 	nUndoLevel=0;
147*cdf0e10cSrcweir 	mbUndoEnabled=true;
148*cdf0e10cSrcweir 	nProgressPercent=0;
149*cdf0e10cSrcweir 	nLoadVersion=0;
150*cdf0e10cSrcweir 	bExtColorTable=sal_False;
151*cdf0e10cSrcweir 	mbChanged = sal_False;
152*cdf0e10cSrcweir 	bInfoChanged=sal_False;
153*cdf0e10cSrcweir 	bPagNumsDirty=sal_False;
154*cdf0e10cSrcweir 	bMPgNumsDirty=sal_False;
155*cdf0e10cSrcweir 	bPageNotValid=sal_False;
156*cdf0e10cSrcweir 	bSavePortable=sal_False;
157*cdf0e10cSrcweir 	bSaveCompressed=sal_False;
158*cdf0e10cSrcweir 	bSaveNative=sal_False;
159*cdf0e10cSrcweir 	bSwapGraphics=sal_False;
160*cdf0e10cSrcweir 	nSwapGraphicsMode=SDR_SWAPGRAPHICSMODE_DEFAULT;
161*cdf0e10cSrcweir 	bSaveOLEPreview=sal_False;
162*cdf0e10cSrcweir 	bPasteResize=sal_False;
163*cdf0e10cSrcweir 	bNoBitmapCaching=sal_False;
164*cdf0e10cSrcweir 	bReadOnly=sal_False;
165*cdf0e10cSrcweir 	nStreamCompressMode=COMPRESSMODE_NONE;
166*cdf0e10cSrcweir 	nStreamNumberFormat=NUMBERFORMAT_INT_BIGENDIAN;
167*cdf0e10cSrcweir 	nDefaultTabulator=0;
168*cdf0e10cSrcweir 	pColorTable=NULL;
169*cdf0e10cSrcweir 	pDashList=NULL;
170*cdf0e10cSrcweir 	pLineEndList=NULL;
171*cdf0e10cSrcweir 	pHatchList=NULL;
172*cdf0e10cSrcweir 	pGradientList=NULL;
173*cdf0e10cSrcweir 	pBitmapList=NULL;
174*cdf0e10cSrcweir 	mpNumberFormatter = NULL;
175*cdf0e10cSrcweir 	bTransparentTextFrames=sal_False;
176*cdf0e10cSrcweir 	bStarDrawPreviewMode = sal_False;
177*cdf0e10cSrcweir 	nStarDrawPreviewMasterPageNum = SDRPAGE_NOTFOUND;
178*cdf0e10cSrcweir 	pModelStorage = NULL;
179*cdf0e10cSrcweir 	mpForbiddenCharactersTable = NULL;
180*cdf0e10cSrcweir 	mbModelLocked = sal_False;
181*cdf0e10cSrcweir 	mpOutlinerCache = NULL;
182*cdf0e10cSrcweir 	mbKernAsianPunctuation = sal_False;
183*cdf0e10cSrcweir     mbAddExtLeading = sal_False;
184*cdf0e10cSrcweir 	mnHandoutPageCount = 0;
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir     SvxAsianConfig aAsian;
187*cdf0e10cSrcweir 	mnCharCompressType = aAsian.GetCharDistanceCompression();
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir #ifdef OSL_LITENDIAN
190*cdf0e10cSrcweir 	nStreamNumberFormat=NUMBERFORMAT_INT_LITTLEENDIAN;
191*cdf0e10cSrcweir #endif
192*cdf0e10cSrcweir 	bExtColorTable=bUseExtColorTable;
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir 	if ( pPool == NULL )
195*cdf0e10cSrcweir     {
196*cdf0e10cSrcweir 		pItemPool=new SdrItemPool(0L, bLoadRefCounts);
197*cdf0e10cSrcweir 		// Der Outliner hat keinen eigenen Pool, deshalb den der EditEngine
198*cdf0e10cSrcweir 		SfxItemPool* pOutlPool=EditEngine::CreatePool( bLoadRefCounts );
199*cdf0e10cSrcweir 		// OutlinerPool als SecondaryPool des SdrPool
200*cdf0e10cSrcweir 		pItemPool->SetSecondaryPool(pOutlPool);
201*cdf0e10cSrcweir 		// Merken, dass ich mir die beiden Pools selbst gemacht habe
202*cdf0e10cSrcweir 		bMyPool=sal_True;
203*cdf0e10cSrcweir 	}
204*cdf0e10cSrcweir 	pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir // SJ: #95129# using static SdrEngineDefaults only if default SvxFontHeight item is not available
207*cdf0e10cSrcweir     const SfxPoolItem* pPoolItem = pItemPool->GetPoolDefaultItem( EE_CHAR_FONTHEIGHT );
208*cdf0e10cSrcweir     if ( pPoolItem )
209*cdf0e10cSrcweir         nDefTextHgt = ((SvxFontHeightItem*)pPoolItem)->GetHeight();
210*cdf0e10cSrcweir     else
211*cdf0e10cSrcweir         nDefTextHgt = SdrEngineDefaults::GetFontHeight();
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( SdrTextWordWrapItem( sal_False ) );
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir 	SetTextDefaults();
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir 	pLayerAdmin=new SdrLayerAdmin;
218*cdf0e10cSrcweir 	pLayerAdmin->SetModel(this);
219*cdf0e10cSrcweir 	ImpSetUIUnit();
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir 	// den DrawOutliner OnDemand erzeugen geht noch nicht, weil ich den Pool
222*cdf0e10cSrcweir 	// sonst nicht kriege (erst ab 302!)
223*cdf0e10cSrcweir 	pDrawOutliner = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, this );
224*cdf0e10cSrcweir 	ImpSetOutlinerDefaults(pDrawOutliner, sal_True);
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir 	pHitTestOutliner = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, this );
227*cdf0e10cSrcweir 	ImpSetOutlinerDefaults(pHitTestOutliner, sal_True);
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir 	ImpCreateTables();
230*cdf0e10cSrcweir }
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir SdrModel::SdrModel(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, sal_Bool bLoadRefCounts):
233*cdf0e10cSrcweir 	maMaPag(1024,32,32),
234*cdf0e10cSrcweir 	maPages(1024,32,32)
235*cdf0e10cSrcweir {
236*cdf0e10cSrcweir #ifdef TIMELOG
237*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::SdrModel(...)" );
238*cdf0e10cSrcweir #endif
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir 	DBG_CTOR(SdrModel,NULL);
241*cdf0e10cSrcweir 	ImpCtor(pPool,pPers,sal_False, (FASTBOOL)bLoadRefCounts);
242*cdf0e10cSrcweir }
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir SdrModel::SdrModel(const String& rPath, SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, sal_Bool bLoadRefCounts):
245*cdf0e10cSrcweir 	maMaPag(1024,32,32),
246*cdf0e10cSrcweir 	maPages(1024,32,32),
247*cdf0e10cSrcweir 	aTablePath(rPath)
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir #ifdef TIMELOG
250*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::SdrModel(...)" );
251*cdf0e10cSrcweir #endif
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir 	DBG_CTOR(SdrModel,NULL);
254*cdf0e10cSrcweir 	ImpCtor(pPool,pPers,sal_False, (FASTBOOL)bLoadRefCounts);
255*cdf0e10cSrcweir }
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir SdrModel::SdrModel(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, FASTBOOL bUseExtColorTable, sal_Bool bLoadRefCounts):
258*cdf0e10cSrcweir 	maMaPag(1024,32,32),
259*cdf0e10cSrcweir 	maPages(1024,32,32)
260*cdf0e10cSrcweir {
261*cdf0e10cSrcweir #ifdef TIMELOG
262*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::SdrModel(...)" );
263*cdf0e10cSrcweir #endif
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir 	DBG_CTOR(SdrModel,NULL);
266*cdf0e10cSrcweir 	ImpCtor(pPool,pPers,bUseExtColorTable, (FASTBOOL)bLoadRefCounts);
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir SdrModel::SdrModel(const String& rPath, SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, FASTBOOL bUseExtColorTable, sal_Bool bLoadRefCounts):
270*cdf0e10cSrcweir 	maMaPag(1024,32,32),
271*cdf0e10cSrcweir 	maPages(1024,32,32),
272*cdf0e10cSrcweir 	aTablePath(rPath)
273*cdf0e10cSrcweir {
274*cdf0e10cSrcweir #ifdef TIMELOG
275*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::SdrModel(...)" );
276*cdf0e10cSrcweir #endif
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir 	DBG_CTOR(SdrModel,NULL);
279*cdf0e10cSrcweir 	ImpCtor(pPool,pPers,bUseExtColorTable, (FASTBOOL)bLoadRefCounts);
280*cdf0e10cSrcweir }
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir SdrModel::SdrModel(const SdrModel& /*rSrcModel*/):
283*cdf0e10cSrcweir 	SfxBroadcaster(),
284*cdf0e10cSrcweir 	tools::WeakBase< SdrModel >(),
285*cdf0e10cSrcweir 	maMaPag(1024,32,32),
286*cdf0e10cSrcweir 	maPages(1024,32,32)
287*cdf0e10cSrcweir {
288*cdf0e10cSrcweir #ifdef TIMELOG
289*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::SdrModel(...)" );
290*cdf0e10cSrcweir #endif
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir 	// noch nicht implementiert
293*cdf0e10cSrcweir 	DBG_ERROR("SdrModel::CopyCtor() ist noch nicht implementiert");
294*cdf0e10cSrcweir }
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir SdrModel::~SdrModel()
297*cdf0e10cSrcweir {
298*cdf0e10cSrcweir #ifdef TIMELOG
299*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "svx", "aw93748", "SdrModel::~SdrModel(...)" );
300*cdf0e10cSrcweir #endif
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir 	DBG_DTOR(SdrModel,NULL);
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir 	mbInDestruction = true;
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	Broadcast(SdrHint(HINT_MODELCLEARED));
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir 	delete mpOutlinerCache;
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir 	ClearUndoBuffer();
311*cdf0e10cSrcweir #ifdef DBG_UTIL
312*cdf0e10cSrcweir 	if(pAktUndoGroup)
313*cdf0e10cSrcweir 	{
314*cdf0e10cSrcweir 		ByteString aStr("Im Dtor des SdrModel steht noch ein offenes Undo rum: \"");
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir 		aStr += ByteString(pAktUndoGroup->GetComment(), gsl_getSystemTextEncoding());
317*cdf0e10cSrcweir 		aStr += '\"';
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir 		DBG_ERROR(aStr.GetBuffer());
320*cdf0e10cSrcweir 	}
321*cdf0e10cSrcweir #endif
322*cdf0e10cSrcweir 	if (pAktUndoGroup!=NULL)
323*cdf0e10cSrcweir 		delete pAktUndoGroup;
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir 	// #116168#
326*cdf0e10cSrcweir 	ClearModel(sal_True);
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir 	delete pLayerAdmin;
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir 	// Den DrawOutliner erst nach dem ItemPool loeschen, da
331*cdf0e10cSrcweir 	// der ItemPool Items des DrawOutliners referenziert !!! (<- das war mal)
332*cdf0e10cSrcweir 	// Wg. Problem bei Malte Reihenfolge wieder umgestellt.
333*cdf0e10cSrcweir 	// Loeschen des Outliners vor dem loeschen des ItemPools
334*cdf0e10cSrcweir 	delete pHitTestOutliner;
335*cdf0e10cSrcweir 	delete pDrawOutliner;
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir 	// delete StyleSheetPool, derived classes should not do this since
338*cdf0e10cSrcweir 	// the DrawingEngine may need it in its destrctor (SB)
339*cdf0e10cSrcweir 	if( mxStyleSheetPool.is() )
340*cdf0e10cSrcweir 	{
341*cdf0e10cSrcweir 		Reference< XComponent > xComponent( dynamic_cast< cppu::OWeakObject* >( mxStyleSheetPool.get() ), UNO_QUERY );
342*cdf0e10cSrcweir 		if( xComponent.is() ) try
343*cdf0e10cSrcweir 		{
344*cdf0e10cSrcweir 			xComponent->dispose();
345*cdf0e10cSrcweir 		}
346*cdf0e10cSrcweir 		catch( RuntimeException& )
347*cdf0e10cSrcweir 		{
348*cdf0e10cSrcweir 		}
349*cdf0e10cSrcweir 		mxStyleSheetPool.clear();
350*cdf0e10cSrcweir 	}
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 	if (bMyPool)
353*cdf0e10cSrcweir 	{
354*cdf0e10cSrcweir 		// Pools loeschen, falls es meine sind
355*cdf0e10cSrcweir 		SfxItemPool* pOutlPool=pItemPool->GetSecondaryPool();
356*cdf0e10cSrcweir         SfxItemPool::Free(pItemPool);
357*cdf0e10cSrcweir 		// Der OutlinerPool muss nach dem ItemPool plattgemacht werden, da der
358*cdf0e10cSrcweir 		// ItemPool SetItems enthaelt die ihrerseits Items des OutlinerPools
359*cdf0e10cSrcweir 		// referenzieren (Joe)
360*cdf0e10cSrcweir         SfxItemPool::Free(pOutlPool);
361*cdf0e10cSrcweir 	}
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir 	if( mpForbiddenCharactersTable )
364*cdf0e10cSrcweir 		mpForbiddenCharactersTable->release();
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir 	// Tabellen, Listen und Paletten loeschen
367*cdf0e10cSrcweir 	if (!bExtColorTable)
368*cdf0e10cSrcweir 		delete pColorTable;
369*cdf0e10cSrcweir 	delete pDashList;
370*cdf0e10cSrcweir 	delete pLineEndList;
371*cdf0e10cSrcweir 	delete pHatchList;
372*cdf0e10cSrcweir 	delete pGradientList;
373*cdf0e10cSrcweir 	delete pBitmapList;
374*cdf0e10cSrcweir 
375*cdf0e10cSrcweir 	if(mpNumberFormatter)
376*cdf0e10cSrcweir 		delete mpNumberFormatter;
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir 	delete mpImpl->mpUndoFactory;
379*cdf0e10cSrcweir 	delete mpImpl;
380*cdf0e10cSrcweir }
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir bool SdrModel::IsInDestruction() const
383*cdf0e10cSrcweir {
384*cdf0e10cSrcweir 	return mbInDestruction;
385*cdf0e10cSrcweir }
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir const SvNumberFormatter& SdrModel::GetNumberFormatter() const
388*cdf0e10cSrcweir {
389*cdf0e10cSrcweir 	if(!mpNumberFormatter)
390*cdf0e10cSrcweir 	{
391*cdf0e10cSrcweir 		// use cast here since from outside view this IS a const method
392*cdf0e10cSrcweir 		((SdrModel*)this)->mpNumberFormatter = new SvNumberFormatter(
393*cdf0e10cSrcweir 			::comphelper::getProcessServiceFactory(), LANGUAGE_SYSTEM);
394*cdf0e10cSrcweir 	}
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir 	return *mpNumberFormatter;
397*cdf0e10cSrcweir }
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir // noch nicht implementiert:
400*cdf0e10cSrcweir void SdrModel::operator=(const SdrModel& /*rSrcModel*/)
401*cdf0e10cSrcweir {
402*cdf0e10cSrcweir 	DBG_ERROR("SdrModel::operator=() ist noch nicht implementiert");
403*cdf0e10cSrcweir }
404*cdf0e10cSrcweir 
405*cdf0e10cSrcweir FASTBOOL SdrModel::operator==(const SdrModel& /*rCmpModel*/) const
406*cdf0e10cSrcweir {
407*cdf0e10cSrcweir 	DBG_ERROR("SdrModel::operator==() ist noch nicht implementiert");
408*cdf0e10cSrcweir 	return sal_False;
409*cdf0e10cSrcweir }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir void SdrModel::SetSwapGraphics( FASTBOOL bSwap )
412*cdf0e10cSrcweir {
413*cdf0e10cSrcweir 	bSwapGraphics = bSwap;
414*cdf0e10cSrcweir }
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir FASTBOOL SdrModel::IsReadOnly() const
417*cdf0e10cSrcweir {
418*cdf0e10cSrcweir 	return bReadOnly;
419*cdf0e10cSrcweir }
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir void SdrModel::SetReadOnly(FASTBOOL bYes)
422*cdf0e10cSrcweir {
423*cdf0e10cSrcweir 	bReadOnly=bYes;
424*cdf0e10cSrcweir }
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir void SdrModel::SetMaxUndoActionCount(sal_uIntPtr nAnz)
429*cdf0e10cSrcweir {
430*cdf0e10cSrcweir 	if (nAnz<1) nAnz=1;
431*cdf0e10cSrcweir 	nMaxUndoCount=nAnz;
432*cdf0e10cSrcweir 	if (pUndoStack!=NULL) {
433*cdf0e10cSrcweir 		while (pUndoStack->Count()>nMaxUndoCount) {
434*cdf0e10cSrcweir 			delete (SfxUndoAction*) pUndoStack->Remove(pUndoStack->Count());
435*cdf0e10cSrcweir 		}
436*cdf0e10cSrcweir 	}
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir void SdrModel::ClearUndoBuffer()
440*cdf0e10cSrcweir {
441*cdf0e10cSrcweir 	if (pUndoStack!=NULL) {
442*cdf0e10cSrcweir 		while (pUndoStack->Count()!=0) {
443*cdf0e10cSrcweir 			delete (SfxUndoAction*) pUndoStack->Remove(pUndoStack->Count()-1);
444*cdf0e10cSrcweir 		}
445*cdf0e10cSrcweir 		delete pUndoStack;
446*cdf0e10cSrcweir 		pUndoStack=NULL;
447*cdf0e10cSrcweir 	}
448*cdf0e10cSrcweir 	if (pRedoStack!=NULL) {
449*cdf0e10cSrcweir 		while (pRedoStack->Count()!=0) {
450*cdf0e10cSrcweir 			delete (SfxUndoAction*) pRedoStack->Remove(pRedoStack->Count()-1);
451*cdf0e10cSrcweir 		}
452*cdf0e10cSrcweir 		delete pRedoStack;
453*cdf0e10cSrcweir 		pRedoStack=NULL;
454*cdf0e10cSrcweir 	}
455*cdf0e10cSrcweir }
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir FASTBOOL SdrModel::Undo()
458*cdf0e10cSrcweir {
459*cdf0e10cSrcweir 	FASTBOOL bRet=sal_False;
460*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
461*cdf0e10cSrcweir 	{
462*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::Undo(), method not supported with application undo manager!");
463*cdf0e10cSrcweir 	}
464*cdf0e10cSrcweir 	else
465*cdf0e10cSrcweir 	{
466*cdf0e10cSrcweir 		SfxUndoAction* pDo=(SfxUndoAction*)GetUndoAction(0);
467*cdf0e10cSrcweir 		if(pDo!=NULL)
468*cdf0e10cSrcweir 		{
469*cdf0e10cSrcweir 			const bool bWasUndoEnabled = mbUndoEnabled;
470*cdf0e10cSrcweir 			mbUndoEnabled = false;
471*cdf0e10cSrcweir 			pDo->Undo();
472*cdf0e10cSrcweir 			if(pRedoStack==NULL)
473*cdf0e10cSrcweir 				pRedoStack=new Container(1024,16,16);
474*cdf0e10cSrcweir 			pRedoStack->Insert(pUndoStack->Remove((sal_uIntPtr)0),(sal_uIntPtr)0);
475*cdf0e10cSrcweir 			mbUndoEnabled = bWasUndoEnabled;
476*cdf0e10cSrcweir 		}
477*cdf0e10cSrcweir 	}
478*cdf0e10cSrcweir 	return bRet;
479*cdf0e10cSrcweir }
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir FASTBOOL SdrModel::Redo()
482*cdf0e10cSrcweir {
483*cdf0e10cSrcweir 	FASTBOOL bRet=sal_False;
484*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
485*cdf0e10cSrcweir 	{
486*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::Redo(), method not supported with application undo manager!");
487*cdf0e10cSrcweir 	}
488*cdf0e10cSrcweir 	else
489*cdf0e10cSrcweir 	{
490*cdf0e10cSrcweir 		SfxUndoAction* pDo=(SfxUndoAction*)GetRedoAction(0);
491*cdf0e10cSrcweir 		if(pDo!=NULL)
492*cdf0e10cSrcweir 		{
493*cdf0e10cSrcweir 			const bool bWasUndoEnabled = mbUndoEnabled;
494*cdf0e10cSrcweir 			mbUndoEnabled = false;
495*cdf0e10cSrcweir 			pDo->Redo();
496*cdf0e10cSrcweir 			if(pUndoStack==NULL)
497*cdf0e10cSrcweir 				pUndoStack=new Container(1024,16,16);
498*cdf0e10cSrcweir 			pUndoStack->Insert(pRedoStack->Remove((sal_uIntPtr)0),(sal_uIntPtr)0);
499*cdf0e10cSrcweir 			mbUndoEnabled = bWasUndoEnabled;
500*cdf0e10cSrcweir 		}
501*cdf0e10cSrcweir 	}
502*cdf0e10cSrcweir 	return bRet;
503*cdf0e10cSrcweir }
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir FASTBOOL SdrModel::Repeat(SfxRepeatTarget& rView)
506*cdf0e10cSrcweir {
507*cdf0e10cSrcweir 	FASTBOOL bRet=sal_False;
508*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
509*cdf0e10cSrcweir 	{
510*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::Redo(), method not supported with application undo manager!");
511*cdf0e10cSrcweir 	}
512*cdf0e10cSrcweir 	else
513*cdf0e10cSrcweir 	{
514*cdf0e10cSrcweir 		SfxUndoAction* pDo=(SfxUndoAction*)GetUndoAction(0);
515*cdf0e10cSrcweir 		if(pDo!=NULL)
516*cdf0e10cSrcweir 		{
517*cdf0e10cSrcweir 			if(pDo->CanRepeat(rView))
518*cdf0e10cSrcweir 			{
519*cdf0e10cSrcweir 				pDo->Repeat(rView);
520*cdf0e10cSrcweir 				bRet=sal_True;
521*cdf0e10cSrcweir 			}
522*cdf0e10cSrcweir 		}
523*cdf0e10cSrcweir 	}
524*cdf0e10cSrcweir 	return bRet;
525*cdf0e10cSrcweir }
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir void SdrModel::ImpPostUndoAction(SdrUndoAction* pUndo)
528*cdf0e10cSrcweir {
529*cdf0e10cSrcweir 	DBG_ASSERT( mpImpl->mpUndoManager == 0, "svx::SdrModel::ImpPostUndoAction(), method not supported with application undo manager!" );
530*cdf0e10cSrcweir 	if( IsUndoEnabled() )
531*cdf0e10cSrcweir 	{
532*cdf0e10cSrcweir 		if (aUndoLink.IsSet())
533*cdf0e10cSrcweir 		{
534*cdf0e10cSrcweir 			aUndoLink.Call(pUndo);
535*cdf0e10cSrcweir 		}
536*cdf0e10cSrcweir 		else
537*cdf0e10cSrcweir 		{
538*cdf0e10cSrcweir 			if (pUndoStack==NULL)
539*cdf0e10cSrcweir 				pUndoStack=new Container(1024,16,16);
540*cdf0e10cSrcweir 			pUndoStack->Insert(pUndo,(sal_uIntPtr)0);
541*cdf0e10cSrcweir 			while (pUndoStack->Count()>nMaxUndoCount)
542*cdf0e10cSrcweir 			{
543*cdf0e10cSrcweir 				delete (SfxUndoAction*)pUndoStack->Remove(pUndoStack->Count()-1);
544*cdf0e10cSrcweir 			}
545*cdf0e10cSrcweir 			if (pRedoStack!=NULL)
546*cdf0e10cSrcweir 				pRedoStack->Clear();
547*cdf0e10cSrcweir 		}
548*cdf0e10cSrcweir 	}
549*cdf0e10cSrcweir 	else
550*cdf0e10cSrcweir 	{
551*cdf0e10cSrcweir 		delete pUndo;
552*cdf0e10cSrcweir 	}
553*cdf0e10cSrcweir }
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir void SdrModel::BegUndo()
556*cdf0e10cSrcweir {
557*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
558*cdf0e10cSrcweir 	{
559*cdf0e10cSrcweir 		const String aEmpty;
560*cdf0e10cSrcweir 		mpImpl->mpUndoManager->EnterListAction(aEmpty,aEmpty);
561*cdf0e10cSrcweir 		nUndoLevel++;
562*cdf0e10cSrcweir 	}
563*cdf0e10cSrcweir 	else if( IsUndoEnabled() )
564*cdf0e10cSrcweir 	{
565*cdf0e10cSrcweir 		if(pAktUndoGroup==NULL)
566*cdf0e10cSrcweir 		{
567*cdf0e10cSrcweir 			pAktUndoGroup = new SdrUndoGroup(*this);
568*cdf0e10cSrcweir 			nUndoLevel=1;
569*cdf0e10cSrcweir 		}
570*cdf0e10cSrcweir 		else
571*cdf0e10cSrcweir 		{
572*cdf0e10cSrcweir 			nUndoLevel++;
573*cdf0e10cSrcweir 		}
574*cdf0e10cSrcweir 	}
575*cdf0e10cSrcweir }
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir void SdrModel::BegUndo(const XubString& rComment)
578*cdf0e10cSrcweir {
579*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
580*cdf0e10cSrcweir 	{
581*cdf0e10cSrcweir 		const String aEmpty;
582*cdf0e10cSrcweir 		mpImpl->mpUndoManager->EnterListAction( rComment, aEmpty );
583*cdf0e10cSrcweir 		nUndoLevel++;
584*cdf0e10cSrcweir 	}
585*cdf0e10cSrcweir 	else if( IsUndoEnabled() )
586*cdf0e10cSrcweir 	{
587*cdf0e10cSrcweir 		BegUndo();
588*cdf0e10cSrcweir 		if (nUndoLevel==1)
589*cdf0e10cSrcweir 		{
590*cdf0e10cSrcweir 			pAktUndoGroup->SetComment(rComment);
591*cdf0e10cSrcweir 		}
592*cdf0e10cSrcweir 	}
593*cdf0e10cSrcweir }
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir void SdrModel::BegUndo(const XubString& rComment, const XubString& rObjDescr, SdrRepeatFunc eFunc)
596*cdf0e10cSrcweir {
597*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
598*cdf0e10cSrcweir 	{
599*cdf0e10cSrcweir 		String aComment(rComment);
600*cdf0e10cSrcweir 		if( aComment.Len() && rObjDescr.Len() )
601*cdf0e10cSrcweir 		{
602*cdf0e10cSrcweir 			String aSearchString(RTL_CONSTASCII_USTRINGPARAM("%1"));
603*cdf0e10cSrcweir 			aComment.SearchAndReplace(aSearchString, rObjDescr);
604*cdf0e10cSrcweir 		}
605*cdf0e10cSrcweir 		const String aEmpty;
606*cdf0e10cSrcweir 		mpImpl->mpUndoManager->EnterListAction( aComment,aEmpty );
607*cdf0e10cSrcweir 		nUndoLevel++;
608*cdf0e10cSrcweir 	}
609*cdf0e10cSrcweir 	else if( IsUndoEnabled() )
610*cdf0e10cSrcweir 	{
611*cdf0e10cSrcweir 		BegUndo();
612*cdf0e10cSrcweir 		if (nUndoLevel==1)
613*cdf0e10cSrcweir 		{
614*cdf0e10cSrcweir 			pAktUndoGroup->SetComment(rComment);
615*cdf0e10cSrcweir 			pAktUndoGroup->SetObjDescription(rObjDescr);
616*cdf0e10cSrcweir 			pAktUndoGroup->SetRepeatFunction(eFunc);
617*cdf0e10cSrcweir 		}
618*cdf0e10cSrcweir 	}
619*cdf0e10cSrcweir }
620*cdf0e10cSrcweir 
621*cdf0e10cSrcweir void SdrModel::BegUndo(SdrUndoGroup* pUndoGrp)
622*cdf0e10cSrcweir {
623*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
624*cdf0e10cSrcweir 	{
625*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::BegUndo(), method not supported with application undo manager!" );
626*cdf0e10cSrcweir 		nUndoLevel++;
627*cdf0e10cSrcweir 	}
628*cdf0e10cSrcweir 	else if( IsUndoEnabled() )
629*cdf0e10cSrcweir 	{
630*cdf0e10cSrcweir 		if (pAktUndoGroup==NULL)
631*cdf0e10cSrcweir 		{
632*cdf0e10cSrcweir 			pAktUndoGroup=pUndoGrp;
633*cdf0e10cSrcweir 			nUndoLevel=1;
634*cdf0e10cSrcweir 		}
635*cdf0e10cSrcweir 		else
636*cdf0e10cSrcweir 		{
637*cdf0e10cSrcweir 			delete pUndoGrp;
638*cdf0e10cSrcweir 			nUndoLevel++;
639*cdf0e10cSrcweir 		}
640*cdf0e10cSrcweir 	}
641*cdf0e10cSrcweir 	else
642*cdf0e10cSrcweir 	{
643*cdf0e10cSrcweir 		delete pUndoGrp;
644*cdf0e10cSrcweir 	}
645*cdf0e10cSrcweir }
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir void SdrModel::EndUndo()
648*cdf0e10cSrcweir {
649*cdf0e10cSrcweir 	DBG_ASSERT(nUndoLevel!=0,"SdrModel::EndUndo(): UndoLevel is already 0!");
650*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
651*cdf0e10cSrcweir 	{
652*cdf0e10cSrcweir 		if( nUndoLevel )
653*cdf0e10cSrcweir 		{
654*cdf0e10cSrcweir 			nUndoLevel--;
655*cdf0e10cSrcweir 			mpImpl->mpUndoManager->LeaveListAction();
656*cdf0e10cSrcweir 		}
657*cdf0e10cSrcweir 	}
658*cdf0e10cSrcweir 	else
659*cdf0e10cSrcweir 	{
660*cdf0e10cSrcweir 		if(pAktUndoGroup!=NULL && IsUndoEnabled())
661*cdf0e10cSrcweir 		{
662*cdf0e10cSrcweir 			nUndoLevel--;
663*cdf0e10cSrcweir 			if(nUndoLevel==0)
664*cdf0e10cSrcweir 			{
665*cdf0e10cSrcweir 				if(pAktUndoGroup->GetActionCount()!=0)
666*cdf0e10cSrcweir 				{
667*cdf0e10cSrcweir 					SdrUndoAction* pUndo=pAktUndoGroup;
668*cdf0e10cSrcweir 					pAktUndoGroup=NULL;
669*cdf0e10cSrcweir 					ImpPostUndoAction(pUndo);
670*cdf0e10cSrcweir 				}
671*cdf0e10cSrcweir 				else
672*cdf0e10cSrcweir 				{
673*cdf0e10cSrcweir 					// was empty
674*cdf0e10cSrcweir 					delete pAktUndoGroup;
675*cdf0e10cSrcweir 					pAktUndoGroup=NULL;
676*cdf0e10cSrcweir 				}
677*cdf0e10cSrcweir 			}
678*cdf0e10cSrcweir 		}
679*cdf0e10cSrcweir 	}
680*cdf0e10cSrcweir }
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir void SdrModel::SetUndoComment(const XubString& rComment)
683*cdf0e10cSrcweir {
684*cdf0e10cSrcweir 	DBG_ASSERT(nUndoLevel!=0,"SdrModel::SetUndoComment(): UndoLevel is on level 0!");
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
687*cdf0e10cSrcweir 	{
688*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::SetUndoComment(), method not supported with application undo manager!" );
689*cdf0e10cSrcweir 	}
690*cdf0e10cSrcweir 	else if( IsUndoEnabled() )
691*cdf0e10cSrcweir 	{
692*cdf0e10cSrcweir 		if(nUndoLevel==1)
693*cdf0e10cSrcweir 		{
694*cdf0e10cSrcweir 			pAktUndoGroup->SetComment(rComment);
695*cdf0e10cSrcweir 		}
696*cdf0e10cSrcweir 	}
697*cdf0e10cSrcweir }
698*cdf0e10cSrcweir 
699*cdf0e10cSrcweir void SdrModel::SetUndoComment(const XubString& rComment, const XubString& rObjDescr)
700*cdf0e10cSrcweir {
701*cdf0e10cSrcweir 	DBG_ASSERT(nUndoLevel!=0,"SdrModel::SetUndoComment(): UndoLevel is 0!");
702*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
703*cdf0e10cSrcweir 	{
704*cdf0e10cSrcweir 		DBG_ERROR("svx::SdrModel::SetUndoComment(), method not supported with application undo manager!" );
705*cdf0e10cSrcweir 	}
706*cdf0e10cSrcweir 	else
707*cdf0e10cSrcweir 	{
708*cdf0e10cSrcweir 		if (nUndoLevel==1)
709*cdf0e10cSrcweir 		{
710*cdf0e10cSrcweir 			pAktUndoGroup->SetComment(rComment);
711*cdf0e10cSrcweir 			pAktUndoGroup->SetObjDescription(rObjDescr);
712*cdf0e10cSrcweir 		}
713*cdf0e10cSrcweir 	}
714*cdf0e10cSrcweir }
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir void SdrModel::AddUndo(SdrUndoAction* pUndo)
717*cdf0e10cSrcweir {
718*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
719*cdf0e10cSrcweir 	{
720*cdf0e10cSrcweir 		mpImpl->mpUndoManager->AddUndoAction( pUndo );
721*cdf0e10cSrcweir 	}
722*cdf0e10cSrcweir 	else if( !IsUndoEnabled() )
723*cdf0e10cSrcweir 	{
724*cdf0e10cSrcweir 		delete pUndo;
725*cdf0e10cSrcweir 	}
726*cdf0e10cSrcweir 	else
727*cdf0e10cSrcweir 	{
728*cdf0e10cSrcweir 		if (pAktUndoGroup!=NULL)
729*cdf0e10cSrcweir 		{
730*cdf0e10cSrcweir 			pAktUndoGroup->AddAction(pUndo);
731*cdf0e10cSrcweir 		}
732*cdf0e10cSrcweir 		else
733*cdf0e10cSrcweir 		{
734*cdf0e10cSrcweir 			ImpPostUndoAction(pUndo);
735*cdf0e10cSrcweir 		}
736*cdf0e10cSrcweir 	}
737*cdf0e10cSrcweir }
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir void SdrModel::EnableUndo( bool bEnable )
740*cdf0e10cSrcweir {
741*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
742*cdf0e10cSrcweir 	{
743*cdf0e10cSrcweir 		mpImpl->mpUndoManager->EnableUndo( bEnable );
744*cdf0e10cSrcweir 	}
745*cdf0e10cSrcweir 	else
746*cdf0e10cSrcweir 	{
747*cdf0e10cSrcweir 		mbUndoEnabled = bEnable;
748*cdf0e10cSrcweir 	}
749*cdf0e10cSrcweir }
750*cdf0e10cSrcweir 
751*cdf0e10cSrcweir bool SdrModel::IsUndoEnabled() const
752*cdf0e10cSrcweir {
753*cdf0e10cSrcweir 	if( mpImpl->mpUndoManager )
754*cdf0e10cSrcweir 	{
755*cdf0e10cSrcweir 		return mpImpl->mpUndoManager->IsUndoEnabled();
756*cdf0e10cSrcweir 	}
757*cdf0e10cSrcweir 	else
758*cdf0e10cSrcweir 	{
759*cdf0e10cSrcweir 		return mbUndoEnabled;
760*cdf0e10cSrcweir 	}
761*cdf0e10cSrcweir }
762*cdf0e10cSrcweir 
763*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir void SdrModel::ImpCreateTables()
766*cdf0e10cSrcweir {
767*cdf0e10cSrcweir 	// der Writer hat seinen eigenen ColorTable
768*cdf0e10cSrcweir 	if (!bExtColorTable) pColorTable=new XColorTable(aTablePath,(XOutdevItemPool*)pItemPool);
769*cdf0e10cSrcweir 	pDashList    =new XDashList    (aTablePath,(XOutdevItemPool*)pItemPool);
770*cdf0e10cSrcweir 	pLineEndList =new XLineEndList (aTablePath,(XOutdevItemPool*)pItemPool);
771*cdf0e10cSrcweir 	pHatchList   =new XHatchList   (aTablePath,(XOutdevItemPool*)pItemPool);
772*cdf0e10cSrcweir 	pGradientList=new XGradientList(aTablePath,(XOutdevItemPool*)pItemPool);
773*cdf0e10cSrcweir 	pBitmapList  =new XBitmapList  (aTablePath,(XOutdevItemPool*)pItemPool);
774*cdf0e10cSrcweir }
775*cdf0e10cSrcweir 
776*cdf0e10cSrcweir // #116168#
777*cdf0e10cSrcweir void SdrModel::ClearModel(sal_Bool bCalledFromDestructor)
778*cdf0e10cSrcweir {
779*cdf0e10cSrcweir 	if(bCalledFromDestructor)
780*cdf0e10cSrcweir 	{
781*cdf0e10cSrcweir 		mbInDestruction = true;
782*cdf0e10cSrcweir 	}
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir 	sal_Int32 i;
785*cdf0e10cSrcweir 	// delete all drawing pages
786*cdf0e10cSrcweir 	sal_Int32 nAnz=GetPageCount();
787*cdf0e10cSrcweir 	for (i=nAnz-1; i>=0; i--)
788*cdf0e10cSrcweir 	{
789*cdf0e10cSrcweir 		DeletePage( (sal_uInt16)i );
790*cdf0e10cSrcweir 	}
791*cdf0e10cSrcweir 	maPages.Clear();
792*cdf0e10cSrcweir 	// #109538#
793*cdf0e10cSrcweir 	PageListChanged();
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir 	// delete all Masterpages
796*cdf0e10cSrcweir 	nAnz=GetMasterPageCount();
797*cdf0e10cSrcweir 	for(i=nAnz-1; i>=0; i--)
798*cdf0e10cSrcweir 	{
799*cdf0e10cSrcweir 		DeleteMasterPage( (sal_uInt16)i );
800*cdf0e10cSrcweir 	}
801*cdf0e10cSrcweir 	maMaPag.Clear();
802*cdf0e10cSrcweir 	// #109538#
803*cdf0e10cSrcweir 	MasterPageListChanged();
804*cdf0e10cSrcweir 
805*cdf0e10cSrcweir 	pLayerAdmin->ClearLayer();
806*cdf0e10cSrcweir }
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir SdrModel* SdrModel::AllocModel() const
809*cdf0e10cSrcweir {
810*cdf0e10cSrcweir 	SdrModel* pModel=new SdrModel;
811*cdf0e10cSrcweir 	pModel->SetScaleUnit(eObjUnit,aObjUnit);
812*cdf0e10cSrcweir 	return pModel;
813*cdf0e10cSrcweir }
814*cdf0e10cSrcweir 
815*cdf0e10cSrcweir SdrPage* SdrModel::AllocPage(FASTBOOL bMasterPage)
816*cdf0e10cSrcweir {
817*cdf0e10cSrcweir 	return new SdrPage(*this,bMasterPage);
818*cdf0e10cSrcweir }
819*cdf0e10cSrcweir 
820*cdf0e10cSrcweir void SdrModel::SetTextDefaults() const
821*cdf0e10cSrcweir {
822*cdf0e10cSrcweir 	SetTextDefaults( pItemPool, nDefTextHgt );
823*cdf0e10cSrcweir }
824*cdf0e10cSrcweir 
825*cdf0e10cSrcweir void ImpGetDefaultFontsLanguage( SvxFontItem& rLatin, SvxFontItem& rAsian, SvxFontItem& rComplex)
826*cdf0e10cSrcweir {
827*cdf0e10cSrcweir 	const sal_uInt16 nItemCnt = 3;
828*cdf0e10cSrcweir 	static struct {
829*cdf0e10cSrcweir 		sal_uInt16 nFntType, nLanguage;
830*cdf0e10cSrcweir 	}  aOutTypeArr[ nItemCnt ] = {
831*cdf0e10cSrcweir 		{  DEFAULTFONT_LATIN_TEXT, LANGUAGE_ENGLISH_US },
832*cdf0e10cSrcweir 		{  DEFAULTFONT_CJK_TEXT, LANGUAGE_ENGLISH_US },
833*cdf0e10cSrcweir 		{  DEFAULTFONT_CTL_TEXT, LANGUAGE_ARABIC_SAUDI_ARABIA }
834*cdf0e10cSrcweir 	};
835*cdf0e10cSrcweir 	SvxFontItem* aItemArr[ nItemCnt ] = { &rLatin, &rAsian, &rComplex };
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < nItemCnt; ++n )
838*cdf0e10cSrcweir 	{
839*cdf0e10cSrcweir 		Font aFnt( OutputDevice::GetDefaultFont(
840*cdf0e10cSrcweir 			aOutTypeArr[ n ].nFntType, aOutTypeArr[ n ].nLanguage,
841*cdf0e10cSrcweir 			DEFAULTFONT_FLAGS_ONLYONE, 0 ));
842*cdf0e10cSrcweir 		SvxFontItem* pI = aItemArr[ n ];
843*cdf0e10cSrcweir         pI->SetFamily( aFnt.GetFamily());
844*cdf0e10cSrcweir         pI->SetFamilyName( aFnt.GetName());
845*cdf0e10cSrcweir         pI->SetStyleName( String() );
846*cdf0e10cSrcweir         pI->SetPitch( aFnt.GetPitch());
847*cdf0e10cSrcweir         pI->SetCharSet( aFnt.GetCharSet() );
848*cdf0e10cSrcweir 	}
849*cdf0e10cSrcweir }
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_uIntPtr nDefTextHgt )
852*cdf0e10cSrcweir {
853*cdf0e10cSrcweir 	// #95114# set application-language specific dynamic pool language defaults
854*cdf0e10cSrcweir     SvxFontItem aSvxFontItem( EE_CHAR_FONTINFO) ;
855*cdf0e10cSrcweir 	SvxFontItem aSvxFontItemCJK(EE_CHAR_FONTINFO_CJK);
856*cdf0e10cSrcweir 	SvxFontItem aSvxFontItemCTL(EE_CHAR_FONTINFO_CTL);
857*cdf0e10cSrcweir 	sal_uInt16 nLanguage(Application::GetSettings().GetLanguage());
858*cdf0e10cSrcweir 
859*cdf0e10cSrcweir 	// get DEFAULTFONT_LATIN_TEXT and set at pool as dynamic default
860*cdf0e10cSrcweir 	Font aFont(OutputDevice::GetDefaultFont(DEFAULTFONT_LATIN_TEXT, nLanguage, DEFAULTFONT_FLAGS_ONLYONE, 0));
861*cdf0e10cSrcweir     aSvxFontItem.SetFamily(aFont.GetFamily());
862*cdf0e10cSrcweir     aSvxFontItem.SetFamilyName(aFont.GetName());
863*cdf0e10cSrcweir     aSvxFontItem.SetStyleName(String());
864*cdf0e10cSrcweir     aSvxFontItem.SetPitch( aFont.GetPitch());
865*cdf0e10cSrcweir     aSvxFontItem.SetCharSet( aFont.GetCharSet() );
866*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem(aSvxFontItem);
867*cdf0e10cSrcweir 
868*cdf0e10cSrcweir 	// get DEFAULTFONT_CJK_TEXT and set at pool as dynamic default
869*cdf0e10cSrcweir 	Font aFontCJK(OutputDevice::GetDefaultFont(DEFAULTFONT_CJK_TEXT, nLanguage, DEFAULTFONT_FLAGS_ONLYONE, 0));
870*cdf0e10cSrcweir     aSvxFontItemCJK.SetFamily( aFontCJK.GetFamily());
871*cdf0e10cSrcweir     aSvxFontItemCJK.SetFamilyName(aFontCJK.GetName());
872*cdf0e10cSrcweir     aSvxFontItemCJK.SetStyleName(String());
873*cdf0e10cSrcweir     aSvxFontItemCJK.SetPitch( aFontCJK.GetPitch());
874*cdf0e10cSrcweir     aSvxFontItemCJK.SetCharSet( aFontCJK.GetCharSet());
875*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem(aSvxFontItemCJK);
876*cdf0e10cSrcweir 
877*cdf0e10cSrcweir 	// get DEFAULTFONT_CTL_TEXT and set at pool as dynamic default
878*cdf0e10cSrcweir 	Font aFontCTL(OutputDevice::GetDefaultFont(DEFAULTFONT_CTL_TEXT, nLanguage, DEFAULTFONT_FLAGS_ONLYONE, 0));
879*cdf0e10cSrcweir     aSvxFontItemCTL.SetFamily(aFontCTL.GetFamily());
880*cdf0e10cSrcweir     aSvxFontItemCTL.SetFamilyName(aFontCTL.GetName());
881*cdf0e10cSrcweir     aSvxFontItemCTL.SetStyleName(String());
882*cdf0e10cSrcweir     aSvxFontItemCTL.SetPitch( aFontCTL.GetPitch() );
883*cdf0e10cSrcweir     aSvxFontItemCTL.SetCharSet( aFontCTL.GetCharSet());
884*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem(aSvxFontItemCTL);
885*cdf0e10cSrcweir 
886*cdf0e10cSrcweir 	// set dynamic FontHeight defaults
887*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT ) );
888*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CJK ) );
889*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CTL ) );
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir 	// set FontColor defaults
892*cdf0e10cSrcweir     pItemPool->SetPoolDefaultItem( SvxColorItem(SdrEngineDefaults::GetFontColor(), EE_CHAR_COLOR) );
893*cdf0e10cSrcweir }
894*cdf0e10cSrcweir 
895*cdf0e10cSrcweir SdrOutliner& SdrModel::GetDrawOutliner(const SdrTextObj* pObj) const
896*cdf0e10cSrcweir {
897*cdf0e10cSrcweir 	pDrawOutliner->SetTextObj(pObj);
898*cdf0e10cSrcweir 	return *pDrawOutliner;
899*cdf0e10cSrcweir }
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir boost::shared_ptr< SdrOutliner > SdrModel::CreateDrawOutliner(const SdrTextObj* pObj)
902*cdf0e10cSrcweir {
903*cdf0e10cSrcweir 	boost::shared_ptr< SdrOutliner > xDrawOutliner( SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, this ) );
904*cdf0e10cSrcweir 	ImpSetOutlinerDefaults(xDrawOutliner.get(), sal_True);
905*cdf0e10cSrcweir 	xDrawOutliner->SetTextObj(pObj);
906*cdf0e10cSrcweir 	return xDrawOutliner;
907*cdf0e10cSrcweir }
908*cdf0e10cSrcweir 
909*cdf0e10cSrcweir const SdrTextObj* SdrModel::GetFormattingTextObj() const
910*cdf0e10cSrcweir {
911*cdf0e10cSrcweir 	if (pDrawOutliner!=NULL) {
912*cdf0e10cSrcweir 		return pDrawOutliner->GetTextObj();
913*cdf0e10cSrcweir 	}
914*cdf0e10cSrcweir 	return NULL;
915*cdf0e10cSrcweir }
916*cdf0e10cSrcweir 
917*cdf0e10cSrcweir void SdrModel::ImpSetOutlinerDefaults( SdrOutliner* pOutliner, sal_Bool bInit )
918*cdf0e10cSrcweir {
919*cdf0e10cSrcweir 	/**************************************************************************
920*cdf0e10cSrcweir 	* Initialisierung der Outliner fuer Textausgabe und HitTest
921*cdf0e10cSrcweir 	**************************************************************************/
922*cdf0e10cSrcweir 	if( bInit )
923*cdf0e10cSrcweir 	{
924*cdf0e10cSrcweir 		pOutliner->EraseVirtualDevice();
925*cdf0e10cSrcweir 		pOutliner->SetUpdateMode(sal_False);
926*cdf0e10cSrcweir 		pOutliner->SetEditTextObjectPool(pItemPool);
927*cdf0e10cSrcweir 		pOutliner->SetDefTab(nDefaultTabulator);
928*cdf0e10cSrcweir 	}
929*cdf0e10cSrcweir 
930*cdf0e10cSrcweir 	pOutliner->SetRefDevice(GetRefDevice());
931*cdf0e10cSrcweir 	pOutliner->SetForbiddenCharsTable(GetForbiddenCharsTable());
932*cdf0e10cSrcweir 	pOutliner->SetAsianCompressionMode( mnCharCompressType );
933*cdf0e10cSrcweir 	pOutliner->SetKernAsianPunctuation( IsKernAsianPunctuation() );
934*cdf0e10cSrcweir     pOutliner->SetAddExtLeading( IsAddExtLeading() );
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir 	if ( !GetRefDevice() )
937*cdf0e10cSrcweir 	{
938*cdf0e10cSrcweir 		MapMode aMapMode(eObjUnit, Point(0,0), aObjUnit, aObjUnit);
939*cdf0e10cSrcweir 		pOutliner->SetRefMapMode(aMapMode);
940*cdf0e10cSrcweir 	}
941*cdf0e10cSrcweir }
942*cdf0e10cSrcweir 
943*cdf0e10cSrcweir void SdrModel::SetRefDevice(OutputDevice* pDev)
944*cdf0e10cSrcweir {
945*cdf0e10cSrcweir 	pRefOutDev=pDev;
946*cdf0e10cSrcweir 	ImpSetOutlinerDefaults( pDrawOutliner );
947*cdf0e10cSrcweir 	ImpSetOutlinerDefaults( pHitTestOutliner );
948*cdf0e10cSrcweir 	RefDeviceChanged();
949*cdf0e10cSrcweir }
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir void SdrModel::ImpReformatAllTextObjects()
952*cdf0e10cSrcweir {
953*cdf0e10cSrcweir 	if( isLocked() )
954*cdf0e10cSrcweir 		return;
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir 	sal_uInt16 nAnz=GetMasterPageCount();
957*cdf0e10cSrcweir 	sal_uInt16 nNum;
958*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++) {
959*cdf0e10cSrcweir 		GetMasterPage(nNum)->ReformatAllTextObjects();
960*cdf0e10cSrcweir 	}
961*cdf0e10cSrcweir 	nAnz=GetPageCount();
962*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++) {
963*cdf0e10cSrcweir 		GetPage(nNum)->ReformatAllTextObjects();
964*cdf0e10cSrcweir 	}
965*cdf0e10cSrcweir }
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir /** #103122#
968*cdf0e10cSrcweir 	steps over all available pages and sends notify messages to
969*cdf0e10cSrcweir 	all edge objects that are connected to other objects so that
970*cdf0e10cSrcweir 	they may reposition itselfs
971*cdf0e10cSrcweir */
972*cdf0e10cSrcweir void SdrModel::ImpReformatAllEdgeObjects()
973*cdf0e10cSrcweir {
974*cdf0e10cSrcweir 	if( isLocked() )
975*cdf0e10cSrcweir 		return;
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir 	sal_uInt16 nAnz=GetMasterPageCount();
978*cdf0e10cSrcweir 	sal_uInt16 nNum;
979*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++)
980*cdf0e10cSrcweir 	{
981*cdf0e10cSrcweir 		GetMasterPage(nNum)->ReformatAllEdgeObjects();
982*cdf0e10cSrcweir 	}
983*cdf0e10cSrcweir 	nAnz=GetPageCount();
984*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++)
985*cdf0e10cSrcweir 	{
986*cdf0e10cSrcweir 		GetPage(nNum)->ReformatAllEdgeObjects();
987*cdf0e10cSrcweir 	}
988*cdf0e10cSrcweir }
989*cdf0e10cSrcweir 
990*cdf0e10cSrcweir SvStream* SdrModel::GetDocumentStream(SdrDocumentStreamInfo& /*rStreamInfo*/) const
991*cdf0e10cSrcweir {
992*cdf0e10cSrcweir 	return NULL;
993*cdf0e10cSrcweir }
994*cdf0e10cSrcweir 
995*cdf0e10cSrcweir // Die Vorlagenattribute der Zeichenobjekte in harte Attribute verwandeln.
996*cdf0e10cSrcweir void SdrModel::BurnInStyleSheetAttributes()
997*cdf0e10cSrcweir {
998*cdf0e10cSrcweir 	sal_uInt16 nAnz=GetMasterPageCount();
999*cdf0e10cSrcweir 	sal_uInt16 nNum;
1000*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++) {
1001*cdf0e10cSrcweir 		GetMasterPage(nNum)->BurnInStyleSheetAttributes();
1002*cdf0e10cSrcweir 	}
1003*cdf0e10cSrcweir 	nAnz=GetPageCount();
1004*cdf0e10cSrcweir 	for (nNum=0; nNum<nAnz; nNum++) {
1005*cdf0e10cSrcweir 		GetPage(nNum)->BurnInStyleSheetAttributes();
1006*cdf0e10cSrcweir 	}
1007*cdf0e10cSrcweir }
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir void SdrModel::RefDeviceChanged()
1010*cdf0e10cSrcweir {
1011*cdf0e10cSrcweir 	Broadcast(SdrHint(HINT_REFDEVICECHG));
1012*cdf0e10cSrcweir 	ImpReformatAllTextObjects();
1013*cdf0e10cSrcweir }
1014*cdf0e10cSrcweir 
1015*cdf0e10cSrcweir void SdrModel::SetDefaultFontHeight(sal_uIntPtr nVal)
1016*cdf0e10cSrcweir {
1017*cdf0e10cSrcweir 	if (nVal!=nDefTextHgt) {
1018*cdf0e10cSrcweir 		nDefTextHgt=nVal;
1019*cdf0e10cSrcweir 		Broadcast(SdrHint(HINT_DEFFONTHGTCHG));
1020*cdf0e10cSrcweir 		ImpReformatAllTextObjects();
1021*cdf0e10cSrcweir 	}
1022*cdf0e10cSrcweir }
1023*cdf0e10cSrcweir 
1024*cdf0e10cSrcweir void SdrModel::SetDefaultTabulator(sal_uInt16 nVal)
1025*cdf0e10cSrcweir {
1026*cdf0e10cSrcweir 	if (nDefaultTabulator!=nVal) {
1027*cdf0e10cSrcweir 		nDefaultTabulator=nVal;
1028*cdf0e10cSrcweir 		Outliner& rOutliner=GetDrawOutliner();
1029*cdf0e10cSrcweir 		rOutliner.SetDefTab(nVal);
1030*cdf0e10cSrcweir 		Broadcast(SdrHint(HINT_DEFAULTTABCHG));
1031*cdf0e10cSrcweir 		ImpReformatAllTextObjects();
1032*cdf0e10cSrcweir 	}
1033*cdf0e10cSrcweir }
1034*cdf0e10cSrcweir 
1035*cdf0e10cSrcweir void SdrModel::ImpSetUIUnit()
1036*cdf0e10cSrcweir {
1037*cdf0e10cSrcweir 	if(0 == aUIScale.GetNumerator() || 0 == aUIScale.GetDenominator())
1038*cdf0e10cSrcweir     {
1039*cdf0e10cSrcweir         aUIScale = Fraction(1,1);
1040*cdf0e10cSrcweir     }
1041*cdf0e10cSrcweir 
1042*cdf0e10cSrcweir     // set start values
1043*cdf0e10cSrcweir 	nUIUnitKomma = 0;
1044*cdf0e10cSrcweir 	sal_Int64 nMul(1);
1045*cdf0e10cSrcweir 	sal_Int64 nDiv(1);
1046*cdf0e10cSrcweir 
1047*cdf0e10cSrcweir 	// normalize on meters resp. inch
1048*cdf0e10cSrcweir 	switch (eObjUnit)
1049*cdf0e10cSrcweir     {
1050*cdf0e10cSrcweir 		case MAP_100TH_MM   : nUIUnitKomma+=5; break;
1051*cdf0e10cSrcweir 		case MAP_10TH_MM    : nUIUnitKomma+=4; break;
1052*cdf0e10cSrcweir 		case MAP_MM         : nUIUnitKomma+=3; break;
1053*cdf0e10cSrcweir 		case MAP_CM         : nUIUnitKomma+=2; break;
1054*cdf0e10cSrcweir 		case MAP_1000TH_INCH: nUIUnitKomma+=3; break;
1055*cdf0e10cSrcweir 		case MAP_100TH_INCH : nUIUnitKomma+=2; break;
1056*cdf0e10cSrcweir 		case MAP_10TH_INCH  : nUIUnitKomma+=1; break;
1057*cdf0e10cSrcweir 		case MAP_INCH       : nUIUnitKomma+=0; break;
1058*cdf0e10cSrcweir 		case MAP_POINT      : nDiv=72;     break;          // 1Pt   = 1/72"
1059*cdf0e10cSrcweir 		case MAP_TWIP       : nDiv=144; nUIUnitKomma++; break; // 1Twip = 1/1440"
1060*cdf0e10cSrcweir 		case MAP_PIXEL      : break;
1061*cdf0e10cSrcweir 		case MAP_SYSFONT    : break;
1062*cdf0e10cSrcweir 		case MAP_APPFONT    : break;
1063*cdf0e10cSrcweir 		case MAP_RELATIVE   : break;
1064*cdf0e10cSrcweir 		default: break;
1065*cdf0e10cSrcweir 	} // switch
1066*cdf0e10cSrcweir 
1067*cdf0e10cSrcweir 	// 1 mile    =  8 furlong = 63.360" = 1.609.344,0mm
1068*cdf0e10cSrcweir 	// 1 furlong = 10 chains  =  7.920" =   201.168,0mm
1069*cdf0e10cSrcweir 	// 1 chain   =  4 poles   =    792" =    20.116,8mm
1070*cdf0e10cSrcweir 	// 1 pole    =  5 1/2 yd  =    198" =     5.029,2mm
1071*cdf0e10cSrcweir 	// 1 yd      =  3 ft      =     36" =       914,4mm
1072*cdf0e10cSrcweir 	// 1 ft      = 12 "       =      1" =       304,8mm
1073*cdf0e10cSrcweir 	switch (eUIUnit)
1074*cdf0e10cSrcweir     {
1075*cdf0e10cSrcweir 		case FUNIT_NONE   : break;
1076*cdf0e10cSrcweir 		// Metrisch
1077*cdf0e10cSrcweir 		case FUNIT_100TH_MM: nUIUnitKomma-=5; break;
1078*cdf0e10cSrcweir 		case FUNIT_MM     : nUIUnitKomma-=3; break;
1079*cdf0e10cSrcweir 		case FUNIT_CM     : nUIUnitKomma-=2; break;
1080*cdf0e10cSrcweir 		case FUNIT_M      : nUIUnitKomma+=0; break;
1081*cdf0e10cSrcweir 		case FUNIT_KM     : nUIUnitKomma+=3; break;
1082*cdf0e10cSrcweir 		// Inch
1083*cdf0e10cSrcweir 		case FUNIT_TWIP   : nMul=144; nUIUnitKomma--;  break;  // 1Twip = 1/1440"
1084*cdf0e10cSrcweir 		case FUNIT_POINT  : nMul=72;     break;            // 1Pt   = 1/72"
1085*cdf0e10cSrcweir 		case FUNIT_PICA   : nMul=6;      break;            // 1Pica = 1/6"  ?
1086*cdf0e10cSrcweir 		case FUNIT_INCH   : break;                         // 1"    = 1"
1087*cdf0e10cSrcweir 		case FUNIT_FOOT   : nDiv*=12;    break;            // 1Ft   = 12"
1088*cdf0e10cSrcweir 		case FUNIT_MILE   : nDiv*=6336; nUIUnitKomma++; break; // 1mile = 63360"
1089*cdf0e10cSrcweir 		// sonstiges
1090*cdf0e10cSrcweir 		case FUNIT_CUSTOM : break;
1091*cdf0e10cSrcweir 		case FUNIT_PERCENT: nUIUnitKomma+=2; break;
1092*cdf0e10cSrcweir 	} // switch
1093*cdf0e10cSrcweir 
1094*cdf0e10cSrcweir     // check if mapping is from metric to inch and adapt
1095*cdf0e10cSrcweir 	const bool bMapInch(IsInch(eObjUnit));
1096*cdf0e10cSrcweir 	const bool bUIMetr(IsMetric(eUIUnit));
1097*cdf0e10cSrcweir 
1098*cdf0e10cSrcweir     if (bMapInch && bUIMetr)
1099*cdf0e10cSrcweir     {
1100*cdf0e10cSrcweir 		nUIUnitKomma += 4;
1101*cdf0e10cSrcweir 		nMul *= 254;
1102*cdf0e10cSrcweir 	}
1103*cdf0e10cSrcweir 
1104*cdf0e10cSrcweir     // check if mapping is from inch to metric and adapt
1105*cdf0e10cSrcweir 	const bool bMapMetr(IsMetric(eObjUnit));
1106*cdf0e10cSrcweir 	const bool bUIInch(IsInch(eUIUnit));
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir     if (bMapMetr && bUIInch)
1109*cdf0e10cSrcweir     {
1110*cdf0e10cSrcweir 		nUIUnitKomma -= 4;
1111*cdf0e10cSrcweir 		nDiv *= 254;
1112*cdf0e10cSrcweir 	}
1113*cdf0e10cSrcweir 
1114*cdf0e10cSrcweir 	// use temporary fraction for reduction (fallback to 32bit here),
1115*cdf0e10cSrcweir     // may need to be changed in the future, too
1116*cdf0e10cSrcweir     if(1 != nMul || 1 != nDiv)
1117*cdf0e10cSrcweir     {
1118*cdf0e10cSrcweir         const Fraction aTemp(static_cast< long >(nMul), static_cast< long >(nDiv));
1119*cdf0e10cSrcweir         nMul = aTemp.GetNumerator();
1120*cdf0e10cSrcweir         nDiv = aTemp.GetDenominator();
1121*cdf0e10cSrcweir     }
1122*cdf0e10cSrcweir 
1123*cdf0e10cSrcweir     // #i89872# take Unit of Measurement into account
1124*cdf0e10cSrcweir     if(1 != aUIScale.GetDenominator() || 1 != aUIScale.GetNumerator())
1125*cdf0e10cSrcweir     {
1126*cdf0e10cSrcweir         // divide by UIScale
1127*cdf0e10cSrcweir 	    nMul *= aUIScale.GetDenominator();
1128*cdf0e10cSrcweir 	    nDiv *= aUIScale.GetNumerator();
1129*cdf0e10cSrcweir     }
1130*cdf0e10cSrcweir 
1131*cdf0e10cSrcweir     // shorten trailing zeroes for dividend
1132*cdf0e10cSrcweir     while(0 == (nMul % 10))
1133*cdf0e10cSrcweir     {
1134*cdf0e10cSrcweir 	    nUIUnitKomma--;
1135*cdf0e10cSrcweir 	    nMul /= 10;
1136*cdf0e10cSrcweir     }
1137*cdf0e10cSrcweir 
1138*cdf0e10cSrcweir     // shorten trailing zeroes for divisor
1139*cdf0e10cSrcweir     while(0 == (nDiv % 10))
1140*cdf0e10cSrcweir     {
1141*cdf0e10cSrcweir 	    nUIUnitKomma++;
1142*cdf0e10cSrcweir 	    nDiv /= 10;
1143*cdf0e10cSrcweir     }
1144*cdf0e10cSrcweir 
1145*cdf0e10cSrcweir     // end preparations, set member values
1146*cdf0e10cSrcweir     aUIUnitFact = Fraction(sal_Int32(nMul), sal_Int32(nDiv));
1147*cdf0e10cSrcweir 	bUIOnlyKomma = (nMul == nDiv);
1148*cdf0e10cSrcweir 	TakeUnitStr(eUIUnit, aUIUnitStr);
1149*cdf0e10cSrcweir }
1150*cdf0e10cSrcweir 
1151*cdf0e10cSrcweir void SdrModel::SetScaleUnit(MapUnit eMap, const Fraction& rFrac)
1152*cdf0e10cSrcweir {
1153*cdf0e10cSrcweir 	if (eObjUnit!=eMap || aObjUnit!=rFrac) {
1154*cdf0e10cSrcweir 		eObjUnit=eMap;
1155*cdf0e10cSrcweir 		aObjUnit=rFrac;
1156*cdf0e10cSrcweir 		pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
1157*cdf0e10cSrcweir 		ImpSetUIUnit();
1158*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pDrawOutliner );
1159*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pHitTestOutliner );
1160*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1161*cdf0e10cSrcweir 	}
1162*cdf0e10cSrcweir }
1163*cdf0e10cSrcweir 
1164*cdf0e10cSrcweir void SdrModel::SetScaleUnit(MapUnit eMap)
1165*cdf0e10cSrcweir {
1166*cdf0e10cSrcweir 	if (eObjUnit!=eMap) {
1167*cdf0e10cSrcweir 		eObjUnit=eMap;
1168*cdf0e10cSrcweir 		pItemPool->SetDefaultMetric((SfxMapUnit)eObjUnit);
1169*cdf0e10cSrcweir 		ImpSetUIUnit();
1170*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pDrawOutliner );
1171*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pHitTestOutliner );
1172*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1173*cdf0e10cSrcweir 	}
1174*cdf0e10cSrcweir }
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir void SdrModel::SetScaleFraction(const Fraction& rFrac)
1177*cdf0e10cSrcweir {
1178*cdf0e10cSrcweir 	if (aObjUnit!=rFrac) {
1179*cdf0e10cSrcweir 		aObjUnit=rFrac;
1180*cdf0e10cSrcweir 		ImpSetUIUnit();
1181*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pDrawOutliner );
1182*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pHitTestOutliner );
1183*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1184*cdf0e10cSrcweir 	}
1185*cdf0e10cSrcweir }
1186*cdf0e10cSrcweir 
1187*cdf0e10cSrcweir void SdrModel::SetUIUnit(FieldUnit eUnit)
1188*cdf0e10cSrcweir {
1189*cdf0e10cSrcweir 	if (eUIUnit!=eUnit) {
1190*cdf0e10cSrcweir 		eUIUnit=eUnit;
1191*cdf0e10cSrcweir 		ImpSetUIUnit();
1192*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1193*cdf0e10cSrcweir 	}
1194*cdf0e10cSrcweir }
1195*cdf0e10cSrcweir 
1196*cdf0e10cSrcweir void SdrModel::SetUIScale(const Fraction& rScale)
1197*cdf0e10cSrcweir {
1198*cdf0e10cSrcweir 	if (aUIScale!=rScale) {
1199*cdf0e10cSrcweir 		aUIScale=rScale;
1200*cdf0e10cSrcweir 		ImpSetUIUnit();
1201*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1202*cdf0e10cSrcweir 	}
1203*cdf0e10cSrcweir }
1204*cdf0e10cSrcweir 
1205*cdf0e10cSrcweir void SdrModel::SetUIUnit(FieldUnit eUnit, const Fraction& rScale)
1206*cdf0e10cSrcweir {
1207*cdf0e10cSrcweir 	if (eUIUnit!=eUnit || aUIScale!=rScale) {
1208*cdf0e10cSrcweir 		eUIUnit=eUnit;
1209*cdf0e10cSrcweir 		aUIScale=rScale;
1210*cdf0e10cSrcweir 		ImpSetUIUnit();
1211*cdf0e10cSrcweir 		ImpReformatAllTextObjects(); // #40424#
1212*cdf0e10cSrcweir 	}
1213*cdf0e10cSrcweir }
1214*cdf0e10cSrcweir 
1215*cdf0e10cSrcweir void SdrModel::TakeUnitStr(FieldUnit eUnit, XubString& rStr)
1216*cdf0e10cSrcweir {
1217*cdf0e10cSrcweir 	switch(eUnit)
1218*cdf0e10cSrcweir 	{
1219*cdf0e10cSrcweir 		default:
1220*cdf0e10cSrcweir 		case FUNIT_NONE   :
1221*cdf0e10cSrcweir 		case FUNIT_CUSTOM :
1222*cdf0e10cSrcweir 		{
1223*cdf0e10cSrcweir 			rStr = String();
1224*cdf0e10cSrcweir 			break;
1225*cdf0e10cSrcweir 		}
1226*cdf0e10cSrcweir 		case FUNIT_100TH_MM:
1227*cdf0e10cSrcweir 		{
1228*cdf0e10cSrcweir 			sal_Char aText[] = "/100mm";
1229*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1230*cdf0e10cSrcweir 			break;
1231*cdf0e10cSrcweir 		}
1232*cdf0e10cSrcweir 		case FUNIT_MM     :
1233*cdf0e10cSrcweir 		{
1234*cdf0e10cSrcweir 			sal_Char aText[] = "mm";
1235*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1236*cdf0e10cSrcweir 			break;
1237*cdf0e10cSrcweir 		}
1238*cdf0e10cSrcweir 		case FUNIT_CM     :
1239*cdf0e10cSrcweir 		{
1240*cdf0e10cSrcweir 			sal_Char aText[] = "cm";
1241*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1242*cdf0e10cSrcweir 			break;
1243*cdf0e10cSrcweir 		}
1244*cdf0e10cSrcweir 		case FUNIT_M      :
1245*cdf0e10cSrcweir 		{
1246*cdf0e10cSrcweir 			rStr = String();
1247*cdf0e10cSrcweir 			rStr += sal_Unicode('m');
1248*cdf0e10cSrcweir 			break;
1249*cdf0e10cSrcweir 		}
1250*cdf0e10cSrcweir 		case FUNIT_KM     :
1251*cdf0e10cSrcweir 		{
1252*cdf0e10cSrcweir 			sal_Char aText[] = "km";
1253*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1254*cdf0e10cSrcweir 			break;
1255*cdf0e10cSrcweir 		}
1256*cdf0e10cSrcweir 		case FUNIT_TWIP   :
1257*cdf0e10cSrcweir 		{
1258*cdf0e10cSrcweir 			sal_Char aText[] = "twip";
1259*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1260*cdf0e10cSrcweir 			break;
1261*cdf0e10cSrcweir 		}
1262*cdf0e10cSrcweir 		case FUNIT_POINT  :
1263*cdf0e10cSrcweir 		{
1264*cdf0e10cSrcweir 			sal_Char aText[] = "pt";
1265*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1266*cdf0e10cSrcweir 			break;
1267*cdf0e10cSrcweir 		}
1268*cdf0e10cSrcweir 		case FUNIT_PICA   :
1269*cdf0e10cSrcweir 		{
1270*cdf0e10cSrcweir 			sal_Char aText[] = "pica";
1271*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1272*cdf0e10cSrcweir 			break;
1273*cdf0e10cSrcweir 		}
1274*cdf0e10cSrcweir 		case FUNIT_INCH   :
1275*cdf0e10cSrcweir 		{
1276*cdf0e10cSrcweir 			rStr = String();
1277*cdf0e10cSrcweir 			rStr += sal_Unicode('"');
1278*cdf0e10cSrcweir 			break;
1279*cdf0e10cSrcweir 		}
1280*cdf0e10cSrcweir 		case FUNIT_FOOT   :
1281*cdf0e10cSrcweir 		{
1282*cdf0e10cSrcweir 			sal_Char aText[] = "ft";
1283*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1284*cdf0e10cSrcweir 			break;
1285*cdf0e10cSrcweir 		}
1286*cdf0e10cSrcweir 		case FUNIT_MILE   :
1287*cdf0e10cSrcweir 		{
1288*cdf0e10cSrcweir 			sal_Char aText[] = "mile(s)";
1289*cdf0e10cSrcweir 			rStr = UniString(aText, sizeof(aText-1));
1290*cdf0e10cSrcweir 			break;
1291*cdf0e10cSrcweir 		}
1292*cdf0e10cSrcweir 		case FUNIT_PERCENT:
1293*cdf0e10cSrcweir 		{
1294*cdf0e10cSrcweir 			rStr = String();
1295*cdf0e10cSrcweir 			rStr += sal_Unicode('%');
1296*cdf0e10cSrcweir 			break;
1297*cdf0e10cSrcweir 		}
1298*cdf0e10cSrcweir 	}
1299*cdf0e10cSrcweir }
1300*cdf0e10cSrcweir 
1301*cdf0e10cSrcweir void SdrModel::TakeMetricStr(long nVal, XubString& rStr, FASTBOOL bNoUnitChars, sal_Int32 nNumDigits) const
1302*cdf0e10cSrcweir {
1303*cdf0e10cSrcweir 	// #i22167#
1304*cdf0e10cSrcweir 	// change to double precision usage to not loose decimal places after comma
1305*cdf0e10cSrcweir 	const bool bNegative(nVal < 0L);
1306*cdf0e10cSrcweir     SvtSysLocale aSysLoc;
1307*cdf0e10cSrcweir     const LocaleDataWrapper& rLoc(aSysLoc.GetLocaleData());
1308*cdf0e10cSrcweir 	double fLocalValue(double(nVal) * double(aUIUnitFact));
1309*cdf0e10cSrcweir 
1310*cdf0e10cSrcweir 	if(bNegative)
1311*cdf0e10cSrcweir 	{
1312*cdf0e10cSrcweir 		fLocalValue = -fLocalValue;
1313*cdf0e10cSrcweir 	}
1314*cdf0e10cSrcweir 
1315*cdf0e10cSrcweir 	if( -1 == nNumDigits )
1316*cdf0e10cSrcweir 	{
1317*cdf0e10cSrcweir 		nNumDigits = rLoc.getNumDigits();
1318*cdf0e10cSrcweir 	}
1319*cdf0e10cSrcweir 
1320*cdf0e10cSrcweir 	sal_Int32 nKomma(nUIUnitKomma);
1321*cdf0e10cSrcweir 
1322*cdf0e10cSrcweir 	if(nKomma > nNumDigits)
1323*cdf0e10cSrcweir 	{
1324*cdf0e10cSrcweir 		const sal_Int32 nDiff(nKomma - nNumDigits);
1325*cdf0e10cSrcweir 		const double fFactor(pow(10.0, static_cast<const int>(nDiff)));
1326*cdf0e10cSrcweir 
1327*cdf0e10cSrcweir 		fLocalValue /= fFactor;
1328*cdf0e10cSrcweir 		nKomma = nNumDigits;
1329*cdf0e10cSrcweir 	}
1330*cdf0e10cSrcweir 	else if(nKomma < nNumDigits)
1331*cdf0e10cSrcweir 	{
1332*cdf0e10cSrcweir 		const sal_Int32 nDiff(nNumDigits - nKomma);
1333*cdf0e10cSrcweir 		const double fFactor(pow(10.0, static_cast<const int>(nDiff)));
1334*cdf0e10cSrcweir 
1335*cdf0e10cSrcweir 		fLocalValue *= fFactor;
1336*cdf0e10cSrcweir 		nKomma = nNumDigits;
1337*cdf0e10cSrcweir 	}
1338*cdf0e10cSrcweir 
1339*cdf0e10cSrcweir 	rStr = UniString::CreateFromInt32(static_cast<sal_Int32>(fLocalValue + 0.5));
1340*cdf0e10cSrcweir 
1341*cdf0e10cSrcweir 	if(nKomma < 0)
1342*cdf0e10cSrcweir 	{
1343*cdf0e10cSrcweir 		// Negatives Komma bedeutet: Nullen dran
1344*cdf0e10cSrcweir 		sal_Int32 nAnz(-nKomma);
1345*cdf0e10cSrcweir 
1346*cdf0e10cSrcweir 		for(sal_Int32 i=0; i<nAnz; i++)
1347*cdf0e10cSrcweir 			rStr += sal_Unicode('0');
1348*cdf0e10cSrcweir 
1349*cdf0e10cSrcweir 		nKomma = 0;
1350*cdf0e10cSrcweir 	}
1351*cdf0e10cSrcweir 
1352*cdf0e10cSrcweir 	// #83257# the second condition needs to be <= since inside this loop
1353*cdf0e10cSrcweir 	// also the leading zero is inserted.
1354*cdf0e10cSrcweir 	if(nKomma > 0 && rStr.Len() <= nKomma)
1355*cdf0e10cSrcweir 	{
1356*cdf0e10cSrcweir 		// Fuer Komma evtl. vorne Nullen dran
1357*cdf0e10cSrcweir 		sal_Int32 nAnz(nKomma - rStr.Len());
1358*cdf0e10cSrcweir 
1359*cdf0e10cSrcweir         if(nAnz >= 0 && rLoc.isNumLeadingZero())
1360*cdf0e10cSrcweir 			nAnz++;
1361*cdf0e10cSrcweir 
1362*cdf0e10cSrcweir 		for(sal_Int32 i=0; i<nAnz; i++)
1363*cdf0e10cSrcweir 			rStr.Insert(sal_Unicode('0'), 0);
1364*cdf0e10cSrcweir 	}
1365*cdf0e10cSrcweir 
1366*cdf0e10cSrcweir     sal_Unicode cDec( rLoc.getNumDecimalSep().GetChar(0) );
1367*cdf0e10cSrcweir 
1368*cdf0e10cSrcweir 	// KommaChar einfuegen
1369*cdf0e10cSrcweir 	sal_Int32 nVorKomma(rStr.Len() - nKomma);
1370*cdf0e10cSrcweir 
1371*cdf0e10cSrcweir 	if(nKomma > 0)
1372*cdf0e10cSrcweir         rStr.Insert(cDec, (xub_StrLen) nVorKomma);
1373*cdf0e10cSrcweir 
1374*cdf0e10cSrcweir     if(!rLoc.isNumTrailingZeros())
1375*cdf0e10cSrcweir 	{
1376*cdf0e10cSrcweir 		while(rStr.Len() && rStr.GetChar(rStr.Len() - 1) == sal_Unicode('0'))
1377*cdf0e10cSrcweir 			rStr.Erase(rStr.Len() - 1);
1378*cdf0e10cSrcweir 
1379*cdf0e10cSrcweir 		if(rStr.Len() && rStr.GetChar(rStr.Len() - 1) == cDec)
1380*cdf0e10cSrcweir 			rStr.Erase(rStr.Len() - 1);
1381*cdf0e10cSrcweir 	}
1382*cdf0e10cSrcweir 
1383*cdf0e10cSrcweir 	// ggf. Trennpunkte bei jedem Tausender einfuegen
1384*cdf0e10cSrcweir     if( nVorKomma > 3 )
1385*cdf0e10cSrcweir 	{
1386*cdf0e10cSrcweir         String aThoSep( rLoc.getNumThousandSep() );
1387*cdf0e10cSrcweir         if ( aThoSep.Len() > 0 )
1388*cdf0e10cSrcweir         {
1389*cdf0e10cSrcweir             sal_Unicode cTho( aThoSep.GetChar(0) );
1390*cdf0e10cSrcweir             sal_Int32 i(nVorKomma - 3);
1391*cdf0e10cSrcweir 
1392*cdf0e10cSrcweir             while(i > 0) // #78311#
1393*cdf0e10cSrcweir             {
1394*cdf0e10cSrcweir                 rStr.Insert(cTho, (xub_StrLen)i);
1395*cdf0e10cSrcweir                 i -= 3;
1396*cdf0e10cSrcweir             }
1397*cdf0e10cSrcweir         }
1398*cdf0e10cSrcweir 	}
1399*cdf0e10cSrcweir 
1400*cdf0e10cSrcweir 	if(!rStr.Len())
1401*cdf0e10cSrcweir 	{
1402*cdf0e10cSrcweir 		rStr = String();
1403*cdf0e10cSrcweir 		rStr += sal_Unicode('0');
1404*cdf0e10cSrcweir 	}
1405*cdf0e10cSrcweir 
1406*cdf0e10cSrcweir 	if(bNegative)
1407*cdf0e10cSrcweir 	{
1408*cdf0e10cSrcweir 		rStr.Insert(sal_Unicode('-'), 0);
1409*cdf0e10cSrcweir 	}
1410*cdf0e10cSrcweir 
1411*cdf0e10cSrcweir 	if(!bNoUnitChars)
1412*cdf0e10cSrcweir 		rStr += aUIUnitStr;
1413*cdf0e10cSrcweir }
1414*cdf0e10cSrcweir 
1415*cdf0e10cSrcweir void SdrModel::TakeWinkStr(long nWink, XubString& rStr, FASTBOOL bNoDegChar) const
1416*cdf0e10cSrcweir {
1417*cdf0e10cSrcweir 	sal_Bool bNeg(nWink < 0);
1418*cdf0e10cSrcweir 
1419*cdf0e10cSrcweir 	if(bNeg)
1420*cdf0e10cSrcweir 		nWink = -nWink;
1421*cdf0e10cSrcweir 
1422*cdf0e10cSrcweir 	rStr = UniString::CreateFromInt32(nWink);
1423*cdf0e10cSrcweir 
1424*cdf0e10cSrcweir     SvtSysLocale aSysLoc;
1425*cdf0e10cSrcweir     const LocaleDataWrapper& rLoc = aSysLoc.GetLocaleData();
1426*cdf0e10cSrcweir 	xub_StrLen nAnz(2);
1427*cdf0e10cSrcweir 
1428*cdf0e10cSrcweir     if(rLoc.isNumLeadingZero())
1429*cdf0e10cSrcweir 		nAnz++;
1430*cdf0e10cSrcweir 
1431*cdf0e10cSrcweir 	while(rStr.Len() < nAnz)
1432*cdf0e10cSrcweir 		rStr.Insert(sal_Unicode('0'), 0);
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir     rStr.Insert(rLoc.getNumDecimalSep().GetChar(0), rStr.Len() - 2);
1435*cdf0e10cSrcweir 
1436*cdf0e10cSrcweir 	if(bNeg)
1437*cdf0e10cSrcweir 		rStr.Insert(sal_Unicode('-'), 0);
1438*cdf0e10cSrcweir 
1439*cdf0e10cSrcweir 	if(!bNoDegChar)
1440*cdf0e10cSrcweir 		rStr += DEGREE_CHAR;
1441*cdf0e10cSrcweir }
1442*cdf0e10cSrcweir 
1443*cdf0e10cSrcweir void SdrModel::TakePercentStr(const Fraction& rVal, XubString& rStr, FASTBOOL bNoPercentChar) const
1444*cdf0e10cSrcweir {
1445*cdf0e10cSrcweir 	sal_Int32 nMul(rVal.GetNumerator());
1446*cdf0e10cSrcweir 	sal_Int32 nDiv(rVal.GetDenominator());
1447*cdf0e10cSrcweir 	sal_Bool bNeg(nMul < 0);
1448*cdf0e10cSrcweir 
1449*cdf0e10cSrcweir 	if(nDiv < 0)
1450*cdf0e10cSrcweir 		bNeg = !bNeg;
1451*cdf0e10cSrcweir 
1452*cdf0e10cSrcweir 	if(nMul < 0)
1453*cdf0e10cSrcweir 		nMul = -nMul;
1454*cdf0e10cSrcweir 
1455*cdf0e10cSrcweir 	if(nDiv < 0)
1456*cdf0e10cSrcweir 		nDiv = -nDiv;
1457*cdf0e10cSrcweir 
1458*cdf0e10cSrcweir 	nMul *= 100;
1459*cdf0e10cSrcweir 	nMul += nDiv/2;
1460*cdf0e10cSrcweir 	nMul /= nDiv;
1461*cdf0e10cSrcweir 
1462*cdf0e10cSrcweir 	rStr = UniString::CreateFromInt32(nMul);
1463*cdf0e10cSrcweir 
1464*cdf0e10cSrcweir 	if(bNeg)
1465*cdf0e10cSrcweir 		rStr.Insert(sal_Unicode('-'), 0);
1466*cdf0e10cSrcweir 
1467*cdf0e10cSrcweir 	if(!bNoPercentChar)
1468*cdf0e10cSrcweir 		rStr += sal_Unicode('%');
1469*cdf0e10cSrcweir }
1470*cdf0e10cSrcweir 
1471*cdf0e10cSrcweir void SdrModel::SetChanged(sal_Bool bFlg)
1472*cdf0e10cSrcweir {
1473*cdf0e10cSrcweir 	mbChanged = bFlg;
1474*cdf0e10cSrcweir }
1475*cdf0e10cSrcweir 
1476*cdf0e10cSrcweir void SdrModel::RecalcPageNums(FASTBOOL bMaster)
1477*cdf0e10cSrcweir {
1478*cdf0e10cSrcweir 	Container& rPL=*(bMaster ? &maMaPag : &maPages);
1479*cdf0e10cSrcweir 	sal_uInt16 nAnz=sal_uInt16(rPL.Count());
1480*cdf0e10cSrcweir 	sal_uInt16 i;
1481*cdf0e10cSrcweir 	for (i=0; i<nAnz; i++) {
1482*cdf0e10cSrcweir 		SdrPage* pPg=(SdrPage*)(rPL.GetObject(i));
1483*cdf0e10cSrcweir 		pPg->SetPageNum(i);
1484*cdf0e10cSrcweir 	}
1485*cdf0e10cSrcweir 	if (bMaster) bMPgNumsDirty=sal_False;
1486*cdf0e10cSrcweir 	else bPagNumsDirty=sal_False;
1487*cdf0e10cSrcweir }
1488*cdf0e10cSrcweir 
1489*cdf0e10cSrcweir void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos)
1490*cdf0e10cSrcweir {
1491*cdf0e10cSrcweir 	sal_uInt16 nAnz=GetPageCount();
1492*cdf0e10cSrcweir 	if (nPos>nAnz) nPos=nAnz;
1493*cdf0e10cSrcweir 	maPages.Insert(pPage,nPos);
1494*cdf0e10cSrcweir 	// #109538#
1495*cdf0e10cSrcweir 	PageListChanged();
1496*cdf0e10cSrcweir 	pPage->SetInserted(sal_True);
1497*cdf0e10cSrcweir 	pPage->SetPageNum(nPos);
1498*cdf0e10cSrcweir 	pPage->SetModel(this);
1499*cdf0e10cSrcweir 	if (nPos<nAnz) bPagNumsDirty=sal_True;
1500*cdf0e10cSrcweir 	SetChanged();
1501*cdf0e10cSrcweir 	SdrHint aHint(HINT_PAGEORDERCHG);
1502*cdf0e10cSrcweir 	aHint.SetPage(pPage);
1503*cdf0e10cSrcweir 	Broadcast(aHint);
1504*cdf0e10cSrcweir }
1505*cdf0e10cSrcweir 
1506*cdf0e10cSrcweir void SdrModel::DeletePage(sal_uInt16 nPgNum)
1507*cdf0e10cSrcweir {
1508*cdf0e10cSrcweir 	SdrPage* pPg=RemovePage(nPgNum);
1509*cdf0e10cSrcweir 	delete pPg;
1510*cdf0e10cSrcweir }
1511*cdf0e10cSrcweir 
1512*cdf0e10cSrcweir SdrPage* SdrModel::RemovePage(sal_uInt16 nPgNum)
1513*cdf0e10cSrcweir {
1514*cdf0e10cSrcweir 	SdrPage* pPg=(SdrPage*)maPages.Remove(nPgNum);
1515*cdf0e10cSrcweir 	// #109538#
1516*cdf0e10cSrcweir 	PageListChanged();
1517*cdf0e10cSrcweir 	if (pPg!=NULL) {
1518*cdf0e10cSrcweir 		pPg->SetInserted(sal_False);
1519*cdf0e10cSrcweir 	}
1520*cdf0e10cSrcweir 	bPagNumsDirty=sal_True;
1521*cdf0e10cSrcweir 	SetChanged();
1522*cdf0e10cSrcweir 	SdrHint aHint(HINT_PAGEORDERCHG);
1523*cdf0e10cSrcweir 	aHint.SetPage(pPg);
1524*cdf0e10cSrcweir 	Broadcast(aHint);
1525*cdf0e10cSrcweir 	return pPg;
1526*cdf0e10cSrcweir }
1527*cdf0e10cSrcweir 
1528*cdf0e10cSrcweir void SdrModel::MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
1529*cdf0e10cSrcweir {
1530*cdf0e10cSrcweir 	SdrPage* pPg=(SdrPage*)maPages.Remove(nPgNum);
1531*cdf0e10cSrcweir 	// #109538#
1532*cdf0e10cSrcweir 	PageListChanged();
1533*cdf0e10cSrcweir 	if (pPg!=NULL) {
1534*cdf0e10cSrcweir 		pPg->SetInserted(sal_False);
1535*cdf0e10cSrcweir 		InsertPage(pPg,nNewPos);
1536*cdf0e10cSrcweir 	}
1537*cdf0e10cSrcweir }
1538*cdf0e10cSrcweir 
1539*cdf0e10cSrcweir void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos)
1540*cdf0e10cSrcweir {
1541*cdf0e10cSrcweir 	sal_uInt16 nAnz=GetMasterPageCount();
1542*cdf0e10cSrcweir 	if (nPos>nAnz) nPos=nAnz;
1543*cdf0e10cSrcweir 	maMaPag.Insert(pPage,nPos);
1544*cdf0e10cSrcweir 	// #109538#
1545*cdf0e10cSrcweir 	MasterPageListChanged();
1546*cdf0e10cSrcweir 	pPage->SetInserted(sal_True);
1547*cdf0e10cSrcweir 	pPage->SetPageNum(nPos);
1548*cdf0e10cSrcweir 	pPage->SetModel(this);
1549*cdf0e10cSrcweir 	if (nPos<nAnz) {
1550*cdf0e10cSrcweir 		bMPgNumsDirty=sal_True;
1551*cdf0e10cSrcweir 	}
1552*cdf0e10cSrcweir 	SetChanged();
1553*cdf0e10cSrcweir 	SdrHint aHint(HINT_PAGEORDERCHG);
1554*cdf0e10cSrcweir 	aHint.SetPage(pPage);
1555*cdf0e10cSrcweir 	Broadcast(aHint);
1556*cdf0e10cSrcweir }
1557*cdf0e10cSrcweir 
1558*cdf0e10cSrcweir void SdrModel::DeleteMasterPage(sal_uInt16 nPgNum)
1559*cdf0e10cSrcweir {
1560*cdf0e10cSrcweir 	SdrPage* pPg=RemoveMasterPage(nPgNum);
1561*cdf0e10cSrcweir 	if (pPg!=NULL) delete pPg;
1562*cdf0e10cSrcweir }
1563*cdf0e10cSrcweir 
1564*cdf0e10cSrcweir SdrPage* SdrModel::RemoveMasterPage(sal_uInt16 nPgNum)
1565*cdf0e10cSrcweir {
1566*cdf0e10cSrcweir 	SdrPage* pRetPg=(SdrPage*)maMaPag.Remove(nPgNum);
1567*cdf0e10cSrcweir 	// #109538#
1568*cdf0e10cSrcweir 	MasterPageListChanged();
1569*cdf0e10cSrcweir 
1570*cdf0e10cSrcweir 	if(pRetPg)
1571*cdf0e10cSrcweir 	{
1572*cdf0e10cSrcweir 		// Nun die Verweise der normalen Zeichenseiten auf die entfernte MasterPage loeschen
1573*cdf0e10cSrcweir 		sal_uInt16 nPageAnz(GetPageCount());
1574*cdf0e10cSrcweir 
1575*cdf0e10cSrcweir 		for(sal_uInt16 np(0); np < nPageAnz; np++)
1576*cdf0e10cSrcweir 		{
1577*cdf0e10cSrcweir 			GetPage(np)->TRG_ImpMasterPageRemoved(*pRetPg);
1578*cdf0e10cSrcweir 		}
1579*cdf0e10cSrcweir 
1580*cdf0e10cSrcweir 		pRetPg->SetInserted(sal_False);
1581*cdf0e10cSrcweir 	}
1582*cdf0e10cSrcweir 
1583*cdf0e10cSrcweir 	bMPgNumsDirty=sal_True;
1584*cdf0e10cSrcweir 	SetChanged();
1585*cdf0e10cSrcweir 	SdrHint aHint(HINT_PAGEORDERCHG);
1586*cdf0e10cSrcweir 	aHint.SetPage(pRetPg);
1587*cdf0e10cSrcweir 	Broadcast(aHint);
1588*cdf0e10cSrcweir 	return pRetPg;
1589*cdf0e10cSrcweir }
1590*cdf0e10cSrcweir 
1591*cdf0e10cSrcweir void SdrModel::MoveMasterPage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
1592*cdf0e10cSrcweir {
1593*cdf0e10cSrcweir 	SdrPage* pPg=(SdrPage*)maMaPag.Remove(nPgNum);
1594*cdf0e10cSrcweir 	// #109538#
1595*cdf0e10cSrcweir 	MasterPageListChanged();
1596*cdf0e10cSrcweir 	if (pPg!=NULL) {
1597*cdf0e10cSrcweir 		pPg->SetInserted(sal_False);
1598*cdf0e10cSrcweir 		maMaPag.Insert(pPg,nNewPos);
1599*cdf0e10cSrcweir 		// #109538#
1600*cdf0e10cSrcweir 		MasterPageListChanged();
1601*cdf0e10cSrcweir 	}
1602*cdf0e10cSrcweir 	bMPgNumsDirty=sal_True;
1603*cdf0e10cSrcweir 	SetChanged();
1604*cdf0e10cSrcweir 	SdrHint aHint(HINT_PAGEORDERCHG);
1605*cdf0e10cSrcweir 	aHint.SetPage(pPg);
1606*cdf0e10cSrcweir 	Broadcast(aHint);
1607*cdf0e10cSrcweir }
1608*cdf0e10cSrcweir 
1609*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1610*cdf0e10cSrcweir 
1611*cdf0e10cSrcweir FASTBOOL SdrModel::CheckConsistence() const
1612*cdf0e10cSrcweir {
1613*cdf0e10cSrcweir 	FASTBOOL bRet=sal_True;
1614*cdf0e10cSrcweir #ifdef DBG_UTIL
1615*cdf0e10cSrcweir 	DBG_CHKTHIS(SdrModel,NULL);
1616*cdf0e10cSrcweir #endif
1617*cdf0e10cSrcweir 	return bRet;
1618*cdf0e10cSrcweir }
1619*cdf0e10cSrcweir 
1620*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1621*cdf0e10cSrcweir 
1622*cdf0e10cSrcweir // #48289#
1623*cdf0e10cSrcweir void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
1624*cdf0e10cSrcweir 						 sal_uInt16 nDestPos,
1625*cdf0e10cSrcweir 						 FASTBOOL bUndo, FASTBOOL bMoveNoCopy)
1626*cdf0e10cSrcweir {
1627*cdf0e10cSrcweir 	if( bUndo && !IsUndoEnabled() )
1628*cdf0e10cSrcweir 		bUndo = false;
1629*cdf0e10cSrcweir 
1630*cdf0e10cSrcweir 	if( bUndo )
1631*cdf0e10cSrcweir 		BegUndo(ImpGetResStr(STR_UndoMergeModel));
1632*cdf0e10cSrcweir 
1633*cdf0e10cSrcweir 	sal_uInt16 nPageAnz=GetPageCount();
1634*cdf0e10cSrcweir 	sal_uInt16 nMaxPage=nPageAnz;
1635*cdf0e10cSrcweir 
1636*cdf0e10cSrcweir 	if (nMaxPage!=0)
1637*cdf0e10cSrcweir 		nMaxPage--;
1638*cdf0e10cSrcweir 	if (nFirstPageNum>nMaxPage)
1639*cdf0e10cSrcweir 		nFirstPageNum=nMaxPage;
1640*cdf0e10cSrcweir 	if (nLastPageNum>nMaxPage)
1641*cdf0e10cSrcweir 		nLastPageNum =nMaxPage;
1642*cdf0e10cSrcweir 	FASTBOOL bReverse=nLastPageNum<nFirstPageNum;
1643*cdf0e10cSrcweir 	if (nDestPos>nPageAnz)
1644*cdf0e10cSrcweir 		nDestPos=nPageAnz;
1645*cdf0e10cSrcweir 
1646*cdf0e10cSrcweir 	// Zunaechst die Zeiger der betroffenen Seiten in einem Array sichern
1647*cdf0e10cSrcweir 	sal_uInt16 nPageNum=nFirstPageNum;
1648*cdf0e10cSrcweir 	sal_uInt16 nCopyAnz=((!bReverse)?(nLastPageNum-nFirstPageNum):(nFirstPageNum-nLastPageNum))+1;
1649*cdf0e10cSrcweir 	SdrPage** pPagePtrs=new SdrPage*[nCopyAnz];
1650*cdf0e10cSrcweir 	sal_uInt16 nCopyNum;
1651*cdf0e10cSrcweir 	for(nCopyNum=0; nCopyNum<nCopyAnz; nCopyNum++)
1652*cdf0e10cSrcweir 	{
1653*cdf0e10cSrcweir 		pPagePtrs[nCopyNum]=GetPage(nPageNum);
1654*cdf0e10cSrcweir 		if (bReverse)
1655*cdf0e10cSrcweir 			nPageNum--;
1656*cdf0e10cSrcweir 		else
1657*cdf0e10cSrcweir 			nPageNum++;
1658*cdf0e10cSrcweir 	}
1659*cdf0e10cSrcweir 
1660*cdf0e10cSrcweir 	// Jetzt die Seiten kopieren
1661*cdf0e10cSrcweir 	sal_uInt16 nDestNum=nDestPos;
1662*cdf0e10cSrcweir 	for (nCopyNum=0; nCopyNum<nCopyAnz; nCopyNum++)
1663*cdf0e10cSrcweir 	{
1664*cdf0e10cSrcweir 		SdrPage* pPg=pPagePtrs[nCopyNum];
1665*cdf0e10cSrcweir 		sal_uInt16 nPageNum2=pPg->GetPageNum();
1666*cdf0e10cSrcweir 		if (!bMoveNoCopy)
1667*cdf0e10cSrcweir 		{
1668*cdf0e10cSrcweir 			const SdrPage* pPg1=GetPage(nPageNum2);
1669*cdf0e10cSrcweir 			pPg=pPg1->Clone();
1670*cdf0e10cSrcweir 			InsertPage(pPg,nDestNum);
1671*cdf0e10cSrcweir 			if (bUndo)
1672*cdf0e10cSrcweir 				AddUndo(GetSdrUndoFactory().CreateUndoCopyPage(*pPg));
1673*cdf0e10cSrcweir 			nDestNum++;
1674*cdf0e10cSrcweir 		}
1675*cdf0e10cSrcweir 		else
1676*cdf0e10cSrcweir 		{
1677*cdf0e10cSrcweir 			// Move ist nicht getestet!
1678*cdf0e10cSrcweir 			if (nDestNum>nPageNum2)
1679*cdf0e10cSrcweir 				nDestNum--;
1680*cdf0e10cSrcweir 
1681*cdf0e10cSrcweir 			if(bUndo)
1682*cdf0e10cSrcweir 				AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*GetPage(nPageNum2),nPageNum2,nDestNum));
1683*cdf0e10cSrcweir 
1684*cdf0e10cSrcweir 			pPg=RemovePage(nPageNum2);
1685*cdf0e10cSrcweir 			InsertPage(pPg,nDestNum);
1686*cdf0e10cSrcweir 			nDestNum++;
1687*cdf0e10cSrcweir 		}
1688*cdf0e10cSrcweir 
1689*cdf0e10cSrcweir 		if(bReverse)
1690*cdf0e10cSrcweir 			nPageNum2--;
1691*cdf0e10cSrcweir 		else
1692*cdf0e10cSrcweir 			nPageNum2++;
1693*cdf0e10cSrcweir 	}
1694*cdf0e10cSrcweir 
1695*cdf0e10cSrcweir 	delete[] pPagePtrs;
1696*cdf0e10cSrcweir 	if(bUndo)
1697*cdf0e10cSrcweir 		EndUndo();
1698*cdf0e10cSrcweir }
1699*cdf0e10cSrcweir 
1700*cdf0e10cSrcweir void SdrModel::Merge(SdrModel& rSourceModel,
1701*cdf0e10cSrcweir 					 sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
1702*cdf0e10cSrcweir 					 sal_uInt16 nDestPos,
1703*cdf0e10cSrcweir 					 FASTBOOL bMergeMasterPages, FASTBOOL bAllMasterPages,
1704*cdf0e10cSrcweir 					 FASTBOOL bUndo, FASTBOOL bTreadSourceAsConst)
1705*cdf0e10cSrcweir {
1706*cdf0e10cSrcweir 	if (&rSourceModel==this)
1707*cdf0e10cSrcweir 	{ // #48289#
1708*cdf0e10cSrcweir 		CopyPages(nFirstPageNum,nLastPageNum,nDestPos,bUndo,!bTreadSourceAsConst);
1709*cdf0e10cSrcweir 		return;
1710*cdf0e10cSrcweir 	}
1711*cdf0e10cSrcweir 
1712*cdf0e10cSrcweir 	if( bUndo && !IsUndoEnabled() )
1713*cdf0e10cSrcweir 		bUndo = false;
1714*cdf0e10cSrcweir 
1715*cdf0e10cSrcweir 	if (bUndo)
1716*cdf0e10cSrcweir 		BegUndo(ImpGetResStr(STR_UndoMergeModel));
1717*cdf0e10cSrcweir 
1718*cdf0e10cSrcweir 	sal_uInt16 nSrcPageAnz=rSourceModel.GetPageCount();
1719*cdf0e10cSrcweir 	sal_uInt16 nSrcMasterPageAnz=rSourceModel.GetMasterPageCount();
1720*cdf0e10cSrcweir 	sal_uInt16 nDstMasterPageAnz=GetMasterPageCount();
1721*cdf0e10cSrcweir 	FASTBOOL bInsPages=(nFirstPageNum<nSrcPageAnz || nLastPageNum<nSrcPageAnz);
1722*cdf0e10cSrcweir 	sal_uInt16 nMaxSrcPage=nSrcPageAnz; if (nMaxSrcPage!=0) nMaxSrcPage--;
1723*cdf0e10cSrcweir 	if (nFirstPageNum>nMaxSrcPage) nFirstPageNum=nMaxSrcPage;
1724*cdf0e10cSrcweir 	if (nLastPageNum>nMaxSrcPage)  nLastPageNum =nMaxSrcPage;
1725*cdf0e10cSrcweir 	FASTBOOL bReverse=nLastPageNum<nFirstPageNum;
1726*cdf0e10cSrcweir 
1727*cdf0e10cSrcweir 	sal_uInt16*   pMasterMap=NULL;
1728*cdf0e10cSrcweir 	int* pMasterNeed=NULL;
1729*cdf0e10cSrcweir 	sal_uInt16    nMasterNeed=0;
1730*cdf0e10cSrcweir 	if (bMergeMasterPages && nSrcMasterPageAnz!=0) {
1731*cdf0e10cSrcweir 		// Feststellen, welche MasterPages aus rSrcModel benoetigt werden
1732*cdf0e10cSrcweir 		pMasterMap=new sal_uInt16[nSrcMasterPageAnz];
1733*cdf0e10cSrcweir 		pMasterNeed=new int[nSrcMasterPageAnz];
1734*cdf0e10cSrcweir 		memset(pMasterMap,0xFF,nSrcMasterPageAnz*sizeof(sal_uInt16));
1735*cdf0e10cSrcweir 		if (bAllMasterPages) {
1736*cdf0e10cSrcweir 			memset(pMasterNeed,sal_True,nSrcMasterPageAnz*sizeof(FASTBOOL));
1737*cdf0e10cSrcweir 		} else {
1738*cdf0e10cSrcweir 			memset(pMasterNeed,sal_False,nSrcMasterPageAnz*sizeof(FASTBOOL));
1739*cdf0e10cSrcweir 			sal_uInt16 nAnf= bReverse ? nLastPageNum : nFirstPageNum;
1740*cdf0e10cSrcweir 			sal_uInt16 nEnd= bReverse ? nFirstPageNum : nLastPageNum;
1741*cdf0e10cSrcweir 			for (sal_uInt16 i=nAnf; i<=nEnd; i++) {
1742*cdf0e10cSrcweir 				const SdrPage* pPg=rSourceModel.GetPage(i);
1743*cdf0e10cSrcweir 				if(pPg->TRG_HasMasterPage())
1744*cdf0e10cSrcweir 				{
1745*cdf0e10cSrcweir 					SdrPage& rMasterPage = pPg->TRG_GetMasterPage();
1746*cdf0e10cSrcweir 					sal_uInt16 nMPgNum(rMasterPage.GetPageNum());
1747*cdf0e10cSrcweir 
1748*cdf0e10cSrcweir 					if(nMPgNum < nSrcMasterPageAnz)
1749*cdf0e10cSrcweir 					{
1750*cdf0e10cSrcweir 						pMasterNeed[nMPgNum] = sal_True;
1751*cdf0e10cSrcweir 					}
1752*cdf0e10cSrcweir 				}
1753*cdf0e10cSrcweir 			}
1754*cdf0e10cSrcweir 		}
1755*cdf0e10cSrcweir 		// Nun das Mapping der MasterPages bestimmen
1756*cdf0e10cSrcweir 		sal_uInt16 nAktMaPagNum=nDstMasterPageAnz;
1757*cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nSrcMasterPageAnz; i++) {
1758*cdf0e10cSrcweir 			if (pMasterNeed[i]) {
1759*cdf0e10cSrcweir 				pMasterMap[i]=nAktMaPagNum;
1760*cdf0e10cSrcweir 				nAktMaPagNum++;
1761*cdf0e10cSrcweir 				nMasterNeed++;
1762*cdf0e10cSrcweir 			}
1763*cdf0e10cSrcweir 		}
1764*cdf0e10cSrcweir 	}
1765*cdf0e10cSrcweir 
1766*cdf0e10cSrcweir 	// rueberholen der Masterpages
1767*cdf0e10cSrcweir 	if (pMasterMap!=NULL && pMasterNeed!=NULL && nMasterNeed!=0) {
1768*cdf0e10cSrcweir 		for (sal_uInt16 i=nSrcMasterPageAnz; i>0;) {
1769*cdf0e10cSrcweir 			i--;
1770*cdf0e10cSrcweir 			if (pMasterNeed[i]) {
1771*cdf0e10cSrcweir 				SdrPage* pPg=NULL;
1772*cdf0e10cSrcweir 				if (bTreadSourceAsConst) {
1773*cdf0e10cSrcweir 					const SdrPage* pPg1=rSourceModel.GetMasterPage(i);
1774*cdf0e10cSrcweir 					pPg=pPg1->Clone();
1775*cdf0e10cSrcweir 				} else {
1776*cdf0e10cSrcweir 					pPg=rSourceModel.RemoveMasterPage(i);
1777*cdf0e10cSrcweir 				}
1778*cdf0e10cSrcweir 				if (pPg!=NULL) {
1779*cdf0e10cSrcweir 					// und alle ans einstige Ende des DstModel reinschieben.
1780*cdf0e10cSrcweir 					// nicht InsertMasterPage() verwenden da die Sache
1781*cdf0e10cSrcweir 					// inkonsistent ist bis alle drin sind
1782*cdf0e10cSrcweir 					maMaPag.Insert(pPg,nDstMasterPageAnz);
1783*cdf0e10cSrcweir 					// #109538#
1784*cdf0e10cSrcweir 					MasterPageListChanged();
1785*cdf0e10cSrcweir 					pPg->SetInserted(sal_True);
1786*cdf0e10cSrcweir 					pPg->SetModel(this);
1787*cdf0e10cSrcweir 					bMPgNumsDirty=sal_True;
1788*cdf0e10cSrcweir 					if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg));
1789*cdf0e10cSrcweir 				} else {
1790*cdf0e10cSrcweir 					DBG_ERROR("SdrModel::Merge(): MasterPage im SourceModel nicht gefunden");
1791*cdf0e10cSrcweir 				}
1792*cdf0e10cSrcweir 			}
1793*cdf0e10cSrcweir 		}
1794*cdf0e10cSrcweir 	}
1795*cdf0e10cSrcweir 
1796*cdf0e10cSrcweir 	// rueberholen der Zeichenseiten
1797*cdf0e10cSrcweir 	if (bInsPages) {
1798*cdf0e10cSrcweir 		sal_uInt16 nSourcePos=nFirstPageNum;
1799*cdf0e10cSrcweir 		sal_uInt16 nMergeCount=sal_uInt16(Abs((long)((long)nFirstPageNum-nLastPageNum))+1);
1800*cdf0e10cSrcweir 		if (nDestPos>GetPageCount()) nDestPos=GetPageCount();
1801*cdf0e10cSrcweir 		while (nMergeCount>0) {
1802*cdf0e10cSrcweir 			SdrPage* pPg=NULL;
1803*cdf0e10cSrcweir 			if (bTreadSourceAsConst) {
1804*cdf0e10cSrcweir 				const SdrPage* pPg1=rSourceModel.GetPage(nSourcePos);
1805*cdf0e10cSrcweir 				pPg=pPg1->Clone();
1806*cdf0e10cSrcweir 			} else {
1807*cdf0e10cSrcweir 				pPg=rSourceModel.RemovePage(nSourcePos);
1808*cdf0e10cSrcweir 			}
1809*cdf0e10cSrcweir 			if (pPg!=NULL) {
1810*cdf0e10cSrcweir 				InsertPage(pPg,nDestPos);
1811*cdf0e10cSrcweir 				if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg));
1812*cdf0e10cSrcweir 				// und nun zu den MasterPageDescriptoren
1813*cdf0e10cSrcweir 
1814*cdf0e10cSrcweir 				if(pPg->TRG_HasMasterPage())
1815*cdf0e10cSrcweir 				{
1816*cdf0e10cSrcweir 					SdrPage& rMasterPage = pPg->TRG_GetMasterPage();
1817*cdf0e10cSrcweir 					sal_uInt16 nMaPgNum(rMasterPage.GetPageNum());
1818*cdf0e10cSrcweir 
1819*cdf0e10cSrcweir 					if (bMergeMasterPages)
1820*cdf0e10cSrcweir 					{
1821*cdf0e10cSrcweir 						sal_uInt16 nNeuNum(0xFFFF);
1822*cdf0e10cSrcweir 
1823*cdf0e10cSrcweir 						if(pMasterMap)
1824*cdf0e10cSrcweir 						{
1825*cdf0e10cSrcweir 							nNeuNum = pMasterMap[nMaPgNum];
1826*cdf0e10cSrcweir 						}
1827*cdf0e10cSrcweir 
1828*cdf0e10cSrcweir 						if(nNeuNum != 0xFFFF)
1829*cdf0e10cSrcweir 						{
1830*cdf0e10cSrcweir 							if(bUndo)
1831*cdf0e10cSrcweir 							{
1832*cdf0e10cSrcweir 								AddUndo(GetSdrUndoFactory().CreateUndoPageChangeMasterPage(*pPg));
1833*cdf0e10cSrcweir 							}
1834*cdf0e10cSrcweir 
1835*cdf0e10cSrcweir 							pPg->TRG_SetMasterPage(*GetMasterPage(nNeuNum));
1836*cdf0e10cSrcweir 						}
1837*cdf0e10cSrcweir 						DBG_ASSERT(nNeuNum!=0xFFFF,"SdrModel::Merge(): Irgendwas ist krumm beim Mappen der MasterPages");
1838*cdf0e10cSrcweir 					} else {
1839*cdf0e10cSrcweir 						if (nMaPgNum>=nDstMasterPageAnz) {
1840*cdf0e10cSrcweir 							// Aha, die ist ausserbalb des urspruenglichen Bereichs der Masterpages des DstModel
1841*cdf0e10cSrcweir 							pPg->TRG_ClearMasterPage();
1842*cdf0e10cSrcweir 						}
1843*cdf0e10cSrcweir 					}
1844*cdf0e10cSrcweir 				}
1845*cdf0e10cSrcweir 
1846*cdf0e10cSrcweir 			} else {
1847*cdf0e10cSrcweir 				DBG_ERROR("SdrModel::Merge(): Zeichenseite im SourceModel nicht gefunden");
1848*cdf0e10cSrcweir 			}
1849*cdf0e10cSrcweir 			nDestPos++;
1850*cdf0e10cSrcweir 			if (bReverse) nSourcePos--;
1851*cdf0e10cSrcweir 			else if (bTreadSourceAsConst) nSourcePos++;
1852*cdf0e10cSrcweir 			nMergeCount--;
1853*cdf0e10cSrcweir 		}
1854*cdf0e10cSrcweir 	}
1855*cdf0e10cSrcweir 
1856*cdf0e10cSrcweir 	delete [] pMasterMap;
1857*cdf0e10cSrcweir 	delete [] pMasterNeed;
1858*cdf0e10cSrcweir 
1859*cdf0e10cSrcweir 	bMPgNumsDirty=sal_True;
1860*cdf0e10cSrcweir 	bPagNumsDirty=sal_True;
1861*cdf0e10cSrcweir 
1862*cdf0e10cSrcweir 	SetChanged();
1863*cdf0e10cSrcweir 	// Fehlt: Mergen und Mapping der Layer
1864*cdf0e10cSrcweir 	// an den Objekten sowie an den MasterPageDescriptoren
1865*cdf0e10cSrcweir 	if (bUndo) EndUndo();
1866*cdf0e10cSrcweir }
1867*cdf0e10cSrcweir 
1868*cdf0e10cSrcweir void SdrModel::SetStarDrawPreviewMode(sal_Bool bPreview)
1869*cdf0e10cSrcweir {
1870*cdf0e10cSrcweir 	if (!bPreview && bStarDrawPreviewMode && GetPageCount())
1871*cdf0e10cSrcweir 	{
1872*cdf0e10cSrcweir 		// Das Zuruecksetzen ist nicht erlaubt, da das Model ev. nicht vollstaendig geladen wurde
1873*cdf0e10cSrcweir 		DBG_ASSERT(sal_False,"SdrModel::SetStarDrawPreviewMode(): Zuruecksetzen nicht erlaubt, da Model ev. nicht vollstaendig");
1874*cdf0e10cSrcweir 	}
1875*cdf0e10cSrcweir 	else
1876*cdf0e10cSrcweir 	{
1877*cdf0e10cSrcweir 		bStarDrawPreviewMode = bPreview;
1878*cdf0e10cSrcweir 	}
1879*cdf0e10cSrcweir }
1880*cdf0e10cSrcweir 
1881*cdf0e10cSrcweir uno::Reference< uno::XInterface > SdrModel::getUnoModel()
1882*cdf0e10cSrcweir {
1883*cdf0e10cSrcweir 	if( !mxUnoModel.is() )
1884*cdf0e10cSrcweir 		mxUnoModel = createUnoModel();
1885*cdf0e10cSrcweir 
1886*cdf0e10cSrcweir 	return mxUnoModel;
1887*cdf0e10cSrcweir }
1888*cdf0e10cSrcweir 
1889*cdf0e10cSrcweir void SdrModel::setUnoModel( ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xModel )
1890*cdf0e10cSrcweir {
1891*cdf0e10cSrcweir     mxUnoModel = xModel;
1892*cdf0e10cSrcweir }
1893*cdf0e10cSrcweir 
1894*cdf0e10cSrcweir uno::Reference< uno::XInterface > SdrModel::createUnoModel()
1895*cdf0e10cSrcweir {
1896*cdf0e10cSrcweir 	DBG_ERROR( "SdrModel::createUnoModel() - base implementation should not be called!" );
1897*cdf0e10cSrcweir 	::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xInt;
1898*cdf0e10cSrcweir 	return xInt;
1899*cdf0e10cSrcweir }
1900*cdf0e10cSrcweir 
1901*cdf0e10cSrcweir void SdrModel::setLock( sal_Bool bLock )
1902*cdf0e10cSrcweir {
1903*cdf0e10cSrcweir 	if( mbModelLocked != bLock )
1904*cdf0e10cSrcweir 	{
1905*cdf0e10cSrcweir 		if( sal_False == bLock )
1906*cdf0e10cSrcweir 		{
1907*cdf0e10cSrcweir 			// ReformatAllTextObjects(); #103122# due to a typo in the above if, this code was never
1908*cdf0e10cSrcweir 			//							 executed, so I remove it until we discover that we need it here
1909*cdf0e10cSrcweir 			ImpReformatAllEdgeObjects();	// #103122#
1910*cdf0e10cSrcweir 		}
1911*cdf0e10cSrcweir 		mbModelLocked = bLock;
1912*cdf0e10cSrcweir 	}
1913*cdf0e10cSrcweir }
1914*cdf0e10cSrcweir 
1915*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1916*cdf0e10cSrcweir 
1917*cdf0e10cSrcweir void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSet, SdrModel* pNewModel )
1918*cdf0e10cSrcweir {
1919*cdf0e10cSrcweir 	if( pSourceSet && pDestSet && (pSourceSet != pDestSet ) )
1920*cdf0e10cSrcweir 	{
1921*cdf0e10cSrcweir 		if( pNewModel == NULL )
1922*cdf0e10cSrcweir 			pNewModel = this;
1923*cdf0e10cSrcweir 
1924*cdf0e10cSrcweir 		SfxWhichIter aWhichIter(*pSourceSet);
1925*cdf0e10cSrcweir 		sal_uInt16 nWhich(aWhichIter.FirstWhich());
1926*cdf0e10cSrcweir 		const SfxPoolItem *pPoolItem;
1927*cdf0e10cSrcweir 
1928*cdf0e10cSrcweir 		while(nWhich)
1929*cdf0e10cSrcweir 		{
1930*cdf0e10cSrcweir 			if(SFX_ITEM_SET == pSourceSet->GetItemState(nWhich, sal_False, &pPoolItem))
1931*cdf0e10cSrcweir 			{
1932*cdf0e10cSrcweir 				const SfxPoolItem* pItem = pPoolItem;
1933*cdf0e10cSrcweir 
1934*cdf0e10cSrcweir 				switch( nWhich )
1935*cdf0e10cSrcweir 				{
1936*cdf0e10cSrcweir 				case XATTR_FILLBITMAP:
1937*cdf0e10cSrcweir 					pItem = ((XFillBitmapItem*)pItem)->checkForUniqueItem( pNewModel );
1938*cdf0e10cSrcweir 					break;
1939*cdf0e10cSrcweir 				case XATTR_LINEDASH:
1940*cdf0e10cSrcweir 					pItem = ((XLineDashItem*)pItem)->checkForUniqueItem( pNewModel );
1941*cdf0e10cSrcweir 					break;
1942*cdf0e10cSrcweir 				case XATTR_LINESTART:
1943*cdf0e10cSrcweir 					pItem = ((XLineStartItem*)pItem)->checkForUniqueItem( pNewModel );
1944*cdf0e10cSrcweir 					break;
1945*cdf0e10cSrcweir 				case XATTR_LINEEND:
1946*cdf0e10cSrcweir 					pItem = ((XLineEndItem*)pItem)->checkForUniqueItem( pNewModel );
1947*cdf0e10cSrcweir 					break;
1948*cdf0e10cSrcweir 				case XATTR_FILLGRADIENT:
1949*cdf0e10cSrcweir 					pItem = ((XFillGradientItem*)pItem)->checkForUniqueItem( pNewModel );
1950*cdf0e10cSrcweir 					break;
1951*cdf0e10cSrcweir 				case XATTR_FILLFLOATTRANSPARENCE:
1952*cdf0e10cSrcweir 					// #85953# allow all kinds of XFillFloatTransparenceItem to be set
1953*cdf0e10cSrcweir 					pItem = ((XFillFloatTransparenceItem*)pItem)->checkForUniqueItem( pNewModel );
1954*cdf0e10cSrcweir 					break;
1955*cdf0e10cSrcweir 				case XATTR_FILLHATCH:
1956*cdf0e10cSrcweir 					pItem = ((XFillHatchItem*)pItem)->checkForUniqueItem( pNewModel );
1957*cdf0e10cSrcweir 					break;
1958*cdf0e10cSrcweir 				}
1959*cdf0e10cSrcweir 
1960*cdf0e10cSrcweir 				// set item
1961*cdf0e10cSrcweir 				if( pItem )
1962*cdf0e10cSrcweir 				{
1963*cdf0e10cSrcweir 					pDestSet->Put(*pItem);
1964*cdf0e10cSrcweir 
1965*cdf0e10cSrcweir 					// delete item if it was a generated one
1966*cdf0e10cSrcweir 					if( pItem != pPoolItem)
1967*cdf0e10cSrcweir 						delete (SfxPoolItem*)pItem;
1968*cdf0e10cSrcweir 				}
1969*cdf0e10cSrcweir 			}
1970*cdf0e10cSrcweir 			nWhich = aWhichIter.NextWhich();
1971*cdf0e10cSrcweir 		}
1972*cdf0e10cSrcweir 	}
1973*cdf0e10cSrcweir }
1974*cdf0e10cSrcweir 
1975*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1976*cdf0e10cSrcweir 
1977*cdf0e10cSrcweir void SdrModel::SetForbiddenCharsTable( vos::ORef<SvxForbiddenCharactersTable> xForbiddenChars )
1978*cdf0e10cSrcweir {
1979*cdf0e10cSrcweir 	if( mpForbiddenCharactersTable )
1980*cdf0e10cSrcweir 		mpForbiddenCharactersTable->release();
1981*cdf0e10cSrcweir 
1982*cdf0e10cSrcweir 	mpForbiddenCharactersTable = xForbiddenChars.getBodyPtr();
1983*cdf0e10cSrcweir 
1984*cdf0e10cSrcweir 	if( mpForbiddenCharactersTable )
1985*cdf0e10cSrcweir 		mpForbiddenCharactersTable->acquire();
1986*cdf0e10cSrcweir 
1987*cdf0e10cSrcweir 	ImpSetOutlinerDefaults( pDrawOutliner );
1988*cdf0e10cSrcweir 	ImpSetOutlinerDefaults( pHitTestOutliner );
1989*cdf0e10cSrcweir }
1990*cdf0e10cSrcweir 
1991*cdf0e10cSrcweir vos::ORef<SvxForbiddenCharactersTable> SdrModel::GetForbiddenCharsTable() const
1992*cdf0e10cSrcweir {
1993*cdf0e10cSrcweir 	return mpForbiddenCharactersTable;
1994*cdf0e10cSrcweir }
1995*cdf0e10cSrcweir 
1996*cdf0e10cSrcweir void SdrModel::SetCharCompressType( sal_uInt16 nType )
1997*cdf0e10cSrcweir {
1998*cdf0e10cSrcweir 	if( nType != mnCharCompressType )
1999*cdf0e10cSrcweir 	{
2000*cdf0e10cSrcweir 		mnCharCompressType = nType;
2001*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pDrawOutliner );
2002*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pHitTestOutliner );
2003*cdf0e10cSrcweir 	}
2004*cdf0e10cSrcweir }
2005*cdf0e10cSrcweir 
2006*cdf0e10cSrcweir void SdrModel::SetKernAsianPunctuation( sal_Bool bEnabled )
2007*cdf0e10cSrcweir {
2008*cdf0e10cSrcweir 	if( mbKernAsianPunctuation != bEnabled )
2009*cdf0e10cSrcweir 	{
2010*cdf0e10cSrcweir 		mbKernAsianPunctuation = bEnabled;
2011*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pDrawOutliner );
2012*cdf0e10cSrcweir 		ImpSetOutlinerDefaults( pHitTestOutliner );
2013*cdf0e10cSrcweir 	}
2014*cdf0e10cSrcweir }
2015*cdf0e10cSrcweir 
2016*cdf0e10cSrcweir void SdrModel::SetAddExtLeading( sal_Bool bEnabled )
2017*cdf0e10cSrcweir {
2018*cdf0e10cSrcweir     if( mbAddExtLeading != bEnabled )
2019*cdf0e10cSrcweir     {
2020*cdf0e10cSrcweir         mbAddExtLeading = bEnabled;
2021*cdf0e10cSrcweir         ImpSetOutlinerDefaults( pDrawOutliner );
2022*cdf0e10cSrcweir         ImpSetOutlinerDefaults( pHitTestOutliner );
2023*cdf0e10cSrcweir     }
2024*cdf0e10cSrcweir }
2025*cdf0e10cSrcweir 
2026*cdf0e10cSrcweir void SdrModel::ReformatAllTextObjects()
2027*cdf0e10cSrcweir {
2028*cdf0e10cSrcweir 	ImpReformatAllTextObjects();
2029*cdf0e10cSrcweir }
2030*cdf0e10cSrcweir 
2031*cdf0e10cSrcweir FASTBOOL SdrModel::HasTransparentObjects( sal_Bool bCheckForAlphaChannel ) const
2032*cdf0e10cSrcweir {
2033*cdf0e10cSrcweir 	FASTBOOL	bRet = sal_False;
2034*cdf0e10cSrcweir 	sal_uInt16		n, nCount;
2035*cdf0e10cSrcweir 
2036*cdf0e10cSrcweir 	for( n = 0, nCount = GetMasterPageCount(); ( n < nCount ) && !bRet; n++ )
2037*cdf0e10cSrcweir 		if( GetMasterPage( n )->HasTransparentObjects( bCheckForAlphaChannel ) )
2038*cdf0e10cSrcweir 			bRet = sal_True;
2039*cdf0e10cSrcweir 
2040*cdf0e10cSrcweir 	if( !bRet )
2041*cdf0e10cSrcweir 	{
2042*cdf0e10cSrcweir 		for( n = 0, nCount = GetPageCount(); ( n < nCount ) && !bRet; n++ )
2043*cdf0e10cSrcweir 			if( GetPage( n )->HasTransparentObjects( bCheckForAlphaChannel ) )
2044*cdf0e10cSrcweir 				bRet = sal_True;
2045*cdf0e10cSrcweir 	}
2046*cdf0e10cSrcweir 
2047*cdf0e10cSrcweir 	return bRet;
2048*cdf0e10cSrcweir }
2049*cdf0e10cSrcweir 
2050*cdf0e10cSrcweir SdrOutliner* SdrModel::createOutliner( sal_uInt16 nOutlinerMode )
2051*cdf0e10cSrcweir {
2052*cdf0e10cSrcweir 	if( NULL == mpOutlinerCache )
2053*cdf0e10cSrcweir 		mpOutlinerCache = new SdrOutlinerCache(this);
2054*cdf0e10cSrcweir 
2055*cdf0e10cSrcweir 	return mpOutlinerCache->createOutliner( nOutlinerMode );
2056*cdf0e10cSrcweir }
2057*cdf0e10cSrcweir 
2058*cdf0e10cSrcweir void SdrModel::disposeOutliner( SdrOutliner* pOutliner )
2059*cdf0e10cSrcweir {
2060*cdf0e10cSrcweir 	if( mpOutlinerCache )
2061*cdf0e10cSrcweir 	{
2062*cdf0e10cSrcweir 		mpOutlinerCache->disposeOutliner( pOutliner );
2063*cdf0e10cSrcweir 	}
2064*cdf0e10cSrcweir 	else
2065*cdf0e10cSrcweir 	{
2066*cdf0e10cSrcweir 		delete pOutliner;
2067*cdf0e10cSrcweir 	}
2068*cdf0e10cSrcweir }
2069*cdf0e10cSrcweir 
2070*cdf0e10cSrcweir SvxNumType SdrModel::GetPageNumType() const
2071*cdf0e10cSrcweir {
2072*cdf0e10cSrcweir 	return SVX_ARABIC;
2073*cdf0e10cSrcweir }
2074*cdf0e10cSrcweir 
2075*cdf0e10cSrcweir const SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum) const
2076*cdf0e10cSrcweir {
2077*cdf0e10cSrcweir 	DBG_ASSERT(nPgNum < maPages.Count(), "SdrModel::GetPage: Access out of range (!)");
2078*cdf0e10cSrcweir 	return (SdrPage*)(maPages.GetObject(nPgNum));
2079*cdf0e10cSrcweir }
2080*cdf0e10cSrcweir 
2081*cdf0e10cSrcweir SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum)
2082*cdf0e10cSrcweir {
2083*cdf0e10cSrcweir 	DBG_ASSERT(nPgNum < maPages.Count(), "SdrModel::GetPage: Access out of range (!)");
2084*cdf0e10cSrcweir 	return (SdrPage*)(maPages.GetObject(nPgNum));
2085*cdf0e10cSrcweir }
2086*cdf0e10cSrcweir 
2087*cdf0e10cSrcweir sal_uInt16 SdrModel::GetPageCount() const
2088*cdf0e10cSrcweir {
2089*cdf0e10cSrcweir 	return sal_uInt16(maPages.Count());
2090*cdf0e10cSrcweir }
2091*cdf0e10cSrcweir 
2092*cdf0e10cSrcweir void SdrModel::PageListChanged()
2093*cdf0e10cSrcweir {
2094*cdf0e10cSrcweir }
2095*cdf0e10cSrcweir 
2096*cdf0e10cSrcweir const SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) const
2097*cdf0e10cSrcweir {
2098*cdf0e10cSrcweir 	DBG_ASSERT(nPgNum < maMaPag.Count(), "SdrModel::GetMasterPage: Access out of range (!)");
2099*cdf0e10cSrcweir 	return (SdrPage*)(maMaPag.GetObject(nPgNum));
2100*cdf0e10cSrcweir }
2101*cdf0e10cSrcweir 
2102*cdf0e10cSrcweir SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum)
2103*cdf0e10cSrcweir {
2104*cdf0e10cSrcweir 	DBG_ASSERT(nPgNum < maMaPag.Count(), "SdrModel::GetMasterPage: Access out of range (!)");
2105*cdf0e10cSrcweir 	return (SdrPage*)(maMaPag.GetObject(nPgNum));
2106*cdf0e10cSrcweir }
2107*cdf0e10cSrcweir 
2108*cdf0e10cSrcweir sal_uInt16 SdrModel::GetMasterPageCount() const
2109*cdf0e10cSrcweir {
2110*cdf0e10cSrcweir 	return sal_uInt16(maMaPag.Count());
2111*cdf0e10cSrcweir }
2112*cdf0e10cSrcweir 
2113*cdf0e10cSrcweir void SdrModel::MasterPageListChanged()
2114*cdf0e10cSrcweir {
2115*cdf0e10cSrcweir }
2116*cdf0e10cSrcweir 
2117*cdf0e10cSrcweir void SdrModel::SetSdrUndoManager( SfxUndoManager* pUndoManager )
2118*cdf0e10cSrcweir {
2119*cdf0e10cSrcweir 	mpImpl->mpUndoManager = pUndoManager;
2120*cdf0e10cSrcweir }
2121*cdf0e10cSrcweir 
2122*cdf0e10cSrcweir SfxUndoManager* SdrModel::GetSdrUndoManager() const
2123*cdf0e10cSrcweir {
2124*cdf0e10cSrcweir     return mpImpl->mpUndoManager;
2125*cdf0e10cSrcweir }
2126*cdf0e10cSrcweir 
2127*cdf0e10cSrcweir SdrUndoFactory& SdrModel::GetSdrUndoFactory() const
2128*cdf0e10cSrcweir {
2129*cdf0e10cSrcweir 	if( !mpImpl->mpUndoFactory )
2130*cdf0e10cSrcweir 		mpImpl->mpUndoFactory = new SdrUndoFactory;
2131*cdf0e10cSrcweir 	return *mpImpl->mpUndoFactory;
2132*cdf0e10cSrcweir }
2133*cdf0e10cSrcweir 
2134*cdf0e10cSrcweir void SdrModel::SetSdrUndoFactory( SdrUndoFactory* pUndoFactory )
2135*cdf0e10cSrcweir {
2136*cdf0e10cSrcweir 	if( pUndoFactory && (pUndoFactory != mpImpl->mpUndoFactory) )
2137*cdf0e10cSrcweir 	{
2138*cdf0e10cSrcweir 		delete mpImpl->mpUndoFactory;
2139*cdf0e10cSrcweir 		mpImpl->mpUndoFactory = pUndoFactory;
2140*cdf0e10cSrcweir 	}
2141*cdf0e10cSrcweir }
2142*cdf0e10cSrcweir 
2143*cdf0e10cSrcweir /** cl: added this for OJ to complete his reporting engine, does not work
2144*cdf0e10cSrcweir 	correctly so only enable it for his model */
2145*cdf0e10cSrcweir bool SdrModel::IsAllowShapePropertyChangeListener() const
2146*cdf0e10cSrcweir {
2147*cdf0e10cSrcweir 	return mpImpl && mpImpl->mbAllowShapePropertyChangeListener;
2148*cdf0e10cSrcweir }
2149*cdf0e10cSrcweir 
2150*cdf0e10cSrcweir void SdrModel::SetAllowShapePropertyChangeListener( bool bAllow )
2151*cdf0e10cSrcweir {
2152*cdf0e10cSrcweir 	if( mpImpl )
2153*cdf0e10cSrcweir 	{
2154*cdf0e10cSrcweir 		mpImpl->mbAllowShapePropertyChangeListener = bAllow;
2155*cdf0e10cSrcweir 	}
2156*cdf0e10cSrcweir }
2157*cdf0e10cSrcweir 
2158*cdf0e10cSrcweir const ::com::sun::star::uno::Sequence< sal_Int8 >& SdrModel::getUnoTunnelImplementationId()
2159*cdf0e10cSrcweir {
2160*cdf0e10cSrcweir 	static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0;
2161*cdf0e10cSrcweir 	if( !pSeq )
2162*cdf0e10cSrcweir 	{
2163*cdf0e10cSrcweir 		::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
2164*cdf0e10cSrcweir 		if( !pSeq )
2165*cdf0e10cSrcweir 		{
2166*cdf0e10cSrcweir 			static Sequence< sal_Int8 > aSeq( 16 );
2167*cdf0e10cSrcweir 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
2168*cdf0e10cSrcweir 			pSeq = &aSeq;
2169*cdf0e10cSrcweir 		}
2170*cdf0e10cSrcweir 	}
2171*cdf0e10cSrcweir 	return *pSeq;
2172*cdf0e10cSrcweir }
2173*cdf0e10cSrcweir 
2174*cdf0e10cSrcweir void SdrModel::SetDrawingLayerPoolDefaults()
2175*cdf0e10cSrcweir {
2176*cdf0e10cSrcweir 	const String aNullStr;
2177*cdf0e10cSrcweir 	const Color aNullLineCol(COL_DEFAULT_SHAPE_STROKE);
2178*cdf0e10cSrcweir 	const Color aNullFillCol(COL_DEFAULT_SHAPE_FILLING);
2179*cdf0e10cSrcweir 	const XHatch aNullHatch(aNullLineCol);
2180*cdf0e10cSrcweir 
2181*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( XFillColorItem(aNullStr,aNullFillCol) );
2182*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( XFillHatchItem(pItemPool,aNullHatch) );
2183*cdf0e10cSrcweir 	pItemPool->SetPoolDefaultItem( XLineColorItem(aNullStr,aNullLineCol) );
2184*cdf0e10cSrcweir }
2185*cdf0e10cSrcweir 
2186*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
2187*cdf0e10cSrcweir 
2188*cdf0e10cSrcweir TYPEINIT1(SdrHint,SfxHint);
2189*cdf0e10cSrcweir 
2190*cdf0e10cSrcweir SdrHint::SdrHint()
2191*cdf0e10cSrcweir :	mpPage(0L),
2192*cdf0e10cSrcweir 	mpObj(0L),
2193*cdf0e10cSrcweir 	mpObjList(0L),
2194*cdf0e10cSrcweir 	meHint(HINT_UNKNOWN)
2195*cdf0e10cSrcweir {
2196*cdf0e10cSrcweir }
2197*cdf0e10cSrcweir 
2198*cdf0e10cSrcweir SdrHint::SdrHint(SdrHintKind eNewHint)
2199*cdf0e10cSrcweir :	mpPage(0L),
2200*cdf0e10cSrcweir 	mpObj(0L),
2201*cdf0e10cSrcweir 	mpObjList(0L),
2202*cdf0e10cSrcweir 	meHint(eNewHint)
2203*cdf0e10cSrcweir {
2204*cdf0e10cSrcweir }
2205*cdf0e10cSrcweir 
2206*cdf0e10cSrcweir SdrHint::SdrHint(const SdrObject& rNewObj)
2207*cdf0e10cSrcweir :	mpPage(rNewObj.GetPage()),
2208*cdf0e10cSrcweir 	mpObj(&rNewObj),
2209*cdf0e10cSrcweir 	mpObjList(rNewObj.GetObjList()),
2210*cdf0e10cSrcweir 	meHint(HINT_OBJCHG)
2211*cdf0e10cSrcweir {
2212*cdf0e10cSrcweir 	maRectangle = rNewObj.GetLastBoundRect();
2213*cdf0e10cSrcweir }
2214*cdf0e10cSrcweir 
2215*cdf0e10cSrcweir SdrHint::SdrHint(const SdrObject& rNewObj, const Rectangle& rRect)
2216*cdf0e10cSrcweir :	mpPage(rNewObj.GetPage()),
2217*cdf0e10cSrcweir 	mpObj(&rNewObj),
2218*cdf0e10cSrcweir 	mpObjList(rNewObj.GetObjList()),
2219*cdf0e10cSrcweir 	meHint(HINT_OBJCHG)
2220*cdf0e10cSrcweir {
2221*cdf0e10cSrcweir 	maRectangle = rRect;
2222*cdf0e10cSrcweir }
2223*cdf0e10cSrcweir 
2224*cdf0e10cSrcweir void SdrHint::SetPage(const SdrPage* pNewPage)
2225*cdf0e10cSrcweir {
2226*cdf0e10cSrcweir 	mpPage = pNewPage;
2227*cdf0e10cSrcweir }
2228*cdf0e10cSrcweir 
2229*cdf0e10cSrcweir void SdrHint::SetObjList(const SdrObjList* pNewOL)
2230*cdf0e10cSrcweir {
2231*cdf0e10cSrcweir 	mpObjList = pNewOL;
2232*cdf0e10cSrcweir }
2233*cdf0e10cSrcweir 
2234*cdf0e10cSrcweir void SdrHint::SetObject(const SdrObject* pNewObj)
2235*cdf0e10cSrcweir {
2236*cdf0e10cSrcweir 	mpObj = pNewObj;
2237*cdf0e10cSrcweir }
2238*cdf0e10cSrcweir 
2239*cdf0e10cSrcweir void SdrHint::SetKind(SdrHintKind eNewKind)
2240*cdf0e10cSrcweir {
2241*cdf0e10cSrcweir 	meHint = eNewKind;
2242*cdf0e10cSrcweir }
2243*cdf0e10cSrcweir 
2244*cdf0e10cSrcweir void SdrHint::SetRect(const Rectangle& rNewRect)
2245*cdf0e10cSrcweir {
2246*cdf0e10cSrcweir 	maRectangle = rNewRect;
2247*cdf0e10cSrcweir }
2248*cdf0e10cSrcweir 
2249*cdf0e10cSrcweir const SdrPage* SdrHint::GetPage() const
2250*cdf0e10cSrcweir {
2251*cdf0e10cSrcweir 	return mpPage;
2252*cdf0e10cSrcweir }
2253*cdf0e10cSrcweir 
2254*cdf0e10cSrcweir const SdrObjList* SdrHint::GetObjList() const
2255*cdf0e10cSrcweir {
2256*cdf0e10cSrcweir 	return mpObjList;
2257*cdf0e10cSrcweir }
2258*cdf0e10cSrcweir 
2259*cdf0e10cSrcweir const SdrObject* SdrHint::GetObject() const
2260*cdf0e10cSrcweir {
2261*cdf0e10cSrcweir 	return mpObj;
2262*cdf0e10cSrcweir }
2263*cdf0e10cSrcweir 
2264*cdf0e10cSrcweir SdrHintKind SdrHint::GetKind() const
2265*cdf0e10cSrcweir {
2266*cdf0e10cSrcweir 	return meHint;
2267*cdf0e10cSrcweir }
2268*cdf0e10cSrcweir 
2269*cdf0e10cSrcweir const Rectangle& SdrHint::GetRect() const
2270*cdf0e10cSrcweir {
2271*cdf0e10cSrcweir 	return maRectangle;
2272*cdf0e10cSrcweir }
2273*cdf0e10cSrcweir 
2274*cdf0e10cSrcweir // eof
2275