Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/xml/sax/SAXParseException.hpp>
21 : #include <com/sun/star/xml/sax/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 <osl/diagnose.h>
26 : #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 "ProcAttrTContext.hxx"
33 : #include "TransformerBase.hxx"
34 : #include "TransformerActions.hxx"
35 : #include "ActionMapTypesOASIS.hxx"
36 : #include "MutableAttrList.hxx"
37 : #include "PropertyActionsOASIS.hxx"
38 : #include "StyleOASISTContext.hxx"
39 : #include <xmloff/xmluconv.hxx>
40 :
41 : using namespace ::xmloff::token;
42 : using namespace ::com::sun::star::uno;
43 : using namespace ::com::sun::star::xml::sax;
44 :
45 : static const sal_uInt16 aAttrActionMaps[XML_PROP_TYPE_END] =
46 : {
47 : PROP_OASIS_GRAPHIC_ATTR_ACTIONS,
48 : PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS, // DRAWING_PAGE
49 : PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS,
50 : PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS,
51 : PROP_OASIS_TEXT_ATTR_ACTIONS,
52 : PROP_OASIS_PARAGRAPH_ATTR_ACTIONS,
53 : MAX_OASIS_PROP_ACTIONS, // RUBY
54 : PROP_OASIS_SECTION_ATTR_ACTIONS,
55 : PROP_OASIS_TABLE_ATTR_ACTIONS,
56 : PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS,
57 : PROP_OASIS_TABLE_ROW_ATTR_ACTIONS,
58 : PROP_OASIS_TABLE_CELL_ATTR_ACTIONS,
59 : PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS,
60 : PROP_OASIS_CHART_ATTR_ACTIONS
61 : };
62 :
63 : class XMLPropertiesTContext_Impl : public XMLPersElemContentTContext
64 : {
65 : ::com::sun::star::uno::Reference<
66 : ::com::sun::star::xml::sax::XAttributeList > m_xAttrList;
67 :
68 : XMLPropType m_ePropType;
69 : bool m_bControlStyle;
70 : OUString m_aStyleFamily;
71 :
72 : public:
73 :
74 118 : void SetQNameAndPropType( const OUString& rQName,
75 : XMLPropType ePropType )
76 : {
77 118 : m_ePropType = ePropType;
78 118 : XMLTransformerContext::SetQName( rQName );
79 118 : };
80 :
81 : TYPEINFO_OVERRIDE();
82 :
83 : XMLPropertiesTContext_Impl( XMLTransformerBase& rTransformer,
84 : const OUString& rQName,
85 : XMLPropType eP,
86 : const OUString& rStyleFamily,
87 : bool _bControlStyle = false );
88 :
89 : virtual ~XMLPropertiesTContext_Impl();
90 :
91 : virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
92 :
93 : virtual void Export() SAL_OVERRIDE;
94 :
95 : static XMLPropType GetPropType( const OUString& rLocalName );
96 :
97 : static OUString MergeUnderline( XMLTokenEnum eUnderline,
98 : bool bBold, bool bDouble );
99 : static OUString MergeLineThrough( XMLTokenEnum eLineThrough,
100 : bool bBold, bool bDouble,
101 : sal_Unicode c );
102 : };
103 :
104 0 : TYPEINIT1( XMLPropertiesTContext_Impl, XMLPersElemContentTContext );
105 :
106 476 : XMLPropertiesTContext_Impl::XMLPropertiesTContext_Impl(
107 : XMLTransformerBase& rImp, const OUString& rQName, XMLPropType eP,
108 : const OUString& rStyleFamily, bool _bControlStyle ) :
109 : XMLPersElemContentTContext( rImp, rQName, XML_NAMESPACE_STYLE,
110 : XML_PROPERTIES),
111 : m_ePropType( eP ),
112 : m_bControlStyle( _bControlStyle ),
113 476 : m_aStyleFamily( rStyleFamily )
114 : {
115 476 : }
116 :
117 952 : XMLPropertiesTContext_Impl::~XMLPropertiesTContext_Impl()
118 : {
119 952 : }
120 :
121 594 : void XMLPropertiesTContext_Impl::StartElement(
122 : const Reference< XAttributeList >& rAttrList )
123 : {
124 594 : XMLTransformerActions *pActions = 0;
125 594 : sal_uInt16 nActionMap = aAttrActionMaps[m_ePropType];
126 594 : if( nActionMap < MAX_OASIS_PROP_ACTIONS )
127 : {
128 594 : pActions = GetTransformer().GetUserDefinedActions( nActionMap );
129 : OSL_ENSURE( pActions, "go no actions" );
130 : }
131 :
132 594 : if( pActions )
133 : {
134 594 : XMLMutableAttributeList *pAttrList = 0;
135 594 : if( !m_xAttrList.is() )
136 : {
137 476 : pAttrList = new XMLMutableAttributeList();
138 476 : m_xAttrList = pAttrList;
139 : }
140 : else
141 : {
142 : pAttrList =
143 118 : static_cast< XMLMutableAttributeList * >( m_xAttrList.get() );
144 : }
145 :
146 594 : XMLTokenEnum eUnderline = XML_TOKEN_END;
147 594 : bool bBoldUnderline = false, bDoubleUnderline = false;
148 594 : XMLTokenEnum eLineThrough = XML_TOKEN_END;
149 594 : bool bBoldLineThrough = false, bDoubleLineThrough = false;
150 594 : sal_Unicode cLineThroughChar = 0;
151 :
152 594 : bool bIntervalMinorFound = false;
153 594 : double fIntervalMajor = 0.0;
154 594 : sal_Int32 nIntervalMinorDivisor = 0;
155 :
156 : // #i25616#
157 594 : OUString aOpacityValueRemember;
158 1188 : OUString aImageOpacityValueRemember;
159 :
160 594 : sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
161 2943 : for( sal_Int16 i=0; i < nAttrCount; i++ )
162 : {
163 2349 : const OUString& rAttrName = rAttrList->getNameByIndex( i );
164 4698 : const OUString& rAttrValue = rAttrList->getValueByIndex( i );
165 4698 : OUString aLocalName;
166 : sal_uInt16 nPrefix =
167 2349 : GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
168 2349 : &aLocalName );
169 :
170 4698 : XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
171 : XMLTransformerActions::const_iterator aIter =
172 2349 : pActions->find( aKey );
173 2349 : if( !(aIter == pActions->end() ) )
174 : {
175 868 : switch( (*aIter).second.m_nActionType )
176 : {
177 : case XML_ATACTION_REMOVE:
178 4 : break;
179 : case XML_ATACTION_COPY:
180 0 : pAttrList->AddAttribute( rAttrName, rAttrValue );
181 0 : break;
182 : case XML_ATACTION_RENAME:
183 : {
184 : OUString aNewAttrQName(
185 5 : GetTransformer().GetNamespaceMap().GetQNameByKey(
186 5 : (*aIter).second.GetQNamePrefixFromParam1(),
187 : ::xmloff::token::GetXMLToken(
188 15 : (*aIter).second.GetQNameTokenFromParam1()) ) );
189 5 : pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
190 : }
191 5 : break;
192 : case XML_ATACTION_IN2INCH:
193 : {
194 787 : OUString aAttrValue( rAttrValue );
195 : XMLTransformerBase::ReplaceSingleInWithInch(
196 787 : aAttrValue );
197 787 : pAttrList->AddAttribute( rAttrName, aAttrValue );
198 : }
199 787 : break;
200 : case XML_ATACTION_INS2INCHS:
201 : {
202 12 : OUString aAttrValue( rAttrValue );
203 : XMLTransformerBase::ReplaceInWithInch(
204 12 : aAttrValue );
205 12 : pAttrList->AddAttribute( rAttrName, aAttrValue );
206 : }
207 12 : break;
208 : case XML_ATACTION_DECODE_STYLE_NAME_REF:
209 : {
210 3 : OUString aAttrValue( rAttrValue );
211 3 : XMLTransformerBase::DecodeStyleName(aAttrValue);
212 3 : pAttrList->AddAttribute( rAttrName, aAttrValue );
213 : }
214 3 : break;
215 : case XML_ATACTION_RENAME_DECODE_STYLE_NAME_REF:
216 : {
217 : OUString aNewAttrQName(
218 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
219 0 : (*aIter).second.GetQNamePrefixFromParam1(),
220 : ::xmloff::token::GetXMLToken(
221 0 : (*aIter).second.GetQNameTokenFromParam1()) ) );
222 0 : OUString aAttrValue( rAttrValue );
223 0 : XMLTransformerBase::DecodeStyleName(aAttrValue);
224 0 : pAttrList->AddAttribute( aNewAttrQName, aAttrValue );
225 : }
226 0 : break;
227 : case XML_ATACTION_NEG_PERCENT:
228 : {
229 0 : OUString aAttrValue( rAttrValue );
230 0 : XMLTransformerBase::NegPercent(aAttrValue);
231 0 : pAttrList->AddAttribute( rAttrName, aAttrValue );
232 : }
233 0 : break;
234 : case XML_ATACTION_RENAME_NEG_PERCENT:
235 : {
236 : OUString aNewAttrQName(
237 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
238 0 : (*aIter).second.GetQNamePrefixFromParam1(),
239 : ::xmloff::token::GetXMLToken(
240 0 : (*aIter).second.GetQNameTokenFromParam1()) ) );
241 0 : OUString aAttrValue( rAttrValue );
242 0 : XMLTransformerBase::NegPercent(aAttrValue);
243 0 : pAttrList->AddAttribute( aNewAttrQName, aAttrValue );
244 : }
245 0 : break;
246 : case XML_OPTACTION_LINE_MODE:
247 : {
248 : bool bWordMode =
249 0 : IsXMLToken( rAttrValue, XML_SKIP_WHITE_SPACE );
250 : OUString aAttrQName(
251 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
252 : XML_NAMESPACE_FO,
253 0 : GetXMLToken( XML_SCORE_SPACES ) ) );
254 : sal_Int16 nIndex =
255 0 : pAttrList->GetIndexByName( aAttrQName );
256 0 : if( -1 != nIndex )
257 : {
258 0 : if( bWordMode )
259 : {
260 : const OUString& rOldValue =
261 0 : pAttrList->getValueByIndex( nIndex );
262 0 : if( !IsXMLToken( rOldValue, XML_TRUE ) )
263 : {
264 : pAttrList->SetValueByIndex( nIndex,
265 0 : GetXMLToken( XML_TRUE ) );
266 0 : }
267 : }
268 : }
269 : else
270 : {
271 : OUString aAttrValue( GetXMLToken( bWordMode
272 : ? XML_FALSE
273 0 : : XML_TRUE ) );
274 0 : pAttrList->AddAttribute( aAttrQName, aAttrValue );
275 0 : }
276 : }
277 0 : break;
278 : case XML_OPTACTION_KEEP_WITH_NEXT:
279 : {
280 : OUString aAttrValue( GetXMLToken(
281 5 : IsXMLToken( rAttrValue, XML_ALWAYS )
282 : ? XML_TRUE
283 5 : : XML_FALSE) );
284 5 : pAttrList->AddAttribute( rAttrName, aAttrValue );
285 : }
286 5 : break;
287 : case XML_OPTACTION_UNDERLINE_WIDTH:
288 5 : if( IsXMLToken( rAttrValue, XML_BOLD ) )
289 0 : bBoldUnderline = true;
290 5 : break;
291 : case XML_OPTACTION_UNDERLINE_TYPE:
292 0 : if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
293 0 : bDoubleUnderline = true;
294 0 : break;
295 : case XML_OPTACTION_UNDERLINE_STYLE:
296 6 : eUnderline = GetTransformer().GetToken( rAttrValue );
297 6 : break;
298 : case XML_OPTACTION_LINETHROUGH_WIDTH:
299 0 : if( IsXMLToken( rAttrValue, XML_BOLD ) )
300 0 : bBoldLineThrough = true;
301 0 : break;
302 : case XML_OPTACTION_LINETHROUGH_TYPE:
303 1 : if( IsXMLToken( rAttrValue, XML_DOUBLE ) )
304 0 : bDoubleLineThrough = true;
305 1 : break;
306 : case XML_OPTACTION_LINETHROUGH_STYLE:
307 1 : eLineThrough = GetTransformer().GetToken( rAttrValue );
308 1 : break;
309 : case XML_OPTACTION_LINETHROUGH_TEXT:
310 0 : if( !rAttrValue.isEmpty() )
311 0 : cLineThroughChar = rAttrValue[0];
312 0 : break;
313 : case XML_OPTACTION_INTERPOLATION:
314 : {
315 : // 0: none (default)
316 0 : sal_Int32 nSplineType = 0;
317 0 : if( IsXMLToken( rAttrValue, XML_CUBIC_SPLINE ))
318 0 : nSplineType = 1;
319 0 : else if( IsXMLToken( rAttrValue, XML_B_SPLINE ))
320 0 : nSplineType = 2;
321 :
322 : pAttrList->AddAttribute(
323 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
324 : XML_NAMESPACE_CHART,
325 0 : GetXMLToken( XML_SPLINES )),
326 0 : OUString::number( nSplineType ));
327 : }
328 0 : break;
329 : case XML_OPTACTION_INTERVAL_MAJOR:
330 0 : pAttrList->AddAttribute( rAttrName, rAttrValue );
331 0 : ::sax::Converter::convertDouble(fIntervalMajor, rAttrValue);
332 0 : break;
333 : case XML_OPTACTION_INTERVAL_MINOR_DIVISOR:
334 0 : ::sax::Converter::convertNumber(nIntervalMinorDivisor, rAttrValue);
335 0 : bIntervalMinorFound = true;
336 0 : break;
337 : case XML_OPTACTION_SYMBOL_TYPE:
338 : {
339 : // if symbol_type is "named-symbol" the "symbol"
340 : // property is set in the action XML_OPTACTION_SYMBOL_NAME
341 0 : sal_Int32 nSymbolType = 0;
342 0 : if( IsXMLToken( rAttrValue, XML_NONE ))
343 0 : nSymbolType = -3;
344 0 : else if( IsXMLToken( rAttrValue, XML_AUTOMATIC ))
345 0 : nSymbolType = -2;
346 0 : else if( IsXMLToken( rAttrValue, XML_IMAGE ))
347 0 : nSymbolType = -1;
348 :
349 0 : if( nSymbolType < 0 )
350 : pAttrList->AddAttribute(
351 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
352 : XML_NAMESPACE_CHART,
353 0 : GetXMLToken( XML_SYMBOL )),
354 0 : OUString::number( nSymbolType ));
355 : }
356 0 : break;
357 : case XML_OPTACTION_SYMBOL_NAME:
358 : {
359 : // assume "symbol-type" == "named-symbol"
360 0 : sal_Int32 nSymbolType = -3; // NONE
361 : // "square" just has an awkward token-name
362 0 : if( IsXMLToken( rAttrValue, XML_GRADIENTSTYLE_SQUARE ))
363 0 : nSymbolType = 0;
364 0 : else if( IsXMLToken( rAttrValue, XML_DIAMOND ))
365 0 : nSymbolType = 1;
366 0 : else if( IsXMLToken( rAttrValue, XML_ARROW_DOWN ))
367 0 : nSymbolType = 2;
368 0 : else if( IsXMLToken( rAttrValue, XML_ARROW_UP ))
369 0 : nSymbolType = 3;
370 0 : else if( IsXMLToken( rAttrValue, XML_ARROW_RIGHT ))
371 0 : nSymbolType = 4;
372 0 : else if( IsXMLToken( rAttrValue, XML_ARROW_LEFT ))
373 0 : nSymbolType = 5;
374 0 : else if( IsXMLToken( rAttrValue, XML_BOW_TIE ))
375 0 : nSymbolType = 6;
376 0 : else if( IsXMLToken( rAttrValue, XML_HOURGLASS ))
377 0 : nSymbolType = 7;
378 0 : else if( IsXMLToken( rAttrValue, XML_CIRCLE ))
379 0 : nSymbolType = 8;
380 0 : else if( IsXMLToken( rAttrValue, XML_STAR ))
381 0 : nSymbolType = 9;
382 0 : else if( IsXMLToken( rAttrValue, XML_X ))
383 0 : nSymbolType = 10;
384 0 : else if( IsXMLToken( rAttrValue, XML_PLUS ))
385 0 : nSymbolType = 11;
386 0 : else if( IsXMLToken( rAttrValue, XML_ASTERISK ))
387 0 : nSymbolType = 12;
388 0 : else if( IsXMLToken( rAttrValue, XML_HORIZONTAL_BAR ))
389 0 : nSymbolType = 13;
390 0 : else if( IsXMLToken( rAttrValue, XML_VERTICAL_BAR ))
391 0 : nSymbolType = 14;
392 :
393 0 : if( nSymbolType >= 0 )
394 : pAttrList->AddAttribute(
395 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
396 : XML_NAMESPACE_CHART,
397 0 : GetXMLToken( XML_SYMBOL )),
398 0 : OUString::number( nSymbolType ));
399 : }
400 0 : break;
401 : // #i25616#
402 : case XML_OPTACTION_OPACITY:
403 0 : aOpacityValueRemember = rAttrValue;
404 0 : XMLTransformerBase::NegPercent(aOpacityValueRemember);
405 0 : break;
406 :
407 : // #i25616#
408 : case XML_OPTACTION_IMAGE_OPACITY:
409 0 : aImageOpacityValueRemember = rAttrValue;
410 0 : XMLTransformerBase::NegPercent(aImageOpacityValueRemember);
411 0 : break;
412 :
413 : case XML_OPTACTION_KEEP_TOGETHER:
414 : pAttrList->AddAttribute(
415 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
416 0 : XML_NAMESPACE_STYLE,GetXMLToken(XML_BREAK_INSIDE)),
417 : GetXMLToken(
418 0 : IsXMLToken( rAttrValue, XML_ALWAYS )
419 : ? XML_COLUMNSPLIT_AVOID
420 0 : : XML_COLUMNSPLIT_AUTO ) );
421 0 : break;
422 :
423 : case XML_OPTACTION_CONTROL_TEXT_ALIGN:
424 39 : if ( m_bControlStyle )
425 : {
426 : OUString aNewAttrQName(
427 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
428 : XML_NAMESPACE_STYLE,
429 : ::xmloff::token::GetXMLToken(
430 0 : XML_TEXT_ALIGN ) ) );
431 0 : pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
432 : }
433 : else
434 : {
435 : OUString aNewAttrQName(
436 39 : GetTransformer().GetNamespaceMap().GetQNameByKey(
437 : XML_NAMESPACE_FO,
438 : ::xmloff::token::GetXMLToken(
439 78 : XML_TEXT_ALIGN ) ) );
440 39 : pAttrList->AddAttribute( aNewAttrQName, rAttrValue );
441 : }
442 39 : break;
443 :
444 : case XML_OPTACTION_DRAW_WRITING_MODE:
445 0 : if( IsXMLToken( m_aStyleFamily, XML_GRAPHICS ) )
446 : {
447 : pAttrList->AddAttribute(
448 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
449 : XML_NAMESPACE_DRAW,
450 0 : GetXMLToken( XML_WRITING_MODE ) ), rAttrValue );
451 : }
452 0 : pAttrList->AddAttribute( rAttrName, rAttrValue );
453 0 : break;
454 :
455 : case XML_ATACTION_CAPTION_ESCAPE_OASIS:
456 : {
457 0 : OUString aAttrValue( rAttrValue );
458 0 : if( aAttrValue.indexOf( '%' ) != -1 )
459 : {
460 0 : sal_Int32 nValue = 0;
461 0 : ::sax::Converter::convertPercent(nValue, rAttrValue);
462 0 : if( nValue )
463 : {
464 0 : nValue *= 100;
465 0 : OUStringBuffer aOut;
466 0 : ::sax::Converter::convertPercent(aOut, nValue);
467 0 : aAttrValue = aOut.makeStringAndClear();
468 : }
469 : }
470 : else
471 : {
472 0 : XMLTransformerBase::ReplaceSingleInWithInch( aAttrValue );
473 : }
474 :
475 0 : pAttrList->AddAttribute( rAttrName, aAttrValue );
476 : }
477 0 : break;
478 :
479 : case XML_ATACTION_DECODE_PROTECT:
480 : {
481 0 : pAttrList->AddAttribute( rAttrName, rAttrValue );
482 :
483 0 : if( rAttrValue.indexOf( GetXMLToken( XML_SIZE ) ) != -1 )
484 0 : pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
485 : XML_NAMESPACE_DRAW,
486 0 : GetXMLToken( XML_SIZE_PROTECT )), GetXMLToken( XML_TRUE ) );
487 :
488 0 : if( rAttrValue.indexOf( GetXMLToken( XML_POSITION ) ) != -1 )
489 0 : pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
490 : XML_NAMESPACE_DRAW,
491 0 : GetXMLToken( XML_MOVE_PROTECT )), GetXMLToken( XML_TRUE ) );
492 : }
493 0 : break;
494 :
495 : case XML_ATACTION_DRAW_MIRROR_OASIS: // renames style:mirror to draw:mirror and adapts values
496 : {
497 : // keep original for writer graphic objects
498 : // Adapts attribute values (#i49139#)
499 0 : OUString aNewAttrValue;
500 0 : SvXMLTokenEnumerator aTokenEnum( rAttrValue );
501 0 : OUString aToken;
502 0 : while( aTokenEnum.getNextToken( aToken ) )
503 : {
504 0 : if ( !aNewAttrValue.isEmpty() )
505 : {
506 0 : aNewAttrValue += " ";
507 : }
508 :
509 0 : if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_EVEN ) )
510 : {
511 0 : aNewAttrValue += GetXMLToken( XML_HORIZONTAL_ON_LEFT_PAGES );
512 : }
513 0 : else if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_ODD ) )
514 : {
515 0 : aNewAttrValue += GetXMLToken( XML_HORIZONTAL_ON_RIGHT_PAGES );
516 : }
517 : else
518 : {
519 0 : aNewAttrValue += aToken;
520 : }
521 : }
522 0 : pAttrList->AddAttribute( rAttrName, aNewAttrValue );
523 :
524 : // create old draw:mirror for drawing graphic objects
525 0 : OUString aAttrValue( GetXMLToken( IsXMLToken( rAttrValue, XML_HORIZONTAL ) ? XML_TRUE : XML_FALSE ) );
526 0 : pAttrList->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey(
527 : XML_NAMESPACE_DRAW,
528 0 : GetXMLToken( XML_MIRROR )), aAttrValue );
529 : }
530 0 : break;
531 : case XML_ATACTION_GAMMA_OASIS: // converts percentage value to double
532 : {
533 : sal_Int32 nValue;
534 0 : ::sax::Converter::convertPercent( nValue, rAttrValue );
535 0 : const double fValue = ((double)nValue) / 100.0;
536 0 : pAttrList->AddAttribute( rAttrName, OUString::number( fValue ) );
537 : }
538 0 : break;
539 : case XML_ATACTION_OPACITY_FIX:
540 : {
541 : sal_Int32 nValue;
542 0 : if( rAttrValue.indexOf( '%' ) != -1 )
543 : {
544 0 : ::sax::Converter::convertPercent(nValue, rAttrValue);
545 : }
546 : else
547 : {
548 0 : nValue = sal_Int32( rAttrValue.toDouble() * 100.0 );
549 : }
550 0 : nValue = 100 - nValue;
551 :
552 0 : OUStringBuffer aOut;
553 0 : ::sax::Converter::convertPercent(aOut, nValue);
554 0 : pAttrList->AddAttribute( rAttrName, aOut.makeStringAndClear() );
555 : }
556 0 : break;
557 : default:
558 : OSL_ENSURE( false, "unknown action" );
559 0 : break;
560 : }
561 : }
562 : else
563 : {
564 1481 : pAttrList->AddAttribute( rAttrName, rAttrValue );
565 : }
566 2349 : }
567 594 : if( XML_TOKEN_END != eUnderline )
568 : pAttrList->AddAttribute(
569 6 : GetTransformer().GetNamespaceMap().GetQNameByKey(
570 : XML_NAMESPACE_STYLE,
571 6 : GetXMLToken( XML_TEXT_UNDERLINE ) ),
572 : MergeUnderline( eUnderline, bBoldUnderline,
573 12 : bDoubleUnderline ) );
574 594 : if( XML_TOKEN_END != eLineThrough )
575 : pAttrList->AddAttribute(
576 1 : GetTransformer().GetNamespaceMap().GetQNameByKey(
577 : XML_NAMESPACE_STYLE,
578 1 : GetXMLToken( XML_TEXT_CROSSING_OUT ) ),
579 : MergeLineThrough( eLineThrough, bBoldLineThrough,
580 2 : bDoubleLineThrough, cLineThroughChar ) );
581 594 : if( bIntervalMinorFound )
582 : {
583 0 : double fIntervalMinor = 0.0;
584 0 : if( nIntervalMinorDivisor != 0)
585 0 : fIntervalMinor = fIntervalMajor / static_cast< double >( nIntervalMinorDivisor );
586 :
587 0 : OUStringBuffer aBuf;
588 0 : ::sax::Converter::convertDouble( aBuf, fIntervalMinor );
589 : pAttrList->AddAttribute(
590 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
591 : XML_NAMESPACE_CHART,
592 0 : GetXMLToken( XML_INTERVAL_MINOR )),
593 0 : aBuf.makeStringAndClear());
594 : }
595 :
596 : // #i25616#
597 594 : if(!aOpacityValueRemember.isEmpty() || !aImageOpacityValueRemember.isEmpty())
598 : {
599 : pAttrList->AddAttribute(
600 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
601 : XML_NAMESPACE_DRAW,
602 0 : GetXMLToken( XML_TRANSPARENCY ) ),
603 0 : !aImageOpacityValueRemember.isEmpty()
604 0 : ? aImageOpacityValueRemember : aOpacityValueRemember );
605 594 : }
606 : }
607 : else
608 : {
609 0 : if( !m_xAttrList.is() )
610 : {
611 0 : m_xAttrList = new XMLMutableAttributeList( rAttrList, true );
612 : }
613 : else
614 : {
615 0 : static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
616 0 : ->AppendAttributeList( rAttrList );
617 : }
618 : }
619 594 : }
620 :
621 476 : void XMLPropertiesTContext_Impl::Export()
622 : {
623 952 : GetTransformer().GetDocHandler()->startElement( GetExportQName(),
624 952 : m_xAttrList );
625 476 : ExportContent();
626 476 : GetTransformer().GetDocHandler()->endElement( GetExportQName() );
627 476 : }
628 :
629 598 : XMLPropType XMLPropertiesTContext_Impl::GetPropType( const OUString& rLocalName )
630 : {
631 598 : XMLPropType eProp = XML_PROP_TYPE_END;
632 598 : if( IsXMLToken( rLocalName, XML_GRAPHIC_PROPERTIES ) )
633 22 : eProp = XML_PROP_TYPE_GRAPHIC;
634 576 : else if( IsXMLToken( rLocalName, XML_DRAWING_PAGE_PROPERTIES ) )
635 1 : eProp = XML_PROP_TYPE_DRAWING_PAGE;
636 575 : else if( IsXMLToken( rLocalName, XML_PAGE_LAYOUT_PROPERTIES ) )
637 3 : eProp = XML_PROP_TYPE_PAGE_LAYOUT;
638 572 : else if( IsXMLToken( rLocalName, XML_HEADER_FOOTER_PROPERTIES ) )
639 2 : eProp = XML_PROP_TYPE_HEADER_FOOTER;
640 570 : else if( IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) )
641 275 : eProp = XML_PROP_TYPE_TEXT;
642 295 : else if( IsXMLToken( rLocalName, XML_PARAGRAPH_PROPERTIES ) )
643 81 : eProp = XML_PROP_TYPE_PARAGRAPH;
644 214 : else if( IsXMLToken( rLocalName, XML_RUBY_PROPERTIES ) )
645 0 : eProp = XML_PROP_TYPE_RUBY;
646 214 : else if( IsXMLToken( rLocalName, XML_SECTION_PROPERTIES ) )
647 1 : eProp = XML_PROP_TYPE_SECTION;
648 213 : else if( IsXMLToken( rLocalName, XML_TABLE_PROPERTIES ) )
649 12 : eProp = XML_PROP_TYPE_TABLE;
650 201 : else if( IsXMLToken( rLocalName, XML_TABLE_COLUMN_PROPERTIES ) )
651 45 : eProp = XML_PROP_TYPE_TABLE_COLUMN;
652 156 : else if( IsXMLToken( rLocalName, XML_TABLE_ROW_PROPERTIES ) )
653 22 : eProp = XML_PROP_TYPE_TABLE_ROW;
654 134 : else if( IsXMLToken( rLocalName, XML_TABLE_CELL_PROPERTIES ) )
655 10 : eProp = XML_PROP_TYPE_TABLE_CELL;
656 124 : else if( IsXMLToken( rLocalName, XML_LIST_LEVEL_PROPERTIES ) )
657 120 : eProp = XML_PROP_TYPE_LIST_LEVEL;
658 4 : else if( IsXMLToken( rLocalName, XML_CHART_PROPERTIES ) )
659 0 : eProp = XML_PROP_TYPE_CHART;
660 :
661 598 : return eProp;
662 : }
663 :
664 6 : OUString XMLPropertiesTContext_Impl::MergeUnderline(
665 : XMLTokenEnum eUnderline, bool bBold, bool bDouble )
666 : {
667 6 : if( bDouble )
668 : {
669 0 : switch( eUnderline )
670 : {
671 : case XML_WAVE:
672 0 : eUnderline = XML_DOUBLE_WAVE;
673 0 : break;
674 : default:
675 0 : eUnderline = XML_DOUBLE;
676 0 : break;
677 : }
678 : }
679 6 : else if( bBold )
680 : {
681 0 : switch( eUnderline )
682 : {
683 : case XML_NONE:
684 : case XML_SOLID:
685 0 : eUnderline = XML_BOLD;
686 0 : break;
687 : case XML_DOTTED:
688 0 : eUnderline = XML_BOLD_DOTTED;
689 0 : break;
690 : case XML_DASH:
691 0 : eUnderline = XML_BOLD_DASH;
692 0 : break;
693 : case XML_LONG_DASH:
694 0 : eUnderline = XML_BOLD_LONG_DASH;
695 0 : break;
696 : case XML_DOT_DASH:
697 0 : eUnderline = XML_BOLD_DOT_DASH;
698 0 : break;
699 : case XML_DOT_DOT_DASH:
700 0 : eUnderline = XML_BOLD_DOT_DOT_DASH;
701 0 : break;
702 : case XML_WAVE:
703 0 : eUnderline = XML_BOLD_WAVE;
704 0 : break;
705 : default:
706 : OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
707 0 : break;
708 : }
709 : }
710 : else
711 : {
712 6 : switch( eUnderline )
713 : {
714 : case XML_SOLID:
715 5 : eUnderline = XML_SINGLE;
716 5 : break;
717 : case XML_NONE:
718 1 : eUnderline = XML_NONE;
719 1 : break;
720 : default:
721 : OSL_FAIL( "xmloff::XMLPropertiesTContext_Impl::MergeUnderline(), missing underline case!" );
722 0 : break;
723 : }
724 : }
725 :
726 6 : return GetXMLToken( eUnderline );
727 : }
728 :
729 1 : OUString XMLPropertiesTContext_Impl::MergeLineThrough(
730 : XMLTokenEnum eLineThrough, bool bBold, bool bDouble,
731 : sal_Unicode c )
732 : {
733 1 : if( c )
734 0 : eLineThrough = c=='/' ? XML_SLASH : XML_uX;
735 1 : else if( bDouble )
736 0 : eLineThrough = XML_DOUBLE_LINE;
737 1 : else if( bBold )
738 0 : eLineThrough = XML_THICK_LINE;
739 1 : else if( XML_NONE != eLineThrough )
740 0 : eLineThrough = XML_SINGLE_LINE;
741 :
742 1 : return GetXMLToken( eLineThrough );
743 : }
744 :
745 0 : TYPEINIT1( XMLStyleOASISTContext, XMLPersElemContentTContext );
746 :
747 500 : XMLStyleOASISTContext::XMLStyleOASISTContext(XMLTransformerBase& rImp,
748 : const OUString& rQName, bool bPersistent)
749 : : XMLPersElemContentTContext(rImp, rQName)
750 : , m_bPersistent(bPersistent)
751 500 : , m_bControlStyle(false)
752 : {
753 500 : }
754 :
755 3 : XMLStyleOASISTContext::XMLStyleOASISTContext(
756 : XMLTransformerBase& rImp, const OUString& rQName,
757 : sal_uInt16 nPrefix, ::xmloff::token::XMLTokenEnum eToken,
758 : bool bPersistent)
759 : : XMLPersElemContentTContext(rImp, rQName, nPrefix, eToken)
760 : , m_bPersistent(bPersistent)
761 3 : , m_bControlStyle(false)
762 : {
763 3 : }
764 :
765 1006 : XMLStyleOASISTContext::~XMLStyleOASISTContext()
766 : {
767 1006 : }
768 :
769 701 : XMLTransformerContext *XMLStyleOASISTContext::CreateChildContext(
770 : sal_uInt16 nPrefix,
771 : const OUString& rLocalName,
772 : const OUString& rQName,
773 : const Reference< XAttributeList >& rAttrList )
774 : {
775 701 : XMLTransformerContext *pContext = 0;
776 :
777 701 : if( XML_NAMESPACE_STYLE == nPrefix || XML_NAMESPACE_LO_EXT == nPrefix )
778 : {
779 : XMLPropType ePropType =
780 598 : XMLPropertiesTContext_Impl::GetPropType( rLocalName );
781 598 : if( XML_PROP_TYPE_END != ePropType )
782 : {
783 : // if no properties context exist start a new one.
784 594 : if( !m_xPropContext.is() )
785 952 : m_xPropContext = new XMLPropertiesTContext_Impl(
786 1428 : GetTransformer(), rQName, ePropType, m_aStyleFamily, m_bControlStyle );
787 : else
788 118 : m_xPropContext->SetQNameAndPropType( rQName, ePropType );
789 594 : pContext = m_xPropContext.get();
790 : }
791 : }
792 701 : if( !pContext )
793 : {
794 : // if a properties context exist close it
795 107 : if( m_xPropContext.is() && !m_bPersistent )
796 : {
797 2 : m_xPropContext->Export();
798 2 : m_xPropContext = 0;
799 : }
800 :
801 : pContext = m_bPersistent
802 : ? XMLPersElemContentTContext::CreateChildContext(
803 10 : nPrefix, rLocalName, rQName, rAttrList )
804 : : XMLTransformerContext::CreateChildContext(
805 117 : nPrefix, rLocalName, rQName, rAttrList );
806 : }
807 :
808 701 : return pContext;
809 : }
810 :
811 503 : void XMLStyleOASISTContext::StartElement(
812 : const Reference< XAttributeList >& rAttrList )
813 : {
814 : XMLTransformerActions *pActions =
815 503 : GetTransformer().GetUserDefinedActions( OASIS_STYLE_ACTIONS );
816 : OSL_ENSURE( pActions, "go no actions" );
817 :
818 503 : Reference< XAttributeList > xAttrList( rAttrList );
819 503 : XMLMutableAttributeList *pMutableAttrList = 0;
820 503 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
821 503 : sal_Int16 nFamilyAttr = -1;
822 503 : m_bControlStyle = false;
823 :
824 1926 : for( sal_Int16 i=0; i < nAttrCount; i++ )
825 : {
826 1423 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
827 2846 : OUString aLocalName;
828 : sal_uInt16 nPrefix =
829 1423 : GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
830 1423 : &aLocalName );
831 2846 : XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
832 : XMLTransformerActions::const_iterator aIter =
833 1423 : pActions->find( aKey );
834 1423 : if( !(aIter == pActions->end() ) )
835 : {
836 1068 : if( !pMutableAttrList )
837 : {
838 : pMutableAttrList =
839 426 : new XMLMutableAttributeList( xAttrList );
840 426 : xAttrList = pMutableAttrList;
841 : }
842 1068 : const OUString& rAttrValue = xAttrList->getValueByIndex( i );
843 1068 : switch( (*aIter).second.m_nActionType )
844 : {
845 : case XML_ATACTION_STYLE_FAMILY:
846 365 : if( IsXMLToken( rAttrValue, XML_GRAPHIC ) )
847 : {
848 22 : m_aStyleFamily = GetXMLToken( XML_GRAPHICS ) ;
849 22 : pMutableAttrList->SetValueByIndex( i, m_aStyleFamily );
850 : }
851 : else
852 : {
853 343 : m_aStyleFamily = rAttrValue;
854 :
855 343 : if( IsXMLToken( rAttrValue, XML_PARAGRAPH ) )
856 101 : nFamilyAttr = i;
857 : }
858 :
859 365 : break;
860 : case XML_ATACTION_STYLE_DISPLAY_NAME:
861 : case XML_ATACTION_REMOVE:
862 140 : pMutableAttrList->RemoveAttributeByIndex( i );
863 140 : --i;
864 140 : --nAttrCount;
865 140 : break;
866 : case XML_ATACTION_DECODE_STYLE_NAME:
867 370 : m_bControlStyle = rAttrValue.startsWith( "ctrl" );
868 : // fall-through
869 : case XML_ATACTION_DECODE_STYLE_NAME_REF:
870 : {
871 563 : OUString aAttrValue( rAttrValue );
872 563 : if( XMLTransformerBase::DecodeStyleName(aAttrValue) )
873 223 : pMutableAttrList->SetValueByIndex( i, aAttrValue );
874 : }
875 563 : break;
876 : case XML_ATACTION_IN2INCH:
877 : {
878 0 : OUString aAttrValue( rAttrValue );
879 0 : if( XMLTransformerBase::ReplaceSingleInWithInch(
880 : aAttrValue ) )
881 0 : pMutableAttrList->SetValueByIndex( i, aAttrValue );
882 : }
883 0 : break;
884 : case XML_ATACTION_NEG_PERCENT:
885 : {
886 0 : OUString aAttrValue( rAttrValue );
887 0 : if( XMLTransformerBase::NegPercent(aAttrValue) )
888 0 : pMutableAttrList->SetValueByIndex( i, aAttrValue );
889 : }
890 0 : break;
891 : case XML_ATACTION_URI_OASIS:
892 : {
893 0 : OUString aAttrValue( rAttrValue );
894 0 : if( GetTransformer().ConvertURIToOOo( aAttrValue,
895 0 : static_cast< bool >((*aIter).second.m_nParam1)))
896 0 : pMutableAttrList->SetValueByIndex( i, aAttrValue );
897 : }
898 0 : break;
899 : default:
900 : OSL_ENSURE( false, "unknown action" );
901 0 : break;
902 1068 : }
903 : }
904 1423 : }
905 :
906 503 : if( m_bControlStyle && nFamilyAttr != -1 )
907 0 : pMutableAttrList->SetValueByIndex( nFamilyAttr, GetXMLToken( XML_CONTROL ) );
908 :
909 503 : if( m_bPersistent )
910 11 : XMLPersElemContentTContext::StartElement( xAttrList );
911 : else
912 984 : GetTransformer().GetDocHandler()->startElement( GetExportQName(),
913 984 : xAttrList );
914 503 : }
915 :
916 503 : void XMLStyleOASISTContext::EndElement()
917 : {
918 503 : if( m_bPersistent )
919 : {
920 11 : XMLPersElemContentTContext::EndElement();
921 : }
922 : else
923 : {
924 : // if a properties context exist close it
925 492 : if( m_xPropContext.is() )
926 : {
927 464 : m_xPropContext->Export();
928 464 : m_xPropContext = 0;
929 : }
930 492 : GetTransformer().GetDocHandler()->endElement( GetExportQName() );
931 : }
932 503 : }
933 :
934 0 : void XMLStyleOASISTContext::Characters( const OUString& )
935 : {
936 : // element content only:
937 0 : }
938 :
939 11 : void XMLStyleOASISTContext::ExportContent()
940 : {
941 11 : if( m_xPropContext.is() )
942 10 : m_xPropContext->Export();
943 11 : XMLPersElemContentTContext::ExportContent();
944 11 : }
945 :
946 11 : bool XMLStyleOASISTContext::IsPersistent() const
947 : {
948 11 : return m_bPersistent;
949 : }
950 :
951 24 : XMLTransformerActions *XMLStyleOASISTContext::CreateTransformerActions(
952 : sal_uInt16 nType )
953 : {
954 24 : XMLTransformerActionInit *pInit = 0;
955 :
956 24 : switch( nType )
957 : {
958 : case PROP_OASIS_GRAPHIC_ATTR_ACTIONS:
959 3 : pInit = aGraphicPropertyOASISAttrActionTable;
960 3 : break;
961 : case PROP_OASIS_DRAWING_PAGE_ATTR_ACTIONS:
962 1 : pInit = aDrawingPagePropertyOASISAttrActionTable;
963 1 : break;
964 : case PROP_OASIS_PAGE_LAYOUT_ATTR_ACTIONS:
965 3 : pInit = aPageLayoutPropertyOASISAttrActionTable;
966 3 : break;
967 : case PROP_OASIS_HEADER_FOOTER_ATTR_ACTIONS:
968 1 : pInit = aHeaderFooterPropertyOASISAttrActionTable;
969 1 : break;
970 : case PROP_OASIS_TEXT_ATTR_ACTIONS:
971 3 : pInit = aTextPropertyOASISAttrActionTable;
972 3 : break;
973 : case PROP_OASIS_PARAGRAPH_ATTR_ACTIONS:
974 3 : pInit = aParagraphPropertyOASISAttrActionTable;
975 3 : break;
976 : case PROP_OASIS_SECTION_ATTR_ACTIONS:
977 1 : pInit = aSectionPropertyOASISAttrActionTable;
978 1 : break;
979 : case PROP_OASIS_TABLE_ATTR_ACTIONS:
980 2 : pInit = aTablePropertyOASISAttrActionTable;
981 2 : break;
982 : case PROP_OASIS_TABLE_COLUMN_ATTR_ACTIONS:
983 1 : pInit = aTableColumnPropertyOASISAttrActionTable;
984 1 : break;
985 : case PROP_OASIS_TABLE_ROW_ATTR_ACTIONS:
986 2 : pInit = aTableRowPropertyOASISAttrActionTable;
987 2 : break;
988 : case PROP_OASIS_TABLE_CELL_ATTR_ACTIONS:
989 1 : pInit = aTableCellPropertyOASISAttrActionTable;
990 1 : break;
991 : case PROP_OASIS_LIST_LEVEL_ATTR_ACTIONS:
992 3 : pInit = aListLevelPropertyOASISAttrActionTable;
993 3 : break;
994 : case PROP_OASIS_CHART_ATTR_ACTIONS:
995 0 : pInit = aChartPropertyOASISAttrActionTable;
996 0 : break;
997 : }
998 :
999 24 : XMLTransformerActions *pActions = 0;
1000 24 : if( pInit )
1001 24 : pActions = new XMLTransformerActions( pInit );
1002 :
1003 24 : return pActions;
1004 : }
1005 :
1006 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|