1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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>
24 #include <rtl/ustrbuf.hxx>
25 #include <sax/tools/converter.hxx>
26 #include <xmloff/nmspmap.hxx>
27 #include <xmloff/xmltoken.hxx>
28 #include "xmloff/xmlnmspe.hxx"
29 #include "PropType.hxx"
30 #include "DeepTContext.hxx"
31 #include "ProcAttrTContext.hxx"
32 #include "TransformerBase.hxx"
33 #include "TransformerActions.hxx"
34 #include "ActionMapTypesOASIS.hxx"
35 #include "MutableAttrList.hxx"
36 #include "PropertyActionsOASIS.hxx"
37 #include "StyleOASISTContext.hxx"
38 #include <xmloff/xmluconv.hxx>
40 using ::rtl::OUString
;
41 using namespace ::xmloff::token
;
42 using namespace ::com::sun::star::uno
;
43 using namespace ::com::sun::star::xml::sax
;
44 //------------------------------------------------------------------------------
46 static sal_uInt16 aAttrActionMaps
[XML_PROP_TYPE_END
] =
48 PROP_OASIS_GRAPHIC_ATTR_ACTIONS
,
49 PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS
, // DRAWING_PAGE
50 PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS
,
51 PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS
,
52 PROP_OASIS_TEXT_ATTR_ACTIONS
,
53 PROP_OASIS_PARAGRAPH_ATTR_ACTIONS
,
54 MAX_OASIS_PROP_ACTIONS
, // RUBY
55 PROP_OASIS_SECTION_ATTR_ACTIONS
,
56 PROP_OASIS_TABLE_ATTR_ACTIONS
,
57 PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS
,
58 PROP_OASIS_TABLE_ROW_ATTR_ACTIONS
,
59 PROP_OASIS_TABLE_CELL_ATTR_ACTIONS
,
60 PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS
,
61 PROP_OASIS_CHART_ATTR_ACTIONS
64 //------------------------------------------------------------------------------
66 class XMLPropertiesTContext_Impl
: public XMLPersElemContentTContext
68 ::com::sun::star::uno::Reference
<
69 ::com::sun::star::xml::sax::XAttributeList
> m_xAttrList
;
71 XMLPropType m_ePropType
;
72 sal_Bool m_bControlStyle
;
73 ::rtl::OUString m_aStyleFamily
;
77 void SetQNameAndPropType( const ::rtl::OUString
& rQName
,
78 XMLPropType ePropType
)
80 m_ePropType
= ePropType
;
81 XMLTransformerContext::SetQName( rQName
);
86 XMLPropertiesTContext_Impl( XMLTransformerBase
& rTransformer
,
87 const ::rtl::OUString
& rQName
,
89 const ::rtl::OUString
& rStyleFamily
,
90 sal_Bool _bControlStyle
= sal_False
);
92 virtual ~XMLPropertiesTContext_Impl();
94 virtual void StartElement( const ::com::sun::star::uno::Reference
< ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
);
96 virtual void Export();
98 static XMLPropType
GetPropType( const OUString
& rLocalName
);
100 static OUString
MergeUnderline( XMLTokenEnum eUnderline
,
101 sal_Bool bBold
, sal_Bool bDouble
);
102 static OUString
MergeLineThrough( XMLTokenEnum eLineThrough
,
103 sal_Bool bBold
, sal_Bool bDouble
,
107 TYPEINIT1( XMLPropertiesTContext_Impl
, XMLPersElemContentTContext
);
109 XMLPropertiesTContext_Impl::XMLPropertiesTContext_Impl(
110 XMLTransformerBase
& rImp
, const OUString
& rQName
, XMLPropType eP
,
111 const ::rtl::OUString
& rStyleFamily
, sal_Bool _bControlStyle
) :
112 XMLPersElemContentTContext( rImp
, rQName
, XML_NAMESPACE_STYLE
,
115 m_bControlStyle( _bControlStyle
),
116 m_aStyleFamily( rStyleFamily
)
120 XMLPropertiesTContext_Impl::~XMLPropertiesTContext_Impl()
124 void XMLPropertiesTContext_Impl::StartElement(
125 const Reference
< XAttributeList
>& rAttrList
)
127 XMLTransformerActions
*pActions
= 0;
128 sal_uInt16 nActionMap
= aAttrActionMaps
[m_ePropType
];
129 if( nActionMap
< MAX_OASIS_PROP_ACTIONS
)
131 pActions
= GetTransformer().GetUserDefinedActions( nActionMap
);
132 OSL_ENSURE( pActions
, "go no actions" );
137 XMLMutableAttributeList
*pAttrList
= 0;
138 if( !m_xAttrList
.is() )
140 pAttrList
= new XMLMutableAttributeList();
141 m_xAttrList
= pAttrList
;
146 static_cast< XMLMutableAttributeList
* >( m_xAttrList
.get() );
149 XMLTokenEnum eUnderline
= XML_TOKEN_END
;
150 sal_Bool bBoldUnderline
= sal_False
, bDoubleUnderline
= sal_False
;
151 XMLTokenEnum eLineThrough
= XML_TOKEN_END
;
152 sal_Bool bBoldLineThrough
= sal_False
, bDoubleLineThrough
= sal_False
;
153 sal_Unicode cLineThroughChar
= 0;
155 bool bIntervalMinorFound
= false;
156 double fIntervalMajor
= 0.0;
157 sal_Int32 nIntervalMinorDivisor
= 0;
160 OUString aOpacityValueRemember
;
161 OUString aImageOpacityValueRemember
;
163 sal_Int16 nAttrCount
= rAttrList
.is() ? rAttrList
->getLength() : 0;
164 for( sal_Int16 i
=0; i
< nAttrCount
; i
++ )
166 const OUString
& rAttrName
= rAttrList
->getNameByIndex( i
);
167 const OUString
& rAttrValue
= rAttrList
->getValueByIndex( i
);
170 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName
,
173 XMLTransformerActions::key_type
aKey( nPrefix
, aLocalName
);
174 XMLTransformerActions::const_iterator aIter
=
175 pActions
->find( aKey
);
176 if( !(aIter
== pActions
->end() ) )
178 switch( (*aIter
).second
.m_nActionType
)
180 case XML_ATACTION_REMOVE
:
182 case XML_ATACTION_COPY
:
183 pAttrList
->AddAttribute( rAttrName
, rAttrValue
);
185 case XML_ATACTION_RENAME
:
187 OUString
aNewAttrQName(
188 GetTransformer().GetNamespaceMap().GetQNameByKey(
189 (*aIter
).second
.GetQNamePrefixFromParam1(),
190 ::xmloff::token::GetXMLToken(
191 (*aIter
).second
.GetQNameTokenFromParam1()) ) );
192 pAttrList
->AddAttribute( aNewAttrQName
, rAttrValue
);
195 case XML_ATACTION_IN2INCH
:
197 OUString
aAttrValue( rAttrValue
);
198 XMLTransformerBase::ReplaceSingleInWithInch(
200 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
203 case XML_ATACTION_INS2INCHS
:
205 OUString
aAttrValue( rAttrValue
);
206 XMLTransformerBase::ReplaceInWithInch(
208 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
211 case XML_ATACTION_DECODE_STYLE_NAME_REF
:
213 OUString
aAttrValue( rAttrValue
);
214 GetTransformer().DecodeStyleName(aAttrValue
);
215 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
218 case XML_ATACTION_RENAME_DECODE_STYLE_NAME_REF
:
220 OUString
aNewAttrQName(
221 GetTransformer().GetNamespaceMap().GetQNameByKey(
222 (*aIter
).second
.GetQNamePrefixFromParam1(),
223 ::xmloff::token::GetXMLToken(
224 (*aIter
).second
.GetQNameTokenFromParam1()) ) );
225 OUString
aAttrValue( rAttrValue
);
226 GetTransformer().DecodeStyleName(aAttrValue
);
227 pAttrList
->AddAttribute( aNewAttrQName
, aAttrValue
);
230 case XML_ATACTION_NEG_PERCENT
:
232 OUString
aAttrValue( rAttrValue
);
233 GetTransformer().NegPercent(aAttrValue
);
234 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
237 case XML_ATACTION_RENAME_NEG_PERCENT
:
239 OUString
aNewAttrQName(
240 GetTransformer().GetNamespaceMap().GetQNameByKey(
241 (*aIter
).second
.GetQNamePrefixFromParam1(),
242 ::xmloff::token::GetXMLToken(
243 (*aIter
).second
.GetQNameTokenFromParam1()) ) );
244 OUString
aAttrValue( rAttrValue
);
245 GetTransformer().NegPercent(aAttrValue
);
246 pAttrList
->AddAttribute( aNewAttrQName
, aAttrValue
);
249 case XML_OPTACTION_LINE_MODE
:
252 IsXMLToken( rAttrValue
, XML_SKIP_WHITE_SPACE
);
254 GetTransformer().GetNamespaceMap().GetQNameByKey(
256 GetXMLToken( XML_SCORE_SPACES
) ) );
258 pAttrList
->GetIndexByName( aAttrQName
);
263 const OUString
& rOldValue
=
264 pAttrList
->getValueByIndex( nIndex
);
265 if( !IsXMLToken( rOldValue
, XML_TRUE
) )
267 pAttrList
->SetValueByIndex( nIndex
,
268 GetXMLToken( XML_TRUE
) );
274 OUString
aAttrValue( GetXMLToken( bWordMode
277 pAttrList
->AddAttribute( aAttrQName
, aAttrValue
);
281 case XML_OPTACTION_KEEP_WITH_NEXT
:
283 OUString
aAttrValue( GetXMLToken(
284 IsXMLToken( rAttrValue
, XML_ALWAYS
)
287 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
290 case XML_OPTACTION_UNDERLINE_WIDTH
:
291 if( IsXMLToken( rAttrValue
, XML_BOLD
) )
292 bBoldUnderline
= sal_True
;
294 case XML_OPTACTION_UNDERLINE_TYPE
:
295 if( IsXMLToken( rAttrValue
, XML_DOUBLE
) )
296 bDoubleUnderline
= sal_True
;
298 case XML_OPTACTION_UNDERLINE_STYLE
:
299 eUnderline
= GetTransformer().GetToken( rAttrValue
);
301 case XML_OPTACTION_LINETHROUGH_WIDTH
:
302 if( IsXMLToken( rAttrValue
, XML_BOLD
) )
303 bBoldLineThrough
= sal_True
;
305 case XML_OPTACTION_LINETHROUGH_TYPE
:
306 if( IsXMLToken( rAttrValue
, XML_DOUBLE
) )
307 bDoubleLineThrough
= sal_True
;
309 case XML_OPTACTION_LINETHROUGH_STYLE
:
310 eLineThrough
= GetTransformer().GetToken( rAttrValue
);
312 case XML_OPTACTION_LINETHROUGH_TEXT
:
313 if( !rAttrValue
.isEmpty() )
314 cLineThroughChar
= rAttrValue
[0];
316 case XML_OPTACTION_INTERPOLATION
:
319 sal_Int32 nSplineType
= 0;
320 if( IsXMLToken( rAttrValue
, XML_CUBIC_SPLINE
))
322 else if( IsXMLToken( rAttrValue
, XML_B_SPLINE
))
325 pAttrList
->AddAttribute(
326 GetTransformer().GetNamespaceMap().GetQNameByKey(
328 GetXMLToken( XML_SPLINES
)),
329 OUString::valueOf( nSplineType
));
332 case XML_OPTACTION_INTERVAL_MAJOR
:
333 pAttrList
->AddAttribute( rAttrName
, rAttrValue
);
334 ::sax::Converter::convertDouble(fIntervalMajor
, rAttrValue
);
336 case XML_OPTACTION_INTERVAL_MINOR_DIVISOR
:
337 ::sax::Converter::convertNumber(nIntervalMinorDivisor
, rAttrValue
);
338 bIntervalMinorFound
= true;
340 case XML_OPTACTION_SYMBOL_TYPE
:
342 // if symbol_type is "named-symbol" the "symbol"
343 // property is set in the action XML_OPTACTION_SYMBOL_NAME
344 sal_Int32 nSymbolType
= 0;
345 if( IsXMLToken( rAttrValue
, XML_NONE
))
347 else if( IsXMLToken( rAttrValue
, XML_AUTOMATIC
))
349 else if( IsXMLToken( rAttrValue
, XML_IMAGE
))
352 if( nSymbolType
< 0 )
353 pAttrList
->AddAttribute(
354 GetTransformer().GetNamespaceMap().GetQNameByKey(
356 GetXMLToken( XML_SYMBOL
)),
357 OUString::valueOf( nSymbolType
));
360 case XML_OPTACTION_SYMBOL_NAME
:
362 // assume "symbol-type" == "named-symbol"
363 sal_Int32 nSymbolType
= -3; // NONE
364 // "square" just has an awkward token-name
365 if( IsXMLToken( rAttrValue
, XML_GRADIENTSTYLE_SQUARE
))
367 else if( IsXMLToken( rAttrValue
, XML_DIAMOND
))
369 else if( IsXMLToken( rAttrValue
, XML_ARROW_DOWN
))
371 else if( IsXMLToken( rAttrValue
, XML_ARROW_UP
))
373 else if( IsXMLToken( rAttrValue
, XML_ARROW_RIGHT
))
375 else if( IsXMLToken( rAttrValue
, XML_ARROW_LEFT
))
377 else if( IsXMLToken( rAttrValue
, XML_BOW_TIE
))
379 else if( IsXMLToken( rAttrValue
, XML_HOURGLASS
))
381 else if( IsXMLToken( rAttrValue
, XML_CIRCLE
))
383 else if( IsXMLToken( rAttrValue
, XML_STAR
))
385 else if( IsXMLToken( rAttrValue
, XML_X
))
387 else if( IsXMLToken( rAttrValue
, XML_PLUS
))
389 else if( IsXMLToken( rAttrValue
, XML_ASTERISK
))
391 else if( IsXMLToken( rAttrValue
, XML_HORIZONTAL_BAR
))
393 else if( IsXMLToken( rAttrValue
, XML_VERTICAL_BAR
))
396 if( nSymbolType
>= 0 )
397 pAttrList
->AddAttribute(
398 GetTransformer().GetNamespaceMap().GetQNameByKey(
400 GetXMLToken( XML_SYMBOL
)),
401 OUString::valueOf( nSymbolType
));
405 case XML_OPTACTION_OPACITY
:
406 aOpacityValueRemember
= rAttrValue
;
407 GetTransformer().NegPercent(aOpacityValueRemember
);
411 case XML_OPTACTION_IMAGE_OPACITY
:
412 aImageOpacityValueRemember
= rAttrValue
;
413 GetTransformer().NegPercent(aImageOpacityValueRemember
);
416 case XML_OPTACTION_KEEP_TOGETHER
:
417 pAttrList
->AddAttribute(
418 GetTransformer().GetNamespaceMap().GetQNameByKey(
419 XML_NAMESPACE_STYLE
,GetXMLToken(XML_BREAK_INSIDE
)),
421 IsXMLToken( rAttrValue
, XML_ALWAYS
)
422 ? XML_COLUMNSPLIT_AVOID
423 : XML_COLUMNSPLIT_AUTO
) );
426 case XML_OPTACTION_CONTROL_TEXT_ALIGN
:
427 if ( m_bControlStyle
)
429 OUString
aNewAttrQName(
430 GetTransformer().GetNamespaceMap().GetQNameByKey(
432 ::xmloff::token::GetXMLToken(
433 XML_TEXT_ALIGN
) ) );
434 pAttrList
->AddAttribute( aNewAttrQName
, rAttrValue
);
438 OUString
aNewAttrQName(
439 GetTransformer().GetNamespaceMap().GetQNameByKey(
441 ::xmloff::token::GetXMLToken(
442 XML_TEXT_ALIGN
) ) );
443 pAttrList
->AddAttribute( aNewAttrQName
, rAttrValue
);
447 case XML_OPTACTION_DRAW_WRITING_MODE
:
448 if( IsXMLToken( m_aStyleFamily
, XML_GRAPHICS
) )
450 pAttrList
->AddAttribute(
451 GetTransformer().GetNamespaceMap().GetQNameByKey(
453 GetXMLToken( XML_WRITING_MODE
) ), rAttrValue
);
455 pAttrList
->AddAttribute( rAttrName
, rAttrValue
);
458 case XML_ATACTION_CAPTION_ESCAPE_OASIS
:
460 OUString
aAttrValue( rAttrValue
);
461 if( aAttrValue
.indexOf( sal_Unicode('%') ) != -1 )
463 sal_Int32 nValue
= 0;
464 ::sax::Converter::convertPercent(nValue
, rAttrValue
);
468 rtl::OUStringBuffer aOut
;
469 ::sax::Converter::convertPercent(aOut
, nValue
);
470 aAttrValue
= aOut
.makeStringAndClear();
475 XMLTransformerBase::ReplaceSingleInWithInch( aAttrValue
);
478 pAttrList
->AddAttribute( rAttrName
, aAttrValue
);
482 case XML_ATACTION_DECODE_PROTECT
:
484 pAttrList
->AddAttribute( rAttrName
, rAttrValue
);
486 if( rAttrValue
.indexOf( GetXMLToken( XML_SIZE
) ) != -1 )
487 pAttrList
->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
489 GetXMLToken( XML_SIZE_PROTECT
)), GetXMLToken( XML_TRUE
) );
491 if( rAttrValue
.indexOf( GetXMLToken( XML_POSITION
) ) != -1 )
492 pAttrList
->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
494 GetXMLToken( XML_MOVE_PROTECT
)), GetXMLToken( XML_TRUE
) );
498 case XML_ATACTION_DRAW_MIRROR_OASIS
: // renames style:mirror to draw:mirror and adapts values
500 // keep original for writer graphic objects
501 // Adapts attribute values (#i49139#)
502 OUString aNewAttrValue
;
503 SvXMLTokenEnumerator
aTokenEnum( rAttrValue
);
505 while( aTokenEnum
.getNextToken( aToken
) )
507 if ( !aNewAttrValue
.isEmpty() )
509 aNewAttrValue
+= rtl::OUString(" " );
512 if ( IsXMLToken( aToken
, XML_HORIZONTAL_ON_EVEN
) )
514 aNewAttrValue
+= GetXMLToken( XML_HORIZONTAL_ON_LEFT_PAGES
);
516 else if ( IsXMLToken( aToken
, XML_HORIZONTAL_ON_ODD
) )
518 aNewAttrValue
+= GetXMLToken( XML_HORIZONTAL_ON_RIGHT_PAGES
);
522 aNewAttrValue
+= aToken
;
525 pAttrList
->AddAttribute( rAttrName
, aNewAttrValue
);
527 // create old draw:mirror for drawing graphic objects
528 OUString
aAttrValue( GetXMLToken( IsXMLToken( rAttrValue
, XML_HORIZONTAL
) ? XML_TRUE
: XML_FALSE
) );
529 pAttrList
->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
531 GetXMLToken( XML_MIRROR
)), aAttrValue
);
534 case XML_ATACTION_GAMMA_OASIS
: // converts percentage value to double
537 ::sax::Converter::convertPercent( nValue
, rAttrValue
);
538 const double fValue
= ((double)nValue
) / 100.0;
539 pAttrList
->AddAttribute( rAttrName
, OUString::valueOf( fValue
) );
542 case XML_ATACTION_OPACITY_FIX
:
545 if( rAttrValue
.indexOf( sal_Unicode('%') ) != -1 )
547 ::sax::Converter::convertPercent(nValue
, rAttrValue
);
551 nValue
= sal_Int32( rAttrValue
.toDouble() * 100.0 );
553 nValue
= 100 - nValue
;
555 rtl::OUStringBuffer aOut
;
556 ::sax::Converter::convertPercent(aOut
, nValue
);
557 pAttrList
->AddAttribute( rAttrName
, aOut
.makeStringAndClear() );
561 OSL_ENSURE( !this, "unknown action" );
567 pAttrList
->AddAttribute( rAttrName
, rAttrValue
);
570 if( XML_TOKEN_END
!= eUnderline
)
571 pAttrList
->AddAttribute(
572 GetTransformer().GetNamespaceMap().GetQNameByKey(
574 GetXMLToken( XML_TEXT_UNDERLINE
) ),
575 MergeUnderline( eUnderline
, bBoldUnderline
,
576 bDoubleUnderline
) );
577 if( XML_TOKEN_END
!= eLineThrough
)
578 pAttrList
->AddAttribute(
579 GetTransformer().GetNamespaceMap().GetQNameByKey(
581 GetXMLToken( XML_TEXT_CROSSING_OUT
) ),
582 MergeLineThrough( eLineThrough
, bBoldLineThrough
,
583 bDoubleLineThrough
, cLineThroughChar
) );
584 if( bIntervalMinorFound
)
586 double fIntervalMinor
= 0.0;
587 if( nIntervalMinorDivisor
!= 0)
588 fIntervalMinor
= fIntervalMajor
/ static_cast< double >( nIntervalMinorDivisor
);
590 ::rtl::OUStringBuffer aBuf
;
591 ::sax::Converter::convertDouble( aBuf
, fIntervalMinor
);
592 pAttrList
->AddAttribute(
593 GetTransformer().GetNamespaceMap().GetQNameByKey(
595 GetXMLToken( XML_INTERVAL_MINOR
)),
596 aBuf
.makeStringAndClear());
600 if(!aOpacityValueRemember
.isEmpty() || !aImageOpacityValueRemember
.isEmpty())
602 pAttrList
->AddAttribute(
603 GetTransformer().GetNamespaceMap().GetQNameByKey(
605 GetXMLToken( XML_TRANSPARENCY
) ),
606 !aImageOpacityValueRemember
.isEmpty()
607 ? aImageOpacityValueRemember
: aOpacityValueRemember
);
612 if( !m_xAttrList
.is() )
614 m_xAttrList
= new XMLMutableAttributeList( rAttrList
, sal_True
);
618 static_cast< XMLMutableAttributeList
* >( m_xAttrList
.get() )
619 ->AppendAttributeList( rAttrList
);
624 void XMLPropertiesTContext_Impl::Export()
626 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
629 GetTransformer().GetDocHandler()->endElement( GetExportQName() );
632 XMLPropType
XMLPropertiesTContext_Impl::GetPropType( const OUString
& rLocalName
)
634 XMLPropType eProp
= XML_PROP_TYPE_END
;
635 if( IsXMLToken( rLocalName
, XML_GRAPHIC_PROPERTIES
) )
636 eProp
= XML_PROP_TYPE_GRAPHIC
;
637 else if( IsXMLToken( rLocalName
, XML_DRAWING_PAGE_PROPERTIES
) )
638 eProp
= XML_PROP_TYPE_DRAWING_PAGE
;
639 else if( IsXMLToken( rLocalName
, XML_PAGE_LAYOUT_PROPERTIES
) )
640 eProp
= XML_PROP_TYPE_PAGE_LAYOUT
;
641 else if( IsXMLToken( rLocalName
, XML_HEADER_FOOTER_PROPERTIES
) )
642 eProp
= XML_PROP_TYPE_HEADER_FOOTER
;
643 else if( IsXMLToken( rLocalName
, XML_TEXT_PROPERTIES
) )
644 eProp
= XML_PROP_TYPE_TEXT
;
645 else if( IsXMLToken( rLocalName
, XML_PARAGRAPH_PROPERTIES
) )
646 eProp
= XML_PROP_TYPE_PARAGRAPH
;
647 else if( IsXMLToken( rLocalName
, XML_RUBY_PROPERTIES
) )
648 eProp
= XML_PROP_TYPE_RUBY
;
649 else if( IsXMLToken( rLocalName
, XML_SECTION_PROPERTIES
) )
650 eProp
= XML_PROP_TYPE_SECTION
;
651 else if( IsXMLToken( rLocalName
, XML_TABLE_PROPERTIES
) )
652 eProp
= XML_PROP_TYPE_TABLE
;
653 else if( IsXMLToken( rLocalName
, XML_TABLE_COLUMN_PROPERTIES
) )
654 eProp
= XML_PROP_TYPE_TABLE_COLUMN
;
655 else if( IsXMLToken( rLocalName
, XML_TABLE_ROW_PROPERTIES
) )
656 eProp
= XML_PROP_TYPE_TABLE_ROW
;
657 else if( IsXMLToken( rLocalName
, XML_TABLE_CELL_PROPERTIES
) )
658 eProp
= XML_PROP_TYPE_TABLE_CELL
;
659 else if( IsXMLToken( rLocalName
, XML_LIST_LEVEL_PROPERTIES
) )
660 eProp
= XML_PROP_TYPE_LIST_LEVEL
;
661 else if( IsXMLToken( rLocalName
, XML_CHART_PROPERTIES
) )
662 eProp
= XML_PROP_TYPE_CHART
;
667 OUString
XMLPropertiesTContext_Impl::MergeUnderline(
668 XMLTokenEnum eUnderline
, sal_Bool bBold
, sal_Bool bDouble
)
675 eUnderline
= XML_DOUBLE_WAVE
;
678 eUnderline
= XML_DOUBLE
;
688 eUnderline
= XML_BOLD
;
691 eUnderline
= XML_BOLD_DOTTED
;
694 eUnderline
= XML_BOLD_DASH
;
697 eUnderline
= XML_BOLD_LONG_DASH
;
700 eUnderline
= XML_BOLD_DOT_DASH
;
702 case XML_DOT_DOT_DASH
:
703 eUnderline
= XML_BOLD_DOT_DOT_DASH
;
706 eUnderline
= XML_BOLD_WAVE
;
709 OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
718 eUnderline
= XML_SINGLE
;
721 eUnderline
= XML_NONE
;
724 OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
729 return GetXMLToken( eUnderline
);
732 OUString
XMLPropertiesTContext_Impl::MergeLineThrough(
733 XMLTokenEnum eLineThrough
, sal_Bool bBold
, sal_Bool bDouble
,
737 eLineThrough
= c
=='/' ? XML_SLASH
: XML_uX
;
739 eLineThrough
= XML_DOUBLE_LINE
;
741 eLineThrough
= XML_THICK_LINE
;
742 else if( XML_NONE
!= eLineThrough
)
743 eLineThrough
= XML_SINGLE_LINE
;
745 return GetXMLToken( eLineThrough
);
748 //------------------------------------------------------------------------------
750 TYPEINIT1( XMLStyleOASISTContext
, XMLPersElemContentTContext
);
752 XMLStyleOASISTContext::XMLStyleOASISTContext( XMLTransformerBase
& rImp
,
753 const OUString
& rQName
,
754 sal_Bool bPersistent
) :
755 XMLPersElemContentTContext ( rImp
, rQName
),
756 m_bPersistent( bPersistent
),
757 m_bControlStyle( false )
761 XMLStyleOASISTContext::XMLStyleOASISTContext(
762 XMLTransformerBase
& rImp
,
763 const OUString
& rQName
,
765 ::xmloff::token::XMLTokenEnum eToken
,
766 sal_Bool bPersistent
) :
767 XMLPersElemContentTContext( rImp
, rQName
, nPrefix
, eToken
),
768 m_bPersistent( bPersistent
)
772 XMLStyleOASISTContext::~XMLStyleOASISTContext()
776 XMLTransformerContext
*XMLStyleOASISTContext::CreateChildContext(
778 const OUString
& rLocalName
,
779 const OUString
& rQName
,
780 const Reference
< XAttributeList
>& rAttrList
)
782 XMLTransformerContext
*pContext
= 0;
784 if( XML_NAMESPACE_STYLE
== nPrefix
)
786 XMLPropType ePropType
=
787 XMLPropertiesTContext_Impl::GetPropType( rLocalName
);
788 if( XML_PROP_TYPE_END
!= ePropType
)
790 // if no properties context exist start a new one.
791 if( !m_xPropContext
.is() )
792 m_xPropContext
= new XMLPropertiesTContext_Impl(
793 GetTransformer(), rQName
, ePropType
, m_aStyleFamily
, m_bControlStyle
);
795 m_xPropContext
->SetQNameAndPropType( rQName
, ePropType
);
796 pContext
= m_xPropContext
.get();
801 // if a properties context exist close it
802 if( m_xPropContext
.is() && !m_bPersistent
)
804 m_xPropContext
->Export();
808 pContext
= m_bPersistent
809 ? XMLPersElemContentTContext::CreateChildContext(
810 nPrefix
, rLocalName
, rQName
, rAttrList
)
811 : XMLTransformerContext::CreateChildContext(
812 nPrefix
, rLocalName
, rQName
, rAttrList
);
818 void XMLStyleOASISTContext::StartElement(
819 const Reference
< XAttributeList
>& rAttrList
)
821 XMLTransformerActions
*pActions
=
822 GetTransformer().GetUserDefinedActions( OASIS_STYLE_ACTIONS
);
823 OSL_ENSURE( pActions
, "go no actions" );
825 Reference
< XAttributeList
> xAttrList( rAttrList
);
826 XMLMutableAttributeList
*pMutableAttrList
= 0;
827 sal_Int16 nAttrCount
= xAttrList
.is() ? xAttrList
->getLength() : 0;
828 sal_Int16 nFamilyAttr
= -1;
829 m_bControlStyle
= sal_False
;
831 for( sal_Int16 i
=0; i
< nAttrCount
; i
++ )
833 const OUString
& rAttrName
= xAttrList
->getNameByIndex( i
);
836 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName
,
838 XMLTransformerActions::key_type
aKey( nPrefix
, aLocalName
);
839 XMLTransformerActions::const_iterator aIter
=
840 pActions
->find( aKey
);
841 if( !(aIter
== pActions
->end() ) )
843 if( !pMutableAttrList
)
846 new XMLMutableAttributeList( xAttrList
);
847 xAttrList
= pMutableAttrList
;
849 const OUString
& rAttrValue
= xAttrList
->getValueByIndex( i
);
850 switch( (*aIter
).second
.m_nActionType
)
852 case XML_ATACTION_STYLE_FAMILY
:
853 if( IsXMLToken( rAttrValue
, XML_GRAPHIC
) )
855 m_aStyleFamily
= GetXMLToken( XML_GRAPHICS
) ;
856 pMutableAttrList
->SetValueByIndex( i
, m_aStyleFamily
);
860 m_aStyleFamily
= rAttrValue
;
862 if( IsXMLToken( rAttrValue
, XML_PARAGRAPH
) )
867 case XML_ATACTION_STYLE_DISPLAY_NAME
:
868 case XML_ATACTION_REMOVE
:
869 pMutableAttrList
->RemoveAttributeByIndex( i
);
873 case XML_ATACTION_DECODE_STYLE_NAME
:
874 m_bControlStyle
= 0 == rAttrValue
.compareToAscii( "ctrl", 4 );
875 case XML_ATACTION_DECODE_STYLE_NAME_REF
:
877 OUString
aAttrValue( rAttrValue
);
878 if( GetTransformer().DecodeStyleName(aAttrValue
) )
879 pMutableAttrList
->SetValueByIndex( i
, aAttrValue
);
882 case XML_ATACTION_IN2INCH
:
884 OUString
aAttrValue( rAttrValue
);
885 if( XMLTransformerBase::ReplaceSingleInWithInch(
887 pMutableAttrList
->SetValueByIndex( i
, aAttrValue
);
890 case XML_ATACTION_NEG_PERCENT
:
892 OUString
aAttrValue( rAttrValue
);
893 if( GetTransformer().NegPercent(aAttrValue
) )
894 pMutableAttrList
->SetValueByIndex( i
, aAttrValue
);
897 case XML_ATACTION_URI_OASIS
:
899 OUString
aAttrValue( rAttrValue
);
900 if( GetTransformer().ConvertURIToOOo( aAttrValue
,
901 static_cast< sal_Bool
>((*aIter
).second
.m_nParam1
)))
902 pMutableAttrList
->SetValueByIndex( i
, aAttrValue
);
906 OSL_ENSURE( !this, "unknown action" );
912 if( m_bControlStyle
&& nFamilyAttr
!= -1 )
913 pMutableAttrList
->SetValueByIndex( nFamilyAttr
, GetXMLToken( XML_CONTROL
) );
917 XMLPersElemContentTContext::StartElement( xAttrList
);
919 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
923 void XMLStyleOASISTContext::EndElement()
927 XMLPersElemContentTContext::EndElement();
931 // if a properties context exist close it
932 if( m_xPropContext
.is() )
934 m_xPropContext
->Export();
937 GetTransformer().GetDocHandler()->endElement( GetExportQName() );
941 void XMLStyleOASISTContext::Characters( const OUString
& )
943 // element content only:
946 void XMLStyleOASISTContext::ExportContent()
948 if( m_xPropContext
.is() )
949 m_xPropContext
->Export();
950 XMLPersElemContentTContext::ExportContent();
953 sal_Bool
XMLStyleOASISTContext::IsPersistent() const
955 return m_bPersistent
;
958 XMLTransformerActions
*XMLStyleOASISTContext::CreateTransformerActions(
961 XMLTransformerActionInit
*pInit
= 0;
965 case PROP_OASIS_GRAPHIC_ATTR_ACTIONS
:
966 pInit
= aGraphicPropertyOASISAttrActionTable
;
968 case PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS
:
969 pInit
= aDrawingPagePropertyOASISAttrActionTable
;
971 case PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS
:
972 pInit
= aPageLayoutPropertyOASISAttrActionTable
;
974 case PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS
:
975 pInit
= aHeaderFooterPropertyOASISAttrActionTable
;
977 case PROP_OASIS_TEXT_ATTR_ACTIONS
:
978 pInit
= aTextPropertyOASISAttrActionTable
;
980 case PROP_OASIS_PARAGRAPH_ATTR_ACTIONS
:
981 pInit
= aParagraphPropertyOASISAttrActionTable
;
983 case PROP_OASIS_SECTION_ATTR_ACTIONS
:
984 pInit
= aSectionPropertyOASISAttrActionTable
;
986 case PROP_OASIS_TABLE_ATTR_ACTIONS
:
987 pInit
= aTablePropertyOASISAttrActionTable
;
989 case PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS
:
990 pInit
= aTableColumnPropertyOASISAttrActionTable
;
992 case PROP_OASIS_TABLE_ROW_ATTR_ACTIONS
:
993 pInit
= aTableRowPropertyOASISAttrActionTable
;
995 case PROP_OASIS_TABLE_CELL_ATTR_ACTIONS
:
996 pInit
= aTableCellPropertyOASISAttrActionTable
;
998 case PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS
:
999 pInit
= aListLevelPropertyOASISAttrActionTable
;
1001 case PROP_OASIS_CHART_ATTR_ACTIONS
:
1002 pInit
= aChartPropertyOASISAttrActionTable
;
1006 XMLTransformerActions
*pActions
= 0;
1008 pActions
= new XMLTransformerActions( pInit
);
1013 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */