Bump for 4.0-11
[LibreOffice.git] / xmloff / source / transform / StyleOASISTContext.cxx
blob6f7caf7daf66218577a52b75e7d3ecdea873dc84
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>
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;
75 public:
77 void SetQNameAndPropType( const ::rtl::OUString& rQName,
78 XMLPropType ePropType )
80 m_ePropType = ePropType;
81 XMLTransformerContext::SetQName( rQName );
84 TYPEINFO();
86 XMLPropertiesTContext_Impl( XMLTransformerBase& rTransformer,
87 const ::rtl::OUString& rQName,
88 XMLPropType eP,
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,
104 sal_Unicode c );
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,
113 XML_PROPERTIES),
114 m_ePropType( eP ),
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" );
135 if( pActions )
137 XMLMutableAttributeList *pAttrList = 0;
138 if( !m_xAttrList.is() )
140 pAttrList = new XMLMutableAttributeList();
141 m_xAttrList = pAttrList;
143 else
145 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;
159 // #i25616#
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 );
168 OUString aLocalName;
169 sal_uInt16 nPrefix =
170 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
171 &aLocalName );
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:
181 break;
182 case XML_ATACTION_COPY:
183 pAttrList->AddAttribute( rAttrName, rAttrValue );
184 break;
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 );
194 break;
195 case XML_ATACTION_IN2INCH:
197 OUString aAttrValue( rAttrValue );
198 XMLTransformerBase::ReplaceSingleInWithInch(
199 aAttrValue );
200 pAttrList->AddAttribute( rAttrName, aAttrValue );
202 break;
203 case XML_ATACTION_INS2INCHS:
205 OUString aAttrValue( rAttrValue );
206 XMLTransformerBase::ReplaceInWithInch(
207 aAttrValue );
208 pAttrList->AddAttribute( rAttrName, aAttrValue );
210 break;
211 case XML_ATACTION_DECODE_STYLE_NAME_REF:
213 OUString aAttrValue( rAttrValue );
214 GetTransformer().DecodeStyleName(aAttrValue);
215 pAttrList->AddAttribute( rAttrName, aAttrValue );
217 break;
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 );
229 break;
230 case XML_ATACTION_NEG_PERCENT:
232 OUString aAttrValue( rAttrValue );
233 GetTransformer().NegPercent(aAttrValue);
234 pAttrList->AddAttribute( rAttrName, aAttrValue );
236 break;
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 );
248 break;
249 case XML_OPTACTION_LINE_MODE:
251 sal_Bool bWordMode =
252 IsXMLToken( rAttrValue, XML_SKIP_WHITE_SPACE );
253 OUString aAttrQName(
254 GetTransformer().GetNamespaceMap().GetQNameByKey(
255 XML_NAMESPACE_FO,
256 GetXMLToken( XML_SCORE_SPACES ) ) );
257 sal_Int16 nIndex =
258 pAttrList->GetIndexByName( aAttrQName );
259 if( -1 != nIndex )
261 if( bWordMode )
263 const OUString& rOldValue =
264 pAttrList->getValueByIndex( nIndex );
265 if( !IsXMLToken( rOldValue, XML_TRUE ) )
267 pAttrList->SetValueByIndex( nIndex,
268 GetXMLToken( XML_TRUE ) );
272 else
274 OUString aAttrValue( GetXMLToken( bWordMode
275 ? XML_FALSE
276 : XML_TRUE ) );
277 pAttrList->AddAttribute( aAttrQName, aAttrValue );
280 break;
281 case XML_OPTACTION_KEEP_WITH_NEXT:
283 OUString aAttrValue( GetXMLToken(
284 IsXMLToken( rAttrValue, XML_ALWAYS )
285 ? XML_TRUE
286 : XML_FALSE) );
287 pAttrList->AddAttribute( rAttrName, aAttrValue );
289 break;
290 case XML_OPTACTION_UNDERLINE_WIDTH:
291 if( IsXMLToken( rAttrValue, XML_BOLD ) )
292 bBoldUnderline = sal_True;
293 break;
294 case XML_OPTACTION_UNDERLINE_TYPE:
295 if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
296 bDoubleUnderline = sal_True;
297 break;
298 case XML_OPTACTION_UNDERLINE_STYLE:
299 eUnderline = GetTransformer().GetToken( rAttrValue );
300 break;
301 case XML_OPTACTION_LINETHROUGH_WIDTH:
302 if( IsXMLToken( rAttrValue, XML_BOLD ) )
303 bBoldLineThrough = sal_True;
304 break;
305 case XML_OPTACTION_LINETHROUGH_TYPE:
306 if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
307 bDoubleLineThrough = sal_True;
308 break;
309 case XML_OPTACTION_LINETHROUGH_STYLE:
310 eLineThrough = GetTransformer().GetToken( rAttrValue );
311 break;
312 case XML_OPTACTION_LINETHROUGH_TEXT:
313 if( !rAttrValue.isEmpty() )
314 cLineThroughChar = rAttrValue[0];
315 break;
316 case XML_OPTACTION_INTERPOLATION:
318 // 0: none
319 sal_Int32 nSplineType = 0;
320 if( IsXMLToken( rAttrValue, XML_CUBIC_SPLINE ))
321 nSplineType = 1;
322 else if( IsXMLToken( rAttrValue, XML_B_SPLINE ))
323 nSplineType = 2;
325 pAttrList->AddAttribute(
326 GetTransformer().GetNamespaceMap().GetQNameByKey(
327 XML_NAMESPACE_CHART,
328 GetXMLToken( XML_SPLINES )),
329 OUString::valueOf( nSplineType ));
331 break;
332 case XML_OPTACTION_INTERVAL_MAJOR:
333 pAttrList->AddAttribute( rAttrName, rAttrValue );
334 ::sax::Converter::convertDouble(fIntervalMajor, rAttrValue);
335 break;
336 case XML_OPTACTION_INTERVAL_MINOR_DIVISOR:
337 ::sax::Converter::convertNumber(nIntervalMinorDivisor, rAttrValue);
338 bIntervalMinorFound = true;
339 break;
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 ))
346 nSymbolType = -3;
347 else if( IsXMLToken( rAttrValue, XML_AUTOMATIC ))
348 nSymbolType = -2;
349 else if( IsXMLToken( rAttrValue, XML_IMAGE ))
350 nSymbolType = -1;
352 if( nSymbolType < 0 )
353 pAttrList->AddAttribute(
354 GetTransformer().GetNamespaceMap().GetQNameByKey(
355 XML_NAMESPACE_CHART,
356 GetXMLToken( XML_SYMBOL )),
357 OUString::valueOf( nSymbolType ));
359 break;
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 ))
366 nSymbolType = 0;
367 else if( IsXMLToken( rAttrValue, XML_DIAMOND ))
368 nSymbolType = 1;
369 else if( IsXMLToken( rAttrValue, XML_ARROW_DOWN ))
370 nSymbolType = 2;
371 else if( IsXMLToken( rAttrValue, XML_ARROW_UP ))
372 nSymbolType = 3;
373 else if( IsXMLToken( rAttrValue, XML_ARROW_RIGHT ))
374 nSymbolType = 4;
375 else if( IsXMLToken( rAttrValue, XML_ARROW_LEFT ))
376 nSymbolType = 5;
377 else if( IsXMLToken( rAttrValue, XML_BOW_TIE ))
378 nSymbolType = 6;
379 else if( IsXMLToken( rAttrValue, XML_HOURGLASS ))
380 nSymbolType = 7;
381 else if( IsXMLToken( rAttrValue, XML_CIRCLE ))
382 nSymbolType = 8;
383 else if( IsXMLToken( rAttrValue, XML_STAR ))
384 nSymbolType = 9;
385 else if( IsXMLToken( rAttrValue, XML_X ))
386 nSymbolType = 10;
387 else if( IsXMLToken( rAttrValue, XML_PLUS ))
388 nSymbolType = 11;
389 else if( IsXMLToken( rAttrValue, XML_ASTERISK ))
390 nSymbolType = 12;
391 else if( IsXMLToken( rAttrValue, XML_HORIZONTAL_BAR ))
392 nSymbolType = 13;
393 else if( IsXMLToken( rAttrValue, XML_VERTICAL_BAR ))
394 nSymbolType = 14;
396 if( nSymbolType >= 0 )
397 pAttrList->AddAttribute(
398 GetTransformer().GetNamespaceMap().GetQNameByKey(
399 XML_NAMESPACE_CHART,
400 GetXMLToken( XML_SYMBOL )),
401 OUString::valueOf( nSymbolType ));
403 break;
404 // #i25616#
405 case XML_OPTACTION_OPACITY:
406 aOpacityValueRemember = rAttrValue;
407 GetTransformer().NegPercent(aOpacityValueRemember);
408 break;
410 // #i25616#
411 case XML_OPTACTION_IMAGE_OPACITY:
412 aImageOpacityValueRemember = rAttrValue;
413 GetTransformer().NegPercent(aImageOpacityValueRemember);
414 break;
416 case XML_OPTACTION_KEEP_TOGETHER:
417 pAttrList->AddAttribute(
418 GetTransformer().GetNamespaceMap().GetQNameByKey(
419 XML_NAMESPACE_STYLE,GetXMLToken(XML_BREAK_INSIDE)),
420 GetXMLToken(
421 IsXMLToken( rAttrValue, XML_ALWAYS )
422 ? XML_COLUMNSPLIT_AVOID
423 : XML_COLUMNSPLIT_AUTO ) );
424 break;
426 case XML_OPTACTION_CONTROL_TEXT_ALIGN:
427 if ( m_bControlStyle )
429 OUString aNewAttrQName(
430 GetTransformer().GetNamespaceMap().GetQNameByKey(
431 XML_NAMESPACE_STYLE,
432 ::xmloff::token::GetXMLToken(
433 XML_TEXT_ALIGN ) ) );
434 pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
436 else
438 OUString aNewAttrQName(
439 GetTransformer().GetNamespaceMap().GetQNameByKey(
440 XML_NAMESPACE_FO,
441 ::xmloff::token::GetXMLToken(
442 XML_TEXT_ALIGN ) ) );
443 pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
445 break;
447 case XML_OPTACTION_DRAW_WRITING_MODE:
448 if( IsXMLToken( m_aStyleFamily, XML_GRAPHICS ) )
450 pAttrList->AddAttribute(
451 GetTransformer().GetNamespaceMap().GetQNameByKey(
452 XML_NAMESPACE_DRAW,
453 GetXMLToken( XML_WRITING_MODE ) ), rAttrValue );
455 pAttrList->AddAttribute( rAttrName, rAttrValue );
456 break;
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);
465 if( nValue )
467 nValue *= 100;
468 rtl::OUStringBuffer aOut;
469 ::sax::Converter::convertPercent(aOut, nValue);
470 aAttrValue = aOut.makeStringAndClear();
473 else
475 XMLTransformerBase::ReplaceSingleInWithInch( aAttrValue );
478 pAttrList->AddAttribute( rAttrName, aAttrValue );
480 break;
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(
488 XML_NAMESPACE_DRAW,
489 GetXMLToken( XML_SIZE_PROTECT )), GetXMLToken( XML_TRUE ) );
491 if( rAttrValue.indexOf( GetXMLToken( XML_POSITION ) ) != -1 )
492 pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
493 XML_NAMESPACE_DRAW,
494 GetXMLToken( XML_MOVE_PROTECT )), GetXMLToken( XML_TRUE ) );
496 break;
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 );
504 OUString aToken;
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 );
520 else
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(
530 XML_NAMESPACE_DRAW,
531 GetXMLToken( XML_MIRROR )), aAttrValue );
533 break;
534 case XML_ATACTION_GAMMA_OASIS: // converts percentage value to double
536 sal_Int32 nValue;
537 ::sax::Converter::convertPercent( nValue, rAttrValue );
538 const double fValue = ((double)nValue) / 100.0;
539 pAttrList->AddAttribute( rAttrName, OUString::valueOf( fValue ) );
541 break;
542 case XML_ATACTION_OPACITY_FIX:
544 sal_Int32 nValue;
545 if( rAttrValue.indexOf( sal_Unicode('%') ) != -1 )
547 ::sax::Converter::convertPercent(nValue, rAttrValue);
549 else
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() );
559 break;
560 default:
561 OSL_ENSURE( !this, "unknown action" );
562 break;
565 else
567 pAttrList->AddAttribute( rAttrName, rAttrValue );
570 if( XML_TOKEN_END != eUnderline )
571 pAttrList->AddAttribute(
572 GetTransformer().GetNamespaceMap().GetQNameByKey(
573 XML_NAMESPACE_STYLE,
574 GetXMLToken( XML_TEXT_UNDERLINE ) ),
575 MergeUnderline( eUnderline, bBoldUnderline,
576 bDoubleUnderline ) );
577 if( XML_TOKEN_END != eLineThrough )
578 pAttrList->AddAttribute(
579 GetTransformer().GetNamespaceMap().GetQNameByKey(
580 XML_NAMESPACE_STYLE,
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(
594 XML_NAMESPACE_CHART,
595 GetXMLToken( XML_INTERVAL_MINOR )),
596 aBuf.makeStringAndClear());
599 // #i25616#
600 if(!aOpacityValueRemember.isEmpty() || !aImageOpacityValueRemember.isEmpty())
602 pAttrList->AddAttribute(
603 GetTransformer().GetNamespaceMap().GetQNameByKey(
604 XML_NAMESPACE_DRAW,
605 GetXMLToken( XML_TRANSPARENCY ) ),
606 !aImageOpacityValueRemember.isEmpty()
607 ? aImageOpacityValueRemember : aOpacityValueRemember );
610 else
612 if( !m_xAttrList.is() )
614 m_xAttrList = new XMLMutableAttributeList( rAttrList, sal_True );
616 else
618 static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
619 ->AppendAttributeList( rAttrList );
624 void XMLPropertiesTContext_Impl::Export()
626 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
627 m_xAttrList );
628 ExportContent();
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;
664 return eProp;
667 OUString XMLPropertiesTContext_Impl::MergeUnderline(
668 XMLTokenEnum eUnderline, sal_Bool bBold, sal_Bool bDouble )
670 if( bDouble )
672 switch( eUnderline )
674 case XML_WAVE:
675 eUnderline = XML_DOUBLE_WAVE;
676 break;
677 default:
678 eUnderline = XML_DOUBLE;
679 break;
682 else if( bBold )
684 switch( eUnderline )
686 case XML_NONE:
687 case XML_SOLID:
688 eUnderline = XML_BOLD;
689 break;
690 case XML_DOTTED:
691 eUnderline = XML_BOLD_DOTTED;
692 break;
693 case XML_DASH:
694 eUnderline = XML_BOLD_DASH;
695 break;
696 case XML_LONG_DASH:
697 eUnderline = XML_BOLD_LONG_DASH;
698 break;
699 case XML_DOT_DASH:
700 eUnderline = XML_BOLD_DOT_DASH;
701 break;
702 case XML_DOT_DOT_DASH:
703 eUnderline = XML_BOLD_DOT_DOT_DASH;
704 break;
705 case XML_WAVE:
706 eUnderline = XML_BOLD_WAVE;
707 break;
708 default:
709 OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
710 break;
713 else
715 switch( eUnderline )
717 case XML_SOLID:
718 eUnderline = XML_SINGLE;
719 break;
720 case XML_NONE:
721 eUnderline = XML_NONE;
722 break;
723 default:
724 OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
725 break;
729 return GetXMLToken( eUnderline );
732 OUString XMLPropertiesTContext_Impl::MergeLineThrough(
733 XMLTokenEnum eLineThrough, sal_Bool bBold, sal_Bool bDouble,
734 sal_Unicode c )
736 if( c )
737 eLineThrough = c=='/' ? XML_SLASH : XML_uX;
738 else if( bDouble )
739 eLineThrough = XML_DOUBLE_LINE;
740 else if( bBold )
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,
764 sal_uInt16 nPrefix,
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(
777 sal_uInt16 nPrefix,
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 );
794 else
795 m_xPropContext->SetQNameAndPropType( rQName, ePropType );
796 pContext = m_xPropContext.get();
799 if( !pContext )
801 // if a properties context exist close it
802 if( m_xPropContext.is() && !m_bPersistent )
804 m_xPropContext->Export();
805 m_xPropContext = 0;
808 pContext = m_bPersistent
809 ? XMLPersElemContentTContext::CreateChildContext(
810 nPrefix, rLocalName, rQName, rAttrList )
811 : XMLTransformerContext::CreateChildContext(
812 nPrefix, rLocalName, rQName, rAttrList );
815 return pContext;
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 );
834 OUString aLocalName;
835 sal_uInt16 nPrefix =
836 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
837 &aLocalName );
838 XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
839 XMLTransformerActions::const_iterator aIter =
840 pActions->find( aKey );
841 if( !(aIter == pActions->end() ) )
843 if( !pMutableAttrList )
845 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 );
858 else
860 m_aStyleFamily = rAttrValue;
862 if( IsXMLToken( rAttrValue, XML_PARAGRAPH ) )
863 nFamilyAttr = i;
866 break;
867 case XML_ATACTION_STYLE_DISPLAY_NAME:
868 case XML_ATACTION_REMOVE:
869 pMutableAttrList->RemoveAttributeByIndex( i );
870 --i;
871 --nAttrCount;
872 break;
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 );
881 break;
882 case XML_ATACTION_IN2INCH:
884 OUString aAttrValue( rAttrValue );
885 if( XMLTransformerBase::ReplaceSingleInWithInch(
886 aAttrValue ) )
887 pMutableAttrList->SetValueByIndex( i, aAttrValue );
889 break;
890 case XML_ATACTION_NEG_PERCENT:
892 OUString aAttrValue( rAttrValue );
893 if( GetTransformer().NegPercent(aAttrValue) )
894 pMutableAttrList->SetValueByIndex( i, aAttrValue );
896 break;
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 );
904 break;
905 default:
906 OSL_ENSURE( !this, "unknown action" );
907 break;
912 if( m_bControlStyle && nFamilyAttr != -1 )
913 pMutableAttrList->SetValueByIndex( nFamilyAttr, GetXMLToken( XML_CONTROL ) );
916 if( m_bPersistent )
917 XMLPersElemContentTContext::StartElement( xAttrList );
918 else
919 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
920 xAttrList );
923 void XMLStyleOASISTContext::EndElement()
925 if( m_bPersistent )
927 XMLPersElemContentTContext::EndElement();
929 else
931 // if a properties context exist close it
932 if( m_xPropContext.is() )
934 m_xPropContext->Export();
935 m_xPropContext = 0;
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(
959 sal_uInt16 nType )
961 XMLTransformerActionInit *pInit = 0;
963 switch( nType )
965 case PROP_OASIS_GRAPHIC_ATTR_ACTIONS:
966 pInit = aGraphicPropertyOASISAttrActionTable;
967 break;
968 case PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS:
969 pInit = aDrawingPagePropertyOASISAttrActionTable;
970 break;
971 case PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS:
972 pInit = aPageLayoutPropertyOASISAttrActionTable;
973 break;
974 case PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS:
975 pInit = aHeaderFooterPropertyOASISAttrActionTable;
976 break;
977 case PROP_OASIS_TEXT_ATTR_ACTIONS:
978 pInit = aTextPropertyOASISAttrActionTable;
979 break;
980 case PROP_OASIS_PARAGRAPH_ATTR_ACTIONS:
981 pInit = aParagraphPropertyOASISAttrActionTable;
982 break;
983 case PROP_OASIS_SECTION_ATTR_ACTIONS:
984 pInit = aSectionPropertyOASISAttrActionTable;
985 break;
986 case PROP_OASIS_TABLE_ATTR_ACTIONS:
987 pInit = aTablePropertyOASISAttrActionTable;
988 break;
989 case PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS:
990 pInit = aTableColumnPropertyOASISAttrActionTable;
991 break;
992 case PROP_OASIS_TABLE_ROW_ATTR_ACTIONS:
993 pInit = aTableRowPropertyOASISAttrActionTable;
994 break;
995 case PROP_OASIS_TABLE_CELL_ATTR_ACTIONS:
996 pInit = aTableCellPropertyOASISAttrActionTable;
997 break;
998 case PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS:
999 pInit = aListLevelPropertyOASISAttrActionTable;
1000 break;
1001 case PROP_OASIS_CHART_ATTR_ACTIONS:
1002 pInit = aChartPropertyOASISAttrActionTable;
1003 break;
1006 XMLTransformerActions *pActions = 0;
1007 if( pInit )
1008 pActions = new XMLTransformerActions( pInit );
1010 return pActions;
1013 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */