xref: /aoo4110/main/svl/source/items/style.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HPP_
28*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGS
32*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGSSORTDTOR
33*b1cdbd2cSJim Jagielski #define _SVSTDARR_BYTESTRINGS
34*b1cdbd2cSJim Jagielski #define _SVSTDARR_BYTESTRINGSSORTDTOR
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
37*b1cdbd2cSJim Jagielski #include <tools/tenccvt.hxx>
38*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
39*b1cdbd2cSJim Jagielski #include <unotools/intlwrapper.hxx>
40*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx>
41*b1cdbd2cSJim Jagielski #include <svl/poolitem.hxx>
42*b1cdbd2cSJim Jagielski #include <svl/itemset.hxx>
43*b1cdbd2cSJim Jagielski #include <svl/itempool.hxx>
44*b1cdbd2cSJim Jagielski #include <poolio.hxx>
45*b1cdbd2cSJim Jagielski #include <svl/filerec.hxx>
46*b1cdbd2cSJim Jagielski #include <svl/itemiter.hxx>
47*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
48*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
49*b1cdbd2cSJim Jagielski #include <unotools/syslocale.hxx>
50*b1cdbd2cSJim Jagielski #include <algorithm>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #define STYLESTREAM 			"SfxStyleSheets"
53*b1cdbd2cSJim Jagielski #define STYLESTREAM_VERSION 	sal_uInt16(50)
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
56*b1cdbd2cSJim Jagielski class DbgStyleSheetReferences
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski public:
DbgStyleSheetReferences()59*b1cdbd2cSJim Jagielski 	DbgStyleSheetReferences() : mnStyles(0), mnPools(0) {}
~DbgStyleSheetReferences()60*b1cdbd2cSJim Jagielski 	~DbgStyleSheetReferences()
61*b1cdbd2cSJim Jagielski 	{
62*b1cdbd2cSJim Jagielski 		OSL_TRACE("DbgStyleSheetReferences\nSfxStyleSheetBase left %ld\nSfxStyleSheetBasePool left %ld\n", mnStyles, mnPools );
63*b1cdbd2cSJim Jagielski 	}
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 	sal_uInt32 mnStyles;
66*b1cdbd2cSJim Jagielski 	sal_uInt32 mnPools;
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski aDbgStyleSheetReferences;
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski TYPEINIT0(SfxStyleSheetBase)
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski TYPEINIT3(SfxStyleSheet, SfxStyleSheetBase, SfxListener, SfxBroadcaster)
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski //=========================================================================
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski TYPEINIT1(SfxStyleSheetHint, SfxHint);
80*b1cdbd2cSJim Jagielski TYPEINIT1(SfxStyleSheetHintExtended, SfxStyleSheetHint);
81*b1cdbd2cSJim Jagielski TYPEINIT1(SfxStyleSheetPoolHint, SfxHint);
82*b1cdbd2cSJim Jagielski 
SfxStyleSheetHintExtended(sal_uInt16 nAction,const String & rOldName)83*b1cdbd2cSJim Jagielski SfxStyleSheetHintExtended::SfxStyleSheetHintExtended
84*b1cdbd2cSJim Jagielski (
85*b1cdbd2cSJim Jagielski 	sal_uInt16				nAction,		// SFX_STYLESHEET_... (s.o.)
86*b1cdbd2cSJim Jagielski 	const String&       rOldName
87*b1cdbd2cSJim Jagielski )
88*b1cdbd2cSJim Jagielski :	SfxStyleSheetHint( nAction ),
89*b1cdbd2cSJim Jagielski 	aName( rOldName )
90*b1cdbd2cSJim Jagielski {}
SfxStyleSheetHintExtended(sal_uInt16 nAction,const String & rOldName,SfxStyleSheetBase & rStyleSheet)91*b1cdbd2cSJim Jagielski SfxStyleSheetHintExtended::SfxStyleSheetHintExtended
92*b1cdbd2cSJim Jagielski (
93*b1cdbd2cSJim Jagielski 	sal_uInt16				nAction,		// SFX_STYLESHEET_... (s.o.)
94*b1cdbd2cSJim Jagielski 	const String&       rOldName,
95*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase&	rStyleSheet 	// geh"ort weiterhin dem Aufrufer
96*b1cdbd2cSJim Jagielski )
97*b1cdbd2cSJim Jagielski :	SfxStyleSheetHint( nAction, rStyleSheet ),
98*b1cdbd2cSJim Jagielski 	aName( rOldName )
99*b1cdbd2cSJim Jagielski {}
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
102*b1cdbd2cSJim Jagielski 
SfxStyleSheetHint(sal_uInt16 nAction,SfxStyleSheetBase & rStyleSheet)103*b1cdbd2cSJim Jagielski SfxStyleSheetHint::SfxStyleSheetHint
104*b1cdbd2cSJim Jagielski (
105*b1cdbd2cSJim Jagielski 	sal_uInt16				nAction,		// SFX_STYLESHEET_... (s.o.)
106*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase&	rStyleSheet 	// geh"ort weiterhin dem Aufrufer
107*b1cdbd2cSJim Jagielski )
108*b1cdbd2cSJim Jagielski :	pStyleSh( &rStyleSheet ),
109*b1cdbd2cSJim Jagielski 	nHint( nAction )
110*b1cdbd2cSJim Jagielski {}
111*b1cdbd2cSJim Jagielski 
SfxStyleSheetHint(sal_uInt16 nAction)112*b1cdbd2cSJim Jagielski SfxStyleSheetHint::SfxStyleSheetHint
113*b1cdbd2cSJim Jagielski (
114*b1cdbd2cSJim Jagielski 	sal_uInt16				nAction		// SFX_STYLESHEET_... (s.o.)
115*b1cdbd2cSJim Jagielski )
116*b1cdbd2cSJim Jagielski :	pStyleSh( NULL ),
117*b1cdbd2cSJim Jagielski 	nHint( nAction )
118*b1cdbd2cSJim Jagielski {}
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski //=========================================================================
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski class SfxStyleSheetBasePool_Impl
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski public:
125*b1cdbd2cSJim Jagielski 	SfxStyles aStyles;
126*b1cdbd2cSJim Jagielski 	SfxStyleSheetIteratorPtr pIter;
127*b1cdbd2cSJim Jagielski };
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski //////////////////////////// SfxStyleSheetBase ///////////////////////////////
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski // Konstruktoren
133*b1cdbd2cSJim Jagielski 
SfxStyleSheetBase(const XubString & rName,SfxStyleSheetBasePool & r,SfxStyleFamily eFam,sal_uInt16 mask)134*b1cdbd2cSJim Jagielski SfxStyleSheetBase::SfxStyleSheetBase( const XubString& rName, SfxStyleSheetBasePool& r, SfxStyleFamily eFam, sal_uInt16 mask )
135*b1cdbd2cSJim Jagielski 	: rPool( r )
136*b1cdbd2cSJim Jagielski 	, nFamily( eFam )
137*b1cdbd2cSJim Jagielski 	, aName( rName )
138*b1cdbd2cSJim Jagielski 	, aParent()
139*b1cdbd2cSJim Jagielski 	, aFollow( rName )
140*b1cdbd2cSJim Jagielski 	, pSet( NULL )
141*b1cdbd2cSJim Jagielski 	, nMask(mask)
142*b1cdbd2cSJim Jagielski 	, nHelpId( 0 )
143*b1cdbd2cSJim Jagielski 	, bMySet( sal_False )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
146*b1cdbd2cSJim Jagielski 	aDbgStyleSheetReferences.mnStyles++;
147*b1cdbd2cSJim Jagielski #endif
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
SfxStyleSheetBase(const SfxStyleSheetBase & r)150*b1cdbd2cSJim Jagielski SfxStyleSheetBase::SfxStyleSheetBase( const SfxStyleSheetBase& r )
151*b1cdbd2cSJim Jagielski 	: comphelper::OWeakTypeObject()
152*b1cdbd2cSJim Jagielski 	, rPool( r.rPool )
153*b1cdbd2cSJim Jagielski 	, nFamily( r.nFamily )
154*b1cdbd2cSJim Jagielski 	, aName( r.aName )
155*b1cdbd2cSJim Jagielski 	, aParent( r.aParent )
156*b1cdbd2cSJim Jagielski 	, aFollow( r.aFollow )
157*b1cdbd2cSJim Jagielski 	, aHelpFile( r.aHelpFile )
158*b1cdbd2cSJim Jagielski 	, nMask( r.nMask )
159*b1cdbd2cSJim Jagielski 	, nHelpId( r.nHelpId )
160*b1cdbd2cSJim Jagielski 	, bMySet( r.bMySet )
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
163*b1cdbd2cSJim Jagielski 	aDbgStyleSheetReferences.mnStyles++;
164*b1cdbd2cSJim Jagielski #endif
165*b1cdbd2cSJim Jagielski 	if( r.pSet )
166*b1cdbd2cSJim Jagielski 		pSet = bMySet ? new SfxItemSet( *r.pSet ) : r.pSet;
167*b1cdbd2cSJim Jagielski 	else
168*b1cdbd2cSJim Jagielski 		pSet = NULL;
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
implGetStaticPool()171*b1cdbd2cSJim Jagielski static SfxStyleSheetBasePool& implGetStaticPool()
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski 	static SfxStyleSheetBasePool* pSheetPool = 0;
174*b1cdbd2cSJim Jagielski 	static SfxItemPool* pBasePool = 0;
175*b1cdbd2cSJim Jagielski 	if( !pSheetPool )
176*b1cdbd2cSJim Jagielski 	{
177*b1cdbd2cSJim Jagielski 		UniString aName;
178*b1cdbd2cSJim Jagielski         pBasePool = new SfxItemPool( aName, 0, 0, 0 );
179*b1cdbd2cSJim Jagielski 		pSheetPool = new SfxStyleSheetBasePool(*pBasePool);
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski 	return *pSheetPool;
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
SfxStyleSheetBase()184*b1cdbd2cSJim Jagielski SfxStyleSheetBase::SfxStyleSheetBase()
185*b1cdbd2cSJim Jagielski : comphelper::OWeakTypeObject()
186*b1cdbd2cSJim Jagielski , rPool( implGetStaticPool() )
187*b1cdbd2cSJim Jagielski {
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
~SfxStyleSheetBase()190*b1cdbd2cSJim Jagielski SfxStyleSheetBase::~SfxStyleSheetBase()
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
193*b1cdbd2cSJim Jagielski 	--aDbgStyleSheetReferences.mnStyles;
194*b1cdbd2cSJim Jagielski #endif
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	if( bMySet )
197*b1cdbd2cSJim Jagielski 	{
198*b1cdbd2cSJim Jagielski 		delete pSet;
199*b1cdbd2cSJim Jagielski 		pSet = 0;
200*b1cdbd2cSJim Jagielski 	}
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
GetVersion() const203*b1cdbd2cSJim Jagielski sal_uInt16 SfxStyleSheetBase::GetVersion() const
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski 	return 0x0000;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski // Namen aendern
209*b1cdbd2cSJim Jagielski 
GetName() const210*b1cdbd2cSJim Jagielski const XubString& SfxStyleSheetBase::GetName() const
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski 	return aName;
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski 
SetName(const XubString & rName)215*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::SetName( const XubString& rName )
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski 	if(rName.Len() == 0)
218*b1cdbd2cSJim Jagielski 		return sal_False;
219*b1cdbd2cSJim Jagielski 	if( aName != rName )
220*b1cdbd2cSJim Jagielski 	{
221*b1cdbd2cSJim Jagielski 		String aOldName = aName;
222*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase *pOther = rPool.Find( rName, nFamily ) ;
223*b1cdbd2cSJim Jagielski 		if ( pOther && pOther != this )
224*b1cdbd2cSJim Jagielski 			return sal_False;
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 		SfxStyleFamily eTmpFam=rPool.GetSearchFamily();
227*b1cdbd2cSJim Jagielski 		sal_uInt16 nTmpMask=rPool.GetSearchMask();
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 		rPool.SetSearchMask(nFamily);
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 		if ( aName.Len() )
232*b1cdbd2cSJim Jagielski 			rPool.ChangeParent( aName, rName, sal_False );
233*b1cdbd2cSJim Jagielski 		if ( aFollow.Equals( aName ) )
234*b1cdbd2cSJim Jagielski 			aFollow = rName;
235*b1cdbd2cSJim Jagielski 		aName = rName;
236*b1cdbd2cSJim Jagielski 		rPool.SetSearchMask(eTmpFam, nTmpMask);
237*b1cdbd2cSJim Jagielski 		rPool.Broadcast( SfxStyleSheetHintExtended(
238*b1cdbd2cSJim Jagielski 			SFX_STYLESHEET_MODIFIED, aOldName, *this ) );
239*b1cdbd2cSJim Jagielski 	}
240*b1cdbd2cSJim Jagielski 	return sal_True;
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
GetDisplayName() const243*b1cdbd2cSJim Jagielski rtl::OUString SfxStyleSheetBase::GetDisplayName() const
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski 	if( maDisplayName.getLength() == 0 )
246*b1cdbd2cSJim Jagielski 	{
247*b1cdbd2cSJim Jagielski 		return aName;
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski 	else
250*b1cdbd2cSJim Jagielski 	{
251*b1cdbd2cSJim Jagielski 		return maDisplayName;
252*b1cdbd2cSJim Jagielski 	}
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
SetDisplayName(const rtl::OUString & rDisplayName)255*b1cdbd2cSJim Jagielski void SfxStyleSheetBase::SetDisplayName( const rtl::OUString& rDisplayName )
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski 	maDisplayName = rDisplayName;
258*b1cdbd2cSJim Jagielski }
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski // Parent aendern
261*b1cdbd2cSJim Jagielski 
GetParent() const262*b1cdbd2cSJim Jagielski const XubString& SfxStyleSheetBase::GetParent() const
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski 	return aParent;
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
SetParent(const XubString & rName)267*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::SetParent( const XubString& rName )
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski     if ( rName == aName )
270*b1cdbd2cSJim Jagielski         return sal_False;
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	if( aParent != rName )
273*b1cdbd2cSJim Jagielski 	{
274*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase* pIter = rPool.Find(rName, nFamily);
275*b1cdbd2cSJim Jagielski 		if( rName.Len() && !pIter )
276*b1cdbd2cSJim Jagielski 		{
277*b1cdbd2cSJim Jagielski 			DBG_ERROR( "StyleSheet-Parent nicht gefunden" );
278*b1cdbd2cSJim Jagielski 			return sal_False;
279*b1cdbd2cSJim Jagielski 		}
280*b1cdbd2cSJim Jagielski 		// rekursive Verknuepfungen verhindern
281*b1cdbd2cSJim Jagielski 		if( aName.Len() )
282*b1cdbd2cSJim Jagielski 			while(pIter)
283*b1cdbd2cSJim Jagielski 			{
284*b1cdbd2cSJim Jagielski 				if(pIter->GetName() == aName && aName != rName)
285*b1cdbd2cSJim Jagielski 					return sal_False;
286*b1cdbd2cSJim Jagielski 				pIter = rPool.Find(pIter->GetParent(), nFamily);
287*b1cdbd2cSJim Jagielski 			}
288*b1cdbd2cSJim Jagielski 		aParent = rName;
289*b1cdbd2cSJim Jagielski 	}
290*b1cdbd2cSJim Jagielski 	rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
291*b1cdbd2cSJim Jagielski 	return sal_True;
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski // Follow aendern
295*b1cdbd2cSJim Jagielski 
GetFollow() const296*b1cdbd2cSJim Jagielski const XubString& SfxStyleSheetBase::GetFollow() const
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski 	return aFollow;
299*b1cdbd2cSJim Jagielski }
300*b1cdbd2cSJim Jagielski 
SetFollow(const XubString & rName)301*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::SetFollow( const XubString& rName )
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski 	if( aFollow != rName )
304*b1cdbd2cSJim Jagielski 	{
305*b1cdbd2cSJim Jagielski 		if( !rPool.Find( rName, nFamily ) )
306*b1cdbd2cSJim Jagielski 		{
307*b1cdbd2cSJim Jagielski 			DBG_ERROR( "StyleSheet-Follow nicht gefunden" );
308*b1cdbd2cSJim Jagielski 			return sal_False;
309*b1cdbd2cSJim Jagielski 		}
310*b1cdbd2cSJim Jagielski 		aFollow = rName;
311*b1cdbd2cSJim Jagielski 	}
312*b1cdbd2cSJim Jagielski 	rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
313*b1cdbd2cSJim Jagielski 	return sal_True;
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski // Itemset setzen. Die Dflt-Implementation legt ein neues Set an.
317*b1cdbd2cSJim Jagielski 
GetItemSet()318*b1cdbd2cSJim Jagielski SfxItemSet& SfxStyleSheetBase::GetItemSet()
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski 	if( !pSet )
321*b1cdbd2cSJim Jagielski 	{
322*b1cdbd2cSJim Jagielski 		pSet = new SfxItemSet( rPool.GetPool() );
323*b1cdbd2cSJim Jagielski 		bMySet = sal_True;
324*b1cdbd2cSJim Jagielski 	}
325*b1cdbd2cSJim Jagielski 	return *pSet;
326*b1cdbd2cSJim Jagielski }
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski // Hilfe-Datei und -ID setzen und abfragen
329*b1cdbd2cSJim Jagielski 
GetHelpId(String & rFile)330*b1cdbd2cSJim Jagielski sal_uLong SfxStyleSheetBase::GetHelpId( String& rFile )
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski 	rFile = aHelpFile;
333*b1cdbd2cSJim Jagielski 	return nHelpId;
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
SetHelpId(const String & rFile,sal_uLong nId)336*b1cdbd2cSJim Jagielski void SfxStyleSheetBase::SetHelpId( const String& rFile, sal_uLong nId )
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski 	aHelpFile = rFile;
339*b1cdbd2cSJim Jagielski 	nHelpId = nId;
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski // Folgevorlage m"oglich? Default: Ja
343*b1cdbd2cSJim Jagielski 
HasFollowSupport() const344*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::HasFollowSupport() const
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski 	return sal_True;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski // Basisvorlage m"oglich? Default: Ja
350*b1cdbd2cSJim Jagielski 
HasParentSupport() const351*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::HasParentSupport() const
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski 	return sal_True;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski // Basisvorlage uf NULL setzen m"oglich? Default: Nein
357*b1cdbd2cSJim Jagielski 
HasClearParentSupport() const358*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::HasClearParentSupport() const
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski 	return sal_False;
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski // Defaultmaessig sind alle StyleSheets Used
364*b1cdbd2cSJim Jagielski 
IsUsed() const365*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBase::IsUsed() const
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski 	return sal_True;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski // eingestellte Attribute ausgeben
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 
GetDescription()373*b1cdbd2cSJim Jagielski XubString SfxStyleSheetBase::GetDescription()
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski 	return GetDescription( SFX_MAPUNIT_CM );
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski // eingestellte Attribute ausgeben
379*b1cdbd2cSJim Jagielski 
GetDescription(SfxMapUnit eMetric)380*b1cdbd2cSJim Jagielski XubString SfxStyleSheetBase::GetDescription( SfxMapUnit eMetric )
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski 	SfxItemIter aIter( GetItemSet() );
383*b1cdbd2cSJim Jagielski 	XubString aDesc;
384*b1cdbd2cSJim Jagielski 	const SfxPoolItem* pItem = aIter.FirstItem();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     IntlWrapper aIntlWrapper(comphelper::getProcessServiceFactory(),
387*b1cdbd2cSJim Jagielski             SvtSysLocale().GetLanguage());
388*b1cdbd2cSJim Jagielski 	while ( pItem )
389*b1cdbd2cSJim Jagielski 	{
390*b1cdbd2cSJim Jagielski 		XubString aItemPresentation;
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 		if ( !IsInvalidItem( pItem ) &&
393*b1cdbd2cSJim Jagielski 			 rPool.GetPool().GetPresentation(
394*b1cdbd2cSJim Jagielski 				*pItem, SFX_ITEM_PRESENTATION_COMPLETE,
395*b1cdbd2cSJim Jagielski                 eMetric, aItemPresentation, &aIntlWrapper ) )
396*b1cdbd2cSJim Jagielski         {
397*b1cdbd2cSJim Jagielski 			if ( aDesc.Len() && aItemPresentation.Len() )
398*b1cdbd2cSJim Jagielski 				aDesc.AppendAscii(RTL_CONSTASCII_STRINGPARAM(" + "));
399*b1cdbd2cSJim Jagielski 			if ( aItemPresentation.Len() )
400*b1cdbd2cSJim Jagielski 				aDesc += aItemPresentation;
401*b1cdbd2cSJim Jagielski 		}
402*b1cdbd2cSJim Jagielski 		pItem = aIter.NextItem();
403*b1cdbd2cSJim Jagielski 	}
404*b1cdbd2cSJim Jagielski 	return aDesc;
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski /////////////////////////// SfxStyleSheetIterator ///////////////////////////////
408*b1cdbd2cSJim Jagielski 
GetSearchFamily() const409*b1cdbd2cSJim Jagielski SfxStyleFamily SfxStyleSheetIterator::GetSearchFamily() const
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski 	return nSearchFamily;
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
IsTrivialSearch()414*b1cdbd2cSJim Jagielski inline sal_Bool SfxStyleSheetIterator::IsTrivialSearch()
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski 	return nMask == 0xFFFF && GetSearchFamily() == SFX_STYLE_FAMILY_ALL;
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
DoesStyleMatch(SfxStyleSheetBase * pStyle)419*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetIterator::DoesStyleMatch(SfxStyleSheetBase *pStyle)
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski 	return ((GetSearchFamily() == SFX_STYLE_FAMILY_ALL) ||
422*b1cdbd2cSJim Jagielski 			( pStyle->GetFamily() == GetSearchFamily() ))
423*b1cdbd2cSJim Jagielski 		&& (( pStyle->GetMask() & ( GetSearchMask() & ~SFXSTYLEBIT_USED )) ||
424*b1cdbd2cSJim Jagielski 			( bSearchUsed ? pStyle->IsUsed() : sal_False ) ||
425*b1cdbd2cSJim Jagielski 			GetSearchMask() == SFXSTYLEBIT_ALL );
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 
SfxStyleSheetIterator(SfxStyleSheetBasePool * pBase,SfxStyleFamily eFam,sal_uInt16 n)429*b1cdbd2cSJim Jagielski SfxStyleSheetIterator::SfxStyleSheetIterator(SfxStyleSheetBasePool *pBase,
430*b1cdbd2cSJim Jagielski 											 SfxStyleFamily eFam, sal_uInt16 n)
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	pBasePool=pBase;
433*b1cdbd2cSJim Jagielski 	nSearchFamily=eFam;
434*b1cdbd2cSJim Jagielski 	bSearchUsed=sal_False;
435*b1cdbd2cSJim Jagielski 		if((n != SFXSTYLEBIT_ALL ) && ((n & SFXSTYLEBIT_USED) == SFXSTYLEBIT_USED))
436*b1cdbd2cSJim Jagielski 	{
437*b1cdbd2cSJim Jagielski 		bSearchUsed = sal_True;
438*b1cdbd2cSJim Jagielski 		n &= ~SFXSTYLEBIT_USED;
439*b1cdbd2cSJim Jagielski 	}
440*b1cdbd2cSJim Jagielski 	nMask=n;
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
~SfxStyleSheetIterator()443*b1cdbd2cSJim Jagielski SfxStyleSheetIterator::~SfxStyleSheetIterator()
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 
Count()448*b1cdbd2cSJim Jagielski sal_uInt16 SfxStyleSheetIterator::Count()
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski 	sal_uInt16 n = 0;
451*b1cdbd2cSJim Jagielski 	if( IsTrivialSearch())
452*b1cdbd2cSJim Jagielski 		n = (sal_uInt16) pBasePool->aStyles.size();
453*b1cdbd2cSJim Jagielski 	else
454*b1cdbd2cSJim Jagielski 		for(sal_uInt16 i=0; i<pBasePool->aStyles.size(); i++)
455*b1cdbd2cSJim Jagielski 		{
456*b1cdbd2cSJim Jagielski 			SfxStyleSheetBase* pStyle = pBasePool->aStyles[i].get();
457*b1cdbd2cSJim Jagielski 			if(DoesStyleMatch(pStyle))
458*b1cdbd2cSJim Jagielski 				n++;
459*b1cdbd2cSJim Jagielski 		}
460*b1cdbd2cSJim Jagielski 	return n;
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
operator [](sal_uInt16 nIdx)463*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx)
464*b1cdbd2cSJim Jagielski {
465*b1cdbd2cSJim Jagielski 	if( IsTrivialSearch())
466*b1cdbd2cSJim Jagielski 		return pBasePool->aStyles[nIdx].get();
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 	sal_uInt16 z = 0;
469*b1cdbd2cSJim Jagielski 	for(sal_uInt16 n=0; n<pBasePool->aStyles.size(); n++)
470*b1cdbd2cSJim Jagielski 	{
471*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get();
472*b1cdbd2cSJim Jagielski 		if( DoesStyleMatch(pStyle))
473*b1cdbd2cSJim Jagielski 		{
474*b1cdbd2cSJim Jagielski 			if(z == nIdx)
475*b1cdbd2cSJim Jagielski 			{
476*b1cdbd2cSJim Jagielski 				nAktPosition=n;
477*b1cdbd2cSJim Jagielski 				return pAktStyle=pStyle;
478*b1cdbd2cSJim Jagielski 			}
479*b1cdbd2cSJim Jagielski 			++z;
480*b1cdbd2cSJim Jagielski 		}
481*b1cdbd2cSJim Jagielski 	}
482*b1cdbd2cSJim Jagielski 	DBG_ERROR("falscher Index");
483*b1cdbd2cSJim Jagielski 	return 0;
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski 
First()486*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetIterator::First()
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski 	sal_Int32 nIdx = -1;
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski 	if ( IsTrivialSearch() && pBasePool->aStyles.size() )
491*b1cdbd2cSJim Jagielski 		nIdx = 0;
492*b1cdbd2cSJim Jagielski 	else
493*b1cdbd2cSJim Jagielski 		for( sal_uInt16 n = 0; n < pBasePool->aStyles.size(); n++ )
494*b1cdbd2cSJim Jagielski 		{
495*b1cdbd2cSJim Jagielski 			SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get();
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski 			if ( DoesStyleMatch( pStyle ) )
498*b1cdbd2cSJim Jagielski 			{
499*b1cdbd2cSJim Jagielski 				nIdx = n;
500*b1cdbd2cSJim Jagielski 				break;
501*b1cdbd2cSJim Jagielski 			}
502*b1cdbd2cSJim Jagielski 		}
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 	if ( nIdx != -1 )
505*b1cdbd2cSJim Jagielski 	{
506*b1cdbd2cSJim Jagielski 		nAktPosition = (sal_uInt16)nIdx;
507*b1cdbd2cSJim Jagielski 		return pAktStyle = pBasePool->aStyles[nIdx].get();
508*b1cdbd2cSJim Jagielski 	}
509*b1cdbd2cSJim Jagielski 	return 0;
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 
Next()513*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetIterator::Next()
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski 	sal_Int32 nIdx = -1;
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 	if ( IsTrivialSearch() &&
518*b1cdbd2cSJim Jagielski 		 (sal_uInt16)pBasePool->aStyles.size() > nAktPosition + 1 )
519*b1cdbd2cSJim Jagielski 		nIdx = nAktPosition + 1;
520*b1cdbd2cSJim Jagielski 	else
521*b1cdbd2cSJim Jagielski 		for( sal_uInt16 n = nAktPosition + 1; n < pBasePool->aStyles.size(); n++ )
522*b1cdbd2cSJim Jagielski 		{
523*b1cdbd2cSJim Jagielski 			SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get();
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski 			if ( DoesStyleMatch( pStyle ) )
526*b1cdbd2cSJim Jagielski 			{
527*b1cdbd2cSJim Jagielski 				nIdx = n;
528*b1cdbd2cSJim Jagielski 				break;
529*b1cdbd2cSJim Jagielski 			}
530*b1cdbd2cSJim Jagielski 		}
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski 	if ( nIdx != -1 )
533*b1cdbd2cSJim Jagielski 	{
534*b1cdbd2cSJim Jagielski 		nAktPosition = (sal_uInt16)nIdx;
535*b1cdbd2cSJim Jagielski 		return pAktStyle = pBasePool->aStyles[nIdx].get();
536*b1cdbd2cSJim Jagielski 	}
537*b1cdbd2cSJim Jagielski 	return 0;
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski 
Find(const XubString & rStr)541*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetIterator::Find(const XubString& rStr)
542*b1cdbd2cSJim Jagielski {
543*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n = 0; n < pBasePool->aStyles.size(); n++ )
544*b1cdbd2cSJim Jagielski 	{
545*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase* pStyle = pBasePool->aStyles[n].get();
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski         // #98454# performance: in case of bSearchUsed==sal_True it may be
548*b1cdbd2cSJim Jagielski         // significant to first compare the name and only if it matches to call
549*b1cdbd2cSJim Jagielski         // the style sheet IsUsed() method in DoesStyleMatch().
550*b1cdbd2cSJim Jagielski         if ( pStyle->GetName().Equals( rStr ) && DoesStyleMatch( pStyle ) )
551*b1cdbd2cSJim Jagielski 		{
552*b1cdbd2cSJim Jagielski 			nAktPosition = n;
553*b1cdbd2cSJim Jagielski 			return pAktStyle = pStyle;
554*b1cdbd2cSJim Jagielski 		}
555*b1cdbd2cSJim Jagielski 	}
556*b1cdbd2cSJim Jagielski 	return 0;
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 
GetSearchMask() const560*b1cdbd2cSJim Jagielski sal_uInt16 SfxStyleSheetIterator::GetSearchMask() const
561*b1cdbd2cSJim Jagielski {
562*b1cdbd2cSJim Jagielski 	sal_uInt16 mask = nMask;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 	if ( bSearchUsed )
565*b1cdbd2cSJim Jagielski 		mask |= SFXSTYLEBIT_USED;
566*b1cdbd2cSJim Jagielski 	return mask;
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski /////////////////////////// SfxStyleSheetBasePool ///////////////////////////////
570*b1cdbd2cSJim Jagielski 
Replace(SfxStyleSheetBase & rSource,SfxStyleSheetBase & rTarget)571*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::Replace(
572*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase& rSource, SfxStyleSheetBase& rTarget )
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski 	rTarget.SetFollow( rSource.GetFollow() );
575*b1cdbd2cSJim Jagielski 	rTarget.SetParent( rSource.GetParent() );
576*b1cdbd2cSJim Jagielski 	SfxItemSet& rSourceSet = rSource.GetItemSet();
577*b1cdbd2cSJim Jagielski 	SfxItemSet& rTargetSet = rTarget.GetItemSet();
578*b1cdbd2cSJim Jagielski 	rTargetSet.Intersect( rSourceSet );
579*b1cdbd2cSJim Jagielski 	rTargetSet.Put( rSourceSet );
580*b1cdbd2cSJim Jagielski }
581*b1cdbd2cSJim Jagielski 
GetIterator_Impl()582*b1cdbd2cSJim Jagielski SfxStyleSheetIterator& SfxStyleSheetBasePool::GetIterator_Impl()
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski 	if( !pImp->pIter || (pImp->pIter->GetSearchMask() != nMask) || (pImp->pIter->GetSearchFamily() != nSearchFamily) )
585*b1cdbd2cSJim Jagielski 	{
586*b1cdbd2cSJim Jagielski 		pImp->pIter = CreateIterator( nSearchFamily, nMask );
587*b1cdbd2cSJim Jagielski 	}
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski     return *pImp->pIter;
590*b1cdbd2cSJim Jagielski }
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 
SfxStyleSheetBasePool(SfxItemPool & r)593*b1cdbd2cSJim Jagielski SfxStyleSheetBasePool::SfxStyleSheetBasePool( SfxItemPool& r )
594*b1cdbd2cSJim Jagielski 	: aAppName(r.GetName())
595*b1cdbd2cSJim Jagielski 	, rPool(r)
596*b1cdbd2cSJim Jagielski 	, nSearchFamily(SFX_STYLE_FAMILY_PARA)
597*b1cdbd2cSJim Jagielski 	, nMask(0xFFFF)
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
600*b1cdbd2cSJim Jagielski 	aDbgStyleSheetReferences.mnPools++;
601*b1cdbd2cSJim Jagielski #endif
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	pImp = new SfxStyleSheetBasePool_Impl;
604*b1cdbd2cSJim Jagielski }
605*b1cdbd2cSJim Jagielski 
SfxStyleSheetBasePool(const SfxStyleSheetBasePool & r)606*b1cdbd2cSJim Jagielski SfxStyleSheetBasePool::SfxStyleSheetBasePool( const SfxStyleSheetBasePool& r )
607*b1cdbd2cSJim Jagielski 	: SfxBroadcaster( r )
608*b1cdbd2cSJim Jagielski 	, comphelper::OWeakTypeObject()
609*b1cdbd2cSJim Jagielski     , aAppName(r.aAppName)
610*b1cdbd2cSJim Jagielski 	, rPool(r.rPool)
611*b1cdbd2cSJim Jagielski 	, nSearchFamily(r.nSearchFamily)
612*b1cdbd2cSJim Jagielski 	, nMask( r.nMask )
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
615*b1cdbd2cSJim Jagielski 	aDbgStyleSheetReferences.mnPools++;
616*b1cdbd2cSJim Jagielski #endif
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 	pImp = new SfxStyleSheetBasePool_Impl;
619*b1cdbd2cSJim Jagielski 	*this += r;
620*b1cdbd2cSJim Jagielski }
621*b1cdbd2cSJim Jagielski 
~SfxStyleSheetBasePool()622*b1cdbd2cSJim Jagielski SfxStyleSheetBasePool::~SfxStyleSheetBasePool()
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
625*b1cdbd2cSJim Jagielski 	aDbgStyleSheetReferences.mnPools--;
626*b1cdbd2cSJim Jagielski #endif
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 	Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
629*b1cdbd2cSJim Jagielski 	Clear();
630*b1cdbd2cSJim Jagielski 	delete pImp;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski 
SetParent(SfxStyleFamily eFam,const XubString & rStyle,const XubString & rParent)633*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBasePool::SetParent(SfxStyleFamily eFam, const XubString& rStyle, const XubString& rParent)
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator aIter(this,eFam,SFXSTYLEBIT_ALL);
636*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase *pStyle =
637*b1cdbd2cSJim Jagielski 		aIter.Find(rStyle);
638*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pStyle, "Vorlage nicht gefunden. Writer mit Solar <2541??");
639*b1cdbd2cSJim Jagielski 	if(pStyle)
640*b1cdbd2cSJim Jagielski 		return pStyle->SetParent(rParent);
641*b1cdbd2cSJim Jagielski 	else
642*b1cdbd2cSJim Jagielski 		return sal_False;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 
SetSearchMask(SfxStyleFamily eFam,sal_uInt16 n)646*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::SetSearchMask(SfxStyleFamily eFam, sal_uInt16 n)
647*b1cdbd2cSJim Jagielski {
648*b1cdbd2cSJim Jagielski 	nSearchFamily = eFam; nMask = n;
649*b1cdbd2cSJim Jagielski }
650*b1cdbd2cSJim Jagielski 
GetSearchMask() const651*b1cdbd2cSJim Jagielski sal_uInt16 SfxStyleSheetBasePool::GetSearchMask() const
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski 	return nMask;
654*b1cdbd2cSJim Jagielski }
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski // Der Name des Streams
658*b1cdbd2cSJim Jagielski 
GetStreamName()659*b1cdbd2cSJim Jagielski String SfxStyleSheetBasePool::GetStreamName()
660*b1cdbd2cSJim Jagielski {
661*b1cdbd2cSJim Jagielski 	return String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(STYLESTREAM));
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski /////////////////////////////////// Factory ////////////////////////////////
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski 
CreateIterator(SfxStyleFamily eFam,sal_uInt16 mask)668*b1cdbd2cSJim Jagielski SfxStyleSheetIteratorPtr SfxStyleSheetBasePool::CreateIterator
669*b1cdbd2cSJim Jagielski (
670*b1cdbd2cSJim Jagielski  SfxStyleFamily eFam,
671*b1cdbd2cSJim Jagielski  sal_uInt16 mask
672*b1cdbd2cSJim Jagielski )
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski 	return SfxStyleSheetIteratorPtr(new SfxStyleSheetIterator(this,eFam,mask));
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski 
Create(const XubString & rName,SfxStyleFamily eFam,sal_uInt16 mask)678*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetBasePool::Create
679*b1cdbd2cSJim Jagielski (
680*b1cdbd2cSJim Jagielski 	const XubString& rName,
681*b1cdbd2cSJim Jagielski 	SfxStyleFamily eFam,
682*b1cdbd2cSJim Jagielski 	sal_uInt16 mask
683*b1cdbd2cSJim Jagielski )
684*b1cdbd2cSJim Jagielski {
685*b1cdbd2cSJim Jagielski 	return new SfxStyleSheetBase( rName, *this, eFam, mask );
686*b1cdbd2cSJim Jagielski }
687*b1cdbd2cSJim Jagielski 
Create(const SfxStyleSheetBase & r)688*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetBasePool::Create( const SfxStyleSheetBase& r )
689*b1cdbd2cSJim Jagielski {
690*b1cdbd2cSJim Jagielski 	return new SfxStyleSheetBase( r );
691*b1cdbd2cSJim Jagielski }
692*b1cdbd2cSJim Jagielski 
Make(const XubString & rName,SfxStyleFamily eFam,sal_uInt16 mask,sal_uInt16 nPos)693*b1cdbd2cSJim Jagielski SfxStyleSheetBase& SfxStyleSheetBasePool::Make( const XubString& rName, SfxStyleFamily eFam, sal_uInt16 mask, sal_uInt16 nPos)
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski 	DBG_ASSERT( eFam != SFX_STYLE_FAMILY_ALL, "svl::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" );
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator aIter(this, eFam, mask);
698*b1cdbd2cSJim Jagielski 	rtl::Reference< SfxStyleSheetBase > xStyle( aIter.Find( rName ) );
699*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !xStyle.is(), "svl::SfxStyleSheetBasePool::Make(), StyleSheet already exists" );
700*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator& rIter = GetIterator_Impl();
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski 	if( !xStyle.is() )
703*b1cdbd2cSJim Jagielski 	{
704*b1cdbd2cSJim Jagielski 		xStyle = Create( rName, eFam, mask );
705*b1cdbd2cSJim Jagielski 		if(0xffff == nPos || nPos == aStyles.size() || nPos == rIter.Count())
706*b1cdbd2cSJim Jagielski 		{
707*b1cdbd2cSJim Jagielski 			aStyles.push_back( xStyle );
708*b1cdbd2cSJim Jagielski 		}
709*b1cdbd2cSJim Jagielski 		else
710*b1cdbd2cSJim Jagielski 		{
711*b1cdbd2cSJim Jagielski 			rIter[nPos];
712*b1cdbd2cSJim Jagielski 			aStyles.insert( aStyles.begin() + rIter.GetPos(), xStyle );
713*b1cdbd2cSJim Jagielski 		}
714*b1cdbd2cSJim Jagielski 		Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xStyle.get() ) );
715*b1cdbd2cSJim Jagielski 	}
716*b1cdbd2cSJim Jagielski 	return *xStyle.get();
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski /////////////////////////////// Kopieren ///////////////////////////////////
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski // Hilfsroutine: Falls eine Vorlage dieses Namens existiert, wird
722*b1cdbd2cSJim Jagielski // sie neu erzeugt. Alle Vorlagen, die diese Vorlage zum Parent haben,
723*b1cdbd2cSJim Jagielski // werden umgehaengt.
724*b1cdbd2cSJim Jagielski 
Add(SfxStyleSheetBase & rSheet)725*b1cdbd2cSJim Jagielski SfxStyleSheetBase& SfxStyleSheetBasePool::Add( SfxStyleSheetBase& rSheet )
726*b1cdbd2cSJim Jagielski {
727*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator aIter(this, rSheet.GetFamily(), nMask);
728*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase* pOld = aIter.Find( rSheet.GetName() );
729*b1cdbd2cSJim Jagielski 	Remove( pOld );
730*b1cdbd2cSJim Jagielski 	rtl::Reference< SfxStyleSheetBase > xNew( Create( rSheet ) );
731*b1cdbd2cSJim Jagielski 	aStyles.push_back( xNew );
732*b1cdbd2cSJim Jagielski 	Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CHANGED, *xNew.get() ) );
733*b1cdbd2cSJim Jagielski 	return *xNew.get();
734*b1cdbd2cSJim Jagielski }
735*b1cdbd2cSJim Jagielski 
operator =(const SfxStyleSheetBasePool & r)736*b1cdbd2cSJim Jagielski SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator=( const SfxStyleSheetBasePool& r )
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski 	if( &r != this )
739*b1cdbd2cSJim Jagielski 	{
740*b1cdbd2cSJim Jagielski 		Clear();
741*b1cdbd2cSJim Jagielski 		*this += r;
742*b1cdbd2cSJim Jagielski 	}
743*b1cdbd2cSJim Jagielski 	return *this;
744*b1cdbd2cSJim Jagielski }
745*b1cdbd2cSJim Jagielski 
operator +=(const SfxStyleSheetBasePool & r)746*b1cdbd2cSJim Jagielski SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator+=( const SfxStyleSheetBasePool& r )
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski 	if( &r != this )
749*b1cdbd2cSJim Jagielski 	{
750*b1cdbd2cSJim Jagielski 		SfxStyles::const_iterator aIter( r.aStyles.begin() );
751*b1cdbd2cSJim Jagielski 		while( aIter != r.aStyles.end() )
752*b1cdbd2cSJim Jagielski 		{
753*b1cdbd2cSJim Jagielski 			Add(*(*aIter++).get());
754*b1cdbd2cSJim Jagielski 		}
755*b1cdbd2cSJim Jagielski 	}
756*b1cdbd2cSJim Jagielski 	return *this;
757*b1cdbd2cSJim Jagielski }
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski //////////////////////////////// Suchen ////////////////////////////////////
760*b1cdbd2cSJim Jagielski 
Count()761*b1cdbd2cSJim Jagielski sal_uInt16 SfxStyleSheetBasePool::Count()
762*b1cdbd2cSJim Jagielski {
763*b1cdbd2cSJim Jagielski 	return GetIterator_Impl().Count();
764*b1cdbd2cSJim Jagielski }
765*b1cdbd2cSJim Jagielski 
operator [](sal_uInt16 nIdx)766*b1cdbd2cSJim Jagielski SfxStyleSheetBase *SfxStyleSheetBasePool::operator[](sal_uInt16 nIdx)
767*b1cdbd2cSJim Jagielski {
768*b1cdbd2cSJim Jagielski 	return GetIterator_Impl()[nIdx];
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski 
Find(const XubString & rName,SfxStyleFamily eFam,sal_uInt16 mask)771*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetBasePool::Find(const XubString& rName,
772*b1cdbd2cSJim Jagielski 											   SfxStyleFamily eFam,
773*b1cdbd2cSJim Jagielski 											   sal_uInt16 mask)
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator aIter(this,eFam,mask);
776*b1cdbd2cSJim Jagielski 	return aIter.Find(rName);
777*b1cdbd2cSJim Jagielski }
778*b1cdbd2cSJim Jagielski 
GetStyles()779*b1cdbd2cSJim Jagielski const SfxStyles& SfxStyleSheetBasePool::GetStyles()
780*b1cdbd2cSJim Jagielski {
781*b1cdbd2cSJim Jagielski 	return aStyles;
782*b1cdbd2cSJim Jagielski }
783*b1cdbd2cSJim Jagielski 
First()784*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetBasePool::First()
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski 	return GetIterator_Impl().First();
787*b1cdbd2cSJim Jagielski }
788*b1cdbd2cSJim Jagielski 
Next()789*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetBasePool::Next()
790*b1cdbd2cSJim Jagielski {
791*b1cdbd2cSJim Jagielski 	return GetIterator_Impl().Next();
792*b1cdbd2cSJim Jagielski }
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski //////////////////////////////// Loeschen /////////////////////////////////
795*b1cdbd2cSJim Jagielski 
Remove(SfxStyleSheetBase * p)796*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::Remove( SfxStyleSheetBase* p )
797*b1cdbd2cSJim Jagielski {
798*b1cdbd2cSJim Jagielski 	if( p )
799*b1cdbd2cSJim Jagielski 	{
800*b1cdbd2cSJim Jagielski 		SfxStyles::iterator aIter( std::find( aStyles.begin(), aStyles.end(), rtl::Reference< SfxStyleSheetBase >( p ) ) );
801*b1cdbd2cSJim Jagielski 		if( aIter != aStyles.end() )
802*b1cdbd2cSJim Jagielski 		{
803*b1cdbd2cSJim Jagielski 			// Alle Styles umsetzen, deren Parent dieser hier ist
804*b1cdbd2cSJim Jagielski 			ChangeParent( p->GetName(), p->GetParent() );
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski             // #120015# Do not dispose, the removed StyleSheet may still be used in
807*b1cdbd2cSJim Jagielski             // existing SdrUndoAttrObj incarnations. Rely on refcounting for disposal,
808*b1cdbd2cSJim Jagielski             // this works well under normal conditions (checked breaking and counting
809*b1cdbd2cSJim Jagielski             // on SfxStyleSheetBase constructors and destructors)
810*b1cdbd2cSJim Jagielski             //
811*b1cdbd2cSJim Jagielski 			// com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY );
812*b1cdbd2cSJim Jagielski 			// if( xComp.is() ) try
813*b1cdbd2cSJim Jagielski 			// {
814*b1cdbd2cSJim Jagielski 			// 	xComp->dispose();
815*b1cdbd2cSJim Jagielski 			// }
816*b1cdbd2cSJim Jagielski 			// catch( com::sun::star::uno::Exception& )
817*b1cdbd2cSJim Jagielski 			// {
818*b1cdbd2cSJim Jagielski 			// }
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski 			aStyles.erase(aIter);
821*b1cdbd2cSJim Jagielski 			Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) );
822*b1cdbd2cSJim Jagielski 		}
823*b1cdbd2cSJim Jagielski 	}
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski 
Insert(SfxStyleSheetBase * p)826*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::Insert( SfxStyleSheetBase* p )
827*b1cdbd2cSJim Jagielski {
828*b1cdbd2cSJim Jagielski 	DBG_ASSERT( p, "svl::SfxStyleSheetBasePool::Insert(), no stylesheet?" );
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski 	SfxStyleSheetIterator aIter(this, p->GetFamily(), p->GetMask());
831*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase* pOld = aIter.Find( p->GetName() );
832*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pOld, "svl::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" );
833*b1cdbd2cSJim Jagielski 	if( p->GetParent().Len() )
834*b1cdbd2cSJim Jagielski 	{
835*b1cdbd2cSJim Jagielski 		pOld = aIter.Find( p->GetParent() );
836*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pOld, "svl::SfxStyleSheetBasePool::Insert(), Parent not found!" );
837*b1cdbd2cSJim Jagielski 	}
838*b1cdbd2cSJim Jagielski 	aStyles.push_back( rtl::Reference< SfxStyleSheetBase >( p ) );
839*b1cdbd2cSJim Jagielski 	Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *p ) );
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
Clear()842*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::Clear()
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski 	SfxStyles aClearStyles;
845*b1cdbd2cSJim Jagielski 	aClearStyles.swap( aStyles );
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 	SfxStyles::iterator aIter( aClearStyles.begin() );
848*b1cdbd2cSJim Jagielski 	while( aIter != aClearStyles.end() )
849*b1cdbd2cSJim Jagielski 	{
850*b1cdbd2cSJim Jagielski 		com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY );
851*b1cdbd2cSJim Jagielski 		if( xComp.is() ) try
852*b1cdbd2cSJim Jagielski 		{
853*b1cdbd2cSJim Jagielski 			xComp->dispose();
854*b1cdbd2cSJim Jagielski 		}
855*b1cdbd2cSJim Jagielski 		catch( com::sun::star::uno::Exception& )
856*b1cdbd2cSJim Jagielski 		{
857*b1cdbd2cSJim Jagielski 		}
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski 		Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *(*aIter++).get() ) );
860*b1cdbd2cSJim Jagielski 	}
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski /////////////////////////// Parents umsetzen ////////////////////////////////
864*b1cdbd2cSJim Jagielski 
ChangeParent(const XubString & rOld,const XubString & rNew,sal_Bool bVirtual)865*b1cdbd2cSJim Jagielski void SfxStyleSheetBasePool::ChangeParent(const XubString& rOld,
866*b1cdbd2cSJim Jagielski 										 const XubString& rNew,
867*b1cdbd2cSJim Jagielski 										 sal_Bool bVirtual)
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski 	const sal_uInt16 nTmpMask = GetSearchMask();
870*b1cdbd2cSJim Jagielski 	SetSearchMask(GetSearchFamily(), 0xffff);
871*b1cdbd2cSJim Jagielski 	for( SfxStyleSheetBase* p = First(); p; p = Next() )
872*b1cdbd2cSJim Jagielski 	{
873*b1cdbd2cSJim Jagielski 		if( p->GetParent().Equals( rOld ) )
874*b1cdbd2cSJim Jagielski 		{
875*b1cdbd2cSJim Jagielski 			if(bVirtual)
876*b1cdbd2cSJim Jagielski 				p->SetParent( rNew );
877*b1cdbd2cSJim Jagielski 			else
878*b1cdbd2cSJim Jagielski 				p->aParent = rNew;
879*b1cdbd2cSJim Jagielski 		}
880*b1cdbd2cSJim Jagielski 	}
881*b1cdbd2cSJim Jagielski 	SetSearchMask(GetSearchFamily(), nTmpMask);
882*b1cdbd2cSJim Jagielski }
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski /////////////////////////// Laden/Speichern /////////////////////////////////
885*b1cdbd2cSJim Jagielski 
Load(SvStream &,sal_uInt16)886*b1cdbd2cSJim Jagielski void SfxStyleSheetBase::Load( SvStream&, sal_uInt16 )
887*b1cdbd2cSJim Jagielski {
888*b1cdbd2cSJim Jagielski }
889*b1cdbd2cSJim Jagielski 
Store(SvStream &)890*b1cdbd2cSJim Jagielski void SfxStyleSheetBase::Store( SvStream& )
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski }
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski 
Load(SvStream & rStream)895*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBasePool::Load( SvStream& rStream )
896*b1cdbd2cSJim Jagielski {
897*b1cdbd2cSJim Jagielski 	// alte Version?
898*b1cdbd2cSJim Jagielski 	if ( !rPool.IsVer2_Impl() )
899*b1cdbd2cSJim Jagielski 		return Load1_Impl( rStream );
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski 	// gesamten StyleSheetPool in neuer Version aus einem MiniRecord lesen
902*b1cdbd2cSJim Jagielski 	SfxMiniRecordReader aPoolRec( &rStream, SFX_STYLES_REC );
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski 	// Header-Record lesen
905*b1cdbd2cSJim Jagielski 	short nCharSet = 0;
906*b1cdbd2cSJim Jagielski 	if ( !rStream.GetError() )
907*b1cdbd2cSJim Jagielski 	{
908*b1cdbd2cSJim Jagielski 		SfxSingleRecordReader aHeaderRec( &rStream, SFX_STYLES_REC_HEADER );
909*b1cdbd2cSJim Jagielski 		if ( !aHeaderRec.IsValid() )
910*b1cdbd2cSJim Jagielski 			return sal_False;
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 		aAppName = rPool.GetName();
913*b1cdbd2cSJim Jagielski 		rStream >> nCharSet;
914*b1cdbd2cSJim Jagielski 	}
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski 	// Styles-Record lesen
917*b1cdbd2cSJim Jagielski 	if ( !rStream.GetError() )
918*b1cdbd2cSJim Jagielski 	{
919*b1cdbd2cSJim Jagielski 		SfxMultiRecordReader aStylesRec( &rStream, SFX_STYLES_REC_STYLES );
920*b1cdbd2cSJim Jagielski 		if ( !aStylesRec.IsValid() )
921*b1cdbd2cSJim Jagielski 			return sal_False;
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski 		rtl_TextEncoding eEnc = GetSOLoadTextEncoding(
924*b1cdbd2cSJim Jagielski             (rtl_TextEncoding)nCharSet,
925*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) );
926*b1cdbd2cSJim Jagielski 		rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet();
927*b1cdbd2cSJim Jagielski 		rStream.SetStreamCharSet( eEnc );
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski 		sal_uInt16 nStyles;
930*b1cdbd2cSJim Jagielski 		for ( nStyles = 0; aStylesRec.GetContent(); nStyles++ )
931*b1cdbd2cSJim Jagielski 		{
932*b1cdbd2cSJim Jagielski 			// kann nicht mehr weiterlesen?
933*b1cdbd2cSJim Jagielski 			if ( rStream.GetError() )
934*b1cdbd2cSJim Jagielski 				break;
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 			// Globale Teile
937*b1cdbd2cSJim Jagielski 			XubString aName, aParent, aFollow;
938*b1cdbd2cSJim Jagielski 			String aHelpFile;
939*b1cdbd2cSJim Jagielski 			sal_uInt16 nFamily, nStyleMask,nCount;
940*b1cdbd2cSJim Jagielski 			sal_uInt32 nHelpId;
941*b1cdbd2cSJim Jagielski 			rStream.ReadByteString(aName, eEnc );
942*b1cdbd2cSJim Jagielski 			rStream.ReadByteString(aParent, eEnc );
943*b1cdbd2cSJim Jagielski 			rStream.ReadByteString(aFollow, eEnc );
944*b1cdbd2cSJim Jagielski 			rStream >> nFamily >> nStyleMask;
945*b1cdbd2cSJim Jagielski 			SfxPoolItem::readByteString(rStream, aHelpFile);
946*b1cdbd2cSJim Jagielski 			rStream >> nHelpId;
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 			SfxStyleSheetBase& rSheet = Make( aName, (SfxStyleFamily)nFamily , nStyleMask);
949*b1cdbd2cSJim Jagielski 			rSheet.SetHelpId( aHelpFile, nHelpId );
950*b1cdbd2cSJim Jagielski 			// Hier erst einmal Parent und Follow zwischenspeichern
951*b1cdbd2cSJim Jagielski 			rSheet.aParent = aParent;
952*b1cdbd2cSJim Jagielski 			rSheet.aFollow = aFollow;
953*b1cdbd2cSJim Jagielski 			sal_uInt32 nPos = rStream.Tell();
954*b1cdbd2cSJim Jagielski 			rStream >> nCount;
955*b1cdbd2cSJim Jagielski 			if(nCount)
956*b1cdbd2cSJim Jagielski 			{
957*b1cdbd2cSJim Jagielski 				rStream.Seek( nPos );
958*b1cdbd2cSJim Jagielski 				// Das Laden des ItemSets bedient sich der Methode GetItemSet(),
959*b1cdbd2cSJim Jagielski 				// damit eigene ItemSets untergeschoben werden koennen
960*b1cdbd2cSJim Jagielski 				SfxItemSet& rSet = rSheet.GetItemSet();
961*b1cdbd2cSJim Jagielski 				rSet.ClearItem();
962*b1cdbd2cSJim Jagielski 	//! 		SfxItemSet aTmpSet( *pTmpPool );
963*b1cdbd2cSJim Jagielski 				/*!aTmpSet*/ rSet.Load( rStream );
964*b1cdbd2cSJim Jagielski 				//! rSet.Put( aTmpSet );
965*b1cdbd2cSJim Jagielski 			}
966*b1cdbd2cSJim Jagielski 			// Lokale Teile
967*b1cdbd2cSJim Jagielski 			sal_uInt32 nSize;
968*b1cdbd2cSJim Jagielski 			sal_uInt16 nVer;
969*b1cdbd2cSJim Jagielski 			rStream >> nVer >> nSize;
970*b1cdbd2cSJim Jagielski 			nPos = rStream.Tell() + nSize;
971*b1cdbd2cSJim Jagielski 			rSheet.Load( rStream, nVer );
972*b1cdbd2cSJim Jagielski 			rStream.Seek( nPos );
973*b1cdbd2cSJim Jagielski 		}
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski 		//	#72939# only loop through the styles that were really inserted
976*b1cdbd2cSJim Jagielski 		sal_uLong n = aStyles.size();
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski 		//! delete pTmpPool;
979*b1cdbd2cSJim Jagielski 		// Jetzt Parent und Follow setzen. Alle Sheets sind geladen.
980*b1cdbd2cSJim Jagielski 		// Mit Setxxx() noch einmal den String eintragen, da diese
981*b1cdbd2cSJim Jagielski 		// virtuellen Methoden evtl. ueberlagert sind.
982*b1cdbd2cSJim Jagielski 		for ( sal_uLong i = 0; i < n; i++ )
983*b1cdbd2cSJim Jagielski 		{
984*b1cdbd2cSJim Jagielski 			SfxStyleSheetBase* p = aStyles[ i ].get();
985*b1cdbd2cSJim Jagielski 			XubString aText = p->aParent;
986*b1cdbd2cSJim Jagielski 			p->aParent.Erase();
987*b1cdbd2cSJim Jagielski 			p->SetParent( aText );
988*b1cdbd2cSJim Jagielski 			aText = p->aFollow;
989*b1cdbd2cSJim Jagielski 			p->aFollow.Erase();
990*b1cdbd2cSJim Jagielski 			p->SetFollow( aText );
991*b1cdbd2cSJim Jagielski 		}
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski 		rStream.SetStreamCharSet( eOldEnc );
994*b1cdbd2cSJim Jagielski 	}
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 	// alles klar?
997*b1cdbd2cSJim Jagielski 	return sal_Bool( rStream.GetError() == SVSTREAM_OK );
998*b1cdbd2cSJim Jagielski }
999*b1cdbd2cSJim Jagielski 
Load1_Impl(SvStream & rStream)1000*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBasePool::Load1_Impl( SvStream& rStream )
1001*b1cdbd2cSJim Jagielski {
1002*b1cdbd2cSJim Jagielski 	aAppName = rPool.GetName();
1003*b1cdbd2cSJim Jagielski 	sal_uInt16 nVersion;
1004*b1cdbd2cSJim Jagielski 	short nCharSet;
1005*b1cdbd2cSJim Jagielski 	rStream >> nVersion;
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski 	if(nVersion!=STYLESTREAM_VERSION)
1008*b1cdbd2cSJim Jagielski 		nCharSet=nVersion;
1009*b1cdbd2cSJim Jagielski 	else
1010*b1cdbd2cSJim Jagielski 		rStream >> nCharSet;
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 	rtl_TextEncoding eEnc = GetSOLoadTextEncoding(
1013*b1cdbd2cSJim Jagielski         (rtl_TextEncoding)nCharSet,
1014*b1cdbd2cSJim Jagielski         sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) );
1015*b1cdbd2cSJim Jagielski 	rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet();
1016*b1cdbd2cSJim Jagielski 	rStream.SetStreamCharSet( eEnc );
1017*b1cdbd2cSJim Jagielski 
1018*b1cdbd2cSJim Jagielski 	sal_uInt16 nStyles;
1019*b1cdbd2cSJim Jagielski 	rStream >> nStyles;
1020*b1cdbd2cSJim Jagielski 	sal_uInt16 i;
1021*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nStyles; i++ )
1022*b1cdbd2cSJim Jagielski 	{
1023*b1cdbd2cSJim Jagielski 		// kann nicht mehr weiterlesen?
1024*b1cdbd2cSJim Jagielski 		if ( rStream.GetError() )
1025*b1cdbd2cSJim Jagielski 		{
1026*b1cdbd2cSJim Jagielski 			nStyles = i;
1027*b1cdbd2cSJim Jagielski 			break;
1028*b1cdbd2cSJim Jagielski 		}
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski 		// Globale Teile
1031*b1cdbd2cSJim Jagielski 		XubString aName, aParent, aFollow;
1032*b1cdbd2cSJim Jagielski 		String aHelpFile;
1033*b1cdbd2cSJim Jagielski 		sal_uInt16 nFamily, nStyleMask,nCount;
1034*b1cdbd2cSJim Jagielski 		sal_uInt32 nHelpId;
1035*b1cdbd2cSJim Jagielski 		rStream.ReadByteString(aName, eEnc );
1036*b1cdbd2cSJim Jagielski 		rStream.ReadByteString(aParent, eEnc );
1037*b1cdbd2cSJim Jagielski 		rStream.ReadByteString(aFollow, eEnc );
1038*b1cdbd2cSJim Jagielski 		rStream >> nFamily >> nStyleMask;
1039*b1cdbd2cSJim Jagielski 		SfxPoolItem::readByteString(rStream, aHelpFile);
1040*b1cdbd2cSJim Jagielski 		if(nVersion!=STYLESTREAM_VERSION)
1041*b1cdbd2cSJim Jagielski 		{
1042*b1cdbd2cSJim Jagielski 			sal_uInt16 nTmpHelpId;
1043*b1cdbd2cSJim Jagielski 			rStream >> nTmpHelpId;
1044*b1cdbd2cSJim Jagielski 			nHelpId=nTmpHelpId;
1045*b1cdbd2cSJim Jagielski 		}
1046*b1cdbd2cSJim Jagielski 		else
1047*b1cdbd2cSJim Jagielski 			rStream >> nHelpId;
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase& rSheet = Make( aName, (SfxStyleFamily)nFamily , nStyleMask);
1050*b1cdbd2cSJim Jagielski 		rSheet.SetHelpId( aHelpFile, nHelpId );
1051*b1cdbd2cSJim Jagielski 		// Hier erst einmal Parent und Follow zwischenspeichern
1052*b1cdbd2cSJim Jagielski 		rSheet.aParent = aParent;
1053*b1cdbd2cSJim Jagielski 		rSheet.aFollow = aFollow;
1054*b1cdbd2cSJim Jagielski 		sal_uInt32 nPos = rStream.Tell();
1055*b1cdbd2cSJim Jagielski 		rStream >> nCount;
1056*b1cdbd2cSJim Jagielski 		if(nCount) {
1057*b1cdbd2cSJim Jagielski 			rStream.Seek( nPos );
1058*b1cdbd2cSJim Jagielski 			// Das Laden des ItemSets bedient sich der Methode GetItemSet(),
1059*b1cdbd2cSJim Jagielski 			// damit eigene ItemSets untergeschoben werden koennen
1060*b1cdbd2cSJim Jagielski 			SfxItemSet& rSet = rSheet.GetItemSet();
1061*b1cdbd2cSJim Jagielski 			rSet.ClearItem();
1062*b1cdbd2cSJim Jagielski //! 		SfxItemSet aTmpSet( *pTmpPool );
1063*b1cdbd2cSJim Jagielski 			/*!aTmpSet*/ rSet.Load( rStream );
1064*b1cdbd2cSJim Jagielski 			//! rSet.Put( aTmpSet );
1065*b1cdbd2cSJim Jagielski 		}
1066*b1cdbd2cSJim Jagielski 		// Lokale Teile
1067*b1cdbd2cSJim Jagielski 		sal_uInt32 nSize;
1068*b1cdbd2cSJim Jagielski 		sal_uInt16 nVer;
1069*b1cdbd2cSJim Jagielski 		rStream >> nVer >> nSize;
1070*b1cdbd2cSJim Jagielski 		nPos = rStream.Tell() + nSize;
1071*b1cdbd2cSJim Jagielski 		rSheet.Load( rStream, nVer );
1072*b1cdbd2cSJim Jagielski 		rStream.Seek( nPos );
1073*b1cdbd2cSJim Jagielski 	}
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski 	//! delete pTmpPool;
1076*b1cdbd2cSJim Jagielski 	// Jetzt Parent und Follow setzen. Alle Sheets sind geladen.
1077*b1cdbd2cSJim Jagielski 	// Mit Setxxx() noch einmal den String eintragen, da diese
1078*b1cdbd2cSJim Jagielski 	// virtuellen Methoden evtl. ueberlagert sind.
1079*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nStyles; i++ )
1080*b1cdbd2cSJim Jagielski 	{
1081*b1cdbd2cSJim Jagielski 		SfxStyleSheetBase* p = aStyles[ i ].get();
1082*b1cdbd2cSJim Jagielski 		XubString aText = p->aParent;
1083*b1cdbd2cSJim Jagielski 		p->aParent.Erase();
1084*b1cdbd2cSJim Jagielski 		p->SetParent( aText );
1085*b1cdbd2cSJim Jagielski 		aText = p->aFollow;
1086*b1cdbd2cSJim Jagielski 		p->aFollow.Erase();
1087*b1cdbd2cSJim Jagielski 		p->SetFollow( aText );
1088*b1cdbd2cSJim Jagielski 	}
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 	rStream.SetStreamCharSet( eOldEnc );
1091*b1cdbd2cSJim Jagielski 
1092*b1cdbd2cSJim Jagielski 	return sal_Bool( rStream.GetError() == SVSTREAM_OK );
1093*b1cdbd2cSJim Jagielski }
1094*b1cdbd2cSJim Jagielski 
Store(SvStream & rStream,sal_Bool bUsed)1095*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetBasePool::Store( SvStream& rStream, sal_Bool bUsed )
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski 	// den ganzen StyleSheet-Pool in einen Mini-Record
1098*b1cdbd2cSJim Jagielski 	SfxMiniRecordWriter aPoolRec( &rStream, SFX_STYLES_REC );
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski 	// Erst einmal die Dummies rauszaehlen; die werden nicht gespeichert
1101*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = 0;
1102*b1cdbd2cSJim Jagielski 	for( SfxStyleSheetBase* p = First(); p; p = Next() )
1103*b1cdbd2cSJim Jagielski 	{
1104*b1cdbd2cSJim Jagielski 		if(!bUsed || p->IsUsed())
1105*b1cdbd2cSJim Jagielski 			nCount++;
1106*b1cdbd2cSJim Jagielski 	}
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 	// einen Header-Record vorweg
1109*b1cdbd2cSJim Jagielski 	rtl_TextEncoding eEnc
1110*b1cdbd2cSJim Jagielski 		= ::GetSOStoreTextEncoding(
1111*b1cdbd2cSJim Jagielski             rStream.GetStreamCharSet(),
1112*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_uInt16 >(rStream.GetVersion()) );
1113*b1cdbd2cSJim Jagielski 	rtl_TextEncoding eOldEnc = rStream.GetStreamCharSet();
1114*b1cdbd2cSJim Jagielski 	rStream.SetStreamCharSet( eEnc );
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski 	{
1117*b1cdbd2cSJim Jagielski 		SfxSingleRecordWriter aHeaderRec( &rStream,
1118*b1cdbd2cSJim Jagielski 				SFX_STYLES_REC_HEADER,
1119*b1cdbd2cSJim Jagielski 				STYLESTREAM_VERSION );
1120*b1cdbd2cSJim Jagielski 		rStream << (short) eEnc;
1121*b1cdbd2cSJim Jagielski 	}
1122*b1cdbd2cSJim Jagielski 
1123*b1cdbd2cSJim Jagielski 	// die StyleSheets in einen MultiVarRecord
1124*b1cdbd2cSJim Jagielski 	{
1125*b1cdbd2cSJim Jagielski 		// Bug 79478:
1126*b1cdbd2cSJim Jagielski 		// make a check loop, to be shure, that the converted names are also
1127*b1cdbd2cSJim Jagielski 		// unique like the originals! In other cases we get a loop.
1128*b1cdbd2cSJim Jagielski 		SvStringsSortDtor aSortOrigNames( 0, 128 );
1129*b1cdbd2cSJim Jagielski 		SvStrings aOrigNames( 0, 128 );
1130*b1cdbd2cSJim Jagielski 		SvByteStringsSortDtor aSortConvNames( 0, 128 );
1131*b1cdbd2cSJim Jagielski 		SvByteStrings aConvNames( 0, 128 );
1132*b1cdbd2cSJim Jagielski 
1133*b1cdbd2cSJim Jagielski 		{
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski 			for( SfxStyleSheetBase* p = First(); p; p = Next() )
1136*b1cdbd2cSJim Jagielski 			{
1137*b1cdbd2cSJim Jagielski 				if(!bUsed || p->IsUsed())
1138*b1cdbd2cSJim Jagielski 				{
1139*b1cdbd2cSJim Jagielski 					sal_uInt16 nFamily = (sal_uInt16)p->GetFamily();
1140*b1cdbd2cSJim Jagielski 					String* pName = new String( p->GetName() );
1141*b1cdbd2cSJim Jagielski 					ByteString* pConvName = new ByteString( *pName, eEnc );
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski 					pName->Insert( (sal_Unicode)nFamily, 0 );
1144*b1cdbd2cSJim Jagielski 					pConvName->Insert( "  ", 0 );
1145*b1cdbd2cSJim Jagielski 					pConvName->SetChar(
1146*b1cdbd2cSJim Jagielski                         0,
1147*b1cdbd2cSJim Jagielski                         sal::static_int_cast< char >(0xff & (nFamily >> 8)) );
1148*b1cdbd2cSJim Jagielski 					pConvName->SetChar(
1149*b1cdbd2cSJim Jagielski                         1, sal::static_int_cast< char >(0xff & nFamily) );
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski 					sal_uInt16 nInsPos, nAdd = aSortConvNames.Count();
1152*b1cdbd2cSJim Jagielski 					while( !aSortConvNames.Insert( pConvName, nInsPos ) )
1153*b1cdbd2cSJim Jagielski 						(pConvName->Append( '_' )).Append(
1154*b1cdbd2cSJim Jagielski 									ByteString::CreateFromInt32( nAdd++ ));
1155*b1cdbd2cSJim Jagielski 					aOrigNames.Insert( pName, nInsPos );
1156*b1cdbd2cSJim Jagielski 				}
1157*b1cdbd2cSJim Jagielski 			}
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 			// now we have the list of the names, sorted by convertede names
1160*b1cdbd2cSJim Jagielski 			// But now we need the sorted list of orignames.
1161*b1cdbd2cSJim Jagielski 			{
1162*b1cdbd2cSJim Jagielski 				sal_uInt16 nInsPos, nEnd = aOrigNames.Count();
1163*b1cdbd2cSJim Jagielski 				const ByteStringPtr* ppB = aSortConvNames.GetData();
1164*b1cdbd2cSJim Jagielski 				for( sal_uInt16 n = 0; n < nEnd; ++n, ++ppB )
1165*b1cdbd2cSJim Jagielski 				{
1166*b1cdbd2cSJim Jagielski 					String* p = aOrigNames.GetObject( n );
1167*b1cdbd2cSJim Jagielski 					aSortOrigNames.Insert( p, nInsPos );
1168*b1cdbd2cSJim Jagielski 					aConvNames.Insert( *ppB, nInsPos );
1169*b1cdbd2cSJim Jagielski 				}
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski 			}
1172*b1cdbd2cSJim Jagielski 		}
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski 		ByteString sEmpty;
1176*b1cdbd2cSJim Jagielski 		sal_uInt16 nFndPos;
1177*b1cdbd2cSJim Jagielski 		String sNm;
1178*b1cdbd2cSJim Jagielski 		SfxMultiVarRecordWriter aStylesRec( &rStream, SFX_STYLES_REC_STYLES, 0 );
1179*b1cdbd2cSJim Jagielski 		for( SfxStyleSheetBase* p = First(); p; p = Next() )
1180*b1cdbd2cSJim Jagielski 		{
1181*b1cdbd2cSJim Jagielski 			if(!bUsed || p->IsUsed())
1182*b1cdbd2cSJim Jagielski 			{
1183*b1cdbd2cSJim Jagielski 				aStylesRec.NewContent();
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski 				// Globale Teile speichern
1186*b1cdbd2cSJim Jagielski 				String aHelpFile;
1187*b1cdbd2cSJim Jagielski 				sal_uInt32 nHelpId = p->GetHelpId( aHelpFile );
1188*b1cdbd2cSJim Jagielski 				sal_uInt16 nFamily = sal::static_int_cast< sal_uInt16 >(p->GetFamily());
1189*b1cdbd2cSJim Jagielski 				String sFamily( (sal_Unicode)nFamily );
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 				(sNm = sFamily) += p->GetName();
1192*b1cdbd2cSJim Jagielski 				if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos ))
1193*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 ));
1194*b1cdbd2cSJim Jagielski 				else
1195*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( sEmpty );
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 				(sNm = sFamily) += p->GetParent();
1198*b1cdbd2cSJim Jagielski 				if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos ))
1199*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 ));
1200*b1cdbd2cSJim Jagielski 				else
1201*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( sEmpty );
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski 				(sNm = sFamily) += p->GetFollow();
1204*b1cdbd2cSJim Jagielski 				if( aSortOrigNames.Seek_Entry( &sNm, &nFndPos ))
1205*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( aConvNames.GetObject( nFndPos )->Copy( 2 ));
1206*b1cdbd2cSJim Jagielski 				else
1207*b1cdbd2cSJim Jagielski 					rStream.WriteByteString( sEmpty );
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski 				rStream << nFamily << p->GetMask();
1210*b1cdbd2cSJim Jagielski 				SfxPoolItem::writeByteString(rStream, aHelpFile);
1211*b1cdbd2cSJim Jagielski 				rStream << nHelpId;
1212*b1cdbd2cSJim Jagielski 				if(p->pSet)
1213*b1cdbd2cSJim Jagielski 					p->pSet->Store( rStream );
1214*b1cdbd2cSJim Jagielski 				else
1215*b1cdbd2cSJim Jagielski 					rStream << (sal_uInt16)0;
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 				// Lokale Teile speichern
1218*b1cdbd2cSJim Jagielski 				// Vor dem lokalen Teil wird die Laenge der lokalen Daten
1219*b1cdbd2cSJim Jagielski 				// als sal_uInt32 sowie die Versionsnummer gespeichert.
1220*b1cdbd2cSJim Jagielski 				rStream << (sal_uInt16) p->GetVersion();
1221*b1cdbd2cSJim Jagielski 				sal_uLong nPos1 = rStream.Tell();
1222*b1cdbd2cSJim Jagielski 				rStream << (sal_uInt32) 0;
1223*b1cdbd2cSJim Jagielski 				p->Store( rStream );
1224*b1cdbd2cSJim Jagielski 				sal_uLong nPos2 = rStream.Tell();
1225*b1cdbd2cSJim Jagielski 				rStream.Seek( nPos1 );
1226*b1cdbd2cSJim Jagielski 				rStream << (sal_uInt32) ( nPos2 - nPos1 - sizeof( sal_uInt32 ) );
1227*b1cdbd2cSJim Jagielski 				rStream.Seek( nPos2 );
1228*b1cdbd2cSJim Jagielski 				if( rStream.GetError() != SVSTREAM_OK )
1229*b1cdbd2cSJim Jagielski 					break;
1230*b1cdbd2cSJim Jagielski 			}
1231*b1cdbd2cSJim Jagielski 		}
1232*b1cdbd2cSJim Jagielski 	}
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski 	rStream.SetStreamCharSet( eOldEnc );
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski 	return sal_Bool( rStream.GetError() == SVSTREAM_OK );
1237*b1cdbd2cSJim Jagielski }
1238*b1cdbd2cSJim Jagielski 
GetPool()1239*b1cdbd2cSJim Jagielski SfxItemPool& SfxStyleSheetBasePool::GetPool()
1240*b1cdbd2cSJim Jagielski {
1241*b1cdbd2cSJim Jagielski 	return rPool;
1242*b1cdbd2cSJim Jagielski }
1243*b1cdbd2cSJim Jagielski 
GetPool() const1244*b1cdbd2cSJim Jagielski const SfxItemPool& SfxStyleSheetBasePool::GetPool() const
1245*b1cdbd2cSJim Jagielski {
1246*b1cdbd2cSJim Jagielski 	return rPool;
1247*b1cdbd2cSJim Jagielski }
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski /////////////////////// SfxStyleSheet /////////////////////////////////
1250*b1cdbd2cSJim Jagielski 
SfxStyleSheet(const XubString & rName,const SfxStyleSheetBasePool & r_Pool,SfxStyleFamily eFam,sal_uInt16 mask)1251*b1cdbd2cSJim Jagielski SfxStyleSheet::SfxStyleSheet(const XubString &rName,
1252*b1cdbd2cSJim Jagielski 							 const SfxStyleSheetBasePool& r_Pool,
1253*b1cdbd2cSJim Jagielski 							 SfxStyleFamily eFam,
1254*b1cdbd2cSJim Jagielski 							 sal_uInt16 mask ):
1255*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase(rName, const_cast< SfxStyleSheetBasePool& >( r_Pool ), eFam, mask)
1256*b1cdbd2cSJim Jagielski {}
1257*b1cdbd2cSJim Jagielski 
SfxStyleSheet(const SfxStyleSheet & rStyle)1258*b1cdbd2cSJim Jagielski SfxStyleSheet::SfxStyleSheet(const SfxStyleSheet& rStyle) :
1259*b1cdbd2cSJim Jagielski 	SfxStyleSheetBase(rStyle),
1260*b1cdbd2cSJim Jagielski     SfxListener( rStyle ),
1261*b1cdbd2cSJim Jagielski     SfxBroadcaster( rStyle )
1262*b1cdbd2cSJim Jagielski {}
1263*b1cdbd2cSJim Jagielski 
SfxStyleSheet()1264*b1cdbd2cSJim Jagielski SfxStyleSheet::SfxStyleSheet()
1265*b1cdbd2cSJim Jagielski {
1266*b1cdbd2cSJim Jagielski }
1267*b1cdbd2cSJim Jagielski 
~SfxStyleSheet()1268*b1cdbd2cSJim Jagielski SfxStyleSheet::~SfxStyleSheet()
1269*b1cdbd2cSJim Jagielski {
1270*b1cdbd2cSJim Jagielski 	Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_INDESTRUCTION, *this ) );
1271*b1cdbd2cSJim Jagielski }
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski 
SetParent(const XubString & rName)1274*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheet::SetParent( const XubString& rName )
1275*b1cdbd2cSJim Jagielski {
1276*b1cdbd2cSJim Jagielski 	if(aParent == rName)
1277*b1cdbd2cSJim Jagielski 		return sal_True;
1278*b1cdbd2cSJim Jagielski 	const XubString aOldParent(aParent);
1279*b1cdbd2cSJim Jagielski 	if(SfxStyleSheetBase::SetParent(rName)) {
1280*b1cdbd2cSJim Jagielski 			// aus der Benachrichtigungskette des alten
1281*b1cdbd2cSJim Jagielski 			// Parents gfs. austragen
1282*b1cdbd2cSJim Jagielski 		if(aOldParent.Len()) {
1283*b1cdbd2cSJim Jagielski 			SfxStyleSheet *pParent = (SfxStyleSheet *)rPool.Find(aOldParent, nFamily, 0xffff);
1284*b1cdbd2cSJim Jagielski 			if(pParent)
1285*b1cdbd2cSJim Jagielski 				EndListening(*pParent);
1286*b1cdbd2cSJim Jagielski 		}
1287*b1cdbd2cSJim Jagielski 			// in die Benachrichtigungskette des neuen
1288*b1cdbd2cSJim Jagielski 			// Parents eintragen
1289*b1cdbd2cSJim Jagielski 		if(aParent.Len()) {
1290*b1cdbd2cSJim Jagielski 			SfxStyleSheet *pParent = (SfxStyleSheet *)rPool.Find(aParent, nFamily, 0xffff);
1291*b1cdbd2cSJim Jagielski 			if(pParent)
1292*b1cdbd2cSJim Jagielski 				StartListening(*pParent);
1293*b1cdbd2cSJim Jagielski 		}
1294*b1cdbd2cSJim Jagielski 		return sal_True;
1295*b1cdbd2cSJim Jagielski 	}
1296*b1cdbd2cSJim Jagielski 	return sal_False;
1297*b1cdbd2cSJim Jagielski }
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski // alle Zuhoerer benachtichtigen
1300*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)1301*b1cdbd2cSJim Jagielski void SfxStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint )
1302*b1cdbd2cSJim Jagielski {
1303*b1cdbd2cSJim Jagielski 	Forward(rBC, rHint);
1304*b1cdbd2cSJim Jagielski }
1305*b1cdbd2cSJim Jagielski 
1306*b1cdbd2cSJim Jagielski //////////////////////// SfxStyleSheetPool ///////////////////////////////
1307*b1cdbd2cSJim Jagielski 
SfxStyleSheetPool(SfxItemPool const & rSet)1308*b1cdbd2cSJim Jagielski SfxStyleSheetPool::SfxStyleSheetPool( SfxItemPool const& rSet)
1309*b1cdbd2cSJim Jagielski : SfxStyleSheetBasePool( const_cast< SfxItemPool& >( rSet ) )
1310*b1cdbd2cSJim Jagielski {
1311*b1cdbd2cSJim Jagielski }
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski /////////////////////////////////// Factory ////////////////////////////////
1314*b1cdbd2cSJim Jagielski 
Create(const XubString & rName,SfxStyleFamily eFam,sal_uInt16 mask)1315*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetPool::Create( const XubString& rName,
1316*b1cdbd2cSJim Jagielski 									SfxStyleFamily eFam, sal_uInt16 mask )
1317*b1cdbd2cSJim Jagielski {
1318*b1cdbd2cSJim Jagielski 	return new SfxStyleSheet( rName, *this, eFam, mask );
1319*b1cdbd2cSJim Jagielski }
1320*b1cdbd2cSJim Jagielski 
Create(const SfxStyleSheet & r)1321*b1cdbd2cSJim Jagielski SfxStyleSheetBase* SfxStyleSheetPool::Create( const SfxStyleSheet& r )
1322*b1cdbd2cSJim Jagielski {
1323*b1cdbd2cSJim Jagielski 	return new SfxStyleSheet( r );
1324*b1cdbd2cSJim Jagielski }
1325*b1cdbd2cSJim Jagielski /*
1326*b1cdbd2cSJim Jagielski sal_Bool SfxStyleSheetPool::CopyTo(SfxStyleSheetPool &, const String &)
1327*b1cdbd2cSJim Jagielski {
1328*b1cdbd2cSJim Jagielski 	return sal_False;
1329*b1cdbd2cSJim Jagielski }
1330*b1cdbd2cSJim Jagielski */
1331*b1cdbd2cSJim Jagielski 
1332*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1333*b1cdbd2cSJim Jagielski // class SfxUnoStyleSheet
1334*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1335*b1cdbd2cSJim Jagielski 
SfxUnoStyleSheet(const UniString & _rName,const SfxStyleSheetBasePool & _rPool,SfxStyleFamily _eFamily,sal_uInt16 _nMaske)1336*b1cdbd2cSJim Jagielski SfxUnoStyleSheet::SfxUnoStyleSheet( const UniString& _rName, const SfxStyleSheetBasePool& _rPool, SfxStyleFamily _eFamily, sal_uInt16 _nMaske )
1337*b1cdbd2cSJim Jagielski : ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rName, _rPool, _eFamily, _nMaske )
1338*b1cdbd2cSJim Jagielski {
1339*b1cdbd2cSJim Jagielski }
1340*b1cdbd2cSJim Jagielski 
1341*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
SfxUnoStyleSheet(const SfxStyleSheet & _rSheet)1342*b1cdbd2cSJim Jagielski SfxUnoStyleSheet::SfxUnoStyleSheet( const SfxStyleSheet& _rSheet )
1343*b1cdbd2cSJim Jagielski : ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rSheet )
1344*b1cdbd2cSJim Jagielski {
1345*b1cdbd2cSJim Jagielski }
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1348*b1cdbd2cSJim Jagielski 
getUnoStyleSheet(const::com::sun::star::uno::Reference<::com::sun::star::style::XStyle> & xStyle)1349*b1cdbd2cSJim Jagielski SfxUnoStyleSheet* SfxUnoStyleSheet::getUnoStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle >& xStyle )
1350*b1cdbd2cSJim Jagielski {
1351*b1cdbd2cSJim Jagielski 	SfxUnoStyleSheet* pRet = dynamic_cast< SfxUnoStyleSheet* >( xStyle.get() );
1352*b1cdbd2cSJim Jagielski 	if( !pRet )
1353*b1cdbd2cSJim Jagielski 	{
1354*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xStyle, ::com::sun::star::uno::UNO_QUERY );
1355*b1cdbd2cSJim Jagielski 		if( xUT.is() )
1356*b1cdbd2cSJim Jagielski 			pRet = reinterpret_cast<SfxUnoStyleSheet*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SfxUnoStyleSheet::getIdentifier())));
1357*b1cdbd2cSJim Jagielski 	}
1358*b1cdbd2cSJim Jagielski 	return pRet;
1359*b1cdbd2cSJim Jagielski }
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1362*b1cdbd2cSJim Jagielski // XUnoTunnel
1363*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1364*b1cdbd2cSJim Jagielski 
getSomething(const::com::sun::star::uno::Sequence<::sal_Int8> & rId)1365*b1cdbd2cSJim Jagielski ::sal_Int64 SAL_CALL SfxUnoStyleSheet::getSomething( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& rId ) throw (::com::sun::star::uno::RuntimeException)
1366*b1cdbd2cSJim Jagielski {
1367*b1cdbd2cSJim Jagielski 	if( rId.getLength() == 16 && 0 == rtl_compareMemory( getIdentifier().getConstArray(), rId.getConstArray(), 16 ) )
1368*b1cdbd2cSJim Jagielski 	{
1369*b1cdbd2cSJim Jagielski 		return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
1370*b1cdbd2cSJim Jagielski 	}
1371*b1cdbd2cSJim Jagielski 	else
1372*b1cdbd2cSJim Jagielski 	{
1373*b1cdbd2cSJim Jagielski 		return 0;
1374*b1cdbd2cSJim Jagielski 	}
1375*b1cdbd2cSJim Jagielski }
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1378*b1cdbd2cSJim Jagielski 
getIdentifier()1379*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence< ::sal_Int8 >& SfxUnoStyleSheet::getIdentifier()
1380*b1cdbd2cSJim Jagielski {
1381*b1cdbd2cSJim Jagielski 	static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0;
1382*b1cdbd2cSJim Jagielski 	if( !pSeq )
1383*b1cdbd2cSJim Jagielski 	{
1384*b1cdbd2cSJim Jagielski 		::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() );
1385*b1cdbd2cSJim Jagielski 		if( !pSeq )
1386*b1cdbd2cSJim Jagielski 		{
1387*b1cdbd2cSJim Jagielski 			static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 );
1388*b1cdbd2cSJim Jagielski 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
1389*b1cdbd2cSJim Jagielski 			pSeq = &aSeq;
1390*b1cdbd2cSJim Jagielski 		}
1391*b1cdbd2cSJim Jagielski 	}
1392*b1cdbd2cSJim Jagielski 	return *pSeq;
1393*b1cdbd2cSJim Jagielski }
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1396