diff options
Diffstat (limited to 'svl/source/items/style.cxx')
-rw-r--r-- | svl/source/items/style.cxx | 1394 |
1 files changed, 0 insertions, 1394 deletions
diff --git a/svl/source/items/style.cxx b/svl/source/items/style.cxx deleted file mode 100644 index c6e78a7ef4..0000000000 --- a/svl/source/items/style.cxx +++ /dev/null @@ -1,1394 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svl.hxx" - -#include <com/sun/star/lang/XComponent.hpp> - -#define _SVSTDARR_STRINGS -#define _SVSTDARR_STRINGSSORTDTOR -#define _SVSTDARR_BYTESTRINGS -#define _SVSTDARR_BYTESTRINGSSORTDTOR - -#include <tools/tenccvt.hxx> -#include <comphelper/processfactory.hxx> -#include <unotools/intlwrapper.hxx> -#include <svl/smplhint.hxx> -#include <svl/poolitem.hxx> -#include <svl/itemset.hxx> -#include <svl/itempool.hxx> -#include <poolio.hxx> -#include <svl/filerec.hxx> -#include <svl/itemiter.hxx> -#include <svl/style.hxx> -#include <svl/svstdarr.hxx> -#include <unotools/syslocale.hxx> -#include <algorithm> -#include <comphelper/servicehelper.hxx> - -#define STYLESTREAM "SfxStyleSheets" -#define STYLESTREAM_VERSION sal_uInt16(50) - -#ifdef DBG_UTIL -class DbgStyleSheetReferences -{ -public: - DbgStyleSheetReferences() : mnStyles(0), mnPools(0) {} - ~DbgStyleSheetReferences() - { - OSL_TRACE("DbgStyleSheetReferences\nSfxStyleSheetBase left %ld\nSfxStyleSheetBasePool left %ld\n", mnStyles, mnPools ); - } - - sal_uInt32 mnStyles; - sal_uInt32 mnPools; -} -aDbgStyleSheetReferences; - -#endif - -TYPEINIT0(SfxStyleSheetBase) - -TYPEINIT3(SfxStyleSheet, SfxStyleSheetBase, SfxListener, SfxBroadcaster) - - -//========================================================================= - -TYPEINIT1(SfxStyleSheetHint, SfxHint); -TYPEINIT1(SfxStyleSheetHintExtended, SfxStyleSheetHint); -TYPEINIT1(SfxStyleSheetPoolHint, SfxHint); - -SfxStyleSheetHintExtended::SfxStyleSheetHintExtended -( - sal_uInt16 nAction, // SFX_STYLESHEET_... (s.o.) - const String& rOldName -) -: SfxStyleSheetHint( nAction ), - aName( rOldName ) -{} -SfxStyleSheetHintExtended::SfxStyleSheetHintExtended -( - sal_uInt16 nAction, // SFX_STYLESHEET_... (s.o.) - const String& rOldName, - SfxStyleSheetBase& rStyleSheet // geh"ort weiterhin dem Aufrufer -) -: SfxStyleSheetHint( nAction, rStyleSheet ), - aName( rOldName ) -{} - -//------------------------------------------------------------------------- - -SfxStyleSheetHint::SfxStyleSheetHint -( - sal_uInt16 nAction, // SFX_STYLESHEET_... (s.o.) - SfxStyleSheetBase& rStyleSheet // geh"ort weiterhin dem Aufrufer -) -: pStyleSh( &rStyleSheet ), - nHint( nAction ) -{} - -SfxStyleSheetHint::SfxStyleSheetHint -( - sal_uInt16 nAction // SFX_STYLESHEET_... (s.o.) -) -: pStyleSh( NULL ), - nHint( nAction ) -{} - -//========================================================================= - -class SfxStyleSheetBasePool_Impl -{ - public: - SfxStyles aStyles; - SfxStyleSheetIterator *pIter; - SfxStyleSheetBasePool_Impl() : pIter(0){} - ~SfxStyleSheetBasePool_Impl(){delete pIter;} -}; - - -//////////////////////////// SfxStyleSheetBase /////////////////////////////// - -// Konstruktoren - -SfxStyleSheetBase::SfxStyleSheetBase( const XubString& rName, SfxStyleSheetBasePool& r, SfxStyleFamily eFam, sal_uInt16 mask ) - : rPool( r ) - , nFamily( eFam ) - , aName( rName ) - , aParent() - , aFollow( rName ) - , pSet( NULL ) - , nMask(mask) - , nHelpId( 0 ) - , bMySet( sal_False ) -{ -#ifdef DBG_UTIL - aDbgStyleSheetReferences.mnStyles++; -#endif -} - -SfxStyleSheetBase::SfxStyleSheetBase( const SfxStyleSheetBase& r ) - : comphelper::OWeakTypeObject() - , rPool( r.rPool ) - , nFamily( r.nFamily ) - , aName( r.aName ) - , aParent( r.aParent ) - , aFollow( r.aFollow ) - , aHelpFile( r.aHelpFile ) - , nMask( r.nMask ) - , nHelpId( r.nHelpId ) - , bMySet( r.bMySet ) -{ -#ifdef DBG_UTIL - aDbgStyleSheetReferences.mnStyles++; -#endif - if( r.pSet ) - pSet = bMySet ? new SfxItemSet( *r.pSet ) : r.pSet; - else - pSet = NULL; -} - -static SfxStyleSheetBasePool& implGetStaticPool() -{ - static SfxStyleSheetBasePool* pSheetPool = 0; - static SfxItemPool* pBasePool = 0; - if( !pSheetPool ) - { - UniString aName; - pBasePool = new SfxItemPool( aName, 0, 0, 0 ); - pSheetPool = new SfxStyleSheetBasePool(*pBasePool); - } - return *pSheetPool; -} - -SfxStyleSheetBase::SfxStyleSheetBase() -: comphelper::OWeakTypeObject() -, rPool( implGetStaticPool() ) -{ -} - -SfxStyleSheetBase::~SfxStyleSheetBase() -{ -#ifdef DBG_UTIL - --aDbgStyleSheetReferences.mnStyles; -#endif - - if( bMySet ) - { - delete pSet; - pSet = 0; - } -} - -sal_uInt16 SfxStyleSheetBase::GetVersion() const -{ - return 0x0000; -} - -// Namen aendern - -const XubString& SfxStyleSheetBase::GetName() const -{ - return aName; -} - -sal_Bool SfxStyleSheetBase::SetName( const XubString& rName ) -{ - if(rName.Len() == 0) - return sal_False; - if( aName != rName ) - { - String aOldName = aName; - SfxStyleSheetBase *pOther = rPool.Find( rName, nFamily ) ; - if ( pOther && pOther != this ) - return sal_False; - - SfxStyleFamily eTmpFam=rPool.GetSearchFamily(); - sal_uInt16 nTmpMask=rPool.GetSearchMask(); - - rPool.SetSearchMask(nFamily); - - if ( aName.Len() ) - rPool.ChangeParent( aName, rName, sal_False ); - if ( aFollow.Equals( aName ) ) - aFollow = rName; - aName = rName; - rPool.SetSearchMask(eTmpFam, nTmpMask); - rPool.Broadcast( SfxStyleSheetHintExtended( - SFX_STYLESHEET_MODIFIED, aOldName, *this ) ); - } - return sal_True; -} - -rtl::OUString SfxStyleSheetBase::GetDisplayName() const -{ - if( maDisplayName.getLength() == 0 ) - { - return aName; - } - else - { - return maDisplayName; - } -} - -void SfxStyleSheetBase::SetDisplayName( const rtl::OUString& rDisplayName ) -{ - maDisplayName = rDisplayName; -} - -// Parent aendern - -const XubString& SfxStyleSheetBase::GetParent() const -{ - return aParent; -} - -sal_Bool SfxStyleSheetBase::SetParent( const XubString& rName ) -{ - if ( rName == aName ) - return sal_False; - - if( aParent != rName ) - { - SfxStyleSheetBase* pIter = rPool.Find(rName, nFamily); - if( rName.Len() && !pIter ) - { - OSL_FAIL( "StyleSheet-Parent nicht gefunden" ); - return sal_False; - } - // rekursive Verknuepfungen verhindern - if( aName.Len() ) - while(pIter) - { - if(pIter->GetName() == aName && aName != rName) - return sal_False; - pIter = rPool.Find(pIter->GetParent(), nFamily); - } - aParent = rName; - } - rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) ); - return sal_True; -} - -// Follow aendern - -const XubString& SfxStyleSheetBase::GetFollow() const -{ - return aFollow; -} - -sal_Bool SfxStyleSheetBase::SetFollow( const XubString& rName ) -{ - if( aFollow != rName ) - { - if( !rPool.Find( rName, nFamily ) ) - { - OSL_FAIL( "StyleSheet-Follow nicht gefunden" ); - return sal_False; - } - aFollow = rName; - } - rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) ); - return sal_True; -} - -// Itemset setzen. Die Dflt-Implementation legt ein neues Set an. - -SfxItemSet& SfxStyleSheetBase::GetItemSet() -{ - if( !pSet ) - { - pSet = new SfxItemSet( rPool.GetPool() ); - bMySet = sal_True; - } - return *pSet; -} - -// Hilfe-Datei und -ID setzen und abfragen - -sal_uLong SfxStyleSheetBase::GetHelpId( String& rFile ) -{ - rFile = aHelpFile; - return nHelpId; -} - -void SfxStyleSheetBase::SetHelpId( const String& rFile, sal_uLong nId ) -{ - aHelpFile = rFile; - nHelpId = nId; -} - -// Folgevorlage m"oglich? Default: Ja - -sal_Bool SfxStyleSheetBase::HasFollowSupport() const -{ - return sal_True; -} - -// Basisvorlage m"oglich? Default: Ja - -sal_Bool SfxStyleSheetBase::HasParentSupport() const -{ - return sal_True; -} - -// Basisvorlage uf NULL setzen m"oglich? Default: Nein - -sal_Bool SfxStyleSheetBase::HasClearParentSupport() const -{ - return sal_False; -} - -// Defaultmaessig sind alle StyleSheets Used - -sal_Bool SfxStyleSheetBase::IsUsed() const -{ - return sal_True; -} - -// eingestellte Attribute ausgeben - - -XubString SfxStyleSheetBase::GetDescription() -{ - return GetDescription( SFX_MAPUNIT_CM ); -} - -// eingestellte Attribute ausgeben - -XubString SfxStyleSheetBase::GetDescription( SfxMapUnit eMetric ) -{ - SfxItemIter aIter( GetItemSet() ); - XubString aDesc; - const SfxPoolItem* pItem = aIter.FirstItem(); - - IntlWrapper aIntlWrapper(comphelper::getProcessServiceFactory(), - SvtSysLocale().GetLanguage()); - while ( pItem ) - { - XubString aItemPresentation; - - if ( !IsInvalidItem( pItem ) && - rPool.GetPool().GetPresentation( - *pItem, SFX_ITEM_PRESENTATION_COMPLETE, - eMetric, aItemPresentation, &aIntlWrapper ) ) - { - if ( aDesc.Len() && aItemPresentation.Len() ) - aDesc.AppendAscii(RTL_CONSTASCII_STRINGPARAM(" + ")); - if ( aItemPresentation.Len() ) - aDesc += aItemPresentation; - } - pItem = aIter.NextItem(); - } - return aDesc; -} - -/////////////////////////// SfxStyleSheetIterator /////////////////////////////// - -SfxStyleFamily SfxStyleSheetIterator::GetSearchFamily() const -{ - return nSearchFamily; -} - -inline sal_Bool SfxStyleSheetIterator::IsTrivialSearch() -{ - return nMask == 0xFFFF && GetSearchFamily() == SFX_STYLE_FAMILY_ALL; -} - -sal_Bool SfxStyleSheetIterator::DoesStyleMatch(SfxStyleSheetBase *pStyle) -{ - return ((GetSearchFamily() == SFX_STYLE_FAMILY_ALL) || - ( pStyle->GetFamily() == GetSearchFamily() )) - && (( pStyle->GetMask() & ( GetSearchMask() & ~SFXSTYLEBIT_USED )) || - ( bSearchUsed ? pStyle->IsUsed() : sal_False ) || - GetSearchMask() == SFXSTYLEBIT_ALL ); -} - - -SfxStyleSheetIterator::SfxStyleSheetIterator(SfxStyleSheetBasePool *pBase, - SfxStyleFamily eFam, sal_uInt16 n) -{ - pBasePool=pBase; - nSearchFamily=eFam; - bSearchUsed=sal_False; - if((n != SFXSTYLEBIT_ALL ) && ((n & SFXSTYLEBIT_USED) == SFXSTYLEBIT_USED)) - { - bSearchUsed = sal_True; - n &= ~SFXSTYLEBIT_USED; - } - nMask=n; -} - -SfxStyleSheetIterator::~SfxStyleSheetIterator() -{ -} - - -sal_uInt16 SfxStyleSheetIterator::Count() -{ - sal_uInt16 n = 0; - if( IsTrivialSearch()) - n = (sal_uInt16) pBasePool->aStyles.size(); - else - for(sal_uInt16 i=0; i<pBasePool->aStyles.size(); i++) - { - SfxStyleSheetBase* pStyle = pBasePool->aStyles[i].get(); - if(DoesStyleMatch(pStyle)) - n++; - } - return n; -} - -SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx) -{ - if( IsTrivialSearch()) - return pBasePool->aStyles[nIdx].get(); - - sal_uInt16 z = 0; - for(sal_uInt16 n=0; n<pBasePool->aStyles.size(); n++) - { - SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get(); - if( DoesStyleMatch(pStyle)) - { - if(z == nIdx) - { - nAktPosition=n; - return pAktStyle=pStyle; - } - ++z; - } - } - OSL_FAIL("falscher Index"); - return 0; -} - -SfxStyleSheetBase* SfxStyleSheetIterator::First() -{ - sal_Int32 nIdx = -1; - - if ( IsTrivialSearch() && pBasePool->aStyles.size() ) - nIdx = 0; - else - for( sal_uInt16 n = 0; n < pBasePool->aStyles.size(); n++ ) - { - SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get(); - - if ( DoesStyleMatch( pStyle ) ) - { - nIdx = n; - break; - } - } - - if ( nIdx != -1 ) - { - nAktPosition = (sal_uInt16)nIdx; - return pAktStyle = pBasePool->aStyles[nIdx].get(); - } - return 0; -} - - -SfxStyleSheetBase* SfxStyleSheetIterator::Next() -{ - sal_Int32 nIdx = -1; - - if ( IsTrivialSearch() && - (sal_uInt16)pBasePool->aStyles.size() > nAktPosition + 1 ) - nIdx = nAktPosition + 1; - else - for( sal_uInt16 n = nAktPosition + 1; n < pBasePool->aStyles.size(); n++ ) - { - SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get(); - - if ( DoesStyleMatch( pStyle ) ) - { - nIdx = n; - break; - } - } - - if ( nIdx != -1 ) - { - nAktPosition = (sal_uInt16)nIdx; - return pAktStyle = pBasePool->aStyles[nIdx].get(); - } - return 0; -} - - -SfxStyleSheetBase* SfxStyleSheetIterator::Find(const XubString& rStr) -{ - for ( sal_uInt16 n = 0; n < pBasePool->aStyles.size(); n++ ) - { - SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get(); - - // #98454# performance: in case of bSearchUsed==sal_True it may be - // significant to first compare the name and only if it matches to call - // the style sheet IsUsed() method in DoesStyleMatch(). - if ( pStyle->GetName().Equals( rStr ) && DoesStyleMatch( pStyle ) ) - { - nAktPosition = n; - return pAktStyle = pStyle; - } - } - return 0; -} - - -sal_uInt16 SfxStyleSheetIterator::GetSearchMask() const -{ - sal_uInt16 mask = nMask; - - if ( bSearchUsed ) - mask |= SFXSTYLEBIT_USED; - return mask; -} - -/////////////////////////// SfxStyleSheetBasePool /////////////////////////////// - -void SfxStyleSheetBasePool::Replace( - SfxStyleSheetBase& rSource, SfxStyleSheetBase& rTarget ) -{ - rTarget.SetFollow( rSource.GetFollow() ); - rTarget.SetParent( rSource.GetParent() ); - SfxItemSet& rSourceSet = rSource.GetItemSet(); - SfxItemSet& rTargetSet = rTarget.GetItemSet(); - rTargetSet.Intersect( rSourceSet ); - rTargetSet.Put( rSourceSet ); -} - -SfxStyleSheetIterator& SfxStyleSheetBasePool::GetIterator_Impl() -{ - SfxStyleSheetIterator*& rpIter = pImp->pIter; - if( !rpIter || (rpIter->GetSearchMask() != nMask) || (rpIter->GetSearchFamily() != nSearchFamily) ) - { - delete rpIter; - rpIter = CreateIterator( nSearchFamily, nMask ); - } - return *rpIter; -} - - -SfxStyleSheetBasePool::SfxStyleSheetBasePool( SfxItemPool& r ) - : aAppName(r.GetName()) - , rPool(r) - , nSearchFamily(SFX_STYLE_FAMILY_PARA) - , nMask(0xFFFF) -{ -#ifdef DBG_UTIL - aDbgStyleSheetReferences.mnPools++; -#endif - - pImp = new SfxStyleSheetBasePool_Impl; -} - -SfxStyleSheetBasePool::SfxStyleSheetBasePool( const SfxStyleSheetBasePool& r ) - : SfxBroadcaster( r ) - , comphelper::OWeakTypeObject() - , aAppName(r.aAppName) - , rPool(r.rPool) - , nSearchFamily(r.nSearchFamily) - , nMask( r.nMask ) -{ -#ifdef DBG_UTIL - aDbgStyleSheetReferences.mnPools++; -#endif - - pImp = new SfxStyleSheetBasePool_Impl; - *this += r; -} - -SfxStyleSheetBasePool::~SfxStyleSheetBasePool() -{ -#ifdef DBG_UTIL - aDbgStyleSheetReferences.mnPools--; -#endif - - Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); - Clear(); - delete pImp; -} - -sal_Bool SfxStyleSheetBasePool::SetParent(SfxStyleFamily eFam, const XubString& rStyle, const XubString& rParent) -{ - SfxStyleSheetIterator aIter(this,eFam,SFXSTYLEBIT_ALL); - SfxStyleSheetBase *pStyle = - aIter.Find(rStyle); - OSL_ENSURE(pStyle, "Vorlage nicht gefunden. Writer mit Solar <2541??"); - if(pStyle) - return pStyle->SetParent(rParent); - else - return sal_False; -} - - -void SfxStyleSheetBasePool::SetSearchMask(SfxStyleFamily eFam, sal_uInt16 n) -{ - nSearchFamily = eFam; nMask = n; -} - -sal_uInt16 SfxStyleSheetBasePool::GetSearchMask() const -{ - return nMask; -} - - -// Der Name des Streams - -String SfxStyleSheetBasePool::GetStreamName() -{ - return String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(STYLESTREAM)); -} - -/////////////////////////////////// Factory //////////////////////////////// - - - -SfxStyleSheetIterator* SfxStyleSheetBasePool::CreateIterator -( - SfxStyleFamily eFam, - sal_uInt16 mask -) -{ - return new SfxStyleSheetIterator(this,eFam,mask); -} - - -SfxStyleSheetBase* SfxStyleSheetBasePool::Create -( - const XubString& rName, - SfxStyleFamily eFam, - sal_uInt16 mask -) -{ - return new SfxStyleSheetBase( rName, *this, eFam, mask ); -} - -SfxStyleSheetBase* SfxStyleSheetBasePool::Create( const SfxStyleSheetBase& r ) -{ - return new SfxStyleSheetBase( r ); -} - -SfxStyleSheetBase& SfxStyleSheetBasePool::Make( const XubString& rName, SfxStyleFamily eFam, sal_uInt16 mask, sal_uInt16 nPos) -{ - OSL_ENSURE( eFam != SFX_STYLE_FAMILY_ALL, "svl::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" ); - - SfxStyleSheetIterator aIter(this, eFam, mask); - rtl::Reference< SfxStyleSheetBase > xStyle( aIter.Find( rName ) ); - OSL_ENSURE( !xStyle.is(), "svl::SfxStyleSheetBasePool::Make(), StyleSheet already exists" ); - SfxStyleSheetIterator& rIter = GetIterator_Impl(); - - if( !xStyle.is() ) - { - xStyle = Create( rName, eFam, mask ); - if(0xffff == nPos || nPos == aStyles.size() || nPos == rIter.Count()) - { - aStyles.push_back( xStyle ); - } - else - { - rIter[nPos]; - aStyles.insert( aStyles.begin() + rIter.GetPos(), xStyle ); - } - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xStyle.get() ) ); - } - return *xStyle.get(); -} - -/////////////////////////////// Kopieren /////////////////////////////////// - -// Hilfsroutine: Falls eine Vorlage dieses Namens existiert, wird -// sie neu erzeugt. Alle Vorlagen, die diese Vorlage zum Parent haben, -// werden umgehaengt. - -SfxStyleSheetBase& SfxStyleSheetBasePool::Add( SfxStyleSheetBase& rSheet ) -{ - SfxStyleSheetIterator aIter(this, rSheet.GetFamily(), nMask); - SfxStyleSheetBase* pOld = aIter.Find( rSheet.GetName() ); - Remove( pOld ); - rtl::Reference< SfxStyleSheetBase > xNew( Create( rSheet ) ); - aStyles.push_back( xNew ); - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CHANGED, *xNew.get() ) ); - return *xNew.get(); -} - -SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator=( const SfxStyleSheetBasePool& r ) -{ - if( &r != this ) - { - Clear(); - *this += r; - } - return *this; -} - -SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator+=( const SfxStyleSheetBasePool& r ) -{ - if( &r != this ) - { - SfxStyles::const_iterator aIter( r.aStyles.begin() ); - while( aIter != r.aStyles.end() ) - { - Add(*(*aIter++).get()); - } - } - return *this; -} - -//////////////////////////////// Suchen //////////////////////////////////// - -sal_uInt16 SfxStyleSheetBasePool::Count() -{ - return GetIterator_Impl().Count(); -} - -SfxStyleSheetBase *SfxStyleSheetBasePool::operator[](sal_uInt16 nIdx) -{ - return GetIterator_Impl()[nIdx]; -} - -SfxStyleSheetBase* SfxStyleSheetBasePool::Find(const XubString& rName, - SfxStyleFamily eFam, - sal_uInt16 mask) -{ - SfxStyleSheetIterator aIter(this,eFam,mask); - return aIter.Find(rName); -} - -const SfxStyles& SfxStyleSheetBasePool::GetStyles() -{ - return aStyles; -} - -SfxStyleSheetBase* SfxStyleSheetBasePool::First() -{ - return GetIterator_Impl().First(); -} - -SfxStyleSheetBase* SfxStyleSheetBasePool::Next() -{ - return GetIterator_Impl().Next(); -} - -//////////////////////////////// Loeschen ///////////////////////////////// - -void SfxStyleSheetBasePool::Remove( SfxStyleSheetBase* p ) -{ - if( p ) - { - SfxStyles::iterator aIter( std::find( aStyles.begin(), aStyles.end(), rtl::Reference< SfxStyleSheetBase >( p ) ) ); - if( aIter != aStyles.end() ) - { - // Alle Styles umsetzen, deren Parent dieser hier ist - ChangeParent( p->GetName(), p->GetParent() ); - - com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY ); - if( xComp.is() ) try - { - xComp->dispose(); - } - catch( com::sun::star::uno::Exception& ) - { - } - - aStyles.erase(aIter); - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) ); - } - } -} - -void SfxStyleSheetBasePool::Insert( SfxStyleSheetBase* p ) -{ -#if OSL_DEBUG_LEVEL > 0 - OSL_ENSURE( p, "svl::SfxStyleSheetBasePool::Insert(), no stylesheet?" ); - - SfxStyleSheetIterator aIter(this, p->GetFamily(), p->GetMask()); - SfxStyleSheetBase* pOld = aIter.Find( p->GetName() ); - OSL_ENSURE( !pOld, "svl::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" ); - if( p->GetParent().Len() ) - { - pOld = aIter.Find( p->GetParent() ); - OSL_ENSURE( pOld, "svl::SfxStyleSheetBasePool::Insert(), Parent not found!" ); - } -#endif - aStyles.push_back( rtl::Reference< SfxStyleSheetBase >( p ) ); - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *p ) ); -} - -void SfxStyleSheetBasePool::Clear() -{ - SfxStyles aClearStyles; - aClearStyles.swap( aStyles ); - - SfxStyles::iterator aIter( aClearStyles.begin() ); - while( aIter != aClearStyles.end() ) - { - com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY ); - if( xComp.is() ) try - { - xComp->dispose(); - } - catch( com::sun::star::uno::Exception& ) - { - } - - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *(*aIter++).get() ) ); - } -} - -/////////////////////////// Parents umsetzen //////////////////////////////// - -void SfxStyleSheetBasePool::ChangeParent(const XubString& rOld, - const XubString& rNew, - sal_Bool bVirtual) -{ - const sal_uInt16 nTmpMask = GetSearchMask(); - SetSearchMask(GetSearchFamily(), 0xffff); - for( SfxStyleSheetBase* p = First(); p; p = Next() ) - { - if( p->GetParent().Equals( rOld ) ) - { - if(bVirtual) - p->SetParent( rNew ); - else - p->aParent = rNew; - } - } - SetSearchMask(GetSearchFamily(), nTmpMask); -} - -/////////////////////////// Laden/Speichern ///////////////////////////////// - -void SfxStyleSheetBase::Load( SvStream&, sal_uInt16 ) -{ -} - -void SfxStyleSheetBase::Store( SvStream& ) -{ -} - - -sal_Bool SfxStyleSheetBasePool::Load( SvStream& rStream ) -{ - // alte Version? - if ( !rPool.IsVer2_Impl() ) - return Load1_Impl( rStream ); - - // gesamten StyleSheetPool in neuer Version aus einem MiniRecord lesen - SfxMiniRecordReader aPoolRec( &rStream, SFX_STYLES_REC ); - - // Header-Record lesen - short nCharSet = 0; - if ( !rStream.GetError() ) - { - SfxSingleRecordReader aHeaderRec( &rStream, SFX_STYLES_REC_HEADER ); - if ( !aHeaderRec.IsValid() ) - return sal_False; - - aAppName = rPool.GetName(); - rStream >> nCharSet; - } - - // Styles-Record lesen - if ( !rStream.GetError() ) - { - SfxMultiRecordReader aStylesRec( &rStream, SFX_STYLES_REC_STYLES ); - if ( !aStylesRec.IsValid() ) - return sal_False; - - rtl_TextEncoding eEnc = GetSOLoadTextEncoding( - (rtl_TextEncoding)nCharSet, - sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) ); - rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet(); - rStream.SetStreamCharSet( eEnc ); - - sal_uInt16 nStyles; - for ( nStyles = 0; aStylesRec.GetContent(); nStyles++ ) - { - // kann nicht mehr weiterlesen? - if ( rStream.GetError() ) - break; - - // Globale Teile - XubString aName, aParent, aFollow; - String aHelpFile; - sal_uInt16 nFamily, nStyleMask,nCount; - sal_uInt32 nHelpId; - rStream.ReadByteString(aName, eEnc ); - rStream.ReadByteString(aParent, eEnc ); - rStream.ReadByteString(aFollow, eEnc ); - rStream >> nFamily >> nStyleMask; - SfxPoolItem::readByteString(rStream, aHelpFile); - rStream >> nHelpId; - - SfxStyleSheetBase& rSheet = Make( aName, (SfxStyleFamily)nFamily , nStyleMask); - rSheet.SetHelpId( aHelpFile, nHelpId ); - // Hier erst einmal Parent und Follow zwischenspeichern - rSheet.aParent = aParent; - rSheet.aFollow = aFollow; - sal_uInt32 nPos = rStream.Tell(); - rStream >> nCount; - if(nCount) - { - rStream.Seek( nPos ); - // Das Laden des ItemSets bedient sich der Methode GetItemSet(), - // damit eigene ItemSets untergeschoben werden koennen - SfxItemSet& rSet = rSheet.GetItemSet(); - rSet.ClearItem(); - //! SfxItemSet aTmpSet( *pTmpPool ); - /*!aTmpSet*/ rSet.Load( rStream ); - //! rSet.Put( aTmpSet ); - } - // Lokale Teile - sal_uInt32 nSize; - sal_uInt16 nVer; - rStream >> nVer >> nSize; - nPos = rStream.Tell() + nSize; - rSheet.Load( rStream, nVer ); - rStream.Seek( nPos ); - } - - // #72939# only loop through the styles that were really inserted - sal_uLong n = aStyles.size(); - - //! delete pTmpPool; - // Jetzt Parent und Follow setzen. Alle Sheets sind geladen. - // Mit Setxxx() noch einmal den String eintragen, da diese - // virtuellen Methoden evtl. ueberlagert sind. - for ( sal_uLong i = 0; i < n; i++ ) - { - SfxStyleSheetBase* p = aStyles[ i ].get(); - XubString aText = p->aParent; - p->aParent.Erase(); - p->SetParent( aText ); - aText = p->aFollow; - p->aFollow.Erase(); - p->SetFollow( aText ); - } - - rStream.SetStreamCharSet( eOldEnc ); - } - - // alles klar? - return sal_Bool( rStream.GetError() == SVSTREAM_OK ); -} - -sal_Bool SfxStyleSheetBasePool::Load1_Impl( SvStream& rStream ) -{ - aAppName = rPool.GetName(); - sal_uInt16 nVersion; - short nCharSet; - rStream >> nVersion; - - if(nVersion!=STYLESTREAM_VERSION) - nCharSet=nVersion; - else - rStream >> nCharSet; - - rtl_TextEncoding eEnc = GetSOLoadTextEncoding( - (rtl_TextEncoding)nCharSet, - sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) ); - rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet(); - rStream.SetStreamCharSet( eEnc ); - - sal_uInt16 nStyles; - rStream >> nStyles; - sal_uInt16 i; - for ( i = 0; i < nStyles; i++ ) - { - // kann nicht mehr weiterlesen? - if ( rStream.GetError() ) - { - nStyles = i; - break; - } - - // Globale Teile - XubString aName, aParent, aFollow; - String aHelpFile; - sal_uInt16 nFamily, nStyleMask,nCount; - sal_uInt32 nHelpId; - rStream.ReadByteString(aName, eEnc ); - rStream.ReadByteString(aParent, eEnc ); - rStream.ReadByteString(aFollow, eEnc ); - rStream >> nFamily >> nStyleMask; - SfxPoolItem::readByteString(rStream, aHelpFile); - if(nVersion!=STYLESTREAM_VERSION) - { - sal_uInt16 nTmpHelpId; - rStream >> nTmpHelpId; - nHelpId=nTmpHelpId; - } - else - rStream >> nHelpId; - - SfxStyleSheetBase& rSheet = Make( aName, (SfxStyleFamily)nFamily , nStyleMask); - rSheet.SetHelpId( aHelpFile, nHelpId ); - // Hier erst einmal Parent und Follow zwischenspeichern - rSheet.aParent = aParent; - rSheet.aFollow = aFollow; - sal_uInt32 nPos = rStream.Tell(); - rStream >> nCount; - if(nCount) { - rStream.Seek( nPos ); - // Das Laden des ItemSets bedient sich der Methode GetItemSet(), - // damit eigene ItemSets untergeschoben werden koennen - SfxItemSet& rSet = rSheet.GetItemSet(); - rSet.ClearItem(); -//! SfxItemSet aTmpSet( *pTmpPool ); - /*!aTmpSet*/ rSet.Load( rStream ); - //! rSet.Put( aTmpSet ); - } - // Lokale Teile - sal_uInt32 nSize; - sal_uInt16 nVer; - rStream >> nVer >> nSize; - nPos = rStream.Tell() + nSize; - rSheet.Load( rStream, nVer ); - rStream.Seek( nPos ); - } - - //! delete pTmpPool; - // Jetzt Parent und Follow setzen. Alle Sheets sind geladen. - // Mit Setxxx() noch einmal den String eintragen, da diese - // virtuellen Methoden evtl. ueberlagert sind. - for ( i = 0; i < nStyles; i++ ) - { - SfxStyleSheetBase* p = aStyles[ i ].get(); - XubString aText = p->aParent; - p->aParent.Erase(); - p->SetParent( aText ); - aText = p->aFollow; - p->aFollow.Erase(); - p->SetFollow( aText ); - } - - rStream.SetStreamCharSet( eOldEnc ); - - return sal_Bool( rStream.GetError() == SVSTREAM_OK ); -} - -sal_Bool SfxStyleSheetBasePool::Store( SvStream& rStream, sal_Bool bUsed ) -{ - // den ganzen StyleSheet-Pool in einen Mini-Record - SfxMiniRecordWriter aPoolRec( &rStream, SFX_STYLES_REC ); - - // Erst einmal die Dummies rauszaehlen; die werden nicht gespeichert - sal_uInt16 nCount = 0; - for( SfxStyleSheetBase* p = First(); p; p = Next() ) - { - if(!bUsed || p->IsUsed()) - nCount++; - } - - // einen Header-Record vorweg - rtl_TextEncoding eEnc - = ::GetSOStoreTextEncoding( - rStream.GetStreamCharSet(), - sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) ); - rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet(); - rStream.SetStreamCharSet( eEnc ); - - { - SfxSingleRecordWriter aHeaderRec( &rStream, - SFX_STYLES_REC_HEADER, - STYLESTREAM_VERSION ); - rStream << (short) eEnc; - } - - // die StyleSheets in einen MultiVarRecord - { - // Bug 79478: - // make a check loop, to be shure, that the converted names are also - // unique like the originals! In other cases we get a loop. - SvStringsSortDtor aSortOrigNames( 0, 128 ); - SvStrings aOrigNames( 0, 128 ); - SvByteStringsSortDtor aSortConvNames( 0, 128 ); - SvByteStrings aConvNames( 0, 128 ); - - { - - for( SfxStyleSheetBase* p = First(); p; p = Next() ) - { - if(!bUsed || p->IsUsed()) - { - sal_uInt16 nFamily = (sal_uInt16)p->GetFamily(); - String* pName = new String( p->GetName() ); - ByteString* pConvName = new ByteString( *pName, eEnc ); - - pName->Insert( (sal_Unicode)nFamily, 0 ); - pConvName->Insert( " ", 0 ); - pConvName->SetChar( - 0, - sal::static_int_cast< char >(0xff & (nFamily >> 8)) ); - pConvName->SetChar( - 1, sal::static_int_cast< char >(0xff & nFamily) ); - - sal_uInt16 nInsPos, nAdd = aSortConvNames.Count(); - while( !aSortConvNames.Insert( pConvName, nInsPos ) ) - (pConvName->Append( '_' )).Append(ByteString( - rtl::OString::valueOf(static_cast<sal_Int32>(nAdd++)))); - aOrigNames.Insert( pName, nInsPos ); - } - } - - // now we have the list of the names, sorted by convertede names - // But now we need the sorted list of orignames. - { - sal_uInt16 nInsPos, nEnd = aOrigNames.Count(); - const ByteStringPtr* ppB = aSortConvNames.GetData(); - for( sal_uInt16 n = 0; n < nEnd; ++n, ++ppB ) - { - String* p = aOrigNames.GetObject( n ); - aSortOrigNames.Insert( p, nInsPos ); - aConvNames.Insert( *ppB, nInsPos ); - } - - } - } - - - ByteString sEmpty; - sal_uInt16 nFndPos; - String sNm; - SfxMultiVarRecordWriter aStylesRec( &rStream, SFX_STYLES_REC_STYLES, 0 ); - for( SfxStyleSheetBase* p = First(); p; p = Next() ) - { - if(!bUsed || p->IsUsed()) - { - aStylesRec.NewContent(); - - // Globale Teile speichern - String aHelpFile; - sal_uInt32 nHelpId = p->GetHelpId( aHelpFile ); - sal_uInt16 nFamily = sal::static_int_cast< sal_uInt16 >(p->GetFamily()); - String sFamily( (sal_Unicode)nFamily ); - - (sNm = sFamily) += p->GetName(); - if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos )) - rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 )); - else - rStream.WriteByteString( sEmpty ); - - (sNm = sFamily) += p->GetParent(); - if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos )) - rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 )); - else - rStream.WriteByteString( sEmpty ); - - (sNm = sFamily) += p->GetFollow(); - if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos )) - rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 )); - else - rStream.WriteByteString( sEmpty ); - - rStream << nFamily << p->GetMask(); - SfxPoolItem::writeByteString(rStream, aHelpFile); - rStream << nHelpId; - if(p->pSet) - p->pSet->Store( rStream ); - else - rStream << (sal_uInt16)0; - - // Lokale Teile speichern - // Vor dem lokalen Teil wird die Laenge der lokalen Daten - // als sal_uInt32 sowie die Versionsnummer gespeichert. - rStream << (sal_uInt16) p->GetVersion(); - sal_uLong nPos1 = rStream.Tell(); - rStream << (sal_uInt32) 0; - p->Store( rStream ); - sal_uLong nPos2 = rStream.Tell(); - rStream.Seek( nPos1 ); - rStream << (sal_uInt32) ( nPos2 - nPos1 - sizeof( sal_uInt32 ) ); - rStream.Seek( nPos2 ); - if( rStream.GetError() != SVSTREAM_OK ) - break; - } - } - } - - rStream.SetStreamCharSet( eOldEnc ); - - return sal_Bool( rStream.GetError() == SVSTREAM_OK ); -} - -SfxItemPool& SfxStyleSheetBasePool::GetPool() -{ - return rPool; -} - -const SfxItemPool& SfxStyleSheetBasePool::GetPool() const -{ - return rPool; -} - -/////////////////////// SfxStyleSheet ///////////////////////////////// - -SfxStyleSheet::SfxStyleSheet(const XubString &rName, - const SfxStyleSheetBasePool& r_Pool, - SfxStyleFamily eFam, - sal_uInt16 mask ): - SfxStyleSheetBase(rName, const_cast< SfxStyleSheetBasePool& >( r_Pool ), eFam, mask) -{} - -SfxStyleSheet::SfxStyleSheet(const SfxStyleSheet& rStyle) : - SfxStyleSheetBase(rStyle), - SfxListener( rStyle ), - SfxBroadcaster( rStyle ) -{} - -SfxStyleSheet::SfxStyleSheet() -{ -} - -SfxStyleSheet::~SfxStyleSheet() -{ - Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_INDESTRUCTION, *this ) ); -} - - -sal_Bool SfxStyleSheet::SetParent( const XubString& rName ) -{ - if(aParent == rName) - return sal_True; - const XubString aOldParent(aParent); - if(SfxStyleSheetBase::SetParent(rName)) { - // aus der Benachrichtigungskette des alten - // Parents gfs. austragen - if(aOldParent.Len()) { - SfxStyleSheet *pParent = (SfxStyleSheet *)rPool.Find(aOldParent, nFamily, 0xffff); - if(pParent) - EndListening(*pParent); - } - // in die Benachrichtigungskette des neuen - // Parents eintragen - if(aParent.Len()) { - SfxStyleSheet *pParent = (SfxStyleSheet *)rPool.Find(aParent, nFamily, 0xffff); - if(pParent) - StartListening(*pParent); - } - return sal_True; - } - return sal_False; -} - -// alle Zuhoerer benachtichtigen - -void SfxStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint ) -{ - Forward(rBC, rHint); -} - -//////////////////////// SfxStyleSheetPool /////////////////////////////// - -SfxStyleSheetPool::SfxStyleSheetPool( SfxItemPool const& rSet) -: SfxStyleSheetBasePool( const_cast< SfxItemPool& >( rSet ) ) -{ -} - -/////////////////////////////////// Factory //////////////////////////////// - -SfxStyleSheetBase* SfxStyleSheetPool::Create( const XubString& rName, - SfxStyleFamily eFam, sal_uInt16 mask ) -{ - return new SfxStyleSheet( rName, *this, eFam, mask ); -} - -SfxStyleSheetBase* SfxStyleSheetPool::Create( const SfxStyleSheet& r ) -{ - return new SfxStyleSheet( r ); -} -/* -sal_Bool SfxStyleSheetPool::CopyTo(SfxStyleSheetPool &, const String &) -{ - return sal_False; -} -*/ - -// -------------------------------------------------------------------- -// class SfxUnoStyleSheet -// -------------------------------------------------------------------- - -SfxUnoStyleSheet::SfxUnoStyleSheet( const UniString& _rName, const SfxStyleSheetBasePool& _rPool, SfxStyleFamily _eFamily, sal_uInt16 _nMaske ) -: ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rName, _rPool, _eFamily, _nMaske ) -{ -} - -// -------------------------------------------------------------------- -SfxUnoStyleSheet::SfxUnoStyleSheet( const SfxStyleSheet& _rSheet ) -: ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rSheet ) -{ -} - -// -------------------------------------------------------------------- - -SfxUnoStyleSheet* SfxUnoStyleSheet::getUnoStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle >& xStyle ) -{ - SfxUnoStyleSheet* pRet = dynamic_cast< SfxUnoStyleSheet* >( xStyle.get() ); - if( !pRet ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xStyle, ::com::sun::star::uno::UNO_QUERY ); - if( xUT.is() ) - pRet = reinterpret_cast<SfxUnoStyleSheet*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SfxUnoStyleSheet::getIdentifier()))); - } - return pRet; -} - -// -------------------------------------------------------------------- -// XUnoTunnel -// -------------------------------------------------------------------- - -::sal_Int64 SAL_CALL SfxUnoStyleSheet::getSomething( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& rId ) throw (::com::sun::star::uno::RuntimeException) -{ - if( rId.getLength() == 16 && 0 == rtl_compareMemory( getIdentifier().getConstArray(), rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this)); - } - else - { - return 0; - } -} - -// -------------------------------------------------------------------- - -namespace -{ - class theSfxUnoStyleSheetIdentifier : public rtl::Static< UnoTunnelIdInit, theSfxUnoStyleSheetIdentifier > {}; -} - -const ::com::sun::star::uno::Sequence< ::sal_Int8 >& SfxUnoStyleSheet::getIdentifier() -{ - return theSfxUnoStyleSheetIdentifier::get().getSeq(); -} - -// -------------------------------------------------------------------- - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |