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