xref: /aoo4110/main/xmloff/source/style/impastp4.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_xmloff.hxx"
26*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
27*b1cdbd2cSJim Jagielski #include <xmloff/xmlaustp.hxx>
28*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
29*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
30*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
31*b1cdbd2cSJim Jagielski #include <xmloff/attrlist.hxx>
32*b1cdbd2cSJim Jagielski #include "impastpl.hxx"
33*b1cdbd2cSJim Jagielski #include <xmloff/xmlexppr.hxx>
34*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
35*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
36*b1cdbd2cSJim Jagielski #ifndef _XMLOFF_PAGEMASTERSTYLEMAP_HXX
37*b1cdbd2cSJim Jagielski #include <xmloff/PageMasterStyleMap.hxx>
38*b1cdbd2cSJim Jagielski #endif
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski using namespace ::std;
41*b1cdbd2cSJim Jagielski using ::rtl::OUString;
42*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
45*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski //#############################################################################
48*b1cdbd2cSJim Jagielski //
49*b1cdbd2cSJim Jagielski // Class SvXMLAutoStylePool_Impl
50*b1cdbd2cSJim Jagielski //
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
53*b1cdbd2cSJim Jagielski //
54*b1cdbd2cSJim Jagielski // ctor/dtor class SvXMLAutoStylePool_Impl
55*b1cdbd2cSJim Jagielski //
56*b1cdbd2cSJim Jagielski 
SvXMLAutoStylePoolP_Impl(SvXMLExport & rExp)57*b1cdbd2cSJim Jagielski SvXMLAutoStylePoolP_Impl::SvXMLAutoStylePoolP_Impl( SvXMLExport& rExp)
58*b1cdbd2cSJim Jagielski     :	rExport( rExp ),
59*b1cdbd2cSJim Jagielski         maFamilyList( 5, 5 )
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski 
~SvXMLAutoStylePoolP_Impl()63*b1cdbd2cSJim Jagielski SvXMLAutoStylePoolP_Impl::~SvXMLAutoStylePoolP_Impl()
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 	for (;;) {
66*b1cdbd2cSJim Jagielski         XMLFamilyData_Impl* pData = maFamilyList.Remove( sal_uLong(0) );
67*b1cdbd2cSJim Jagielski         if (pData == NULL) {
68*b1cdbd2cSJim Jagielski             break;
69*b1cdbd2cSJim Jagielski         }
70*b1cdbd2cSJim Jagielski 		delete pData;
71*b1cdbd2cSJim Jagielski     }
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
75*b1cdbd2cSJim Jagielski //
76*b1cdbd2cSJim Jagielski // Adds stylefamily-informations to sorted list
77*b1cdbd2cSJim Jagielski //
78*b1cdbd2cSJim Jagielski 
AddFamily(sal_Int32 nFamily,const OUString & rStrName,const UniReference<SvXMLExportPropertyMapper> & rMapper,const OUString & rStrPrefix,sal_Bool bAsFamily)79*b1cdbd2cSJim Jagielski void SvXMLAutoStylePoolP_Impl::AddFamily(
80*b1cdbd2cSJim Jagielski 		sal_Int32 nFamily,
81*b1cdbd2cSJim Jagielski 		const OUString& rStrName,
82*b1cdbd2cSJim Jagielski 		const UniReference < SvXMLExportPropertyMapper > & rMapper,
83*b1cdbd2cSJim Jagielski 	   	const OUString& rStrPrefix,
84*b1cdbd2cSJim Jagielski 		sal_Bool bAsFamily )
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski 	// store family in a list if not already stored
87*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 	sal_uInt16 nExportFlags = GetExport().getExportFlags();
90*b1cdbd2cSJim Jagielski 	sal_Bool bStylesOnly = (nExportFlags & EXPORT_STYLES) != 0 && (nExportFlags & EXPORT_CONTENT) == 0;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	OUString aPrefix( rStrPrefix );
93*b1cdbd2cSJim Jagielski 	if( bStylesOnly )
94*b1cdbd2cSJim Jagielski 	{
95*b1cdbd2cSJim Jagielski 		aPrefix = OUString( 'M' );
96*b1cdbd2cSJim Jagielski 		aPrefix += rStrPrefix;
97*b1cdbd2cSJim Jagielski 	}
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = new XMLFamilyData_Impl( nFamily, rStrName, rMapper, aPrefix, bAsFamily );
100*b1cdbd2cSJim Jagielski 	if( !maFamilyList.Seek_Entry( pFamily, &nPos ) )
101*b1cdbd2cSJim Jagielski 		maFamilyList.Insert( pFamily );
102*b1cdbd2cSJim Jagielski 	else
103*b1cdbd2cSJim Jagielski 		delete pFamily;
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
107*b1cdbd2cSJim Jagielski //
108*b1cdbd2cSJim Jagielski // Adds a name to list
109*b1cdbd2cSJim Jagielski //
110*b1cdbd2cSJim Jagielski 
RegisterName(sal_Int32 nFamily,const OUString & rName)111*b1cdbd2cSJim Jagielski void SvXMLAutoStylePoolP_Impl::RegisterName( sal_Int32 nFamily, const OUString& rName )
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski 	SvXMLAutoStylePoolNamesP_Impl *pNames = 0;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
116*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTmp( nFamily );
117*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTmp, &nPos ) )
118*b1cdbd2cSJim Jagielski 		pNames = maFamilyList.GetObject( nPos )->mpNameList;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pNames,
121*b1cdbd2cSJim Jagielski 				"SvXMLAutoStylePool_Impl::RegisterName: unknown family" );
122*b1cdbd2cSJim Jagielski 	if( pNames )
123*b1cdbd2cSJim Jagielski 	{
124*b1cdbd2cSJim Jagielski 		OUString *pName = new OUString( rName );
125*b1cdbd2cSJim Jagielski 		if( !pNames->Insert( pName ) )
126*b1cdbd2cSJim Jagielski 			delete pName;
127*b1cdbd2cSJim Jagielski 	}
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
131*b1cdbd2cSJim Jagielski //
132*b1cdbd2cSJim Jagielski // Retrieve the list of registered names
133*b1cdbd2cSJim Jagielski //
134*b1cdbd2cSJim Jagielski 
GetRegisteredNames(uno::Sequence<sal_Int32> & rFamilies,uno::Sequence<OUString> & rNames)135*b1cdbd2cSJim Jagielski void SvXMLAutoStylePoolP_Impl::GetRegisteredNames(
136*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int32>& rFamilies,
137*b1cdbd2cSJim Jagielski     uno::Sequence<OUString>& rNames )
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski     // collect registered names + families
140*b1cdbd2cSJim Jagielski     vector<sal_Int32> aFamilies;
141*b1cdbd2cSJim Jagielski     vector<OUString> aNames;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     // iterate over families
144*b1cdbd2cSJim Jagielski     sal_uInt32 nCount = maFamilyList.Count();
145*b1cdbd2cSJim Jagielski     for( sal_uInt32 i = 0; i < nCount; i++ )
146*b1cdbd2cSJim Jagielski     {
147*b1cdbd2cSJim Jagielski         XMLFamilyData_Impl* pFamily = maFamilyList.GetObject( i );
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski         // iterate over names
150*b1cdbd2cSJim Jagielski         SvXMLAutoStylePoolNamesP_Impl* pNames = pFamily->mpNameList;
151*b1cdbd2cSJim Jagielski         sal_uInt32 nNames = ( pNames != NULL ) ? pNames->Count() : 0;
152*b1cdbd2cSJim Jagielski         for( sal_uInt32 j = 0; j < nNames; j++ )
153*b1cdbd2cSJim Jagielski         {
154*b1cdbd2cSJim Jagielski             aFamilies.push_back( pFamily->mnFamily );
155*b1cdbd2cSJim Jagielski             aNames.push_back( *pNames->GetObject( j ) );
156*b1cdbd2cSJim Jagielski         }
157*b1cdbd2cSJim Jagielski     }
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski     // copy the families + names into the sequence types
160*b1cdbd2cSJim Jagielski     DBG_ASSERT( aFamilies.size() == aNames.size(), "families != names" );
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     rFamilies.realloc( aFamilies.size() );
163*b1cdbd2cSJim Jagielski     std::copy( aFamilies.begin(), aFamilies.end(), rFamilies.getArray() );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     rNames.realloc( aNames.size() );
166*b1cdbd2cSJim Jagielski     std::copy( aNames.begin(), aNames.end(), rNames.getArray() );
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
170*b1cdbd2cSJim Jagielski //
171*b1cdbd2cSJim Jagielski // Adds a array of XMLPropertyState ( vector< XMLPropertyState > ) to list
172*b1cdbd2cSJim Jagielski // if not added, yet.
173*b1cdbd2cSJim Jagielski //
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski /*OUString SvXMLAutoStylePoolP_Impl::Add( sal_Int32 nFamily,
176*b1cdbd2cSJim Jagielski 							 		    const OUString& rParent,
177*b1cdbd2cSJim Jagielski 									    const vector< XMLPropertyState >& rProperties,
178*b1cdbd2cSJim Jagielski 									    sal_Bool bCache )*/
Add(OUString & rName,sal_Int32 nFamily,const OUString & rParent,const::std::vector<XMLPropertyState> & rProperties,sal_Bool bCache,bool bDontSeek)179*b1cdbd2cSJim Jagielski sal_Bool SvXMLAutoStylePoolP_Impl::Add(OUString& rName, sal_Int32 nFamily,
180*b1cdbd2cSJim Jagielski 				const OUString& rParent,
181*b1cdbd2cSJim Jagielski 				const ::std::vector< XMLPropertyState >& rProperties,
182*b1cdbd2cSJim Jagielski 				sal_Bool bCache,
183*b1cdbd2cSJim Jagielski                 bool bDontSeek )
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski 	sal_Bool bRet(sal_False);
186*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = 0;
189*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTemporary( nFamily );
190*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTemporary, &nPos ) )
191*b1cdbd2cSJim Jagielski 	{
192*b1cdbd2cSJim Jagielski 		pFamily = maFamilyList.GetObject( nPos );
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFamily, "SvXMLAutoStylePool_Impl::Add: unknown family" );
196*b1cdbd2cSJim Jagielski 	if( pFamily )
197*b1cdbd2cSJim Jagielski 	{
198*b1cdbd2cSJim Jagielski 		SvXMLAutoStylePoolParentP_Impl aTmp( rParent );
199*b1cdbd2cSJim Jagielski 		SvXMLAutoStylePoolParentP_Impl *pParent = 0;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 		SvXMLAutoStylePoolParentsP_Impl *pParents = pFamily->mpParentList;
202*b1cdbd2cSJim Jagielski 		if( pParents->Seek_Entry( &aTmp, &nPos ) )
203*b1cdbd2cSJim Jagielski 		{
204*b1cdbd2cSJim Jagielski 			pParent = pParents->GetObject( nPos );
205*b1cdbd2cSJim Jagielski 		}
206*b1cdbd2cSJim Jagielski 		else
207*b1cdbd2cSJim Jagielski 		{
208*b1cdbd2cSJim Jagielski 			pParent = new SvXMLAutoStylePoolParentP_Impl( rParent );
209*b1cdbd2cSJim Jagielski 			pParents->Insert( pParent );
210*b1cdbd2cSJim Jagielski 		}
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 		if( pParent->Add( pFamily, rProperties, rName, bDontSeek ) )
213*b1cdbd2cSJim Jagielski 		{
214*b1cdbd2cSJim Jagielski 			pFamily->mnCount++;
215*b1cdbd2cSJim Jagielski 			bRet = sal_True;
216*b1cdbd2cSJim Jagielski 		}
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 		if( bCache )
219*b1cdbd2cSJim Jagielski 		{
220*b1cdbd2cSJim Jagielski 			if( !pFamily->pCache )
221*b1cdbd2cSJim Jagielski 				pFamily->pCache = new SvXMLAutoStylePoolCache_Impl( 256, 256 );
222*b1cdbd2cSJim Jagielski 			if( pFamily->pCache->Count() < MAX_CACHE_SIZE )
223*b1cdbd2cSJim Jagielski 				pFamily->pCache->Insert( new OUString( rName ),
224*b1cdbd2cSJim Jagielski 										 pFamily->pCache->Count() );
225*b1cdbd2cSJim Jagielski 		}
226*b1cdbd2cSJim Jagielski 	}
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	return bRet;
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
AddNamed(const OUString & rName,sal_Int32 nFamily,const OUString & rParent,const::std::vector<XMLPropertyState> & rProperties)231*b1cdbd2cSJim Jagielski sal_Bool SvXMLAutoStylePoolP_Impl::AddNamed(const OUString& rName, sal_Int32 nFamily,
232*b1cdbd2cSJim Jagielski                 const OUString& rParent, const ::std::vector< XMLPropertyState >& rProperties )
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski     // get family and parent the same way as in Add()
235*b1cdbd2cSJim Jagielski     sal_Bool bRet(sal_False);
236*b1cdbd2cSJim Jagielski     sal_uLong nPos;
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski     XMLFamilyData_Impl *pFamily = 0;
239*b1cdbd2cSJim Jagielski     XMLFamilyData_Impl aTemporary( nFamily );
240*b1cdbd2cSJim Jagielski     if( maFamilyList.Seek_Entry( &aTemporary, &nPos ) )
241*b1cdbd2cSJim Jagielski     {
242*b1cdbd2cSJim Jagielski         pFamily = maFamilyList.GetObject( nPos );
243*b1cdbd2cSJim Jagielski     }
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     DBG_ASSERT( pFamily, "SvXMLAutoStylePool_Impl::Add: unknown family" );
246*b1cdbd2cSJim Jagielski     if( pFamily )
247*b1cdbd2cSJim Jagielski     {
248*b1cdbd2cSJim Jagielski         SvXMLAutoStylePoolParentP_Impl aTmp( rParent );
249*b1cdbd2cSJim Jagielski         SvXMLAutoStylePoolParentP_Impl *pParent = 0;
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski         SvXMLAutoStylePoolParentsP_Impl *pParents = pFamily->mpParentList;
252*b1cdbd2cSJim Jagielski         if( pParents->Seek_Entry( &aTmp, &nPos ) )
253*b1cdbd2cSJim Jagielski         {
254*b1cdbd2cSJim Jagielski             pParent = pParents->GetObject( nPos );
255*b1cdbd2cSJim Jagielski         }
256*b1cdbd2cSJim Jagielski         else
257*b1cdbd2cSJim Jagielski         {
258*b1cdbd2cSJim Jagielski             pParent = new SvXMLAutoStylePoolParentP_Impl( rParent );
259*b1cdbd2cSJim Jagielski             pParents->Insert( pParent );
260*b1cdbd2cSJim Jagielski         }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski         if( pParent->AddNamed( pFamily, rProperties, rName ) )
263*b1cdbd2cSJim Jagielski         {
264*b1cdbd2cSJim Jagielski             pFamily->mnCount++;
265*b1cdbd2cSJim Jagielski             bRet = sal_True;
266*b1cdbd2cSJim Jagielski         }
267*b1cdbd2cSJim Jagielski     }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski     return bRet;
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
AddToCache(sal_Int32 nFamily,const OUString & rParent)272*b1cdbd2cSJim Jagielski OUString SvXMLAutoStylePoolP_Impl::AddToCache( sal_Int32 nFamily,
273*b1cdbd2cSJim Jagielski 							 		    const OUString& rParent )
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = 0;
278*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTmp( nFamily );
279*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTmp, &nPos ) )
280*b1cdbd2cSJim Jagielski 	{
281*b1cdbd2cSJim Jagielski 		pFamily = maFamilyList.GetObject( nPos );
282*b1cdbd2cSJim Jagielski 	}
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFamily, "SvXMLAutoStylePool_Impl::Add: unknown family" );
285*b1cdbd2cSJim Jagielski 	if( pFamily )
286*b1cdbd2cSJim Jagielski 	{
287*b1cdbd2cSJim Jagielski 		if( !pFamily->pCache )
288*b1cdbd2cSJim Jagielski 			pFamily->pCache = new SvXMLAutoStylePoolCache_Impl( 256, 256 );
289*b1cdbd2cSJim Jagielski 		if( pFamily->pCache->Count() < MAX_CACHE_SIZE )
290*b1cdbd2cSJim Jagielski 			pFamily->pCache->Insert( new OUString( rParent ),
291*b1cdbd2cSJim Jagielski 									 pFamily->pCache->Count() );
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	return rParent;
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
297*b1cdbd2cSJim Jagielski //
298*b1cdbd2cSJim Jagielski // Search for a array of XMLPropertyState ( vector< XMLPropertyState > ) in list
299*b1cdbd2cSJim Jagielski //
300*b1cdbd2cSJim Jagielski 
Find(sal_Int32 nFamily,const OUString & rParent,const vector<XMLPropertyState> & rProperties) const301*b1cdbd2cSJim Jagielski OUString SvXMLAutoStylePoolP_Impl::Find( sal_Int32 nFamily,
302*b1cdbd2cSJim Jagielski 										 const OUString& rParent,
303*b1cdbd2cSJim Jagielski 										 const vector< XMLPropertyState >& rProperties ) const
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski 	OUString sName;
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
308*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTemporary( nFamily );
309*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = 0;
310*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTemporary, &nPos ) )
311*b1cdbd2cSJim Jagielski 	{
312*b1cdbd2cSJim Jagielski 		pFamily = maFamilyList.GetObject( nPos );
313*b1cdbd2cSJim Jagielski 	}
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFamily, "SvXMLAutoStylePool_Impl::Find: unknown family" );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 	if( pFamily )
318*b1cdbd2cSJim Jagielski 	{
319*b1cdbd2cSJim Jagielski 		SvXMLAutoStylePoolParentP_Impl aTmp( rParent );
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 		const SvXMLAutoStylePoolParentsP_Impl* pParents =
322*b1cdbd2cSJim Jagielski 			pFamily->mpParentList;
323*b1cdbd2cSJim Jagielski 		if( pParents->Seek_Entry( &aTmp, &nPos ) )
324*b1cdbd2cSJim Jagielski 			sName = pParents->GetObject( nPos )->Find( pFamily, rProperties );
325*b1cdbd2cSJim Jagielski 	}
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	return sName;
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
FindAndRemoveCached(sal_Int32 nFamily) const330*b1cdbd2cSJim Jagielski OUString SvXMLAutoStylePoolP_Impl::FindAndRemoveCached( sal_Int32 nFamily ) const
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski 	OUString sName;
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
335*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTmp( nFamily );
336*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = 0;
337*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTmp, &nPos ) )
338*b1cdbd2cSJim Jagielski 	{
339*b1cdbd2cSJim Jagielski 		pFamily = maFamilyList.GetObject( nPos );
340*b1cdbd2cSJim Jagielski 	}
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFamily, "SvXMLAutoStylePool_Impl::Find: unknown family" );
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 	if( pFamily )
345*b1cdbd2cSJim Jagielski 	{
346*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pFamily->pCache, "family doesn't have a cache" );
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 		// The cache may be empty already. This happens if it was filled
349*b1cdbd2cSJim Jagielski 		// completly.
350*b1cdbd2cSJim Jagielski 		if( pFamily->pCache && pFamily->pCache->Count() )
351*b1cdbd2cSJim Jagielski 		{
352*b1cdbd2cSJim Jagielski 			OUString *pName = pFamily->pCache->Remove( 0UL );
353*b1cdbd2cSJim Jagielski 			sName = *pName;
354*b1cdbd2cSJim Jagielski 			delete pName;
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 	}
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 	return sName;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
362*b1cdbd2cSJim Jagielski //
363*b1cdbd2cSJim Jagielski // export
364*b1cdbd2cSJim Jagielski //
365*b1cdbd2cSJim Jagielski 
exportXML(sal_Int32 nFamily,const uno::Reference<::com::sun::star::xml::sax::XDocumentHandler> &,const SvXMLUnitConverter &,const SvXMLNamespaceMap &,const SvXMLAutoStylePoolP * pAntiImpl) const366*b1cdbd2cSJim Jagielski void SvXMLAutoStylePoolP_Impl::exportXML(
367*b1cdbd2cSJim Jagielski 	   	sal_Int32 nFamily,
368*b1cdbd2cSJim Jagielski 		const uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > &,
369*b1cdbd2cSJim Jagielski 		const SvXMLUnitConverter&,
370*b1cdbd2cSJim Jagielski 		const SvXMLNamespaceMap&,
371*b1cdbd2cSJim Jagielski 		const SvXMLAutoStylePoolP *pAntiImpl) const
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski 	sal_uInt32 nCount = 0;
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	// Get list of parents for current family (nFamily)
376*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
377*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl aTmp( nFamily );
378*b1cdbd2cSJim Jagielski 	XMLFamilyData_Impl *pFamily = 0;
379*b1cdbd2cSJim Jagielski 	if( maFamilyList.Seek_Entry( &aTmp, &nPos ) )
380*b1cdbd2cSJim Jagielski 	{
381*b1cdbd2cSJim Jagielski 		pFamily = maFamilyList.GetObject( nPos );
382*b1cdbd2cSJim Jagielski 		nCount         = pFamily->mnCount;
383*b1cdbd2cSJim Jagielski 	}
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFamily,
386*b1cdbd2cSJim Jagielski 				"SvXMLAutoStylePool_Impl::exportXML: unknown family" );
387*b1cdbd2cSJim Jagielski 	if( pFamily && nCount > 0 )
388*b1cdbd2cSJim Jagielski 	{
389*b1cdbd2cSJim Jagielski 		/////////////////////////////////////////////////////////////////////////////////////
390*b1cdbd2cSJim Jagielski 		// create, initialize and fill helper-structure (SvXMLAutoStylePoolProperties_Impl)
391*b1cdbd2cSJim Jagielski 		// wich contains a parent-name and a SvXMLAutoStylePoolProperties_Impl
392*b1cdbd2cSJim Jagielski 		//
393*b1cdbd2cSJim Jagielski 		const SvXMLAutoStylePoolParentsP_Impl *pParents =
394*b1cdbd2cSJim Jagielski 			pFamily->mpParentList;
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 		SvXMLAutoStylePoolPExport_Impl* aExpStyles =
397*b1cdbd2cSJim Jagielski 			new SvXMLAutoStylePoolPExport_Impl[nCount];
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 		sal_uInt32 i;
400*b1cdbd2cSJim Jagielski 		for( i=0; i < nCount; i++ )
401*b1cdbd2cSJim Jagielski 		{
402*b1cdbd2cSJim Jagielski 			aExpStyles[i].mpParent = 0;
403*b1cdbd2cSJim Jagielski 			aExpStyles[i].mpProperties = 0;
404*b1cdbd2cSJim Jagielski 		}
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski 		sal_uInt32 nParents = pParents->Count();
407*b1cdbd2cSJim Jagielski 		for( i=0; i < nParents; i++ )
408*b1cdbd2cSJim Jagielski 		{
409*b1cdbd2cSJim Jagielski 			const SvXMLAutoStylePoolParentP_Impl* pParent =
410*b1cdbd2cSJim Jagielski 				pParents->GetObject( i );
411*b1cdbd2cSJim Jagielski 			sal_uInt32 nProperties = pParent->GetPropertiesList().Count();
412*b1cdbd2cSJim Jagielski 			for( sal_uInt32 j=0; j < nProperties; j++ )
413*b1cdbd2cSJim Jagielski 			{
414*b1cdbd2cSJim Jagielski 				const SvXMLAutoStylePoolPropertiesP_Impl *pProperties =
415*b1cdbd2cSJim Jagielski 					pParent->GetPropertiesList().GetObject( j );
416*b1cdbd2cSJim Jagielski 				nPos = pProperties->GetPos();
417*b1cdbd2cSJim Jagielski 				DBG_ASSERT( nPos < nCount,
418*b1cdbd2cSJim Jagielski 						"SvXMLAutoStylePool_Impl::exportXML: wrong position" );
419*b1cdbd2cSJim Jagielski 				if( nPos < nCount )
420*b1cdbd2cSJim Jagielski 				{
421*b1cdbd2cSJim Jagielski 					DBG_ASSERT( !aExpStyles[nPos].mpProperties,
422*b1cdbd2cSJim Jagielski 						"SvXMLAutoStylePool_Impl::exportXML: double position" );
423*b1cdbd2cSJim Jagielski 					aExpStyles[nPos].mpProperties = pProperties;
424*b1cdbd2cSJim Jagielski 					aExpStyles[nPos].mpParent = &pParent->GetParent();
425*b1cdbd2cSJim Jagielski 				}
426*b1cdbd2cSJim Jagielski 			}
427*b1cdbd2cSJim Jagielski 		}
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 		/////////////////////////////////////////////////////////////////////////////////////
430*b1cdbd2cSJim Jagielski 		//
431*b1cdbd2cSJim Jagielski 		// create string to export for each XML-style. That means for each property-list
432*b1cdbd2cSJim Jagielski 		//
433*b1cdbd2cSJim Jagielski 		OUString aStrFamilyName = pFamily->maStrFamilyName;
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 		for( i=0; i<nCount; i++ )
436*b1cdbd2cSJim Jagielski 		{
437*b1cdbd2cSJim Jagielski 			DBG_ASSERT( aExpStyles[i].mpProperties,
438*b1cdbd2cSJim Jagielski 						"SvXMLAutoStylePool_Impl::exportXML: empty position" );
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 			if( aExpStyles[i].mpProperties )
441*b1cdbd2cSJim Jagielski 			{
442*b1cdbd2cSJim Jagielski                 GetExport().AddAttribute(
443*b1cdbd2cSJim Jagielski                     XML_NAMESPACE_STYLE, XML_NAME,
444*b1cdbd2cSJim Jagielski                     aExpStyles[i].mpProperties->GetName() );
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 				if( pFamily->bAsFamily )
447*b1cdbd2cSJim Jagielski 				{
448*b1cdbd2cSJim Jagielski                     GetExport().AddAttribute(
449*b1cdbd2cSJim Jagielski                         XML_NAMESPACE_STYLE, XML_FAMILY, aStrFamilyName );
450*b1cdbd2cSJim Jagielski 				}
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 				if( aExpStyles[i].mpParent->getLength() )
453*b1cdbd2cSJim Jagielski 				{
454*b1cdbd2cSJim Jagielski                     GetExport().AddAttribute(
455*b1cdbd2cSJim Jagielski                         XML_NAMESPACE_STYLE, XML_PARENT_STYLE_NAME,
456*b1cdbd2cSJim Jagielski                     	GetExport().EncodeStyleName(
457*b1cdbd2cSJim Jagielski 							*aExpStyles[i].mpParent ) );
458*b1cdbd2cSJim Jagielski 				}
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski                 OUString sName;
461*b1cdbd2cSJim Jagielski 				if( pFamily->bAsFamily )
462*b1cdbd2cSJim Jagielski 					sName = GetXMLToken(XML_STYLE);
463*b1cdbd2cSJim Jagielski 				else
464*b1cdbd2cSJim Jagielski 					sName = pFamily->maStrFamilyName;
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski 				pAntiImpl->exportStyleAttributes(
467*b1cdbd2cSJim Jagielski                     GetExport().GetAttrList(),
468*b1cdbd2cSJim Jagielski                     nFamily,
469*b1cdbd2cSJim Jagielski                     aExpStyles[i].mpProperties->GetProperties(),
470*b1cdbd2cSJim Jagielski                     *pFamily->mxMapper.get()
471*b1cdbd2cSJim Jagielski 						, GetExport().GetMM100UnitConverter(),
472*b1cdbd2cSJim Jagielski                         GetExport().GetNamespaceMap()
473*b1cdbd2cSJim Jagielski                     );
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski                 SvXMLElementExport aElem( GetExport(),
476*b1cdbd2cSJim Jagielski                                           XML_NAMESPACE_STYLE, sName,
477*b1cdbd2cSJim Jagielski                                           sal_True, sal_True );
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 				sal_Int32 nStart(-1);
480*b1cdbd2cSJim Jagielski 				sal_Int32 nEnd(-1);
481*b1cdbd2cSJim Jagielski 				if (nFamily == XML_STYLE_FAMILY_PAGE_MASTER)
482*b1cdbd2cSJim Jagielski 				{
483*b1cdbd2cSJim Jagielski 					nStart = 0;
484*b1cdbd2cSJim Jagielski 					sal_Int32 nIndex = 0;
485*b1cdbd2cSJim Jagielski 					UniReference< XMLPropertySetMapper > aPropMapper =
486*b1cdbd2cSJim Jagielski 						pFamily->mxMapper->getPropertySetMapper();
487*b1cdbd2cSJim Jagielski 					sal_Int16 nContextID;
488*b1cdbd2cSJim Jagielski 					while(nIndex < aPropMapper->GetEntryCount() && nEnd == -1)
489*b1cdbd2cSJim Jagielski 					{
490*b1cdbd2cSJim Jagielski 						nContextID = aPropMapper->GetEntryContextId( nIndex );
491*b1cdbd2cSJim Jagielski 						if (nContextID && ((nContextID & CTF_PM_FLAGMASK) != XML_PM_CTF_START))
492*b1cdbd2cSJim Jagielski 							nEnd = nIndex;
493*b1cdbd2cSJim Jagielski 						nIndex++;
494*b1cdbd2cSJim Jagielski 					}
495*b1cdbd2cSJim Jagielski 					if (nEnd == -1)
496*b1cdbd2cSJim Jagielski 						nEnd = nIndex;
497*b1cdbd2cSJim Jagielski 				}
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski 				pFamily->mxMapper->exportXML(
500*b1cdbd2cSJim Jagielski                     GetExport(),
501*b1cdbd2cSJim Jagielski                     aExpStyles[i].mpProperties->GetProperties(),
502*b1cdbd2cSJim Jagielski                     nStart, nEnd, XML_EXPORT_FLAG_IGN_WS );
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 				pAntiImpl->exportStyleContent(
505*b1cdbd2cSJim Jagielski                     GetExport().GetDocHandler(),
506*b1cdbd2cSJim Jagielski                     nFamily,
507*b1cdbd2cSJim Jagielski                     aExpStyles[i].mpProperties->GetProperties(),
508*b1cdbd2cSJim Jagielski                     *pFamily->mxMapper.get(),
509*b1cdbd2cSJim Jagielski                     GetExport().GetMM100UnitConverter(),
510*b1cdbd2cSJim Jagielski                     GetExport().GetNamespaceMap()
511*b1cdbd2cSJim Jagielski                     );
512*b1cdbd2cSJim Jagielski 			}
513*b1cdbd2cSJim Jagielski 		}
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 		delete[] aExpStyles;
516*b1cdbd2cSJim Jagielski 	}
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
ClearEntries()519*b1cdbd2cSJim Jagielski void SvXMLAutoStylePoolP_Impl::ClearEntries()
520*b1cdbd2cSJim Jagielski {
521*b1cdbd2cSJim Jagielski 	for(sal_uInt32 a = 0L; a < maFamilyList.Count(); a++)
522*b1cdbd2cSJim Jagielski 		maFamilyList[a]->ClearEntries();
523*b1cdbd2cSJim Jagielski }
524