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