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