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