cURL: follow redirects
[LibreOffice.git] / xmloff / source / transform / StyleOOoTContext.cxx
blobc7429cc00277ee50983792e8a88cbb5e6990d014
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <com/sun/star/xml/sax/SAXParseException.hpp>
21 #include <com/sun/star/xml/sax/SAXException.hpp>
22 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
23 #include <com/sun/star/xml/sax/XAttributeList.hpp>
25 #include <sax/tools/converter.hxx>
27 #include <xmloff/nmspmap.hxx>
28 #include <xmloff/xmltoken.hxx>
29 #include <xmloff/xmlnmspe.hxx>
30 #include "PropType.hxx"
31 #include "DeepTContext.hxx"
32 #include "RenameElemTContext.hxx"
33 #include "ProcAttrTContext.hxx"
34 #include "ActionMapTypesOOo.hxx"
35 #include "MutableAttrList.hxx"
36 #include "TransformerActions.hxx"
37 #include "PropertyActionsOOo.hxx"
38 #include "TransformerBase.hxx"
40 #include "StyleOOoTContext.hxx"
41 #include <xmloff/xmluconv.hxx>
42 #include <rtl/ustrbuf.hxx>
43 #include <rtl/math.hxx>
44 #include <osl/diagnose.h>
46 using namespace ::xmloff::token;
47 using namespace ::com::sun::star::uno;
48 using namespace ::com::sun::star::xml::sax;
50 const sal_uInt16 MAX_PROP_TYPES = 4;
51 #define ENTRY4(a,b,c,d) \
52 { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \
53 XML_PROP_TYPE_##c, XML_PROP_TYPE_##d }
54 #define ENTRY3(a,b,c) \
55 { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \
56 XML_PROP_TYPE_##c, XML_PROP_TYPE_END }
57 #define ENTRY2(a,b) \
58 { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \
59 XML_PROP_TYPE_END, XML_PROP_TYPE_END }
60 #define ENTRY1(a) \
61 { XML_PROP_TYPE_##a, XML_PROP_TYPE_##END, \
62 XML_PROP_TYPE_END, XML_PROP_TYPE_END }
64 static const XMLPropType aPropTypes[XML_FAMILY_TYPE_END][MAX_PROP_TYPES] =
66 ENTRY3( GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_GRAPHIC,
67 ENTRY3( GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_PRESENTATION,
68 ENTRY1( DRAWING_PAGE ), // XML_FAMILY_TYPE_DRAWING_PAGE,
69 ENTRY1( END ), // XML_FAMILY_TYPE_MASTER_PAGE
70 ENTRY1( PAGE_LAYOUT ), // XML_FAMILY_TYPE_PAGE_LAYOUT,
71 ENTRY1( HEADER_FOOTER ), // XML_FAMILY_TYPE_HEADER_FOOTER
72 ENTRY1( TEXT ), // XML_FAMILY_TYPE_TEXT,
73 ENTRY2( PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_PARAGRAPH,
74 ENTRY1( RUBY ), //XML_FAMILY_TYPE_RUBY,
75 ENTRY1( SECTION ), // XML_FAMILY_TYPE_SECTION,
76 ENTRY1( TABLE ), // XML_FAMILY_TYPE_TABLE,
77 ENTRY1( TABLE_COLUMN ), // XML_FAMILY_TYPE_TABLE_COLUMN,
78 ENTRY1( TABLE_ROW ), // XML_FAMILY_TYPE_TABLE_ROW,
79 ENTRY3( TABLE_CELL, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_TABLE_CELL,
80 ENTRY1( LIST_LEVEL ), // XML_FAMILY_TYPE_LIST,
81 ENTRY4( CHART, GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_CHART,
82 ENTRY1( TEXT ), // XML_FAMILY_TYPE_DATA,
83 ENTRY1( END ), // XML_FAMILY_TYPE_GRADIENT,
84 ENTRY1( END ), // XML_FAMILY_TYPE_HATCH,
85 ENTRY1( END ), // XML_FAMILY_TYPE_FILL_IMAGE,
86 ENTRY1( END ), // XML_FAMILY_TYPE_STROKE_DASH,
87 ENTRY1( END ), // XML_FAMILY_TYPE_MARKER,
90 static const XMLTokenEnum aPropTokens[XML_PROP_TYPE_END] =
92 XML_GRAPHIC_PROPERTIES,
93 XML_DRAWING_PAGE_PROPERTIES,
94 XML_PAGE_LAYOUT_PROPERTIES,
95 XML_HEADER_FOOTER_PROPERTIES,
96 XML_TEXT_PROPERTIES,
97 XML_PARAGRAPH_PROPERTIES,
98 XML_RUBY_PROPERTIES,
99 XML_SECTION_PROPERTIES,
100 XML_TABLE_PROPERTIES,
101 XML_TABLE_COLUMN_PROPERTIES,
102 XML_TABLE_ROW_PROPERTIES,
103 XML_TABLE_CELL_PROPERTIES,
104 XML_LIST_LEVEL_PROPERTIES,
105 XML_CHART_PROPERTIES
108 static const sal_uInt16 aAttrActionMaps[XML_PROP_TYPE_END] =
110 PROP_OOO_GRAPHIC_ATTR_ACTIONS,
111 PROP_OOO_DRAWING_PAGE_ATTR_ACTIONS, // DRAWING_PAGE
112 PROP_OOO_PAGE_LAYOUT_ATTR_ACTIONS,
113 PROP_OOO_HEADER_FOOTER_ATTR_ACTIONS,
114 PROP_OOO_TEXT_ATTR_ACTIONS,
115 PROP_OOO_PARAGRAPH_ATTR_ACTIONS,
116 MAX_OOO_PROP_ACTIONS, // RUBY
117 PROP_OOO_SECTION_ATTR_ACTIONS,
118 PROP_OOO_TABLE_ATTR_ACTIONS,
119 PROP_OOO_TABLE_COLUMN_ATTR_ACTIONS,
120 PROP_OOO_TABLE_ROW_ATTR_ACTIONS,
121 PROP_OOO_TABLE_CELL_ATTR_ACTIONS,
122 PROP_OOO_LIST_LEVEL_ATTR_ACTIONS,
123 PROP_OOO_CHART_ATTR_ACTIONS
126 static const sal_uInt16 aElemActionMaps[XML_PROP_TYPE_END] =
128 PROP_OOO_GRAPHIC_ELEM_ACTIONS,
129 MAX_OOO_PROP_ACTIONS,
130 MAX_OOO_PROP_ACTIONS,
131 MAX_OOO_PROP_ACTIONS,
132 PROP_OOO_TEXT_ELEM_ACTIONS,
133 PROP_OOO_PARAGRAPH_ELEM_ACTIONS,
134 MAX_OOO_PROP_ACTIONS,
135 MAX_OOO_PROP_ACTIONS,
136 MAX_OOO_PROP_ACTIONS,
137 MAX_OOO_PROP_ACTIONS,
138 MAX_OOO_PROP_ACTIONS,
139 PROP_OOO_TABLE_CELL_ELEM_ACTIONS,
140 MAX_OOO_PROP_ACTIONS,
141 PROP_OOO_CHART_ELEM_ACTIONS
144 class XMLTypedPropertiesOOoTContext_Impl : public XMLPersElemContentTContext
146 css::uno::Reference< css::xml::sax::XAttributeList > m_xAttrList;
148 public:
149 XMLTypedPropertiesOOoTContext_Impl( XMLTransformerBase& rTransformer,
150 const OUString& rQName );
152 virtual ~XMLTypedPropertiesOOoTContext_Impl() override;
154 using XMLPersAttrListTContext::AddAttribute;
155 void AddAttribute( const OUString &sName ,
156 const OUString &sValue );
157 void AddAttribute( sal_uInt16 nPrefix, XMLTokenEnum eToken,
158 const OUString &sValue );
160 virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& rAttrList ) override;
162 virtual void Export() override;
165 XMLTypedPropertiesOOoTContext_Impl::XMLTypedPropertiesOOoTContext_Impl(
166 XMLTransformerBase& rImp,
167 const OUString& rQName ) :
168 XMLPersElemContentTContext( rImp, rQName ),
169 m_xAttrList( new XMLMutableAttributeList() )
173 XMLTypedPropertiesOOoTContext_Impl::~XMLTypedPropertiesOOoTContext_Impl()
177 void XMLTypedPropertiesOOoTContext_Impl::AddAttribute(
178 const OUString &sName ,
179 const OUString &sValue )
181 static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
182 ->AddAttribute( sName, sValue );
185 void XMLTypedPropertiesOOoTContext_Impl::AddAttribute(
186 sal_uInt16 nPrefix, XMLTokenEnum eToken,
187 const OUString &sValue )
189 OUString sName(
190 GetTransformer().GetNamespaceMap().GetQNameByKey(
191 nPrefix, ::xmloff::token::GetXMLToken( eToken ) ) );
192 static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
193 ->AddAttribute( sName, sValue );
196 void XMLTypedPropertiesOOoTContext_Impl::StartElement(
197 const Reference< XAttributeList >& )
199 // empty, ignore even the attribute list
202 void XMLTypedPropertiesOOoTContext_Impl::Export()
204 if( m_xAttrList->getLength() || HasElementContent() )
206 GetTransformer().GetDocHandler()->startElement( GetQName(), m_xAttrList );
207 ExportContent();
208 GetTransformer().GetDocHandler()->endElement( GetQName() );
212 class XMLPropertiesOOoTContext_Impl : public XMLTransformerContext
214 ::rtl::Reference < XMLTypedPropertiesOOoTContext_Impl >
215 m_aPropContexts[MAX_PROP_TYPES];
217 typedef XMLPropType XMLPropTypes[MAX_PROP_TYPES];
219 XMLPropTypes m_aPropTypes;
221 bool m_bPersistent;
223 XMLTypedPropertiesOOoTContext_Impl *GetPropContextAndAction(
224 TransformerAction_Impl& rAction,
225 sal_uInt16 nPrefix, const OUString& rLocalName,
226 bool bElem );
228 XMLTypedPropertiesOOoTContext_Impl *GetPropContext(
229 XMLPropType eType );
231 public:
232 XMLPropertiesOOoTContext_Impl( XMLTransformerBase& rTransformer,
233 const OUString& rQName,
234 const XMLPropTypes& rTypes,
235 bool bPersistent );
237 virtual ~XMLPropertiesOOoTContext_Impl() override;
239 rtl::Reference<XMLTransformerContext> CreateChildContext(
240 sal_uInt16 nPrefix,
241 const OUString& rLocalName,
242 const OUString& rQName,
243 const Reference< XAttributeList >& rAttrList ) override;
245 virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& rAttrList ) override;
247 virtual void EndElement() override;
249 virtual void Characters( const OUString& rChars ) override;
251 virtual void Export() override;
253 virtual bool IsPersistent() const override;
256 XMLTypedPropertiesOOoTContext_Impl
257 *XMLPropertiesOOoTContext_Impl::GetPropContext(
258 XMLPropType eType )
260 sal_uInt16 nIndex = MAX_PROP_TYPES;
261 for( sal_uInt16 i=0; i< MAX_PROP_TYPES; i++ )
263 if( m_aPropTypes[i] == eType )
265 nIndex = i;
266 break;
269 if( MAX_PROP_TYPES == nIndex )
270 return nullptr;
272 if( !m_aPropContexts[nIndex].is() )
274 m_aPropContexts[nIndex] =
275 new XMLTypedPropertiesOOoTContext_Impl(
276 GetTransformer(),
277 GetTransformer().GetNamespaceMap().GetQNameByKey(
278 XML_NAMESPACE_STYLE,
279 ::xmloff::token::GetXMLToken(
280 aPropTokens[m_aPropTypes[nIndex]] ) ));
283 return m_aPropContexts[nIndex].get();
286 XMLTypedPropertiesOOoTContext_Impl
287 *XMLPropertiesOOoTContext_Impl::GetPropContextAndAction(
288 TransformerAction_Impl& rAction,
289 sal_uInt16 nPrefix, const OUString& rLocalName,
290 bool bElem )
292 rAction.m_nActionType = XML_ATACTION_COPY;
293 sal_uInt16 nIndex = 0;
295 XMLTransformerActions::key_type aKey( nPrefix, rLocalName );
296 sal_uInt16 i=0;
297 while( i < MAX_PROP_TYPES && XML_PROP_TYPE_END!=m_aPropTypes[i])
299 sal_uInt16 nActionMap =
300 (bElem ? aElemActionMaps : aAttrActionMaps)[m_aPropTypes[i]];
301 if( nActionMap < MAX_OOO_PROP_ACTIONS )
303 XMLTransformerActions *pActions =
304 GetTransformer().GetUserDefinedActions( nActionMap );
305 OSL_ENSURE( pActions, "go no actions" );
306 if( pActions )
308 XMLTransformerActions::const_iterator aIter =
309 pActions->find( aKey );
311 if( !(aIter == pActions->end()) )
313 rAction = (*aIter).second;
314 nIndex = i;
315 break;
319 ++i;
322 #ifdef DBG_UTIL
323 if( !( XML_NAMESPACE_NONE == nPrefix ||
324 (XML_NAMESPACE_UNKNOWN_FLAG & nPrefix) ||
325 XML_PROP_TYPE_END==m_aPropTypes[1] ||
326 (i<MAX_PROP_TYPES && XML_PROP_TYPE_END!=m_aPropTypes[i]) ) )
328 OString aTmp("Didn't find property: ");
329 const OUString& rPrefix =
330 GetTransformer().GetNamespaceMap().GetPrefixByKey( nPrefix );
331 aTmp += OString( rPrefix.getStr(), rPrefix.getLength(),
332 RTL_TEXTENCODING_ASCII_US );
333 aTmp += OString( ':' );
334 aTmp += OString( rLocalName.getStr(), rLocalName.getLength(),
335 RTL_TEXTENCODING_ASCII_US );
336 aTmp += OString(", assuming <style:");
337 const OUString& rName =
338 ::xmloff::token::GetXMLToken( aPropTokens[m_aPropTypes[0]] );
339 aTmp += OString( rName.getStr(), rName.getLength(),
340 RTL_TEXTENCODING_ASCII_US );
341 aTmp += OString( '>' );
343 OSL_FAIL(aTmp.getStr());
345 #endif
347 if( !m_aPropContexts[nIndex].is() )
349 m_aPropContexts[nIndex] =
350 new XMLTypedPropertiesOOoTContext_Impl(
351 GetTransformer(),
352 GetTransformer().GetNamespaceMap().GetQNameByKey(
353 XML_NAMESPACE_STYLE,
354 ::xmloff::token::GetXMLToken(
355 aPropTokens[m_aPropTypes[nIndex]] ) ));
358 return m_aPropContexts[nIndex].get();
361 XMLPropertiesOOoTContext_Impl::XMLPropertiesOOoTContext_Impl(
362 XMLTransformerBase& rImp,
363 const OUString& rQName,
364 const XMLPropTypes& rTypes,
365 bool bPersistent ) :
366 XMLTransformerContext( rImp, rQName ),
367 m_bPersistent( bPersistent )
369 for( sal_uInt16 i=0; i < MAX_PROP_TYPES; ++i )
371 // remember the types that belong to the attribute and element lists
372 m_aPropTypes[i] = rTypes[i];
376 XMLPropertiesOOoTContext_Impl::~XMLPropertiesOOoTContext_Impl()
380 rtl::Reference<XMLTransformerContext> XMLPropertiesOOoTContext_Impl::CreateChildContext(
381 sal_uInt16 nPrefix,
382 const OUString& rLocalName,
383 const OUString& rQName,
384 const Reference< XAttributeList >& rAttrList )
386 TransformerAction_Impl aAction;
387 return GetPropContextAndAction( aAction, nPrefix, rLocalName, true )
388 ->CreateChildContext( nPrefix, rLocalName, rQName, rAttrList );
391 void XMLPropertiesOOoTContext_Impl::StartElement(
392 const Reference< XAttributeList >& rAttrList )
394 XMLTypedPropertiesOOoTContext_Impl * pIntervalMinorDivisorContext = nullptr;
395 double fIntervalMajor = 0.0;
396 double fIntervalMinor = 0.0;
397 bool bMoveProtect = false;
398 bool bSizeProtect = false;
399 OUString aProtectAttrValue;
400 XMLTypedPropertiesOOoTContext_Impl * pProtectContext = nullptr;
402 /* Attribute <style:mirror> has to be priority over attribute <style:draw>.
403 The filter from OpenDocument file format to OpenOffice.org file format
404 produces styles with both attributes. (#i49139#)
406 bool bExistStyleMirror( false );
407 OUString aStyleMirrorAttrValue;
408 bool bExistDrawMirror( false );
409 OUString aDrawMirrorAttrValue;
410 XMLTypedPropertiesOOoTContext_Impl* pMirrorContext( nullptr );
412 sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
413 for( sal_Int16 i=0; i < nAttrCount; i++ )
415 const OUString sAttrName = rAttrList->getNameByIndex( i );
416 const OUString sAttrValue = rAttrList->getValueByIndex( i );
417 OUString aLocalName;
418 sal_uInt16 nPrefix =
419 GetTransformer().GetNamespaceMap().GetKeyByAttrName( sAttrName,
420 &aLocalName );
421 TransformerAction_Impl aAction;
422 XMLTypedPropertiesOOoTContext_Impl *pContext =
423 GetPropContextAndAction( aAction, nPrefix, aLocalName, false );
424 switch( aAction.m_nActionType )
426 case XML_ATACTION_REMOVE:
427 break;
428 case XML_ATACTION_COPY:
429 pContext->AddAttribute( sAttrName, sAttrValue );
430 break;
431 case XML_ATACTION_COPY_DUPLICATE:
433 pContext->AddAttribute( sAttrName, sAttrValue );
434 XMLTypedPropertiesOOoTContext_Impl *pContext2 =
435 GetPropContext( (XMLPropType)aAction.m_nParam1 );
436 if( pContext2 )
437 pContext2->AddAttribute( sAttrName, sAttrValue );
439 break;
440 case XML_ATACTION_RENAME:
442 pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(),
443 aAction.GetQNameTokenFromParam1(),
444 sAttrValue );
446 break;
447 case XML_ATACTION_ENCODE_STYLE_NAME_REF:
449 OUString aAttrValue( sAttrValue );
450 GetTransformer().EncodeStyleName(aAttrValue);
451 pContext->AddAttribute( sAttrName, aAttrValue );
453 break;
454 case XML_ATACTION_RENAME_ENCODE_STYLE_NAME_REF:
456 OUString aAttrValue( sAttrValue );
457 GetTransformer().EncodeStyleName(aAttrValue);
458 pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(),
459 aAction.GetQNameTokenFromParam1(),
460 aAttrValue );
462 break;
463 case XML_ATACTION_NEG_PERCENT:
465 OUString aAttrValue( sAttrValue );
466 XMLTransformerBase::NegPercent(aAttrValue);
467 pContext->AddAttribute( sAttrName, aAttrValue );
469 break;
470 case XML_ATACTION_RENAME_NEG_PERCENT:
472 OUString aAttrValue( sAttrValue );
473 XMLTransformerBase::NegPercent(aAttrValue);
474 pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(),
475 aAction.GetQNameTokenFromParam1(),
476 aAttrValue );
478 break;
479 case XML_ATACTION_INCH2IN:
481 OUString aAttrValue( sAttrValue );
482 XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue );
483 pContext->AddAttribute( sAttrName, aAttrValue );
485 break;
486 case XML_ATACTION_INCH2IN_DUPLICATE:
488 OUString aAttrValue( sAttrValue );
489 XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue );
490 pContext->AddAttribute( sAttrName, aAttrValue );
491 XMLTypedPropertiesOOoTContext_Impl *pContext2 =
492 GetPropContext( (XMLPropType)aAction.m_nParam1 );
493 if( pContext2 )
494 pContext2->AddAttribute( sAttrName, aAttrValue );
496 break;
497 case XML_ATACTION_INCHS2INS:
499 OUString aAttrValue( sAttrValue );
500 XMLTransformerBase::ReplaceInchWithIn( aAttrValue );
501 pContext->AddAttribute( sAttrName, aAttrValue );
503 break;
504 case XML_PTACTION_LINE_MODE:
506 const OUString& aAttrValue( GetXMLToken(
507 IsXMLToken( sAttrValue, XML_TRUE )
508 ? XML_CONTINUOUS
509 : XML_SKIP_WHITE_SPACE) );
510 OUString aAttrQName(
511 GetTransformer().GetNamespaceMap().GetQNameByKey(
512 XML_NAMESPACE_STYLE,
513 GetXMLToken( XML_TEXT_UNDERLINE_MODE ) ) );
514 pContext->AddAttribute( aAttrQName, aAttrValue );
516 aAttrQName =
517 GetTransformer().GetNamespaceMap().GetQNameByKey(
518 XML_NAMESPACE_STYLE,
519 GetXMLToken( XML_TEXT_LINE_THROUGH_MODE ) );
520 pContext->AddAttribute( aAttrQName, aAttrValue );
522 break;
523 case XML_PTACTION_KEEP_WITH_NEXT:
525 const OUString& aAttrValue( GetXMLToken(
526 IsXMLToken( sAttrValue, XML_TRUE )
527 ? XML_ALWAYS
528 : XML_AUTO) );
529 pContext->AddAttribute( sAttrName, aAttrValue );
531 break;
532 case XML_PTACTION_UNDERLINE:
534 XMLTokenEnum eToken = GetTransformer().GetToken( sAttrValue );
535 bool bBold = false, bDouble = false;
536 switch( eToken )
538 case XML_SINGLE:
539 eToken = XML_SOLID;
540 break;
541 case XML_DOUBLE:
542 eToken = XML_SOLID;
543 bDouble = true;
544 break;
545 case XML_BOLD:
546 eToken = XML_SOLID;
547 bBold = true;
548 break;
549 case XML_BOLD_DOTTED:
550 eToken = XML_DOTTED;
551 bBold = true;
552 break;
553 case XML_BOLD_DASH:
554 eToken = XML_DASH;
555 bBold = true;
556 break;
557 case XML_BOLD_LONG_DASH:
558 eToken = XML_LONG_DASH;
559 bBold = true;
560 break;
561 case XML_BOLD_DOT_DASH:
562 eToken = XML_DOT_DASH;
563 bBold = true;
564 break;
565 case XML_BOLD_DOT_DOT_DASH:
566 eToken = XML_DOT_DOT_DASH;
567 bBold = true;
568 break;
569 case XML_BOLD_WAVE:
570 eToken = XML_WAVE;
571 bBold = true;
572 break;
573 case XML_DOUBLE_WAVE:
574 eToken = XML_WAVE;
575 bDouble = true;
576 break;
577 case XML_NONE:
578 eToken = XML_NONE;
579 bDouble = false;
580 break;
581 default:
582 OSL_FAIL( "xmloff::XMLPropertiesOOoTContext_Impl::StartElement(), unknown underline token!" );
583 break;
585 pContext->AddAttribute(
586 GetTransformer().GetNamespaceMap().GetQNameByKey(
587 XML_NAMESPACE_STYLE,
588 GetXMLToken( XML_TEXT_UNDERLINE_STYLE ) ),
589 eToken != XML_TOKEN_END ? GetXMLToken( eToken )
590 : sAttrValue );
591 if( bDouble )
592 pContext->AddAttribute(
593 GetTransformer().GetNamespaceMap().GetQNameByKey(
594 XML_NAMESPACE_STYLE,
595 GetXMLToken( XML_TEXT_UNDERLINE_TYPE ) ),
596 GetXMLToken( XML_DOUBLE ) );
597 if( bBold )
598 pContext->AddAttribute(
599 GetTransformer().GetNamespaceMap().GetQNameByKey(
600 XML_NAMESPACE_STYLE,
601 GetXMLToken( XML_TEXT_UNDERLINE_WIDTH ) ),
602 GetXMLToken( XML_BOLD ) );
604 break;
605 case XML_PTACTION_LINETHROUGH:
607 XMLTokenEnum eToken = GetTransformer().GetToken( sAttrValue );
608 bool bBold = false, bDouble = false;
609 sal_Unicode c = 0;
610 switch( eToken )
612 case XML_SINGLE_LINE:
613 eToken = XML_SOLID;
614 break;
615 case XML_DOUBLE_LINE:
616 eToken = XML_SOLID;
617 bDouble = true;
618 break;
619 case XML_THICK_LINE:
620 eToken = XML_SOLID;
621 bBold = true;
622 break;
623 case XML_SLASH:
624 eToken = XML_SOLID;
625 c = '/';
626 break;
627 case XML_uX:
628 eToken = XML_SOLID;
629 c = 'X';
630 break;
631 default:
632 break;
634 pContext->AddAttribute(
635 GetTransformer().GetNamespaceMap().GetQNameByKey(
636 XML_NAMESPACE_STYLE,
637 GetXMLToken( XML_TEXT_LINE_THROUGH_STYLE ) ),
638 eToken != XML_TOKEN_END ? GetXMLToken( eToken )
639 : sAttrValue );
640 if( bDouble )
641 pContext->AddAttribute(
642 GetTransformer().GetNamespaceMap().GetQNameByKey(
643 XML_NAMESPACE_STYLE,
644 GetXMLToken( XML_TEXT_LINE_THROUGH_TYPE ) ),
645 GetXMLToken( XML_DOUBLE ) );
646 if( bBold )
647 pContext->AddAttribute(
648 GetTransformer().GetNamespaceMap().GetQNameByKey(
649 XML_NAMESPACE_STYLE,
650 GetXMLToken( XML_TEXT_LINE_THROUGH_WIDTH ) ),
651 GetXMLToken( XML_BOLD ) );
652 if( c )
653 pContext->AddAttribute(
654 GetTransformer().GetNamespaceMap().GetQNameByKey(
655 XML_NAMESPACE_STYLE,
656 GetXMLToken( XML_TEXT_LINE_THROUGH_TEXT ) ),
657 OUString( c ) );
659 break;
660 case XML_PTACTION_SPLINES:
662 sal_Int32 nSplineType = sAttrValue.toInt32();
663 OUString aNewAttrName = GetTransformer().GetNamespaceMap().GetQNameByKey(
664 XML_NAMESPACE_CHART, GetXMLToken( XML_INTERPOLATION ) );
666 switch( nSplineType )
668 // straight lines
669 case 0:
670 pContext->AddAttribute(
671 aNewAttrName, GetXMLToken( XML_NONE ));
672 break;
673 // cubic spline
674 case 1:
675 pContext->AddAttribute(
676 aNewAttrName, GetXMLToken( XML_CUBIC_SPLINE ));
677 break;
678 // B-spline
679 case 2:
680 pContext->AddAttribute(
681 aNewAttrName, GetXMLToken( XML_B_SPLINE ));
682 break;
684 default:
685 OSL_FAIL( "invalid spline type" );
686 pContext->AddAttribute(
687 aNewAttrName, GetXMLToken( XML_NONE ));
688 break;
691 break;
692 case XML_PTACTION_INTERVAL_MAJOR:
693 pContext->AddAttribute( sAttrName, sAttrValue );
694 ::sax::Converter::convertDouble( fIntervalMajor, sAttrValue );
695 break;
696 case XML_PTACTION_INTERVAL_MINOR:
697 ::sax::Converter::convertDouble( fIntervalMinor, sAttrValue );
698 pIntervalMinorDivisorContext = pContext;
699 break;
700 case XML_PTACTION_SYMBOL:
702 sal_Int32 nSymbolType = sAttrValue.toInt32();
703 OUString aNewAttrName = GetTransformer().GetNamespaceMap().GetQNameByKey(
704 XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_TYPE ) );
706 if( nSymbolType >= 0 )
708 pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NAMED_SYMBOL ));
709 enum XMLTokenEnum eToken = XML_TOKEN_INVALID;
710 switch( nSymbolType )
712 // SYMBOL0
713 case 0:
714 // "square" has an awkward token name
715 eToken = XML_GRADIENTSTYLE_SQUARE;
716 break;
717 // SYMBOL1
718 case 1:
719 eToken = XML_DIAMOND;
720 break;
721 // SYMBOL2
722 case 2:
723 eToken = XML_ARROW_DOWN;
724 break;
725 // SYMBOL3
726 case 3:
727 eToken = XML_ARROW_UP;
728 break;
729 // SYMBOL4
730 case 4:
731 eToken = XML_ARROW_RIGHT;
732 break;
733 // SYMBOL5
734 case 5:
735 eToken = XML_ARROW_LEFT;
736 break;
737 // SYMBOL6
738 case 6:
739 eToken = XML_BOW_TIE;
740 break;
741 // SYMBOL7
742 case 7:
743 eToken = XML_HOURGLASS;
744 break;
745 case 8:
746 eToken = XML_CIRCLE;
747 break;
748 case 9:
749 eToken = XML_STAR;
750 break;
751 case 10:
752 eToken = XML_X;
753 break;
754 case 11:
755 eToken = XML_PLUS;
756 break;
757 case 12:
758 eToken = XML_ASTERISK;
759 break;
760 case 13:
761 eToken = XML_HORIZONTAL_BAR;
762 break;
763 case 14:
764 eToken = XML_VERTICAL_BAR;
765 break;
766 default:
767 OSL_FAIL( "invalid named symbol" );
768 break;
771 if( eToken != XML_TOKEN_INVALID )
773 pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
774 XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_NAME )),
775 GetXMLToken( eToken ));
778 else
780 switch( nSymbolType )
782 // NONE
783 case -3:
784 pContext->AddAttribute(
785 aNewAttrName, GetXMLToken( XML_NONE ));
786 break;
787 // AUTO
788 case -2:
789 pContext->AddAttribute(
790 aNewAttrName, GetXMLToken( XML_AUTOMATIC ));
791 break;
792 // BITMAPURL
793 case -1:
794 pContext->AddAttribute(
795 aNewAttrName, GetXMLToken( XML_IMAGE ));
796 break;
797 default:
798 OSL_FAIL( "invalid symbol type" );
799 pContext->AddAttribute(
800 aNewAttrName, GetXMLToken( XML_NONE ));
801 break;
805 break;
806 case XML_PTACTION_SYMBOL_IMAGE_NAME:
808 // create an xlink:href element for URI attribute
809 XMLPersAttrListTContext *pSymbolImageContext = new XMLPersAttrListTContext(
810 GetTransformer(), GetTransformer().GetNamespaceMap().GetQNameByKey(
811 XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_IMAGE )));
812 rtl::Reference<XMLTransformerContext> xSymbolImageContext(pSymbolImageContext);
814 OUString aAttrValue( sAttrValue );
815 if( GetTransformer().ConvertURIToOASIS( aAttrValue, true ))
817 pSymbolImageContext->AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aAttrValue );
818 pContext->AddContent(xSymbolImageContext);
821 break;
823 // #i25616#
824 case XML_PTACTION_TRANSPARENCY :
826 OUString aAttrValue( sAttrValue );
827 XMLTransformerBase::NegPercent(aAttrValue);
828 pContext->AddAttribute( XML_NAMESPACE_DRAW,
829 XML_OPACITY,
830 aAttrValue );
831 pContext->AddAttribute( XML_NAMESPACE_DRAW,
832 XML_IMAGE_OPACITY,
833 aAttrValue );
835 break;
837 case XML_PTACTION_BREAK_INSIDE:
839 pContext->AddAttribute(
840 XML_NAMESPACE_FO, XML_KEEP_TOGETHER,
841 GetXMLToken(
842 IsXMLToken( sAttrValue, XML_COLUMNSPLIT_AVOID )
843 ? XML_ALWAYS
844 : XML_AUTO ) );
846 break;
847 case XML_ATACTION_CAPTION_ESCAPE_OOO:
849 OUString aAttrValue( sAttrValue );
850 if( aAttrValue.indexOf( '%' ) != -1 )
852 sal_Int32 nValue = 0;
853 ::sax::Converter::convertPercent( nValue, sAttrValue );
854 if( nValue )
856 nValue /= 100;
857 OUStringBuffer aOut;
858 ::sax::Converter::convertPercent( aOut, nValue );
859 aAttrValue = aOut.makeStringAndClear();
862 else
864 XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue );
867 pContext->AddAttribute( sAttrName, aAttrValue );
869 break;
870 case XML_ATACTION_MOVE_PROTECT:
871 bMoveProtect = IsXMLToken( sAttrValue, XML_TRUE );
872 pProtectContext = pContext;
873 break;
874 case XML_ATACTION_SIZE_PROTECT:
875 bSizeProtect = IsXMLToken( sAttrValue, XML_TRUE );
876 pProtectContext = pContext;
877 break;
878 case XML_ATACTION_PROTECT:
879 aProtectAttrValue = sAttrValue;
880 pProtectContext = pContext;
881 break;
882 case XML_ATACTION_DRAW_MIRROR_OOO: // renames draw:mirror to style:mirror and adapts values
884 // OpenDocument file format: attribute value of <style:mirror> wrong (#i49139#)
885 aDrawMirrorAttrValue =
886 GetXMLToken( IsXMLToken( sAttrValue, XML_TRUE )
887 ? XML_HORIZONTAL : XML_NONE );
888 bExistDrawMirror = true;
889 pMirrorContext = pContext;
891 break;
892 // OpenDocument file format: attribute value of <style:mirror> wrong (#i49139#)
893 case XML_ATACTION_STYLE_MIRROR_OOO: // adapts style:mirror values
895 SvXMLTokenEnumerator aTokenEnum( sAttrValue );
896 OUString aToken;
897 while( aTokenEnum.getNextToken( aToken ) )
899 if ( !aStyleMirrorAttrValue.isEmpty() )
901 aStyleMirrorAttrValue += " ";
904 if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_LEFT_PAGES ) )
906 aStyleMirrorAttrValue += GetXMLToken( XML_HORIZONTAL_ON_EVEN );
908 else if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_RIGHT_PAGES ) )
910 aStyleMirrorAttrValue += GetXMLToken( XML_HORIZONTAL_ON_ODD );
912 else
914 aStyleMirrorAttrValue += aToken;
917 bExistStyleMirror = true;
918 pMirrorContext = pContext;
920 break;
921 case XML_ATACTION_GAMMA_OOO: // converts double value to percentage
923 double fValue = sAttrValue.toDouble();
924 sal_Int32 nValue = (sal_Int32)((fValue * 100.0) + ( fValue > 0 ? 0.5 : - 0.5 ) );
926 OUStringBuffer aOut;
927 ::sax::Converter::convertPercent( aOut, nValue );
928 OUString aAttrValue( aOut.makeStringAndClear() );
929 pContext->AddAttribute( sAttrName, aAttrValue );
931 break;
932 case XML_ATACTION_OPACITY_FIX:
934 sal_Int32 nValue;
935 if( sAttrValue.indexOf( '%' ) != -1 )
937 ::sax::Converter::convertPercent( nValue, sAttrValue );
939 else
941 nValue = sal_Int32( sAttrValue.toDouble() * 100.0 );
943 nValue = 100 - nValue;
945 OUStringBuffer aOut;
946 ::sax::Converter::convertPercent( aOut, nValue );
947 pContext->AddAttribute( sAttrName, aOut.makeStringAndClear() );
949 break;
950 default:
951 OSL_ENSURE( false, "unknown action" );
952 break;
956 // OpenDocument file format: attribute value of <style:mirror> wrong (#i49139#)
957 if ( bExistStyleMirror )
959 pMirrorContext->AddAttribute(
960 GetTransformer().GetNamespaceMap().GetQNameByKey(
961 XML_NAMESPACE_STYLE, GetXMLToken( XML_MIRROR ) ),
962 aStyleMirrorAttrValue);
964 else if ( bExistDrawMirror )
966 pMirrorContext->AddAttribute(
967 GetTransformer().GetNamespaceMap().GetQNameByKey(
968 XML_NAMESPACE_STYLE, GetXMLToken( XML_MIRROR ) ),
969 aDrawMirrorAttrValue);
972 if (bMoveProtect || bSizeProtect || !aProtectAttrValue.isEmpty())
974 if( (bMoveProtect ||bSizeProtect) && IsXMLToken( aProtectAttrValue, XML_NONE ) )
975 aProtectAttrValue.clear();
977 const OUString& rPosition = GetXMLToken( XML_POSITION );
978 if( bMoveProtect && -1 == aProtectAttrValue.indexOf( rPosition ) )
980 if( !aProtectAttrValue.isEmpty() )
981 aProtectAttrValue += " ";
982 aProtectAttrValue += rPosition;
985 const OUString& rSize = GetXMLToken( XML_SIZE );
986 if( bSizeProtect && -1 == aProtectAttrValue.indexOf( rSize ) )
988 if( !aProtectAttrValue.isEmpty() )
989 aProtectAttrValue += " ";
990 aProtectAttrValue += rSize;
993 // coverity[var_deref_model] - pProtectContext is assigned in a superset of the enclosing if condition entry logic
994 pProtectContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_PROTECT ) ), aProtectAttrValue );
997 if( pIntervalMinorDivisorContext )
999 if( fIntervalMinor != 0.0 )
1001 sal_Int32 nIntervalMinorDivisor = static_cast< sal_Int32 >(
1002 ::rtl::math::round( fIntervalMajor / fIntervalMinor ));
1004 OUStringBuffer aBuf;
1005 ::sax::Converter::convertNumber( aBuf, nIntervalMinorDivisor );
1006 pIntervalMinorDivisorContext->AddAttribute(
1007 GetTransformer().GetNamespaceMap().GetQNameByKey(
1008 XML_NAMESPACE_CHART,
1009 GetXMLToken( XML_INTERVAL_MINOR_DIVISOR )),
1010 aBuf.makeStringAndClear());
1015 void XMLPropertiesOOoTContext_Impl::EndElement()
1017 if( !m_bPersistent )
1018 Export();
1021 void XMLPropertiesOOoTContext_Impl::Characters( const OUString& )
1023 // ignore them
1026 void XMLPropertiesOOoTContext_Impl::Export()
1029 for(rtl::Reference<XMLTypedPropertiesOOoTContext_Impl> & rPropContext : m_aPropContexts)
1031 if( rPropContext.is() )
1032 rPropContext->Export();
1036 bool XMLPropertiesOOoTContext_Impl::IsPersistent() const
1038 return m_bPersistent;
1041 XMLStyleOOoTContext::XMLStyleOOoTContext( XMLTransformerBase& rImp,
1042 const OUString& rQName,
1043 XMLFamilyType eT,
1044 bool bPersistent ) :
1045 XMLPersElemContentTContext( rImp, rQName ),
1046 m_eFamily( eT ),
1047 m_bPersistent( bPersistent )
1051 XMLStyleOOoTContext::XMLStyleOOoTContext(
1052 XMLTransformerBase& rImp,
1053 const OUString& rQName,
1054 XMLFamilyType eT,
1055 sal_uInt16 nPrefix,
1056 ::xmloff::token::XMLTokenEnum eToken,
1057 bool bPersistent ) :
1058 XMLPersElemContentTContext( rImp, rQName, nPrefix, eToken ),
1059 m_eFamily( eT ),
1060 m_bPersistent( bPersistent )
1064 XMLStyleOOoTContext::~XMLStyleOOoTContext()
1068 rtl::Reference<XMLTransformerContext> XMLStyleOOoTContext::CreateChildContext(
1069 sal_uInt16 nPrefix,
1070 const OUString& rLocalName,
1071 const OUString& rQName,
1072 const Reference< XAttributeList >& rAttrList )
1074 rtl::Reference<XMLTransformerContext> pContext;
1076 if( XML_NAMESPACE_STYLE == nPrefix &&
1077 IsXMLToken( rLocalName, XML_PROPERTIES ) )
1079 if( aPropTypes[m_eFamily][0] == XML_PROP_TYPE_END )
1081 OSL_ENSURE( false, "unexpected properties element" );
1082 pContext = m_bPersistent
1083 ? XMLPersElemContentTContext::CreateChildContext(
1084 nPrefix, rLocalName, rQName, rAttrList )
1085 : XMLTransformerContext::CreateChildContext(
1086 nPrefix, rLocalName, rQName, rAttrList );
1088 else if( aPropTypes[m_eFamily][1] == XML_PROP_TYPE_END )
1090 sal_uInt16 nActionMap =
1091 aAttrActionMaps[aPropTypes[m_eFamily][0]];
1092 if( nActionMap < MAX_OOO_PROP_ACTIONS )
1094 pContext.set(new XMLPropertiesOOoTContext_Impl(
1095 GetTransformer(), rQName,
1096 aPropTypes[m_eFamily], m_bPersistent ));
1098 else
1100 if( m_bPersistent )
1101 pContext.set(new XMLPersElemContentTContext(
1102 GetTransformer(), rQName,
1103 XML_NAMESPACE_STYLE,
1104 aPropTokens[aPropTypes[m_eFamily][0]] ));
1105 else
1106 pContext.set(new XMLRenameElemTransformerContext(
1107 GetTransformer(), rQName,
1108 XML_NAMESPACE_STYLE,
1109 aPropTokens[aPropTypes[m_eFamily][0]] ));
1112 else
1114 pContext.set(new XMLPropertiesOOoTContext_Impl(
1115 GetTransformer(), rQName,
1116 aPropTypes[m_eFamily], m_bPersistent));
1119 if( m_bPersistent )
1120 AddContent( pContext );
1122 else
1124 pContext = m_bPersistent
1125 ? XMLPersElemContentTContext::CreateChildContext(
1126 nPrefix, rLocalName, rQName, rAttrList )
1127 : XMLTransformerContext::CreateChildContext(
1128 nPrefix, rLocalName, rQName, rAttrList );
1131 return pContext;
1134 void XMLStyleOOoTContext::StartElement(
1135 const Reference< XAttributeList >& rAttrList )
1137 XMLTransformerActions *pActions =
1138 GetTransformer().GetUserDefinedActions( OOO_STYLE_ACTIONS );
1139 OSL_ENSURE( pActions, "go no actions" );
1141 Reference< XAttributeList > xAttrList( rAttrList );
1142 XMLMutableAttributeList *pMutableAttrList = nullptr;
1143 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1144 for( sal_Int16 i=0; i < nAttrCount; i++ )
1146 const OUString sAttrName = xAttrList->getNameByIndex( i );
1147 OUString aLocalName;
1148 sal_uInt16 nPrefix =
1149 GetTransformer().GetNamespaceMap().GetKeyByAttrName( sAttrName,
1150 &aLocalName );
1151 XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
1152 XMLTransformerActions::const_iterator aIter =
1153 pActions->find( aKey );
1154 if( !(aIter == pActions->end() ) )
1156 if( !pMutableAttrList )
1158 pMutableAttrList =
1159 new XMLMutableAttributeList( xAttrList );
1160 xAttrList = pMutableAttrList;
1162 const OUString sAttrValue = xAttrList->getValueByIndex( i );
1163 switch( (*aIter).second.m_nActionType )
1165 case XML_ATACTION_STYLE_FAMILY:
1167 bool bControl = false;
1168 if( XML_FAMILY_TYPE_END == m_eFamily )
1170 if( IsXMLToken( sAttrValue, XML_GRAPHICS ) )
1171 m_eFamily = XML_FAMILY_TYPE_GRAPHIC;
1172 else if( IsXMLToken( sAttrValue, XML_PRESENTATION ) )
1173 m_eFamily = XML_FAMILY_TYPE_PRESENTATION;
1174 else if( IsXMLToken( sAttrValue, XML_DRAWING_PAGE ) )
1175 m_eFamily = XML_FAMILY_TYPE_DRAWING_PAGE;
1176 else if( IsXMLToken( sAttrValue, XML_TEXT) )
1177 m_eFamily = XML_FAMILY_TYPE_TEXT;
1178 else if( IsXMLToken( sAttrValue, XML_PARAGRAPH) )
1179 m_eFamily = XML_FAMILY_TYPE_PARAGRAPH;
1180 else if( IsXMLToken( sAttrValue, XML_RUBY) )
1181 m_eFamily = XML_FAMILY_TYPE_RUBY;
1182 else if( IsXMLToken( sAttrValue, XML_SECTION) )
1183 m_eFamily = XML_FAMILY_TYPE_SECTION;
1184 else if( IsXMLToken( sAttrValue, XML_TABLE) )
1185 m_eFamily = XML_FAMILY_TYPE_TABLE;
1186 else if( IsXMLToken( sAttrValue, XML_TABLE_COLUMN) )
1187 m_eFamily = XML_FAMILY_TYPE_TABLE_COLUMN;
1188 else if( IsXMLToken( sAttrValue, XML_TABLE_ROW) )
1189 m_eFamily = XML_FAMILY_TYPE_TABLE_ROW;
1190 else if( IsXMLToken( sAttrValue, XML_TABLE_CELL) )
1191 m_eFamily = XML_FAMILY_TYPE_TABLE_CELL;
1192 else if( IsXMLToken( sAttrValue, XML_CHART) )
1193 m_eFamily = XML_FAMILY_TYPE_CHART;
1194 else if( IsXMLToken( sAttrValue, XML_CONTROL) )
1196 m_eFamily = XML_FAMILY_TYPE_PARAGRAPH;
1197 bControl = true;
1200 if( XML_FAMILY_TYPE_GRAPHIC == m_eFamily )
1202 pMutableAttrList->SetValueByIndex( i,
1203 GetXMLToken( XML_GRAPHIC ) );
1205 else if( bControl )
1207 pMutableAttrList->SetValueByIndex( i,
1208 GetXMLToken( XML_PARAGRAPH ) );
1211 break;
1212 case XML_ATACTION_INCH2IN:
1214 OUString aAttrValue( sAttrValue );
1215 if( XMLTransformerBase::ReplaceSingleInchWithIn(
1216 aAttrValue ) )
1217 pMutableAttrList->SetValueByIndex( i, aAttrValue );
1219 break;
1220 case XML_ATACTION_ENCODE_STYLE_NAME:
1222 OUString aAttrValue( sAttrValue );
1223 if( GetTransformer().EncodeStyleName(aAttrValue) )
1225 pMutableAttrList->SetValueByIndex( i, aAttrValue );
1226 OUString aNewAttrQName(
1227 GetTransformer().GetNamespaceMap().
1228 GetQNameByKey(
1229 nPrefix, ::xmloff::token::GetXMLToken(
1230 XML_DISPLAY_NAME ) ) );
1231 pMutableAttrList->AddAttribute( aNewAttrQName,
1232 sAttrValue );
1235 break;
1236 case XML_ATACTION_ENCODE_STYLE_NAME_REF:
1238 OUString aAttrValue( sAttrValue );
1239 if( GetTransformer().EncodeStyleName(aAttrValue) )
1240 pMutableAttrList->SetValueByIndex( i, aAttrValue );
1242 break;
1243 case XML_ATACTION_NEG_PERCENT:
1245 OUString aAttrValue( sAttrValue );
1246 if( XMLTransformerBase::NegPercent(aAttrValue) )
1247 pMutableAttrList->SetValueByIndex( i, aAttrValue );
1249 break;
1250 case XML_ATACTION_URI_OOO:
1252 OUString aAttrValue( sAttrValue );
1253 if( GetTransformer().ConvertURIToOASIS( aAttrValue,
1254 static_cast< bool >((*aIter).second.m_nParam1)))
1255 pMutableAttrList->SetValueByIndex( i, aAttrValue );
1257 break;
1258 default:
1259 OSL_ENSURE( false, "unknown action" );
1260 break;
1264 if( XML_FAMILY_TYPE_END == m_eFamily )
1265 m_eFamily = XML_FAMILY_TYPE_TEXT;
1266 if( m_bPersistent )
1267 XMLPersElemContentTContext::StartElement( xAttrList );
1268 else
1269 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
1270 xAttrList );
1273 void XMLStyleOOoTContext::EndElement()
1275 if( m_bPersistent )
1276 XMLPersElemContentTContext::EndElement();
1277 else
1278 GetTransformer().GetDocHandler()->endElement( GetExportQName() );
1281 void XMLStyleOOoTContext::Characters( const OUString& )
1283 // element content only:
1286 bool XMLStyleOOoTContext::IsPersistent() const
1288 return m_bPersistent;
1291 XMLTransformerActions *XMLStyleOOoTContext::CreateTransformerActions(
1292 sal_uInt16 nType )
1294 XMLTransformerActionInit *pInit = nullptr;
1296 switch( nType )
1298 case PROP_OOO_GRAPHIC_ATTR_ACTIONS:
1299 pInit = aGraphicPropertyOOoAttrActionTable;
1300 break;
1301 case PROP_OOO_GRAPHIC_ELEM_ACTIONS:
1302 pInit = aGraphicPropertyOOoElemActionTable;
1303 break;
1304 case PROP_OOO_DRAWING_PAGE_ATTR_ACTIONS:
1305 pInit = aDrawingPagePropertyOOoAttrActionTable;
1306 break;
1307 case PROP_OOO_PAGE_LAYOUT_ATTR_ACTIONS:
1308 pInit = aPageLayoutPropertyOOoAttrActionTable;
1309 break;
1310 case PROP_OOO_HEADER_FOOTER_ATTR_ACTIONS:
1311 pInit = aHeaderFooterPropertyOOoAttrActionTable;
1312 break;
1313 case PROP_OOO_TEXT_ATTR_ACTIONS:
1314 pInit = aTextPropertyOOoAttrActionTable;
1315 break;
1316 case PROP_OOO_TEXT_ELEM_ACTIONS:
1317 pInit = aTextPropertyOOoElemActionTable;
1318 break;
1319 case PROP_OOO_PARAGRAPH_ATTR_ACTIONS:
1320 pInit = aParagraphPropertyOOoAttrActionTable;
1321 break;
1322 case PROP_OOO_PARAGRAPH_ELEM_ACTIONS:
1323 pInit = aParagraphPropertyOOoElemActionTable;
1324 break;
1325 case PROP_OOO_SECTION_ATTR_ACTIONS:
1326 pInit = aSectionPropertyOOoAttrActionTable;
1327 break;
1328 case PROP_OOO_TABLE_ATTR_ACTIONS:
1329 pInit = aTablePropertyOOoAttrActionTable;
1330 break;
1331 case PROP_OOO_TABLE_COLUMN_ATTR_ACTIONS:
1332 pInit = aTableColumnPropertyOOoAttrActionTable;
1333 break;
1334 case PROP_OOO_TABLE_ROW_ATTR_ACTIONS:
1335 pInit = aTableRowPropertyOOoAttrActionTable;
1336 break;
1337 case PROP_OOO_TABLE_CELL_ATTR_ACTIONS:
1338 pInit = aTableCellPropertyOOoAttrActionTable;
1339 break;
1340 case PROP_OOO_TABLE_CELL_ELEM_ACTIONS:
1341 pInit = aTableCellPropertyOOoElemActionTable;
1342 break;
1343 case PROP_OOO_LIST_LEVEL_ATTR_ACTIONS:
1344 pInit = aListLevelPropertyOOoAttrActionTable;
1345 break;
1346 case PROP_OOO_CHART_ATTR_ACTIONS:
1347 pInit = aChartPropertyOOoAttrActionTable;
1348 break;
1349 case PROP_OOO_CHART_ELEM_ACTIONS:
1350 pInit = aChartPropertyOOoElemActionTable;
1351 break;
1354 XMLTransformerActions *pActions = nullptr;
1355 if( pInit )
1356 pActions = new XMLTransformerActions( pInit );
1358 return pActions;
1361 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */