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