xref: /trunk/main/xmloff/source/style/xmlstyle.cxx (revision 63bba73c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <com/sun/star/xml/sax/SAXParseException.hpp>
27 #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
28 #include <com/sun/star/xml/sax/SAXException.hpp>
29 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
30 #include <com/sun/star/xml/sax/XAttributeList.hpp>
31 #include <com/sun/star/xml/sax/XLocator.hpp>
32 #include <com/sun/star/container/XNameContainer.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
35 #include <com/sun/star/style/XAutoStylesSupplier.hpp>
36 #include <com/sun/star/style/XAutoStyleFamily.hpp>
37 #ifndef _XMLOFF_PAGEMASTERPROPMAPPER_HXX
38 #include "PageMasterPropMapper.hxx"
39 #endif
40 #include <tools/debug.hxx>
41 #include <tools/list.hxx>
42 #include <svl/cntnrsrt.hxx>
43 #include <svl/itemset.hxx>
44 #include <xmloff/nmspmap.hxx>
45 #include "xmloff/xmlnmspe.hxx"
46 #include <xmloff/xmltoken.hxx>
47 
48 #ifndef _XMLOFF_FAMILIES_HXX
49 #include <xmloff/families.hxx>
50 #endif
51 #include <xmloff/xmlimp.hxx>
52 #include <xmloff/xmlnumi.hxx>
53 #include <xmloff/xmlimppr.hxx>
54 #include <xmloff/xmlstyle.hxx>
55 #ifndef _XMLOFF_TXTSTYLI_HXX
56 #include <xmloff/txtstyli.hxx>
57 #endif
58 #ifndef _XMLOFF_TXTPRMAP_HXX
59 #include <xmloff/txtprmap.hxx>
60 #endif
61 #include <xmloff/xmlnumfi.hxx>
62 #include "XMLChartStyleContext.hxx"
63 #include "XMLChartPropertySetMapper.hxx"
64 #include <xmloff/XMLShapeStyleContext.hxx>
65 #include "FillStyleContext.hxx"
66 #include "XMLFootnoteConfigurationImportContext.hxx"
67 #include "XMLIndexBibliographyConfigurationContext.hxx"
68 #include "XMLLineNumberingImportContext.hxx"
69 #include "PageMasterImportContext.hxx"
70 #include "PageMasterImportPropMapper.hxx"
71 
72 using ::rtl::OUString;
73 using ::rtl::OUStringBuffer;
74 
75 using namespace ::com::sun::star;
76 using namespace ::com::sun::star::uno;
77 using namespace ::com::sun::star::container;
78 using namespace ::com::sun::star::style;
79 using namespace ::xmloff::token;
80 
81 // ---------------------------------------------------------------------
82 
83 static __FAR_DATA SvXMLTokenMapEntry aStyleStylesElemTokenMap[] =
84 {
85 	{ XML_NAMESPACE_STYLE,	XML_STYLE,			XML_TOK_STYLE_STYLE                },
86 	{ XML_NAMESPACE_STYLE,	XML_PAGE_LAYOUT,	XML_TOK_STYLE_PAGE_MASTER          },
87 	{ XML_NAMESPACE_TEXT,	XML_LIST_STYLE, 	XML_TOK_TEXT_LIST_STYLE            },
88 	{ XML_NAMESPACE_TEXT,	XML_OUTLINE_STYLE,	XML_TOK_TEXT_OUTLINE               },
89 	{ XML_NAMESPACE_STYLE,	XML_DEFAULT_STYLE,	XML_TOK_STYLE_DEFAULT_STYLE        },
90 	{ XML_NAMESPACE_DRAW,	XML_GRADIENT,		XML_TOK_STYLES_GRADIENTSTYLES      },
91 	{ XML_NAMESPACE_DRAW,	XML_HATCH,			XML_TOK_STYLES_HATCHSTYLES         },
92 	{ XML_NAMESPACE_DRAW,	XML_FILL_IMAGE,	    XML_TOK_STYLES_BITMAPSTYLES        },
93 	{ XML_NAMESPACE_DRAW,	XML_OPACITY,		XML_TOK_STYLES_TRANSGRADIENTSTYLES },
94 	{ XML_NAMESPACE_DRAW,	XML_MARKER,		    XML_TOK_STYLES_MARKERSTYLES        },
95 	{ XML_NAMESPACE_DRAW,	XML_STROKE_DASH,	XML_TOK_STYLES_DASHSTYLES        },
96 	{ XML_NAMESPACE_TEXT,	XML_NOTES_CONFIGURATION,    XML_TOK_TEXT_NOTE_CONFIG },
97 	{ XML_NAMESPACE_TEXT,	XML_BIBLIOGRAPHY_CONFIGURATION, XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG },
98 	{ XML_NAMESPACE_TEXT,   XML_LINENUMBERING_CONFIGURATION,XML_TOK_TEXT_LINENUMBERING_CONFIG },
99 	{ XML_NAMESPACE_STYLE,	XML_DEFAULT_PAGE_LAYOUT,	XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT        },
100 	XML_TOKEN_MAP_END
101 };
102 
GetStyleStylesElemTokenMap()103 const SvXMLTokenMap& SvXMLStylesContext::GetStyleStylesElemTokenMap()
104 {
105 	if( !mpStyleStylesElemTokenMap )
106 		mpStyleStylesElemTokenMap =
107 			new SvXMLTokenMap( aStyleStylesElemTokenMap );
108 
109 	return *mpStyleStylesElemTokenMap;
110 }
111 
112 // ---------------------------------------------------------------------
113 
SetAttribute(sal_uInt16 nPrefixKey,const OUString & rLocalName,const OUString & rValue)114 void SvXMLStyleContext::SetAttribute( sal_uInt16 nPrefixKey,
115 									  const OUString& rLocalName,
116 							   		  const OUString& rValue )
117 {
118 	// TODO: use a map here
119 	if( XML_NAMESPACE_STYLE == nPrefixKey )
120 	{
121 		if( IsXMLToken( rLocalName, XML_FAMILY ) )
122 		{
123 			if( IsXMLToken( rValue, XML_PARAGRAPH ) )
124 				mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_PARA;
125 			else if( IsXMLToken( rValue, XML_TEXT ) )
126 				mnFamily = (sal_uInt16)SFX_STYLE_FAMILY_CHAR;
127 		}
128 		else if( IsXMLToken( rLocalName, XML_NAME ) )
129 		{
130 			maName = rValue;
131 		}
132 		else if( IsXMLToken( rLocalName, XML_DISPLAY_NAME ) )
133 		{
134 			maDisplayName = rValue;
135 		}
136 		else if( IsXMLToken( rLocalName, XML_PARENT_STYLE_NAME ) )
137 		{
138             maParentName = rValue;
139 		}
140 		else if( IsXMLToken( rLocalName, XML_NEXT_STYLE_NAME ) )
141 		{
142 			maFollow = rValue;
143 		}
144 		else if( IsXMLToken( rLocalName, XML_HELP_FILE_NAME ) )
145 		{
146 			maHelpFile = rValue;
147 		}
148 		else if( IsXMLToken( rLocalName, XML_HELP_ID ) )
149 		{
150 			sal_Int32 nTmp = rValue.toInt32();
151 			mnHelpId =
152 				(nTmp < 0L) ? 0U : ( (nTmp > USHRT_MAX) ? USHRT_MAX
153 									                    : (sal_uInt16)nTmp );
154 		}
155 	}
156 }
157 
158 TYPEINIT1( SvXMLStyleContext, SvXMLImportContext );
159 
SvXMLStyleContext(SvXMLImport & rImp,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &,sal_uInt16 nFam,sal_Bool bDefault)160 SvXMLStyleContext::SvXMLStyleContext(
161 		SvXMLImport& rImp, sal_uInt16 nPrfx,
162 		const OUString& rLName,
163 		const uno::Reference< xml::sax::XAttributeList >&,
164 		sal_uInt16 nFam, sal_Bool bDefault ) :
165 	SvXMLImportContext( rImp, nPrfx, rLName ),
166 	mnHelpId( UCHAR_MAX ),
167 	mnFamily( nFam ),
168 	mbValid( sal_True ),
169 	mbNew( sal_True ),
170 	mbDefaultStyle( bDefault )
171 {
172 }
173 
~SvXMLStyleContext()174 SvXMLStyleContext::~SvXMLStyleContext()
175 {
176 }
177 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> &)178 SvXMLImportContext *SvXMLStyleContext::CreateChildContext( sal_uInt16 nPrefix,
179 											const OUString& rLocalName,
180 											const uno::Reference< xml::sax::XAttributeList > & )
181 {
182 	return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );;
183 }
184 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)185 void SvXMLStyleContext::StartElement( const uno::Reference< xml::sax::XAttributeList > & xAttrList )
186 {
187 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
188 	for( sal_Int16 i=0; i < nAttrCount; i++ )
189 	{
190 		const OUString& rAttrName = xAttrList->getNameByIndex( i );
191 		OUString aLocalName;
192 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,	&aLocalName );
193 		const OUString& rValue = xAttrList->getValueByIndex( i );
194 
195 		SetAttribute( nPrefix, aLocalName, rValue );
196 	}
197 }
198 
SetDefaults()199 void SvXMLStyleContext::SetDefaults()
200 {
201 }
202 
CreateAndInsert(sal_Bool)203 void SvXMLStyleContext::CreateAndInsert( sal_Bool /*bOverwrite*/ )
204 {
205 }
206 
CreateAndInsertLate(sal_Bool)207 void SvXMLStyleContext::CreateAndInsertLate( sal_Bool /*bOverwrite*/ )
208 {
209 }
210 
Finish(sal_Bool)211 void SvXMLStyleContext::Finish( sal_Bool /*bOverwrite*/ )
212 {
213 }
214 
IsTransient() const215 sal_Bool SvXMLStyleContext::IsTransient() const
216 {
217 	return sal_False;
218 }
219 
220 // ---------------------------------------------------------------------
221 
222 class SvXMLStyleIndex_Impl
223 {
224 	OUString 			  sName;
225 	sal_uInt16 			  nFamily;
226 	const SvXMLStyleContext *pStyle;
227 
228 public:
229 
SvXMLStyleIndex_Impl(sal_uInt16 nFam,const OUString & rName)230 	SvXMLStyleIndex_Impl( sal_uInt16 nFam, const OUString& rName ) :
231 		sName( rName ),
232 		nFamily( nFam ),
233 		pStyle ( 0 )
234 	{
235 	}
236 
SvXMLStyleIndex_Impl(const SvXMLStyleContext * pStl)237 	SvXMLStyleIndex_Impl( const SvXMLStyleContext *pStl ) :
238 		sName( pStl->GetName() ),
239 		nFamily( pStl->GetFamily() ),
240 		pStyle ( pStl )
241 	{
242 	}
243 
GetName() const244 	const OUString& GetName() const { return sName; }
GetFamily() const245 	sal_uInt16 GetFamily() const { return nFamily; }
GetStyle() const246 	const SvXMLStyleContext *GetStyle() const { return pStyle; }
247 };
248 
SvXMLStyleIndexCmp_Impl(const SvXMLStyleIndex_Impl & r1,const SvXMLStyleIndex_Impl & r2)249 int SvXMLStyleIndexCmp_Impl( const SvXMLStyleIndex_Impl& r1,
250 							  const SvXMLStyleIndex_Impl& r2 )
251 {
252 	int nRet;
253 	if( (sal_uInt16)r1.GetFamily() < (sal_uInt16)r2.GetFamily() )
254 		nRet = -1;
255 	else if( (sal_uInt16)r1.GetFamily() > (sal_uInt16)r2.GetFamily() )
256 		nRet = 1;
257 	else
258 		nRet = (int)r1.GetName().compareTo( r2.GetName() );
259 
260 	return nRet;
261 }
262 
263 // ---------------------------------------------------------------------
264 
265 typedef SvXMLStyleContext *SvXMLStyleContextPtr;
266 DECLARE_LIST( SvXMLStyleContexts_Impl, SvXMLStyleContextPtr )
267 
268 DECLARE_CONTAINER_SORT_DEL( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl )
269 IMPL_CONTAINER_SORT( SvXMLStyleIndices_Impl, SvXMLStyleIndex_Impl,
270 				  	 SvXMLStyleIndexCmp_Impl )
271 
272 
273 class SvXMLStylesContext_Impl
274 {
275 	SvXMLStyleContexts_Impl	aStyles;
276 	SvXMLStyleIndices_Impl	*pIndices;
277     sal_Bool bAutomaticStyle;
278 
279 #ifdef DBG_UTIL
280 	sal_uInt32 nIndexCreated;
281 #endif
282 
FlushIndex()283 	void FlushIndex() { delete pIndices; pIndices = 0; }
284 
285 public:
286 	SvXMLStylesContext_Impl( sal_Bool bAuto );
287 	~SvXMLStylesContext_Impl();
288 
GetStyleCount() const289 	sal_uInt32 GetStyleCount() const { return aStyles.Count(); }
290 
GetStyle(sal_uInt32 i) const291 	const SvXMLStyleContext *GetStyle( sal_uInt32 i ) const
292 	{
293 		return i < aStyles.Count() ? aStyles.GetObject(i) : 0;
294 	}
295 
GetStyle(sal_uInt32 i)296 	SvXMLStyleContext *GetStyle( sal_uInt32 i )
297 	{
298 		return i < aStyles.Count() ? aStyles.GetObject(i) : 0;
299 	}
300 
301 	inline void AddStyle( SvXMLStyleContext *pStyle );
302 	void Clear();
303 
304 	const SvXMLStyleContext *FindStyleChildContext( sal_uInt16 nFamily,
305                             const OUString& rName, sal_Bool bCreateIndex ) const;
IsAutomaticStyle() const306     sal_Bool IsAutomaticStyle() const { return bAutomaticStyle; }
307 };
308 
SvXMLStylesContext_Impl(sal_Bool bAuto)309 SvXMLStylesContext_Impl::SvXMLStylesContext_Impl( sal_Bool bAuto ) :
310     aStyles( 20, 5 ),
311 	pIndices( 0 ),
312     bAutomaticStyle( bAuto )
313 #ifdef DBG_UTIL
314 ,   nIndexCreated( 0 )
315 #endif
316 {}
317 
~SvXMLStylesContext_Impl()318 SvXMLStylesContext_Impl::~SvXMLStylesContext_Impl()
319 {
320 	delete pIndices;
321 
322 	while( aStyles.Count() )
323 	{
324 		SvXMLStyleContext *pStyle = aStyles.GetObject(0);
325 		aStyles.Remove( 0UL );
326 		pStyle->ReleaseRef();
327 	}
328 }
329 
AddStyle(SvXMLStyleContext * pStyle)330 inline void SvXMLStylesContext_Impl::AddStyle( SvXMLStyleContext *pStyle )
331 {
332 	aStyles.Insert( pStyle, aStyles.Count() );
333 	pStyle->AddRef();
334 
335 	FlushIndex();
336 }
337 
Clear()338 void SvXMLStylesContext_Impl::Clear()
339 {
340 	FlushIndex();
341 
342 	while( aStyles.Count() )
343 	{
344 		SvXMLStyleContext *pStyle = aStyles.GetObject(0);
345 		aStyles.Remove( 0UL );
346 		pStyle->ReleaseRef();
347 	}
348 }
349 
FindStyleChildContext(sal_uInt16 nFamily,const OUString & rName,sal_Bool bCreateIndex) const350 const SvXMLStyleContext *SvXMLStylesContext_Impl::FindStyleChildContext(
351 								  sal_uInt16 nFamily,
352 								  const OUString& rName,
353 								  sal_Bool bCreateIndex ) const
354 {
355 	const SvXMLStyleContext *pStyle = 0;
356 
357 	if( !pIndices && bCreateIndex && aStyles.Count() > 0 )
358 	{
359 #ifdef DBG_UTIL
360 		DBG_ASSERT( 0==nIndexCreated,
361 					"Performance warning: sdbcx::Index created multiple times" );
362 #endif
363 		((SvXMLStylesContext_Impl *)this)->pIndices =
364 			new SvXMLStyleIndices_Impl(
365                 sal::static_int_cast< sal_uInt16 >(aStyles.Count()), 5 );
366 		for( sal_uInt32 i=0; i < aStyles.Count(); i++ )
367 		{
368 			SvXMLStyleIndex_Impl* pStyleIndex = new SvXMLStyleIndex_Impl( aStyles.GetObject(i));
369 			if (!pIndices->Insert( pStyleIndex ))
370 			{
371 				DBG_ERROR("Here is a double Style");
372 				delete pStyleIndex;
373 			}
374 		}
375 #ifdef DBG_UTIL
376 		((SvXMLStylesContext_Impl *)this)->nIndexCreated++;
377 #endif
378 	}
379 
380 	if( pIndices )
381 	{
382 		SvXMLStyleIndex_Impl aIndex( nFamily, rName );
383 		sal_uLong nPos = 0;
384 		if( pIndices->Seek_Entry( &aIndex, &nPos ) )
385 			pStyle = pIndices->GetObject( nPos )->GetStyle();
386 	}
387 	else
388 	{
389 		for( sal_uInt32 i=0; !pStyle && i < aStyles.Count(); i++ )
390 		{
391 			const SvXMLStyleContext *pS = aStyles.GetObject( i );
392 			if( pS->GetFamily() == nFamily &&
393 				pS->GetName() == rName )
394 				pStyle = pS;
395 		}
396 	}
397 	return pStyle;
398 }
399 
400 // ---------------------------------------------------------------------
401 
402 TYPEINIT1( SvXMLStylesContext, SvXMLImportContext );
403 
GetStyleCount() const404 sal_uInt32 SvXMLStylesContext::GetStyleCount() const
405 {
406 	return mpImpl->GetStyleCount();
407 }
408 
GetStyle(sal_uInt32 i)409 SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i )
410 {
411 	return mpImpl->GetStyle( i );
412 }
413 
GetStyle(sal_uInt32 i) const414 const SvXMLStyleContext *SvXMLStylesContext::GetStyle( sal_uInt32 i ) const
415 {
416 	return mpImpl->GetStyle( i );
417 }
418 
IsAutomaticStyle() const419 sal_Bool SvXMLStylesContext::IsAutomaticStyle() const
420 {
421     return mpImpl->IsAutomaticStyle();
422 }
423 
CreateStyleChildContext(sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)424 SvXMLStyleContext *SvXMLStylesContext::CreateStyleChildContext(
425 		sal_uInt16 p_nPrefix,
426 		const OUString& rLocalName,
427 		const uno::Reference< xml::sax::XAttributeList > & xAttrList )
428 {
429 	SvXMLStyleContext *pStyle = NULL;
430 
431 	if(GetImport().GetDataStylesImport())
432 	{
433 		pStyle = GetImport().GetDataStylesImport()->CreateChildContext(GetImport(), p_nPrefix,
434 									   		rLocalName, xAttrList, *this);
435 	}
436 
437 	if (!pStyle)
438 	{
439 		const SvXMLTokenMap& rTokenMap = GetStyleStylesElemTokenMap();
440 		sal_uInt16 nToken = rTokenMap.Get( p_nPrefix, rLocalName );
441 		switch( nToken  )
442 		{
443 			case XML_TOK_STYLE_STYLE:
444 			case XML_TOK_STYLE_DEFAULT_STYLE:
445 			{
446 				sal_uInt16 nFamily = 0;
447 				sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
448 				for( sal_Int16 i=0; i < nAttrCount; i++ )
449 				{
450 					const OUString& rAttrName = xAttrList->getNameByIndex( i );
451 					OUString aLocalName;
452 					sal_uInt16 nPrefix =
453 						GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
454 																	&aLocalName );
455 					if( XML_NAMESPACE_STYLE == nPrefix &&
456 						IsXMLToken( aLocalName, XML_FAMILY ) )
457 					{
458 						const OUString& rValue = xAttrList->getValueByIndex( i );
459 						nFamily = GetFamily( rValue );
460 						break;
461 					}
462 				}
463 				pStyle = XML_TOK_STYLE_STYLE==nToken
464 					? CreateStyleStyleChildContext( nFamily, p_nPrefix,
465 													rLocalName, xAttrList )
466 					: CreateDefaultStyleStyleChildContext( nFamily, p_nPrefix,
467 													rLocalName, xAttrList );
468 			}
469 			break;
470 			case XML_TOK_STYLE_PAGE_MASTER:
471 			case XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT:
472 			{
473 				//there is not page family in odf now, so I specify one for it
474 				sal_Bool bDefaultStyle  = XML_TOK_STYLE_DEFAULT_PAGE_LAYOUT == nToken
475 					? sal_True: sal_False;
476 				pStyle = new PageStyleContext( GetImport(), p_nPrefix,
477 													rLocalName, xAttrList, *this, bDefaultStyle );
478 			}
479 			break;
480 			case XML_TOK_TEXT_LIST_STYLE:
481 				pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
482 													rLocalName, xAttrList );
483 				break;
484 			case XML_TOK_TEXT_OUTLINE:
485 				pStyle = new SvxXMLListStyleContext( GetImport(), p_nPrefix,
486 													rLocalName, xAttrList, sal_True );
487 				break;
488 			case XML_TOK_TEXT_NOTE_CONFIG:
489 #ifndef SVX_LIGHT
490 				pStyle = new XMLFootnoteConfigurationImportContext(GetImport(),
491 																   p_nPrefix,
492 																   rLocalName,
493 																   xAttrList);
494 #else
495 				// create default context to skip content
496 				pStyle = new SvXMLStyleContext( GetImport(), nPrefix, rLocalName, xAttrList );
497 #endif // #ifndef SVX_LIGHT
498 				break;
499 
500 			case XML_TOK_TEXT_BIBLIOGRAPHY_CONFIG:
501 #ifndef SVX_LIGHT
502 				pStyle = new XMLIndexBibliographyConfigurationContext(
503 					GetImport(), p_nPrefix, rLocalName, xAttrList);
504 #else
505 				// create default context to skip content
506 				pStyle = new SvXMLStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
507 #endif // #ifndef SVX_LIGHT
508 				break;
509 
510 			case XML_TOK_TEXT_LINENUMBERING_CONFIG:
511 #ifndef SVX_LIGHT
512 				pStyle = new XMLLineNumberingImportContext(
513 					GetImport(), p_nPrefix, rLocalName, xAttrList);
514 #else
515 				// create default context to skip content
516 				pStyle = new SvXMLStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
517 #endif // #ifndef SVX_LIGHT
518 				break;
519 
520 			//
521 			// FillStyles
522 			//
523 			case XML_TOK_STYLES_GRADIENTSTYLES:
524 			{
525 				pStyle = new XMLGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
526 				break;
527 			}
528 			case XML_TOK_STYLES_HATCHSTYLES:
529 			{
530 				pStyle = new XMLHatchStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
531 				break;
532 			}
533 			case XML_TOK_STYLES_BITMAPSTYLES:
534 			{
535 				pStyle = new XMLBitmapStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
536 				break;
537 			}
538 			case XML_TOK_STYLES_TRANSGRADIENTSTYLES:
539 			{
540 				pStyle = new XMLTransGradientStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
541 				break;
542 			}
543 			case XML_TOK_STYLES_MARKERSTYLES:
544 			{
545 				pStyle = new XMLMarkerStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
546 				break;
547 			}
548 			case XML_TOK_STYLES_DASHSTYLES:
549 			{
550 				pStyle = new XMLDashStyleContext( GetImport(), p_nPrefix, rLocalName, xAttrList );
551 				break;
552 			}
553 		}
554 	}
555 
556 	return pStyle;
557 }
558 
CreateStyleStyleChildContext(sal_uInt16 nFamily,sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)559 SvXMLStyleContext *SvXMLStylesContext::CreateStyleStyleChildContext(
560 		sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
561 		const uno::Reference< xml::sax::XAttributeList > & xAttrList )
562 {
563 	SvXMLStyleContext *pStyle = 0;
564 
565 	switch( nFamily )
566 	{
567 		case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
568 		case XML_STYLE_FAMILY_TEXT_TEXT:
569 		case XML_STYLE_FAMILY_TEXT_SECTION:
570 			pStyle = new XMLTextStyleContext( GetImport(), nPrefix, rLocalName,
571 											  xAttrList, *this, nFamily );
572 			break;
573 
574 		case XML_STYLE_FAMILY_TEXT_RUBY:
575 			pStyle = new XMLPropStyleContext( GetImport(), nPrefix, rLocalName,
576 											  xAttrList, *this, nFamily );
577 			break;
578 		case XML_STYLE_FAMILY_SCH_CHART_ID:
579 			pStyle = new XMLChartStyleContext( GetImport(), nPrefix, rLocalName,
580 											   xAttrList, *this, nFamily );
581 			break;
582 
583 		case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
584 		case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
585 		case XML_STYLE_FAMILY_SD_POOL_ID:
586 			pStyle = new XMLShapeStyleContext( GetImport(), nPrefix, rLocalName,
587 											   xAttrList, *this, nFamily );
588 	}
589 
590 	return pStyle;
591 }
592 
CreateDefaultStyleStyleChildContext(sal_uInt16,sal_uInt16,const OUString &,const uno::Reference<xml::sax::XAttributeList> &)593 SvXMLStyleContext *SvXMLStylesContext::CreateDefaultStyleStyleChildContext(
594 		sal_uInt16 /*nFamily*/, sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/,
595 		const uno::Reference< xml::sax::XAttributeList > & )
596 {
597 	return 0;
598 }
599 
600 
InsertStyleFamily(sal_uInt16) const601 sal_Bool SvXMLStylesContext::InsertStyleFamily( sal_uInt16 ) const
602 {
603 	return sal_True;
604 }
605 
GetFamily(const::rtl::OUString & rValue) const606 sal_uInt16 SvXMLStylesContext::GetFamily(
607 		const ::rtl::OUString& rValue ) const
608 {
609 	sal_uInt16 nFamily = 0U;
610 	if( IsXMLToken( rValue, XML_PARAGRAPH ) )
611 	{
612 		nFamily = XML_STYLE_FAMILY_TEXT_PARAGRAPH;
613 	}
614 	else if( IsXMLToken( rValue, XML_TEXT ) )
615 	{
616 		nFamily = XML_STYLE_FAMILY_TEXT_TEXT;
617 	}
618 	else if( IsXMLToken( rValue, XML_DATA_STYLE ) )
619 	{
620 		nFamily = XML_STYLE_FAMILY_DATA_STYLE;
621 	}
622 	else if ( IsXMLToken( rValue, XML_SECTION ) )
623 	{
624 		nFamily = XML_STYLE_FAMILY_TEXT_SECTION;
625 	}
626 	else if( IsXMLToken( rValue, XML_TABLE ) )
627 	{
628         nFamily = XML_STYLE_FAMILY_TABLE_TABLE;
629     }
630     else if( IsXMLToken( rValue, XML_TABLE_COLUMN ) )
631         nFamily = XML_STYLE_FAMILY_TABLE_COLUMN;
632     else if( IsXMLToken( rValue, XML_TABLE_ROW ) )
633         nFamily = XML_STYLE_FAMILY_TABLE_ROW;
634     else if( IsXMLToken( rValue, XML_TABLE_CELL ) )
635         nFamily = XML_STYLE_FAMILY_TABLE_CELL;
636 	else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)))
637 	{
638 		nFamily = XML_STYLE_FAMILY_SD_GRAPHICS_ID;
639 	}
640 	else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)))
641 	{
642 		nFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
643 	}
644 	else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_POOL_NAME)))
645 	{
646 		nFamily = XML_STYLE_FAMILY_SD_POOL_ID;
647 	}
648 	else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(XML_STYLE_FAMILY_SD_DRAWINGPAGE_NAME)))
649 	{
650 		nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID;
651 	}
652 	else if( rValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( XML_STYLE_FAMILY_SCH_CHART_NAME )))
653 	{
654 		nFamily = XML_STYLE_FAMILY_SCH_CHART_ID;
655 	}
656 	else if ( IsXMLToken( rValue, XML_RUBY ) )
657 	{
658 		nFamily = XML_STYLE_FAMILY_TEXT_RUBY;
659 	}
660 
661 	return nFamily;
662 }
663 
GetImportPropertyMapper(sal_uInt16 nFamily) const664 UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportPropertyMapper(
665 						sal_uInt16 nFamily ) const
666 {
667 	UniReference < SvXMLImportPropertyMapper > xMapper;
668 
669 	switch( nFamily )
670 	{
671 	case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
672 		if( !mxParaImpPropMapper.is() )
673 		{
674 			SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
675 			pThis->mxParaImpPropMapper =
676 				pThis->GetImport().GetTextImport()
677 					 ->GetParaImportPropertySetMapper();
678 		}
679 		xMapper = mxParaImpPropMapper;
680 		break;
681 	case XML_STYLE_FAMILY_TEXT_TEXT:
682 		if( !mxTextImpPropMapper.is() )
683 		{
684 			SvXMLStylesContext * pThis = (SvXMLStylesContext *)this;
685 			pThis->mxTextImpPropMapper =
686 				pThis->GetImport().GetTextImport()
687 					 ->GetTextImportPropertySetMapper();
688 		}
689 		xMapper = mxTextImpPropMapper;
690 		break;
691 
692 	case XML_STYLE_FAMILY_TEXT_SECTION:
693 		// don't cache section mapper, as it's rarely used
694 		// *sigh*, cast to non-const, because this is a const method,
695 		// but SvXMLImport::GetTextImport() isn't.
696 		xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
697 			GetSectionImportPropertySetMapper();
698 		break;
699 
700 	case XML_STYLE_FAMILY_TEXT_RUBY:
701 		// don't cache section mapper, as it's rarely used
702 		// *sigh*, cast to non-const, because this is a const method,
703 		// but SvXMLImport::GetTextImport() isn't.
704 		xMapper = ((SvXMLStylesContext*)this)->GetImport().GetTextImport()->
705 			GetRubyImportPropertySetMapper();
706 		break;
707 
708 	case XML_STYLE_FAMILY_SD_GRAPHICS_ID:
709 	case XML_STYLE_FAMILY_SD_PRESENTATION_ID:
710 	case XML_STYLE_FAMILY_SD_POOL_ID:
711 		if(!mxShapeImpPropMapper.is())
712 		{
713 			UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport();
714 			((SvXMLStylesContext*)this)->mxShapeImpPropMapper =
715 				aImpHelper->GetPropertySetMapper();
716 		}
717 		xMapper = mxShapeImpPropMapper;
718 		break;
719 #ifndef SVX_LIGHT
720 	case XML_STYLE_FAMILY_SCH_CHART_ID:
721 		if( ! mxChartImpPropMapper.is() )
722 		{
723 			XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper();
724 			mxChartImpPropMapper = new XMLChartImportPropertyMapper( pPropMapper, GetImport() );
725 		}
726 		xMapper = mxChartImpPropMapper;
727 		break;
728 #endif
729 	case XML_STYLE_FAMILY_PAGE_MASTER:
730 		if( ! mxPageImpPropMapper.is() )
731 		{
732 			XMLPropertySetMapper *pPropMapper =
733 				new XMLPageMasterPropSetMapper();
734 			mxPageImpPropMapper =
735 				new PageMasterImportPropertyMapper( pPropMapper,
736 									((SvXMLStylesContext*)this)->GetImport() );
737 		}
738 		xMapper = mxPageImpPropMapper;
739 		break;
740 	}
741 
742 	return xMapper;
743 }
744 
GetAutoStyles(sal_uInt16 nFamily) const745 Reference < XAutoStyleFamily > SvXMLStylesContext::GetAutoStyles( sal_uInt16 nFamily ) const
746 {
747 	Reference < XAutoStyleFamily > xAutoStyles;
748     if( XML_STYLE_FAMILY_TEXT_TEXT == nFamily || XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily)
749     {
750         bool bPara = XML_STYLE_FAMILY_TEXT_PARAGRAPH == nFamily;
751         OUString sName;
752 		if( !bPara && mxTextAutoStyles.is() )
753 			xAutoStyles = mxTextAutoStyles;
754 		else if( bPara && mxParaAutoStyles.is() )
755 			xAutoStyles = mxParaAutoStyles;
756 		else
757         {
758 			sName = bPara ?
759 				OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) ):
760 				OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) );
761             Reference< XAutoStylesSupplier > xAutoStylesSupp(	GetImport().GetModel(), UNO_QUERY );
762             Reference< XAutoStyles > xAutoStyleFamilies = xAutoStylesSupp->getAutoStyles();
763             if (xAutoStyleFamilies->hasByName(sName))
764             {
765                 Any aAny = xAutoStyleFamilies->getByName( sName );
766                 xAutoStyles = *(Reference<XAutoStyleFamily>*)aAny.getValue();
767                 if( bPara )
768                     ((SvXMLStylesContext *)this)->mxParaAutoStyles = xAutoStyles;
769                 else
770                     ((SvXMLStylesContext *)this)->mxTextAutoStyles = xAutoStyles;
771             }
772         }
773     }
774     return xAutoStyles;
775 }
776 
GetStylesContainer(sal_uInt16 nFamily) const777 Reference < XNameContainer > SvXMLStylesContext::GetStylesContainer(
778 												sal_uInt16 nFamily ) const
779 {
780 	Reference < XNameContainer > xStyles;
781 	OUString sName;
782 	switch( nFamily )
783 	{
784 	case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
785 		if( mxParaStyles.is() )
786 			xStyles = mxParaStyles;
787 		else
788 			sName =
789 				OUString( RTL_CONSTASCII_USTRINGPARAM( "ParagraphStyles" ) );
790 		break;
791 
792 	case XML_STYLE_FAMILY_TEXT_TEXT:
793 		if( mxTextStyles.is() )
794 			xStyles = mxTextStyles;
795 		else
796 			sName =
797 				OUString( RTL_CONSTASCII_USTRINGPARAM( "CharacterStyles" ) );
798 		break;
799 	}
800 	if( !xStyles.is() && sName.getLength() )
801 	{
802 		Reference< XStyleFamiliesSupplier > xFamiliesSupp(
803 										GetImport().GetModel(), UNO_QUERY );
804         if ( xFamiliesSupp.is() )
805         {
806 		    Reference< XNameAccess > xFamilies = xFamiliesSupp->getStyleFamilies();
807 		    if (xFamilies->hasByName(sName))
808 		    {
809                 xStyles.set(xFamilies->getByName( sName ),uno::UNO_QUERY);
810 
811 			    switch( nFamily )
812 			    {
813 			    case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
814 				    ((SvXMLStylesContext *)this)->mxParaStyles = xStyles;
815 				    break;
816 
817 			    case XML_STYLE_FAMILY_TEXT_TEXT:
818 				    ((SvXMLStylesContext *)this)->mxTextStyles = xStyles;
819 				    break;
820 			    }
821 		    }
822         }
823 	}
824 
825 	return xStyles;
826 }
827 
GetServiceName(sal_uInt16 nFamily) const828 OUString SvXMLStylesContext::GetServiceName( sal_uInt16 nFamily ) const
829 {
830 	String sServiceName;
831 	switch( nFamily )
832 	{
833 	case XML_STYLE_FAMILY_TEXT_PARAGRAPH:
834 		sServiceName = msParaStyleServiceName;
835 		break;
836 	case XML_STYLE_FAMILY_TEXT_TEXT:
837 		sServiceName = msTextStyleServiceName;
838 		break;
839 	}
840 
841 	return sServiceName;
842 }
843 
844 
SvXMLStylesContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &,sal_Bool bAuto)845 SvXMLStylesContext::SvXMLStylesContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
846 										const OUString& rLName,
847                                         const uno::Reference< xml::sax::XAttributeList > &, sal_Bool bAuto ) :
848 	SvXMLImportContext( rImport, nPrfx, rLName ),
849     msParaStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.ParagraphStyle" ) ),
850     msTextStyleServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.CharacterStyle" ) ),
851     mpImpl( new SvXMLStylesContext_Impl( bAuto ) ),
852     mpStyleStylesElemTokenMap( 0 )
853 {
854 }
855 
856 
~SvXMLStylesContext()857 SvXMLStylesContext::~SvXMLStylesContext()
858 {
859 	delete mpStyleStylesElemTokenMap;
860 	delete mpImpl;
861 }
862 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)863 SvXMLImportContext *SvXMLStylesContext::CreateChildContext( sal_uInt16 nPrefix,
864 										 const OUString& rLocalName,
865 										 const uno::Reference< xml::sax::XAttributeList > & xAttrList )
866 {
867 	SvXMLImportContext *pContext = 0;
868 
869 	SvXMLStyleContext *pStyle =
870 		CreateStyleChildContext( nPrefix, rLocalName, xAttrList );
871 //		DBG_ASSERT( pStyle->GetFamily(), "Style without a family" );
872 	if( pStyle )
873 	{
874 		if( !pStyle->IsTransient() )
875 			mpImpl->AddStyle( pStyle );
876 		pContext = pStyle;
877 	}
878 	else
879 	{
880 		pContext = new SvXMLImportContext( GetImport(), nPrefix,
881 										   rLocalName );
882 	}
883 
884 	return pContext;
885 }
886 
EndElement()887 void SvXMLStylesContext::EndElement()
888 {
889 }
890 
AddStyle(SvXMLStyleContext & rNew)891 void SvXMLStylesContext::AddStyle(SvXMLStyleContext& rNew)
892 {
893 	mpImpl->AddStyle( &rNew );
894 }
895 
Clear()896 void SvXMLStylesContext::Clear()
897 {
898 	mpImpl->Clear();
899 }
900 
CopyAutoStylesToDoc()901 void SvXMLStylesContext::CopyAutoStylesToDoc()
902 {
903 	sal_uInt32 nCount = GetStyleCount();
904 	sal_uInt32 i;
905 	for( i = 0; i < nCount; i++ )
906 	{
907 		SvXMLStyleContext *pStyle = GetStyle( i );
908 		if( !pStyle || ( pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_TEXT &&
909             pStyle->GetFamily() != XML_STYLE_FAMILY_TEXT_PARAGRAPH  &&
910             pStyle->GetFamily() != XML_STYLE_FAMILY_TABLE_CELL ) )
911 			continue;
912         pStyle->CreateAndInsert( sal_False );
913 	}
914 }
915 
CopyStylesToDoc(sal_Bool bOverwrite,sal_Bool bFinish)916 void SvXMLStylesContext::CopyStylesToDoc( sal_Bool bOverwrite,
917 										  sal_Bool bFinish )
918 {
919 	// pass 1: create text, paragraph and frame styles
920 	sal_uInt32 nCount = GetStyleCount();
921 	sal_uInt32 i;
922 
923 	for( i = 0; i < nCount; i++ )
924 	{
925 		SvXMLStyleContext *pStyle = GetStyle( i );
926 		if( !pStyle )
927 			continue;
928 
929 		if (pStyle->IsDefaultStyle())
930 			pStyle->SetDefaults();
931 		else if( InsertStyleFamily( pStyle->GetFamily() ) )
932 			pStyle->CreateAndInsert( bOverwrite );
933 	}
934 
935 	// pass 2: create list styles (they require char styles)
936 	for( i=0; i<nCount; i++ )
937 	{
938 		SvXMLStyleContext *pStyle = GetStyle( i );
939 		if( !pStyle || pStyle->IsDefaultStyle())
940 			continue;
941 
942 		if( InsertStyleFamily( pStyle->GetFamily() ) )
943 			pStyle->CreateAndInsertLate( bOverwrite );
944 	}
945 
946 	// pass3: finish creation of styles
947 	if( bFinish )
948 		FinishStyles( bOverwrite );
949 }
950 
FinishStyles(sal_Bool bOverwrite)951 void SvXMLStylesContext::FinishStyles( sal_Bool bOverwrite )
952 {
953 	sal_uInt32 nCount = GetStyleCount();
954 	for( sal_uInt32 i=0; i<nCount; i++ )
955 	{
956 		SvXMLStyleContext *pStyle = GetStyle( i );
957 		if( !pStyle || !pStyle->IsValid() || pStyle->IsDefaultStyle() )
958 			continue;
959 
960 		if( InsertStyleFamily( pStyle->GetFamily() ) )
961 			pStyle->Finish( bOverwrite );
962 	}
963 }
964 
965 
FindStyleChildContext(sal_uInt16 nFamily,const OUString & rName,sal_Bool bCreateIndex) const966 const SvXMLStyleContext *SvXMLStylesContext::FindStyleChildContext(
967 								  sal_uInt16 nFamily,
968 								  const OUString& rName,
969 								  sal_Bool bCreateIndex ) const
970 {
971 	return mpImpl->FindStyleChildContext( nFamily, rName, bCreateIndex );
972 }
973