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