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