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