xref: /aoo42x/main/svx/source/svdraw/svdetc.cxx (revision cdf0e10c)
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 #include "editeng/forbiddencharacterstable.hxx"
31*cdf0e10cSrcweir #include <com/sun/star/embed/XEmbeddedObject.hpp>
32*cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
33*cdf0e10cSrcweir #include <svx/svdetc.hxx>
34*cdf0e10cSrcweir #include "svx/svditext.hxx"
35*cdf0e10cSrcweir #include <svx/svdmodel.hxx>
36*cdf0e10cSrcweir #include <svx/svdtrans.hxx>
37*cdf0e10cSrcweir #include "svx/svdglob.hxx"
38*cdf0e10cSrcweir #include "svx/svdstr.hrc"
39*cdf0e10cSrcweir #include "svx/svdviter.hxx"
40*cdf0e10cSrcweir #include <svx/svdview.hxx>
41*cdf0e10cSrcweir #include <svx/svdoutl.hxx>
42*cdf0e10cSrcweir #include <vcl/bmpacc.hxx>
43*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
44*cdf0e10cSrcweir #include <svl/itemset.hxx>
45*cdf0e10cSrcweir #include <tools/config.hxx>
46*cdf0e10cSrcweir #include <unotools/cacheoptions.hxx>
47*cdf0e10cSrcweir #include <svl/whiter.hxx>
48*cdf0e10cSrcweir #include <tools/bigint.hxx>
49*cdf0e10cSrcweir #include "editeng/fontitem.hxx"
50*cdf0e10cSrcweir #include <editeng/colritem.hxx>
51*cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
52*cdf0e10cSrcweir #include <svx/xgrad.hxx>
53*cdf0e10cSrcweir #include <svx/xfillit0.hxx>
54*cdf0e10cSrcweir #include <svx/xflclit.hxx>
55*cdf0e10cSrcweir #include <svx/xflhtit.hxx>
56*cdf0e10cSrcweir #include <svx/xbtmpit.hxx>
57*cdf0e10cSrcweir #include <svx/xflgrit.hxx>
58*cdf0e10cSrcweir #include <svx/svdoole2.hxx>
59*cdf0e10cSrcweir #include <svl/itempool.hxx>
60*cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
61*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp>
62*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
63*cdf0e10cSrcweir #include <i18npool/lang.h>
64*cdf0e10cSrcweir #include <unotools/charclass.hxx>
65*cdf0e10cSrcweir #include <unotools/syslocale.hxx>
66*cdf0e10cSrcweir #include <svx/xflbckit.hxx>
67*cdf0e10cSrcweir #include <svx/extrusionbar.hxx>
68*cdf0e10cSrcweir #include <svx/fontworkbar.hxx>
69*cdf0e10cSrcweir #include <vcl/svapp.hxx> //add CHINA001
70*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontact.hxx>
71*cdf0e10cSrcweir #include <svx/svdpage.hxx>
72*cdf0e10cSrcweir #include <svx/svdotable.hxx>
73*cdf0e10cSrcweir #include <svx/sdrhittesthelper.hxx>
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir using namespace ::com::sun::star;
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir /******************************************************************************
78*cdf0e10cSrcweir * Globale Daten der DrawingEngine
79*cdf0e10cSrcweir ******************************************************************************/
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir SdrGlobalData::SdrGlobalData() :
82*cdf0e10cSrcweir     pSysLocale(NULL),
83*cdf0e10cSrcweir     pCharClass(NULL),
84*cdf0e10cSrcweir     pLocaleData(NULL),
85*cdf0e10cSrcweir 	pOutliner(NULL),
86*cdf0e10cSrcweir 	pDefaults(NULL),
87*cdf0e10cSrcweir 	pResMgr(NULL),
88*cdf0e10cSrcweir 	nExchangeFormat(0)
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir     //pSysLocale = new SvtSysLocale;
91*cdf0e10cSrcweir     //pCharClass = pSysLocale->GetCharClassPtr();
92*cdf0e10cSrcweir     //pLocaleData = pSysLocale->GetLocaleDataPtr();
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 	svx::ExtrusionBar::RegisterInterface();
95*cdf0e10cSrcweir 	svx::FontworkBar::RegisterInterface();
96*cdf0e10cSrcweir }
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir SdrGlobalData::~SdrGlobalData()
99*cdf0e10cSrcweir {
100*cdf0e10cSrcweir 	delete pOutliner;
101*cdf0e10cSrcweir 	delete pDefaults;
102*cdf0e10cSrcweir 	delete pResMgr;
103*cdf0e10cSrcweir     //! do NOT delete pCharClass and pLocaleData
104*cdf0e10cSrcweir     delete pSysLocale;
105*cdf0e10cSrcweir }
106*cdf0e10cSrcweir const SvtSysLocale*         SdrGlobalData::GetSysLocale()
107*cdf0e10cSrcweir {
108*cdf0e10cSrcweir     if ( !pSysLocale )
109*cdf0e10cSrcweir         pSysLocale = new SvtSysLocale;
110*cdf0e10cSrcweir     return pSysLocale;
111*cdf0e10cSrcweir }
112*cdf0e10cSrcweir const CharClass*            SdrGlobalData::GetCharClass()
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir     if ( !pCharClass )
115*cdf0e10cSrcweir         pCharClass = GetSysLocale()->GetCharClassPtr();
116*cdf0e10cSrcweir     return pCharClass;
117*cdf0e10cSrcweir }
118*cdf0e10cSrcweir const LocaleDataWrapper*    SdrGlobalData::GetLocaleData()
119*cdf0e10cSrcweir {
120*cdf0e10cSrcweir     if ( !pLocaleData )
121*cdf0e10cSrcweir         pLocaleData = GetSysLocale()->GetLocaleDataPtr();
122*cdf0e10cSrcweir     return pLocaleData;
123*cdf0e10cSrcweir }
124*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir OLEObjCache::OLEObjCache()
127*cdf0e10cSrcweir :	Container( 0 )
128*cdf0e10cSrcweir {
129*cdf0e10cSrcweir 	SvtCacheOptions aCacheOptions;
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 	nSize = aCacheOptions.GetDrawingEngineOLE_Objects();
132*cdf0e10cSrcweir 	pTimer = new AutoTimer();
133*cdf0e10cSrcweir     Link aLink = LINK(this, OLEObjCache, UnloadCheckHdl);
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir     pTimer->SetTimeoutHdl(aLink);
136*cdf0e10cSrcweir     pTimer->SetTimeout(20000);
137*cdf0e10cSrcweir     pTimer->Start();
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 	aLink.Call(pTimer);
140*cdf0e10cSrcweir }
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir OLEObjCache::~OLEObjCache()
143*cdf0e10cSrcweir {
144*cdf0e10cSrcweir 	pTimer->Stop();
145*cdf0e10cSrcweir 	delete pTimer;
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir void OLEObjCache::UnloadOnDemand()
149*cdf0e10cSrcweir {
150*cdf0e10cSrcweir     if ( nSize < Count() )
151*cdf0e10cSrcweir 	{
152*cdf0e10cSrcweir         // more objects than configured cache size try to remove objects
153*cdf0e10cSrcweir         // of course not the freshly inserted one at nIndex=0
154*cdf0e10cSrcweir         sal_uIntPtr nCount2 = Count();
155*cdf0e10cSrcweir         sal_uIntPtr nIndex = nCount2-1;
156*cdf0e10cSrcweir         while( nIndex && nCount2 > nSize )
157*cdf0e10cSrcweir 		{
158*cdf0e10cSrcweir             SdrOle2Obj* pUnloadObj = (SdrOle2Obj*) GetObject(nIndex--);
159*cdf0e10cSrcweir             if ( pUnloadObj )
160*cdf0e10cSrcweir             {
161*cdf0e10cSrcweir                 try
162*cdf0e10cSrcweir                 {
163*cdf0e10cSrcweir                     // it is important to get object without reinitialization to avoid reentrance
164*cdf0e10cSrcweir                     uno::Reference< embed::XEmbeddedObject > xUnloadObj = pUnloadObj->GetObjRef_NoInit();
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir                     sal_Bool bUnload = SdrOle2Obj::CanUnloadRunningObj( xUnloadObj, pUnloadObj->GetAspect() );
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir                     // check whether the object can be unloaded before looking for the parent objects
169*cdf0e10cSrcweir                     if ( xUnloadObj.is() && bUnload )
170*cdf0e10cSrcweir                     {
171*cdf0e10cSrcweir                         uno::Reference< frame::XModel > xUnloadModel( xUnloadObj->getComponent(), uno::UNO_QUERY );
172*cdf0e10cSrcweir                         if ( xUnloadModel.is() )
173*cdf0e10cSrcweir                         {
174*cdf0e10cSrcweir                             for ( sal_uIntPtr nCheckInd = 0; nCheckInd < Count(); nCheckInd++ )
175*cdf0e10cSrcweir                             {
176*cdf0e10cSrcweir                                 SdrOle2Obj* pCacheObj = (SdrOle2Obj*) GetObject(nCheckInd);
177*cdf0e10cSrcweir                                 if ( pCacheObj && pCacheObj != pUnloadObj )
178*cdf0e10cSrcweir                                 {
179*cdf0e10cSrcweir                                     uno::Reference< frame::XModel > xParentModel = pCacheObj->GetParentXModel();
180*cdf0e10cSrcweir                                     if ( xUnloadModel == xParentModel )
181*cdf0e10cSrcweir                                         bUnload = sal_False; // the object has running embedded objects
182*cdf0e10cSrcweir                                 }
183*cdf0e10cSrcweir                             }
184*cdf0e10cSrcweir                         }
185*cdf0e10cSrcweir                     }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir                     if ( bUnload && UnloadObj(pUnloadObj) )
188*cdf0e10cSrcweir                         // object was successfully unloaded
189*cdf0e10cSrcweir                         nCount2--;
190*cdf0e10cSrcweir                 }
191*cdf0e10cSrcweir                 catch( uno::Exception& )
192*cdf0e10cSrcweir                 {}
193*cdf0e10cSrcweir             }
194*cdf0e10cSrcweir 		}
195*cdf0e10cSrcweir 	}
196*cdf0e10cSrcweir }
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir void OLEObjCache::SetSize(sal_uIntPtr nNewSize)
199*cdf0e10cSrcweir {
200*cdf0e10cSrcweir 	nSize = nNewSize;
201*cdf0e10cSrcweir }
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir void OLEObjCache::InsertObj(SdrOle2Obj* pObj)
204*cdf0e10cSrcweir {
205*cdf0e10cSrcweir 	if ( Count() )
206*cdf0e10cSrcweir 	{
207*cdf0e10cSrcweir 		SdrOle2Obj* pExistingObj = (SdrOle2Obj*)GetObject( 0 );
208*cdf0e10cSrcweir 		if ( pObj == pExistingObj )
209*cdf0e10cSrcweir 			// the object is already on the top, nothing has to be changed
210*cdf0e10cSrcweir 			return;
211*cdf0e10cSrcweir 	}
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir     // get the old position of the object to know whether it is already in container
214*cdf0e10cSrcweir     sal_uIntPtr nOldPos = GetPos( pObj );
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir     // insert object into first position
217*cdf0e10cSrcweir 	Remove( nOldPos );
218*cdf0e10cSrcweir 	Insert(pObj, (sal_uIntPtr) 0L);
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir     if ( nOldPos == CONTAINER_ENTRY_NOTFOUND )
221*cdf0e10cSrcweir     {
222*cdf0e10cSrcweir         // a new object was inserted, recalculate the cache
223*cdf0e10cSrcweir         UnloadOnDemand();
224*cdf0e10cSrcweir     }
225*cdf0e10cSrcweir }
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir void OLEObjCache::RemoveObj(SdrOle2Obj* pObj)
228*cdf0e10cSrcweir {
229*cdf0e10cSrcweir     Remove(pObj);
230*cdf0e10cSrcweir }
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir sal_Bool OLEObjCache::UnloadObj(SdrOle2Obj* pObj)
233*cdf0e10cSrcweir {
234*cdf0e10cSrcweir 	sal_Bool bUnloaded = sal_False;
235*cdf0e10cSrcweir 	if (pObj)
236*cdf0e10cSrcweir 	{
237*cdf0e10cSrcweir         //#i80528# The old mechanism is completely useless, only taking into account if
238*cdf0e10cSrcweir         // in all views the GrafDraft feature is used. This will nearly never have been the
239*cdf0e10cSrcweir         // case since no one ever used this option.
240*cdf0e10cSrcweir         //
241*cdf0e10cSrcweir         // A much better (and working) criteria would be the VOC contact count.
242*cdf0e10cSrcweir         // The quesion is what will happen whe i make it work now suddenly? I
243*cdf0e10cSrcweir         // will try it for 2.4.
244*cdf0e10cSrcweir     	const sdr::contact::ViewContact& rViewContact = pObj->GetViewContact();
245*cdf0e10cSrcweir 		const bool bVisible(rViewContact.HasViewObjectContacts(true));
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir 		if(!bVisible)
248*cdf0e10cSrcweir         {
249*cdf0e10cSrcweir     		bUnloaded = pObj->Unload();
250*cdf0e10cSrcweir         }
251*cdf0e10cSrcweir 	}
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir 	return bUnloaded;
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir IMPL_LINK(OLEObjCache, UnloadCheckHdl, AutoTimer*, /*pTim*/)
257*cdf0e10cSrcweir {
258*cdf0e10cSrcweir     UnloadOnDemand();
259*cdf0e10cSrcweir     return 0;
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir void ContainerSorter::DoSort(sal_uIntPtr a, sal_uIntPtr b) const
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir 	sal_uIntPtr nAnz=rCont.Count();
265*cdf0e10cSrcweir 	if (b>nAnz) b=nAnz;
266*cdf0e10cSrcweir 	if (b>0) b--;
267*cdf0e10cSrcweir 	if (a<b) ImpSubSort(a,b);
268*cdf0e10cSrcweir }
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir void ContainerSorter::Is1stLessThan2nd(const void* /*pElem1*/, const void* /*pElem2*/) const
271*cdf0e10cSrcweir {
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir void ContainerSorter::ImpSubSort(long nL, long nR) const
275*cdf0e10cSrcweir {
276*cdf0e10cSrcweir 	long i,j;
277*cdf0e10cSrcweir 	const void* pX;
278*cdf0e10cSrcweir 	void* pI;
279*cdf0e10cSrcweir 	void* pJ;
280*cdf0e10cSrcweir 	i=nL;
281*cdf0e10cSrcweir 	j=nR;
282*cdf0e10cSrcweir 	pX=rCont.GetObject((nL+nR)/2);
283*cdf0e10cSrcweir 	do {
284*cdf0e10cSrcweir 		pI=rCont.Seek(i);
285*cdf0e10cSrcweir 		while (pI!=pX && Compare(pI,pX)<0) { i++; pI=rCont.Next(); }
286*cdf0e10cSrcweir 		pJ=rCont.Seek(j);
287*cdf0e10cSrcweir 		while (pJ!=pX && Compare(pX,pJ)<0) { j--; pJ=rCont.Prev(); }
288*cdf0e10cSrcweir 		if (i<=j) {
289*cdf0e10cSrcweir 			rCont.Replace(pJ,i);
290*cdf0e10cSrcweir 			rCont.Replace(pI,j);
291*cdf0e10cSrcweir 			i++;
292*cdf0e10cSrcweir 			j--;
293*cdf0e10cSrcweir 		}
294*cdf0e10cSrcweir 	} while (i<=j);
295*cdf0e10cSrcweir 	if (nL<j) ImpSubSort(nL,j);
296*cdf0e10cSrcweir 	if (i<nR) ImpSubSort(i,nR);
297*cdf0e10cSrcweir }
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir class ImpUShortContainerSorter: public ContainerSorter {
302*cdf0e10cSrcweir public:
303*cdf0e10cSrcweir 	ImpUShortContainerSorter(Container& rNewCont): ContainerSorter(rNewCont) {}
304*cdf0e10cSrcweir 	virtual int Compare(const void* pElem1, const void* pElem2) const;
305*cdf0e10cSrcweir };
306*cdf0e10cSrcweir 
307*cdf0e10cSrcweir int ImpUShortContainerSorter::Compare(const void* pElem1, const void* pElem2) const
308*cdf0e10cSrcweir {
309*cdf0e10cSrcweir 	sal_uInt16 n1=sal_uInt16(sal_uIntPtr(pElem1));
310*cdf0e10cSrcweir 	sal_uInt16 n2=sal_uInt16(sal_uIntPtr(pElem2));
311*cdf0e10cSrcweir 	return n1<n2 ? -1 : n1>n2 ? 1 : 0;
312*cdf0e10cSrcweir }
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir void UShortCont::Sort()
315*cdf0e10cSrcweir {
316*cdf0e10cSrcweir 	ImpUShortContainerSorter aSorter(aArr);
317*cdf0e10cSrcweir 	aSorter.DoSort();
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir class ImpClipMerk {
323*cdf0e10cSrcweir 	Region aClip;
324*cdf0e10cSrcweir 	FASTBOOL   bClip;
325*cdf0e10cSrcweir public:
326*cdf0e10cSrcweir 	ImpClipMerk(const OutputDevice& rOut): aClip(rOut.GetClipRegion()),bClip(rOut.IsClipRegion()) {}
327*cdf0e10cSrcweir 	void Restore(OutputDevice& rOut)
328*cdf0e10cSrcweir 	{
329*cdf0e10cSrcweir 		// Kein Clipping in die Metafileaufzeichnung
330*cdf0e10cSrcweir 		GDIMetaFile* pMtf=rOut.GetConnectMetaFile();
331*cdf0e10cSrcweir 		if (pMtf!=NULL && (!pMtf->IsRecord() || pMtf->IsPause())) pMtf=NULL;
332*cdf0e10cSrcweir 		if (pMtf!=NULL) pMtf->Pause(sal_True);
333*cdf0e10cSrcweir 		if (bClip) rOut.SetClipRegion(aClip);
334*cdf0e10cSrcweir 		else rOut.SetClipRegion();
335*cdf0e10cSrcweir 		if (pMtf!=NULL) pMtf->Pause(sal_False);
336*cdf0e10cSrcweir 	}
337*cdf0e10cSrcweir };
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir class ImpColorMerk {
340*cdf0e10cSrcweir 	Color aLineColor;
341*cdf0e10cSrcweir 	Color aFillColor;
342*cdf0e10cSrcweir 	Color aBckgrdColor;
343*cdf0e10cSrcweir 	Font  aFont;
344*cdf0e10cSrcweir public:
345*cdf0e10cSrcweir 	ImpColorMerk(const OutputDevice& rOut):
346*cdf0e10cSrcweir 		aLineColor( rOut.GetLineColor() ),
347*cdf0e10cSrcweir 		aFillColor( rOut.GetFillColor() ),
348*cdf0e10cSrcweir 		aBckgrdColor( rOut.GetBackground().GetColor() ),
349*cdf0e10cSrcweir 		aFont (rOut.GetFont()) {}
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir 	ImpColorMerk(const OutputDevice& rOut, sal_uInt16 nMode)
352*cdf0e10cSrcweir 	{
353*cdf0e10cSrcweir 		if ( (nMode & SDRHDC_SAVEPEN) == SDRHDC_SAVEPEN )
354*cdf0e10cSrcweir 			aLineColor = rOut.GetLineColor();
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 		if ( (nMode & SDRHDC_SAVEBRUSH) == SDRHDC_SAVEBRUSH)
357*cdf0e10cSrcweir 		{
358*cdf0e10cSrcweir 			aFillColor = rOut.GetFillColor();
359*cdf0e10cSrcweir 			aBckgrdColor = rOut.GetBackground().GetColor();
360*cdf0e10cSrcweir 		}
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 		if ( (nMode & SDRHDC_SAVEFONT) == SDRHDC_SAVEFONT)
363*cdf0e10cSrcweir 			aFont=rOut.GetFont();
364*cdf0e10cSrcweir 	}
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir 	void Restore(OutputDevice& rOut, sal_uInt16 nMode=SDRHDC_SAVEPENANDBRUSHANDFONT)
367*cdf0e10cSrcweir 	{
368*cdf0e10cSrcweir 		if ( (nMode & SDRHDC_SAVEPEN) == SDRHDC_SAVEPEN)
369*cdf0e10cSrcweir 			rOut.SetLineColor( aLineColor );
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir 		if ( (nMode & SDRHDC_SAVEBRUSH) == SDRHDC_SAVEBRUSH)
372*cdf0e10cSrcweir 		{
373*cdf0e10cSrcweir 			rOut.SetFillColor( aFillColor );
374*cdf0e10cSrcweir 			rOut.SetBackground( Wallpaper( aBckgrdColor ) );
375*cdf0e10cSrcweir 		}
376*cdf0e10cSrcweir 		if ((nMode & SDRHDC_SAVEFONT) ==SDRHDC_SAVEFONT)
377*cdf0e10cSrcweir 		{
378*cdf0e10cSrcweir 			if (!rOut.GetFont().IsSameInstance(aFont))
379*cdf0e10cSrcweir 			{
380*cdf0e10cSrcweir 				rOut.SetFont(aFont);
381*cdf0e10cSrcweir 			}
382*cdf0e10cSrcweir 		}
383*cdf0e10cSrcweir 	}
384*cdf0e10cSrcweir 
385*cdf0e10cSrcweir 	const Color& GetLineColor() const { return aLineColor; }
386*cdf0e10cSrcweir };
387*cdf0e10cSrcweir 
388*cdf0e10cSrcweir ImpSdrHdcMerk::ImpSdrHdcMerk(const OutputDevice& rOut, sal_uInt16 nNewMode, FASTBOOL bAutoMerk):
389*cdf0e10cSrcweir 	pFarbMerk(NULL),
390*cdf0e10cSrcweir 	pClipMerk(NULL),
391*cdf0e10cSrcweir 	pLineColorMerk(NULL),
392*cdf0e10cSrcweir 	nMode(nNewMode)
393*cdf0e10cSrcweir {
394*cdf0e10cSrcweir 	if (bAutoMerk) Save(rOut);
395*cdf0e10cSrcweir }
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir ImpSdrHdcMerk::~ImpSdrHdcMerk()
398*cdf0e10cSrcweir {
399*cdf0e10cSrcweir 	if (pFarbMerk!=NULL) delete pFarbMerk;
400*cdf0e10cSrcweir 	if (pClipMerk!=NULL) delete pClipMerk;
401*cdf0e10cSrcweir 	if (pLineColorMerk !=NULL) delete pLineColorMerk;
402*cdf0e10cSrcweir }
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir void ImpSdrHdcMerk::Save(const OutputDevice& rOut)
405*cdf0e10cSrcweir {
406*cdf0e10cSrcweir 	if (pFarbMerk!=NULL)
407*cdf0e10cSrcweir 	{
408*cdf0e10cSrcweir 		delete pFarbMerk;
409*cdf0e10cSrcweir 		pFarbMerk=NULL;
410*cdf0e10cSrcweir 	}
411*cdf0e10cSrcweir 	if (pClipMerk!=NULL)
412*cdf0e10cSrcweir 	{
413*cdf0e10cSrcweir 		delete pClipMerk;
414*cdf0e10cSrcweir 		pClipMerk=NULL;
415*cdf0e10cSrcweir 	}
416*cdf0e10cSrcweir 	if (pLineColorMerk !=NULL)
417*cdf0e10cSrcweir 	{
418*cdf0e10cSrcweir 		delete pLineColorMerk ;
419*cdf0e10cSrcweir 		pLineColorMerk =NULL;
420*cdf0e10cSrcweir 	}
421*cdf0e10cSrcweir 	if ((nMode & SDRHDC_SAVECLIPPING) ==SDRHDC_SAVECLIPPING)
422*cdf0e10cSrcweir 		pClipMerk=new ImpClipMerk(rOut);
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir 	sal_uInt16 nCol=nMode & SDRHDC_SAVEPENANDBRUSHANDFONT;
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir 	if (nCol==SDRHDC_SAVEPEN)
427*cdf0e10cSrcweir 		pLineColorMerk=new Color( rOut.GetLineColor() );
428*cdf0e10cSrcweir 	else if (nCol==SDRHDC_SAVEPENANDBRUSHANDFONT)
429*cdf0e10cSrcweir 		pFarbMerk=new ImpColorMerk(rOut);
430*cdf0e10cSrcweir 	else if (nCol!=0)
431*cdf0e10cSrcweir 		pFarbMerk=new ImpColorMerk(rOut,nCol);
432*cdf0e10cSrcweir }
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir void ImpSdrHdcMerk::Restore(OutputDevice& rOut, sal_uInt16 nMask) const
435*cdf0e10cSrcweir {
436*cdf0e10cSrcweir 	nMask&=nMode; // nur restaurieren, was auch gesichert wurde
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir 	if ((nMask & SDRHDC_SAVECLIPPING) ==SDRHDC_SAVECLIPPING && pClipMerk!=NULL)
439*cdf0e10cSrcweir 		pClipMerk->Restore(rOut);
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir 	sal_uInt16 nCol=nMask & SDRHDC_SAVEPENANDBRUSHANDFONT;
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir 	if (nCol==SDRHDC_SAVEPEN)
444*cdf0e10cSrcweir 	{
445*cdf0e10cSrcweir 		if (pLineColorMerk!=NULL)
446*cdf0e10cSrcweir 			rOut.SetLineColor(*pLineColorMerk);
447*cdf0e10cSrcweir 		else if (pFarbMerk!=NULL)
448*cdf0e10cSrcweir 			rOut.SetLineColor( pFarbMerk->GetLineColor() );
449*cdf0e10cSrcweir 	} else if (nCol!=0 && pFarbMerk!=NULL)
450*cdf0e10cSrcweir 		pFarbMerk->Restore(rOut,nCol);
451*cdf0e10cSrcweir }
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir void SdrLinkList::Clear()
456*cdf0e10cSrcweir {
457*cdf0e10cSrcweir 	unsigned nAnz=GetLinkCount();
458*cdf0e10cSrcweir 	for (unsigned i=0; i<nAnz; i++) {
459*cdf0e10cSrcweir 		delete (Link*)aList.GetObject(i);
460*cdf0e10cSrcweir 	}
461*cdf0e10cSrcweir 	aList.Clear();
462*cdf0e10cSrcweir }
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir unsigned SdrLinkList::FindEntry(const Link& rLink) const
465*cdf0e10cSrcweir {
466*cdf0e10cSrcweir 	unsigned nAnz=GetLinkCount();
467*cdf0e10cSrcweir 	for (unsigned i=0; i<nAnz; i++) {
468*cdf0e10cSrcweir 		if (GetLink(i)==rLink) return i;
469*cdf0e10cSrcweir 	}
470*cdf0e10cSrcweir 	return 0xFFFF;
471*cdf0e10cSrcweir }
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir void SdrLinkList::InsertLink(const Link& rLink, unsigned nPos)
474*cdf0e10cSrcweir {
475*cdf0e10cSrcweir 	unsigned nFnd=FindEntry(rLink);
476*cdf0e10cSrcweir 	if (nFnd==0xFFFF) {
477*cdf0e10cSrcweir 		if (rLink.IsSet()) {
478*cdf0e10cSrcweir 			aList.Insert(new Link(rLink),nPos);
479*cdf0e10cSrcweir 		} else {
480*cdf0e10cSrcweir 			DBG_ERROR("SdrLinkList::InsertLink(): Versuch, einen nicht gesetzten Link einzufuegen");
481*cdf0e10cSrcweir 		}
482*cdf0e10cSrcweir 	} else {
483*cdf0e10cSrcweir 		DBG_ERROR("SdrLinkList::InsertLink(): Link schon vorhanden");
484*cdf0e10cSrcweir 	}
485*cdf0e10cSrcweir }
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir void SdrLinkList::RemoveLink(const Link& rLink)
488*cdf0e10cSrcweir {
489*cdf0e10cSrcweir 	unsigned nFnd=FindEntry(rLink);
490*cdf0e10cSrcweir 	if (nFnd!=0xFFFF) {
491*cdf0e10cSrcweir 		Link* pLink=(Link*)aList.Remove(nFnd);
492*cdf0e10cSrcweir 		delete pLink;
493*cdf0e10cSrcweir 	} else {
494*cdf0e10cSrcweir 		DBG_ERROR("SdrLinkList::RemoveLink(): Link nicht gefunden");
495*cdf0e10cSrcweir 	}
496*cdf0e10cSrcweir }
497*cdf0e10cSrcweir 
498*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
499*cdf0e10cSrcweir // #98988# Re-implement GetDraftFillColor(...)
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir FASTBOOL GetDraftFillColor(const SfxItemSet& rSet, Color& rCol)
502*cdf0e10cSrcweir {
503*cdf0e10cSrcweir 	XFillStyle eFill=((XFillStyleItem&)rSet.Get(XATTR_FILLSTYLE)).GetValue();
504*cdf0e10cSrcweir 	FASTBOOL bRetval(sal_False);
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir 	switch(eFill)
507*cdf0e10cSrcweir 	{
508*cdf0e10cSrcweir 		case XFILL_SOLID:
509*cdf0e10cSrcweir 		{
510*cdf0e10cSrcweir 			rCol = ((XFillColorItem&)rSet.Get(XATTR_FILLCOLOR)).GetColorValue();
511*cdf0e10cSrcweir 			bRetval = sal_True;
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir 			break;
514*cdf0e10cSrcweir 		}
515*cdf0e10cSrcweir 		case XFILL_HATCH:
516*cdf0e10cSrcweir 		{
517*cdf0e10cSrcweir 			Color aCol1(((XFillHatchItem&)rSet.Get(XATTR_FILLHATCH)).GetHatchValue().GetColor());
518*cdf0e10cSrcweir 			Color aCol2(COL_WHITE);
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir 			// #97870# when hatch background is activated, use object fill color as hatch color
521*cdf0e10cSrcweir 			sal_Bool bFillHatchBackground = ((const XFillBackgroundItem&)(rSet.Get(XATTR_FILLBACKGROUND))).GetValue();
522*cdf0e10cSrcweir 			if(bFillHatchBackground)
523*cdf0e10cSrcweir 			{
524*cdf0e10cSrcweir 				aCol2 = ((const XFillColorItem&)(rSet.Get(XATTR_FILLCOLOR))).GetColorValue();
525*cdf0e10cSrcweir 			}
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir             const basegfx::BColor aAverageColor(basegfx::average(aCol1.getBColor(), aCol2.getBColor()));
528*cdf0e10cSrcweir 			rCol = Color(aAverageColor);
529*cdf0e10cSrcweir 			bRetval = sal_True;
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir 			break;
532*cdf0e10cSrcweir 		}
533*cdf0e10cSrcweir 		case XFILL_GRADIENT: {
534*cdf0e10cSrcweir 			const XGradient& rGrad=((XFillGradientItem&)rSet.Get(XATTR_FILLGRADIENT)).GetGradientValue();
535*cdf0e10cSrcweir 			Color aCol1(rGrad.GetStartColor());
536*cdf0e10cSrcweir 			Color aCol2(rGrad.GetEndColor());
537*cdf0e10cSrcweir             const basegfx::BColor aAverageColor(basegfx::average(aCol1.getBColor(), aCol2.getBColor()));
538*cdf0e10cSrcweir 			rCol = Color(aAverageColor);
539*cdf0e10cSrcweir 			bRetval = sal_True;
540*cdf0e10cSrcweir 
541*cdf0e10cSrcweir 			break;
542*cdf0e10cSrcweir 		}
543*cdf0e10cSrcweir 		case XFILL_BITMAP:
544*cdf0e10cSrcweir 		{
545*cdf0e10cSrcweir 			const Bitmap& rBitmap = ((XFillBitmapItem&)rSet.Get(XATTR_FILLBITMAP)).GetBitmapValue().GetBitmap();
546*cdf0e10cSrcweir 			const Size aSize(rBitmap.GetSizePixel());
547*cdf0e10cSrcweir 			const sal_uInt32 nWidth = aSize.Width();
548*cdf0e10cSrcweir 			const sal_uInt32 nHeight = aSize.Height();
549*cdf0e10cSrcweir 			Bitmap aBitmap(rBitmap);
550*cdf0e10cSrcweir 			BitmapReadAccess* pAccess = aBitmap.AcquireReadAccess();
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir 			if(pAccess && nWidth > 0 && nHeight > 0)
553*cdf0e10cSrcweir 			{
554*cdf0e10cSrcweir 				sal_uInt32 nRt(0L);
555*cdf0e10cSrcweir 				sal_uInt32 nGn(0L);
556*cdf0e10cSrcweir 				sal_uInt32 nBl(0L);
557*cdf0e10cSrcweir 				const sal_uInt32 nMaxSteps(8L);
558*cdf0e10cSrcweir 				const sal_uInt32 nXStep((nWidth > nMaxSteps) ? nWidth / nMaxSteps : 1L);
559*cdf0e10cSrcweir 				const sal_uInt32 nYStep((nHeight > nMaxSteps) ? nHeight / nMaxSteps : 1L);
560*cdf0e10cSrcweir 				sal_uInt32 nAnz(0L);
561*cdf0e10cSrcweir 
562*cdf0e10cSrcweir 				for(sal_uInt32 nY(0L); nY < nHeight; nY += nYStep)
563*cdf0e10cSrcweir 				{
564*cdf0e10cSrcweir 					for(sal_uInt32 nX(0L); nX < nWidth; nX += nXStep)
565*cdf0e10cSrcweir 					{
566*cdf0e10cSrcweir 						const BitmapColor& rCol2 = (pAccess->HasPalette())
567*cdf0e10cSrcweir 							? pAccess->GetPaletteColor((sal_uInt8)pAccess->GetPixel(nY, nX))
568*cdf0e10cSrcweir 							: pAccess->GetPixel(nY, nX);
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir 						nRt += rCol2.GetRed();
571*cdf0e10cSrcweir 						nGn += rCol2.GetGreen();
572*cdf0e10cSrcweir 						nBl += rCol2.GetBlue();
573*cdf0e10cSrcweir 						nAnz++;
574*cdf0e10cSrcweir 					}
575*cdf0e10cSrcweir 				}
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir 				nRt /= nAnz;
578*cdf0e10cSrcweir 				nGn /= nAnz;
579*cdf0e10cSrcweir 				nBl /= nAnz;
580*cdf0e10cSrcweir 
581*cdf0e10cSrcweir 				rCol = Color(sal_uInt8(nRt), sal_uInt8(nGn), sal_uInt8(nBl));
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir 				bRetval = sal_True;
584*cdf0e10cSrcweir 			}
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir 			if(pAccess)
587*cdf0e10cSrcweir 			{
588*cdf0e10cSrcweir 				aBitmap.ReleaseAccess(pAccess);
589*cdf0e10cSrcweir 			}
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir 			break;
592*cdf0e10cSrcweir 		}
593*cdf0e10cSrcweir 		default: break;
594*cdf0e10cSrcweir 	}
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir 	return bRetval;
597*cdf0e10cSrcweir }
598*cdf0e10cSrcweir 
599*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir SdrEngineDefaults::SdrEngineDefaults():
602*cdf0e10cSrcweir 	aFontName( OutputDevice::GetDefaultFont( DEFAULTFONT_SERIF, LANGUAGE_SYSTEM, DEFAULTFONT_FLAGS_ONLYONE ).GetName() ),
603*cdf0e10cSrcweir 	eFontFamily(FAMILY_ROMAN),
604*cdf0e10cSrcweir 	aFontColor(COL_AUTO),
605*cdf0e10cSrcweir 	nFontHeight(847),			  // 847/100mm = ca. 24 Point
606*cdf0e10cSrcweir 	eMapUnit(MAP_100TH_MM),
607*cdf0e10cSrcweir 	aMapFraction(1,1)
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir }
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir SdrEngineDefaults& SdrEngineDefaults::GetDefaults()
612*cdf0e10cSrcweir {
613*cdf0e10cSrcweir 	SdrGlobalData& rGlobalData=GetSdrGlobalData();
614*cdf0e10cSrcweir 	if (rGlobalData.pDefaults==NULL) {
615*cdf0e10cSrcweir 		rGlobalData.pDefaults=new SdrEngineDefaults;
616*cdf0e10cSrcweir 	}
617*cdf0e10cSrcweir 	return *rGlobalData.pDefaults;
618*cdf0e10cSrcweir }
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir void SdrEngineDefaults::LanguageHasChanged()
623*cdf0e10cSrcweir {
624*cdf0e10cSrcweir 	SdrGlobalData& rGlobalData=GetSdrGlobalData();
625*cdf0e10cSrcweir 	if (rGlobalData.pResMgr!=NULL) {
626*cdf0e10cSrcweir 		delete rGlobalData.pResMgr;
627*cdf0e10cSrcweir 		rGlobalData.pResMgr=NULL;
628*cdf0e10cSrcweir 	}
629*cdf0e10cSrcweir }
630*cdf0e10cSrcweir 
631*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir SdrOutliner* SdrMakeOutliner( sal_uInt16 nOutlinerMode, SdrModel* pModel )
634*cdf0e10cSrcweir {
635*cdf0e10cSrcweir 	//SdrEngineDefaults& rDefaults = SdrEngineDefaults::GetDefaults();
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir 	SfxItemPool* pPool = &pModel->GetItemPool();
638*cdf0e10cSrcweir 	SdrOutliner* pOutl = new SdrOutliner( pPool, nOutlinerMode );
639*cdf0e10cSrcweir 	pOutl->SetEditTextObjectPool( pPool );
640*cdf0e10cSrcweir 	pOutl->SetStyleSheetPool( (SfxStyleSheetPool*) pModel->GetStyleSheetPool() );
641*cdf0e10cSrcweir 	pOutl->SetDefTab( pModel->GetDefaultTabulator() );
642*cdf0e10cSrcweir 	pOutl->SetForbiddenCharsTable( pModel->GetForbiddenCharsTable() );
643*cdf0e10cSrcweir 	pOutl->SetAsianCompressionMode( pModel->GetCharCompressType() );
644*cdf0e10cSrcweir 	pOutl->SetKernAsianPunctuation( pModel->IsKernAsianPunctuation() );
645*cdf0e10cSrcweir     pOutl->SetAddExtLeading( pModel->IsAddExtLeading() );
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir 	return pOutl;
648*cdf0e10cSrcweir }
649*cdf0e10cSrcweir 
650*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
651*cdf0e10cSrcweir 
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir SdrLinkList& ImpGetUserMakeObjHdl()
654*cdf0e10cSrcweir {
655*cdf0e10cSrcweir 	SdrGlobalData& rGlobalData=GetSdrGlobalData();
656*cdf0e10cSrcweir 	return rGlobalData.aUserMakeObjHdl;
657*cdf0e10cSrcweir }
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir SdrLinkList& ImpGetUserMakeObjUserDataHdl()
660*cdf0e10cSrcweir {
661*cdf0e10cSrcweir 	SdrGlobalData& rGlobalData=GetSdrGlobalData();
662*cdf0e10cSrcweir 	return rGlobalData.aUserMakeObjUserDataHdl;
663*cdf0e10cSrcweir }
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir ResMgr* ImpGetResMgr()
668*cdf0e10cSrcweir {
669*cdf0e10cSrcweir 	SdrGlobalData& rGlobalData = GetSdrGlobalData();
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir 	if(!rGlobalData.pResMgr)
672*cdf0e10cSrcweir 	{
673*cdf0e10cSrcweir 		ByteString aName("svx");
674*cdf0e10cSrcweir 		rGlobalData.pResMgr =
675*cdf0e10cSrcweir             ResMgr::CreateResMgr( aName.GetBuffer(), Application::GetSettings().GetUILocale() );
676*cdf0e10cSrcweir 	}
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir 	return rGlobalData.pResMgr;
679*cdf0e10cSrcweir }
680*cdf0e10cSrcweir 
681*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
682*cdf0e10cSrcweir 
683*cdf0e10cSrcweir String ImpGetResStr(sal_uInt16 nResID)
684*cdf0e10cSrcweir {
685*cdf0e10cSrcweir 	return String(ResId(nResID, *ImpGetResMgr()));
686*cdf0e10cSrcweir }
687*cdf0e10cSrcweir 
688*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir namespace sdr
691*cdf0e10cSrcweir {
692*cdf0e10cSrcweir String GetResourceString(sal_uInt16 nResID)
693*cdf0e10cSrcweir {
694*cdf0e10cSrcweir 	return ImpGetResStr( nResID );
695*cdf0e10cSrcweir }
696*cdf0e10cSrcweir }
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
699*cdf0e10cSrcweir 
700*cdf0e10cSrcweir sal_Bool SearchOutlinerItems(const SfxItemSet& rSet, sal_Bool bInklDefaults, sal_Bool* pbOnlyEE)
701*cdf0e10cSrcweir {
702*cdf0e10cSrcweir 	sal_Bool bHas=sal_False;
703*cdf0e10cSrcweir 	sal_Bool bOnly=sal_True;
704*cdf0e10cSrcweir 	sal_Bool bLookOnly=pbOnlyEE!=NULL;
705*cdf0e10cSrcweir 	SfxWhichIter aIter(rSet);
706*cdf0e10cSrcweir 	sal_uInt16 nWhich=aIter.FirstWhich();
707*cdf0e10cSrcweir 	while (((bLookOnly && bOnly) || !bHas) && nWhich!=0) {
708*cdf0e10cSrcweir 		// bei bInklDefaults ist der gesamte Which-Range
709*cdf0e10cSrcweir 		// ausschlaggebend, ansonsten nur die gesetzten Items
710*cdf0e10cSrcweir 		// Disabled und DontCare wird als Loch im Which-Range betrachtet
711*cdf0e10cSrcweir 		SfxItemState eState=rSet.GetItemState(nWhich);
712*cdf0e10cSrcweir 		if ((eState==SFX_ITEM_DEFAULT && bInklDefaults) || eState==SFX_ITEM_SET) {
713*cdf0e10cSrcweir 			if (nWhich<EE_ITEMS_START || nWhich>EE_ITEMS_END) bOnly=sal_False;
714*cdf0e10cSrcweir 			else bHas=sal_True;
715*cdf0e10cSrcweir 		}
716*cdf0e10cSrcweir 		nWhich=aIter.NextWhich();
717*cdf0e10cSrcweir 	}
718*cdf0e10cSrcweir 	if (!bHas) bOnly=sal_False;
719*cdf0e10cSrcweir 	if (pbOnlyEE!=NULL) *pbOnlyEE=bOnly;
720*cdf0e10cSrcweir 	return bHas;
721*cdf0e10cSrcweir }
722*cdf0e10cSrcweir 
723*cdf0e10cSrcweir sal_uInt16* RemoveWhichRange(const sal_uInt16* pOldWhichTable, sal_uInt16 nRangeBeg, sal_uInt16 nRangeEnd)
724*cdf0e10cSrcweir {
725*cdf0e10cSrcweir 	// insgesamt sind 6 Faelle moeglich (je Range):
726*cdf0e10cSrcweir 	//		   [Beg..End]		   zu entfernender Range
727*cdf0e10cSrcweir 	// [b..e]	 [b..e]    [b..e]  Fall 1,3,2: egal, ganz weg, egal  + Ranges
728*cdf0e10cSrcweir 	// [b........e]  [b........e]  Fall 4,5  : Bereich verkleinern	 | in
729*cdf0e10cSrcweir 	// [b......................e]  Fall 6	 : Splitting			 + pOldWhichTable
730*cdf0e10cSrcweir 	sal_uInt16 nAnz=0;
731*cdf0e10cSrcweir 	while (pOldWhichTable[nAnz]!=0) nAnz++;
732*cdf0e10cSrcweir 	nAnz++; // nAnz muesste nun in jedem Fall eine ungerade Zahl sein (0 am Ende des Arrays)
733*cdf0e10cSrcweir 	DBG_ASSERT((nAnz&1)==1,"Joe: RemoveWhichRange: WhichTable hat keine ungerade Anzahl von Eintraegen");
734*cdf0e10cSrcweir 	sal_uInt16 nAlloc=nAnz;
735*cdf0e10cSrcweir 	// benoetigte Groesse des neuen Arrays ermitteln
736*cdf0e10cSrcweir 	sal_uInt16 nNum=nAnz-1;
737*cdf0e10cSrcweir 	while (nNum!=0) {
738*cdf0e10cSrcweir 		nNum-=2;
739*cdf0e10cSrcweir 		sal_uInt16 nBeg=pOldWhichTable[nNum];
740*cdf0e10cSrcweir 		sal_uInt16 nEnd=pOldWhichTable[nNum+1];
741*cdf0e10cSrcweir 		if (nEnd<nRangeBeg)  /*nCase=1*/ ;
742*cdf0e10cSrcweir 		else if (nBeg>nRangeEnd) /* nCase=2 */ ;
743*cdf0e10cSrcweir 		else if (nBeg>=nRangeBeg && nEnd<=nRangeEnd) /* nCase=3 */ nAlloc-=2;
744*cdf0e10cSrcweir 		else if (nEnd<=nRangeEnd) /* nCase=4 */;
745*cdf0e10cSrcweir 		else if (nBeg>=nRangeBeg) /* nCase=5*/ ;
746*cdf0e10cSrcweir 		else /* nCase=6 */ nAlloc+=2;
747*cdf0e10cSrcweir 	}
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 	sal_uInt16* pNewWhichTable=new sal_uInt16[nAlloc];
750*cdf0e10cSrcweir 	memcpy(pNewWhichTable,pOldWhichTable,nAlloc*sizeof(sal_uInt16));
751*cdf0e10cSrcweir 	pNewWhichTable[nAlloc-1]=0; // im Falle 3 fehlt die 0 am Ende
752*cdf0e10cSrcweir 	// nun die unerwuenschten Ranges entfernen
753*cdf0e10cSrcweir 	nNum=nAlloc-1;
754*cdf0e10cSrcweir 	while (nNum!=0) {
755*cdf0e10cSrcweir 		nNum-=2;
756*cdf0e10cSrcweir 		sal_uInt16 nBeg=pNewWhichTable[nNum];
757*cdf0e10cSrcweir 		sal_uInt16 nEnd=pNewWhichTable[nNum+1];
758*cdf0e10cSrcweir 		unsigned nCase=0;
759*cdf0e10cSrcweir 		if (nEnd<nRangeBeg) nCase=1;
760*cdf0e10cSrcweir 		else if (nBeg>nRangeEnd) nCase=2;
761*cdf0e10cSrcweir 		else if (nBeg>=nRangeBeg && nEnd<=nRangeEnd) nCase=3;
762*cdf0e10cSrcweir 		else if (nEnd<=nRangeEnd) nCase=4;
763*cdf0e10cSrcweir 		else if (nBeg>=nRangeBeg) nCase=5;
764*cdf0e10cSrcweir 		else nCase=6;
765*cdf0e10cSrcweir 		switch (nCase) {
766*cdf0e10cSrcweir 			case 3: {
767*cdf0e10cSrcweir 				unsigned nTailBytes=(nAnz-(nNum+2))*sizeof(sal_uInt16);
768*cdf0e10cSrcweir 				memcpy(&pNewWhichTable[nNum],&pNewWhichTable[nNum+2],nTailBytes);
769*cdf0e10cSrcweir 				nAnz-=2; // Merken: Array hat sich verkleinert
770*cdf0e10cSrcweir 			} break;
771*cdf0e10cSrcweir 			case 4: pNewWhichTable[nNum+1]=nRangeBeg-1; break;
772*cdf0e10cSrcweir 			case 5: pNewWhichTable[nNum]=nRangeEnd+1;	  break;
773*cdf0e10cSrcweir 			case 6: {
774*cdf0e10cSrcweir 				unsigned nTailBytes=(nAnz-(nNum+2))*sizeof(sal_uInt16);
775*cdf0e10cSrcweir 				memcpy(&pNewWhichTable[nNum+4],&pNewWhichTable[nNum+2],nTailBytes);
776*cdf0e10cSrcweir 				nAnz+=2; // Merken: Array hat sich vergroessert
777*cdf0e10cSrcweir 				pNewWhichTable[nNum+2]=nRangeEnd+1;
778*cdf0e10cSrcweir 				pNewWhichTable[nNum+3]=pNewWhichTable[nNum+1];
779*cdf0e10cSrcweir 				pNewWhichTable[nNum+1]=nRangeBeg-1;
780*cdf0e10cSrcweir 			} break;
781*cdf0e10cSrcweir 		} // switch
782*cdf0e10cSrcweir 	}
783*cdf0e10cSrcweir 	return pNewWhichTable;
784*cdf0e10cSrcweir }
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
787*cdf0e10cSrcweir 
788*cdf0e10cSrcweir SvdProgressInfo::SvdProgressInfo( Link *_pLink )
789*cdf0e10cSrcweir {
790*cdf0e10cSrcweir 	DBG_ASSERT(_pLink!=NULL,"SvdProgressInfo(): Kein Link angegeben!!");
791*cdf0e10cSrcweir 
792*cdf0e10cSrcweir 	pLink = _pLink;
793*cdf0e10cSrcweir 	nSumActionCount = 0;
794*cdf0e10cSrcweir 	nSumCurAction	= 0;
795*cdf0e10cSrcweir 
796*cdf0e10cSrcweir 	nObjCount = 0;
797*cdf0e10cSrcweir 	nCurObj   = 0;
798*cdf0e10cSrcweir 
799*cdf0e10cSrcweir 	nActionCount = 0;
800*cdf0e10cSrcweir 	nCurAction	 = 0;
801*cdf0e10cSrcweir 
802*cdf0e10cSrcweir 	nInsertCount = 0;
803*cdf0e10cSrcweir 	nCurInsert	 = 0;
804*cdf0e10cSrcweir }
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir void SvdProgressInfo::Init( sal_uIntPtr _nSumActionCount, sal_uIntPtr _nObjCount )
807*cdf0e10cSrcweir {
808*cdf0e10cSrcweir 	nSumActionCount = _nSumActionCount;
809*cdf0e10cSrcweir 	nObjCount = _nObjCount;
810*cdf0e10cSrcweir }
811*cdf0e10cSrcweir 
812*cdf0e10cSrcweir sal_Bool SvdProgressInfo::ReportActions( sal_uIntPtr nAnzActions )
813*cdf0e10cSrcweir {
814*cdf0e10cSrcweir 	nSumCurAction += nAnzActions;
815*cdf0e10cSrcweir 	nCurAction += nAnzActions;
816*cdf0e10cSrcweir 	if(nCurAction > nActionCount)
817*cdf0e10cSrcweir 		nCurAction = nActionCount;
818*cdf0e10cSrcweir 
819*cdf0e10cSrcweir 	return pLink->Call(NULL) == 1L;
820*cdf0e10cSrcweir }
821*cdf0e10cSrcweir 
822*cdf0e10cSrcweir sal_Bool SvdProgressInfo::ReportInserts( sal_uIntPtr nAnzInserts )
823*cdf0e10cSrcweir {
824*cdf0e10cSrcweir 	nSumCurAction += nAnzInserts;
825*cdf0e10cSrcweir 	nCurInsert += nAnzInserts;
826*cdf0e10cSrcweir 
827*cdf0e10cSrcweir 	return pLink->Call(NULL) == 1L;
828*cdf0e10cSrcweir }
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir sal_Bool SvdProgressInfo::ReportRescales( sal_uIntPtr nAnzRescales )
831*cdf0e10cSrcweir {
832*cdf0e10cSrcweir 	nSumCurAction += nAnzRescales;
833*cdf0e10cSrcweir 	return pLink->Call(NULL) == 1L;
834*cdf0e10cSrcweir }
835*cdf0e10cSrcweir 
836*cdf0e10cSrcweir void SvdProgressInfo::SetActionCount( sal_uIntPtr _nActionCount )
837*cdf0e10cSrcweir {
838*cdf0e10cSrcweir 	nActionCount = _nActionCount;
839*cdf0e10cSrcweir }
840*cdf0e10cSrcweir 
841*cdf0e10cSrcweir void SvdProgressInfo::SetInsertCount( sal_uIntPtr _nInsertCount )
842*cdf0e10cSrcweir {
843*cdf0e10cSrcweir 	nInsertCount = _nInsertCount;
844*cdf0e10cSrcweir }
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir sal_Bool SvdProgressInfo::SetNextObject()
847*cdf0e10cSrcweir {
848*cdf0e10cSrcweir 	nActionCount = 0;
849*cdf0e10cSrcweir 	nCurAction	 = 0;
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir 	nInsertCount = 0;
852*cdf0e10cSrcweir 	nCurInsert	 = 0;
853*cdf0e10cSrcweir 
854*cdf0e10cSrcweir 	nCurObj++;
855*cdf0e10cSrcweir 	return ReportActions(0);
856*cdf0e10cSrcweir }
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir void SvdProgressInfo::ReportError()
859*cdf0e10cSrcweir {
860*cdf0e10cSrcweir 	pLink->Call((void *)1L);
861*cdf0e10cSrcweir }
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
864*cdf0e10cSrcweir // #i101872# isolate GetTextEditBackgroundColor to tooling; it woll anyways only be used as long
865*cdf0e10cSrcweir // as text edit is not running on overlay
866*cdf0e10cSrcweir 
867*cdf0e10cSrcweir namespace
868*cdf0e10cSrcweir {
869*cdf0e10cSrcweir     bool impGetSdrObjListFillColor(
870*cdf0e10cSrcweir         const SdrObjList& rList,
871*cdf0e10cSrcweir         const Point& rPnt,
872*cdf0e10cSrcweir         const SdrPageView& rTextEditPV,
873*cdf0e10cSrcweir         const SetOfByte& rVisLayers,
874*cdf0e10cSrcweir         Color& rCol)
875*cdf0e10cSrcweir     {
876*cdf0e10cSrcweir 	    if(!rList.GetModel())
877*cdf0e10cSrcweir             return false;
878*cdf0e10cSrcweir 
879*cdf0e10cSrcweir 	    bool bRet(false);
880*cdf0e10cSrcweir 	    bool bMaster(rList.GetPage() ? rList.GetPage()->IsMasterPage() : false);
881*cdf0e10cSrcweir 
882*cdf0e10cSrcweir 	    for(sal_uIntPtr no(rList.GetObjCount()); !bRet && no > 0; )
883*cdf0e10cSrcweir         {
884*cdf0e10cSrcweir 		    no--;
885*cdf0e10cSrcweir 		    SdrObject* pObj = rList.GetObj(no);
886*cdf0e10cSrcweir 		    SdrObjList* pOL = pObj->GetSubList();
887*cdf0e10cSrcweir 
888*cdf0e10cSrcweir             if(pOL)
889*cdf0e10cSrcweir             {
890*cdf0e10cSrcweir                 // group object
891*cdf0e10cSrcweir 			    bRet = impGetSdrObjListFillColor(*pOL, rPnt, rTextEditPV, rVisLayers, rCol);
892*cdf0e10cSrcweir 		    }
893*cdf0e10cSrcweir             else
894*cdf0e10cSrcweir             {
895*cdf0e10cSrcweir         		SdrTextObj* pText = dynamic_cast< SdrTextObj * >(pObj);
896*cdf0e10cSrcweir 
897*cdf0e10cSrcweir                 // #108867# Exclude zero master page object (i.e. background shape) from color query
898*cdf0e10cSrcweir 			    if(pText
899*cdf0e10cSrcweir                     && pObj->IsClosedObj()
900*cdf0e10cSrcweir                     && (!bMaster || (!pObj->IsNotVisibleAsMaster() && 0 != no))
901*cdf0e10cSrcweir                     && pObj->GetCurrentBoundRect().IsInside(rPnt)
902*cdf0e10cSrcweir                     && !pText->IsHideContour()
903*cdf0e10cSrcweir                     && SdrObjectPrimitiveHit(*pObj, rPnt, 0, rTextEditPV, &rVisLayers, false))
904*cdf0e10cSrcweir 			    {
905*cdf0e10cSrcweir             	    bRet = GetDraftFillColor(pObj->GetMergedItemSet(), rCol);
906*cdf0e10cSrcweir 			    }
907*cdf0e10cSrcweir 		    }
908*cdf0e10cSrcweir 	    }
909*cdf0e10cSrcweir 
910*cdf0e10cSrcweir         return bRet;
911*cdf0e10cSrcweir     }
912*cdf0e10cSrcweir 
913*cdf0e10cSrcweir     bool impGetSdrPageFillColor(
914*cdf0e10cSrcweir         const SdrPage& rPage,
915*cdf0e10cSrcweir         const Point& rPnt,
916*cdf0e10cSrcweir         const SdrPageView& rTextEditPV,
917*cdf0e10cSrcweir         const SetOfByte& rVisLayers,
918*cdf0e10cSrcweir         Color& rCol,
919*cdf0e10cSrcweir         bool bSkipBackgroundShape)
920*cdf0e10cSrcweir     {
921*cdf0e10cSrcweir 	    if(!rPage.GetModel())
922*cdf0e10cSrcweir 		    return false;
923*cdf0e10cSrcweir 
924*cdf0e10cSrcweir 	    bool bRet(impGetSdrObjListFillColor(rPage, rPnt, rTextEditPV, rVisLayers, rCol));
925*cdf0e10cSrcweir 
926*cdf0e10cSrcweir 	    if(!bRet && !rPage.IsMasterPage())
927*cdf0e10cSrcweir 	    {
928*cdf0e10cSrcweir 		    if(rPage.TRG_HasMasterPage())
929*cdf0e10cSrcweir 		    {
930*cdf0e10cSrcweir 			    SetOfByte aSet(rVisLayers);
931*cdf0e10cSrcweir 			    aSet &= rPage.TRG_GetMasterPageVisibleLayers();
932*cdf0e10cSrcweir 			    SdrPage& rMasterPage = rPage.TRG_GetMasterPage();
933*cdf0e10cSrcweir 
934*cdf0e10cSrcweir 			    // #108867# Don't fall back to background shape on
935*cdf0e10cSrcweir                 // master pages. This is later handled by
936*cdf0e10cSrcweir                 // GetBackgroundColor, and is necessary to cater for
937*cdf0e10cSrcweir                 // the silly ordering: 1. shapes, 2. master page
938*cdf0e10cSrcweir                 // shapes, 3. page background, 4. master page
939*cdf0e10cSrcweir                 // background.
940*cdf0e10cSrcweir 			    bRet = impGetSdrPageFillColor(rMasterPage, rPnt, rTextEditPV, aSet, rCol, true);
941*cdf0e10cSrcweir 		    }
942*cdf0e10cSrcweir 	    }
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir         // #108867# Only now determine background color from background shapes
945*cdf0e10cSrcweir         if(!bRet && !bSkipBackgroundShape)
946*cdf0e10cSrcweir         {
947*cdf0e10cSrcweir             rCol = rPage.GetPageBackgroundColor();
948*cdf0e10cSrcweir 		    return true;
949*cdf0e10cSrcweir         }
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir 	    return bRet;
952*cdf0e10cSrcweir     }
953*cdf0e10cSrcweir 
954*cdf0e10cSrcweir     Color impCalcBackgroundColor(
955*cdf0e10cSrcweir         const Rectangle& rArea,
956*cdf0e10cSrcweir         const SdrPageView& rTextEditPV,
957*cdf0e10cSrcweir         const SdrPage& rPage)
958*cdf0e10cSrcweir     {
959*cdf0e10cSrcweir         svtools::ColorConfig aColorConfig;
960*cdf0e10cSrcweir         Color aBackground(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
961*cdf0e10cSrcweir 	    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
962*cdf0e10cSrcweir 
963*cdf0e10cSrcweir 	    if(!rStyleSettings.GetHighContrastMode())
964*cdf0e10cSrcweir 	    {
965*cdf0e10cSrcweir             // search in page
966*cdf0e10cSrcweir             const sal_uInt16 SPOTCOUNT(5);
967*cdf0e10cSrcweir             Point aSpotPos[SPOTCOUNT];
968*cdf0e10cSrcweir             Color aSpotColor[SPOTCOUNT];
969*cdf0e10cSrcweir             sal_uIntPtr nHeight( rArea.GetSize().Height() );
970*cdf0e10cSrcweir             sal_uIntPtr nWidth( rArea.GetSize().Width() );
971*cdf0e10cSrcweir             sal_uIntPtr nWidth14  = nWidth / 4;
972*cdf0e10cSrcweir             sal_uIntPtr nHeight14 = nHeight / 4;
973*cdf0e10cSrcweir             sal_uIntPtr nWidth34  = ( 3 * nWidth ) / 4;
974*cdf0e10cSrcweir             sal_uIntPtr nHeight34 = ( 3 * nHeight ) / 4;
975*cdf0e10cSrcweir 
976*cdf0e10cSrcweir             sal_uInt16 i;
977*cdf0e10cSrcweir             for ( i = 0; i < SPOTCOUNT; i++ )
978*cdf0e10cSrcweir             {
979*cdf0e10cSrcweir                 // five spots are used
980*cdf0e10cSrcweir                 switch ( i )
981*cdf0e10cSrcweir                 {
982*cdf0e10cSrcweir                     case 0 :
983*cdf0e10cSrcweir                     {
984*cdf0e10cSrcweir                         // Center-Spot
985*cdf0e10cSrcweir                         aSpotPos[i] = rArea.Center();
986*cdf0e10cSrcweir                     }
987*cdf0e10cSrcweir                     break;
988*cdf0e10cSrcweir 
989*cdf0e10cSrcweir                     case 1 :
990*cdf0e10cSrcweir                     {
991*cdf0e10cSrcweir                         // TopLeft-Spot
992*cdf0e10cSrcweir                         aSpotPos[i] = rArea.TopLeft();
993*cdf0e10cSrcweir                         aSpotPos[i].X() += nWidth14;
994*cdf0e10cSrcweir                         aSpotPos[i].Y() += nHeight14;
995*cdf0e10cSrcweir                     }
996*cdf0e10cSrcweir                     break;
997*cdf0e10cSrcweir 
998*cdf0e10cSrcweir                     case 2 :
999*cdf0e10cSrcweir                     {
1000*cdf0e10cSrcweir                         // TopRight-Spot
1001*cdf0e10cSrcweir                         aSpotPos[i] = rArea.TopLeft();
1002*cdf0e10cSrcweir                         aSpotPos[i].X() += nWidth34;
1003*cdf0e10cSrcweir                         aSpotPos[i].Y() += nHeight14;
1004*cdf0e10cSrcweir                     }
1005*cdf0e10cSrcweir                     break;
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir                     case 3 :
1008*cdf0e10cSrcweir                     {
1009*cdf0e10cSrcweir                         // BottomLeft-Spot
1010*cdf0e10cSrcweir                         aSpotPos[i] = rArea.TopLeft();
1011*cdf0e10cSrcweir                         aSpotPos[i].X() += nWidth14;
1012*cdf0e10cSrcweir                         aSpotPos[i].Y() += nHeight34;
1013*cdf0e10cSrcweir                     }
1014*cdf0e10cSrcweir                     break;
1015*cdf0e10cSrcweir 
1016*cdf0e10cSrcweir                     case 4 :
1017*cdf0e10cSrcweir                     {
1018*cdf0e10cSrcweir                         // BottomRight-Spot
1019*cdf0e10cSrcweir                         aSpotPos[i] = rArea.TopLeft();
1020*cdf0e10cSrcweir                         aSpotPos[i].X() += nWidth34;
1021*cdf0e10cSrcweir                         aSpotPos[i].Y() += nHeight34;
1022*cdf0e10cSrcweir                     }
1023*cdf0e10cSrcweir                     break;
1024*cdf0e10cSrcweir 
1025*cdf0e10cSrcweir                 }
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir                 aSpotColor[i] = Color( COL_WHITE );
1028*cdf0e10cSrcweir                 impGetSdrPageFillColor(rPage, aSpotPos[i], rTextEditPV, rTextEditPV.GetVisibleLayers(), aSpotColor[i], false);
1029*cdf0e10cSrcweir             }
1030*cdf0e10cSrcweir 
1031*cdf0e10cSrcweir             sal_uInt16 aMatch[SPOTCOUNT];
1032*cdf0e10cSrcweir 
1033*cdf0e10cSrcweir             for ( i = 0; i < SPOTCOUNT; i++ )
1034*cdf0e10cSrcweir             {
1035*cdf0e10cSrcweir                 // were same spot colors found?
1036*cdf0e10cSrcweir                 aMatch[i] = 0;
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir                 for ( sal_uInt16 j = 0; j < SPOTCOUNT; j++ )
1039*cdf0e10cSrcweir                 {
1040*cdf0e10cSrcweir                     if( j != i )
1041*cdf0e10cSrcweir                     {
1042*cdf0e10cSrcweir                         if( aSpotColor[i] == aSpotColor[j] )
1043*cdf0e10cSrcweir                         {
1044*cdf0e10cSrcweir                             aMatch[i]++;
1045*cdf0e10cSrcweir                         }
1046*cdf0e10cSrcweir                     }
1047*cdf0e10cSrcweir                 }
1048*cdf0e10cSrcweir             }
1049*cdf0e10cSrcweir 
1050*cdf0e10cSrcweir             // highest weight to center spot
1051*cdf0e10cSrcweir             aBackground = aSpotColor[0];
1052*cdf0e10cSrcweir 
1053*cdf0e10cSrcweir             for ( sal_uInt16 nMatchCount = SPOTCOUNT - 1; nMatchCount > 1; nMatchCount-- )
1054*cdf0e10cSrcweir             {
1055*cdf0e10cSrcweir                 // which spot color was found most?
1056*cdf0e10cSrcweir                 for ( i = 0; i < SPOTCOUNT; i++ )
1057*cdf0e10cSrcweir                 {
1058*cdf0e10cSrcweir                     if( aMatch[i] == nMatchCount )
1059*cdf0e10cSrcweir                     {
1060*cdf0e10cSrcweir                         aBackground = aSpotColor[i];
1061*cdf0e10cSrcweir                         nMatchCount = 1;   // break outer for-loop
1062*cdf0e10cSrcweir                         break;
1063*cdf0e10cSrcweir                     }
1064*cdf0e10cSrcweir                 }
1065*cdf0e10cSrcweir             }
1066*cdf0e10cSrcweir 	    }
1067*cdf0e10cSrcweir 
1068*cdf0e10cSrcweir         return aBackground;
1069*cdf0e10cSrcweir     }
1070*cdf0e10cSrcweir } // end of anonymous namespace
1071*cdf0e10cSrcweir 
1072*cdf0e10cSrcweir Color GetTextEditBackgroundColor(const SdrObjEditView& rView)
1073*cdf0e10cSrcweir {
1074*cdf0e10cSrcweir     svtools::ColorConfig aColorConfig;
1075*cdf0e10cSrcweir     Color aBackground(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
1076*cdf0e10cSrcweir 	const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1077*cdf0e10cSrcweir 
1078*cdf0e10cSrcweir 	if(!rStyleSettings.GetHighContrastMode())
1079*cdf0e10cSrcweir 	{
1080*cdf0e10cSrcweir 		bool bFound(false);
1081*cdf0e10cSrcweir 		SdrTextObj* pText = dynamic_cast< SdrTextObj * >(rView.GetTextEditObject());
1082*cdf0e10cSrcweir 
1083*cdf0e10cSrcweir         if(pText && pText->IsClosedObj())
1084*cdf0e10cSrcweir 		{
1085*cdf0e10cSrcweir 			::sdr::table::SdrTableObj* pTable = dynamic_cast< ::sdr::table::SdrTableObj * >( pText );
1086*cdf0e10cSrcweir 
1087*cdf0e10cSrcweir             if( pTable )
1088*cdf0e10cSrcweir 				bFound = GetDraftFillColor(pTable->GetActiveCellItemSet(), aBackground );
1089*cdf0e10cSrcweir 
1090*cdf0e10cSrcweir 			if( !bFound )
1091*cdf0e10cSrcweir 				bFound=GetDraftFillColor(pText->GetMergedItemSet(), aBackground);
1092*cdf0e10cSrcweir 		}
1093*cdf0e10cSrcweir 
1094*cdf0e10cSrcweir         if(!bFound && pText)
1095*cdf0e10cSrcweir 		{
1096*cdf0e10cSrcweir             SdrPageView* pTextEditPV = rView.GetTextEditPageView();
1097*cdf0e10cSrcweir 
1098*cdf0e10cSrcweir             if(pTextEditPV)
1099*cdf0e10cSrcweir 		    {
1100*cdf0e10cSrcweir 			    Point aPvOfs(pText->GetTextEditOffset());
1101*cdf0e10cSrcweir 			    const SdrPage* pPg = pTextEditPV->GetPage();
1102*cdf0e10cSrcweir 
1103*cdf0e10cSrcweir 			    if(pPg)
1104*cdf0e10cSrcweir 			    {
1105*cdf0e10cSrcweir 				    Rectangle aSnapRect( pText->GetSnapRect() );
1106*cdf0e10cSrcweir 				    aSnapRect.Move(aPvOfs.X(), aPvOfs.Y());
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir 				    return impCalcBackgroundColor(aSnapRect, *pTextEditPV, *pPg);
1109*cdf0e10cSrcweir 			    }
1110*cdf0e10cSrcweir             }
1111*cdf0e10cSrcweir         }
1112*cdf0e10cSrcweir     }
1113*cdf0e10cSrcweir 
1114*cdf0e10cSrcweir     return aBackground;
1115*cdf0e10cSrcweir }
1116*cdf0e10cSrcweir 
1117*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////////////////////////
1118*cdf0e10cSrcweir // eof
1119