/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_xmloff.hxx" #include #include #include #include #include #include #include "xmloff/xmlnmspe.hxx" #include "PropType.hxx" #include "DeepTContext.hxx" #include "RenameElemTContext.hxx" #include "ProcAttrTContext.hxx" #include "ActionMapTypesOOo.hxx" #include "MutableAttrList.hxx" #include "TransformerActions.hxx" #include "PropertyActionsOOo.hxx" #include "TransformerBase.hxx" #include "StyleOOoTContext.hxx" #include #include #include using ::rtl::OUString; using namespace ::xmloff::token; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::xml::sax; const sal_uInt16 MAX_PROP_TYPES = 4; #define ENTRY4(a,b,c,d) \ { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \ XML_PROP_TYPE_##c, XML_PROP_TYPE_##d } #define ENTRY3(a,b,c) \ { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \ XML_PROP_TYPE_##c, XML_PROP_TYPE_END } #define ENTRY2(a,b) \ { XML_PROP_TYPE_##a, XML_PROP_TYPE_##b, \ XML_PROP_TYPE_END, XML_PROP_TYPE_END } #define ENTRY1(a) \ { XML_PROP_TYPE_##a, XML_PROP_TYPE_##END, \ XML_PROP_TYPE_END, XML_PROP_TYPE_END } static XMLPropType aPropTypes[XML_FAMILY_TYPE_END][MAX_PROP_TYPES] = { ENTRY3( GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_GRAPHIC, ENTRY3( GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_PRESENTATION, ENTRY1( DRAWING_PAGE ), // XML_FAMILY_TYPE_DRAWING_PAGE, ENTRY1( END ), // XML_FAMILY_TYPE_MASTER_PAGE ENTRY1( PAGE_LAYOUT ), // XML_FAMILY_TYPE_PAGE_LAYOUT, ENTRY1( HEADER_FOOTER ), // XML_FAMILY_TYPE_HEADER_FOOTER ENTRY1( TEXT ), // XML_FAMILY_TYPE_TEXT, ENTRY2( PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_PARAGRAPH, ENTRY1( RUBY ), //XML_FAMILY_TYPE_RUBY, ENTRY1( SECTION ), // XML_FAMILY_TYPE_SECTION, ENTRY1( TABLE ), // XML_FAMILY_TYPE_TABLE, ENTRY1( TABLE_COLUMN ), // XML_FAMILY_TYPE_TABLE_COLUMN, ENTRY1( TABLE_ROW ), // XML_FAMILY_TYPE_TABLE_ROW, ENTRY3( TABLE_CELL, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_TABLE_CELL, ENTRY1( LIST_LEVEL ), // XML_FAMILY_TYPE_LIST, ENTRY4( CHART, GRAPHIC, PARAGRAPH, TEXT ), // XML_FAMILY_TYPE_CHART, ENTRY1( TEXT ), // XML_FAMILY_TYPE_DATA, ENTRY1( END ), // XML_FAMILY_TYPE_GRADIENT, ENTRY1( END ), // XML_FAMILY_TYPE_HATCH, ENTRY1( END ), // XML_FAMILY_TYPE_FILL_IMAGE, ENTRY1( END ), // XML_FAMILY_TYPE_STROKE_DASH, ENTRY1( END ), // XML_FAMILY_TYPE_MARKER, ENTRY1( END ) // XML_FAMILY_TYPE_PRESENTATION_PAGE_LAYOUT, }; static XMLTokenEnum aPropTokens[XML_PROP_TYPE_END] = { XML_GRAPHIC_PROPERTIES, XML_DRAWING_PAGE_PROPERTIES, XML_PAGE_LAYOUT_PROPERTIES, XML_HEADER_FOOTER_PROPERTIES, XML_TEXT_PROPERTIES, XML_PARAGRAPH_PROPERTIES, XML_RUBY_PROPERTIES, XML_SECTION_PROPERTIES, XML_TABLE_PROPERTIES, XML_TABLE_COLUMN_PROPERTIES, XML_TABLE_ROW_PROPERTIES, XML_TABLE_CELL_PROPERTIES, XML_LIST_LEVEL_PROPERTIES, XML_CHART_PROPERTIES }; static sal_uInt16 aAttrActionMaps[XML_PROP_TYPE_END] = { PROP_OOO_GRAPHIC_ATTR_ACTIONS, PROP_OOO_DRAWING_PAGE_ATTR_ACTIONS, // DRAWING_PAGE PROP_OOO_PAGE_LAYOUT_ATTR_ACTIONS, PROP_OOO_HEADER_FOOTER_ATTR_ACTIONS, PROP_OOO_TEXT_ATTR_ACTIONS, PROP_OOO_PARAGRAPH_ATTR_ACTIONS, MAX_OOO_PROP_ACTIONS, // RUBY PROP_OOO_SECTION_ATTR_ACTIONS, PROP_OOO_TABLE_ATTR_ACTIONS, PROP_OOO_TABLE_COLUMN_ATTR_ACTIONS, PROP_OOO_TABLE_ROW_ATTR_ACTIONS, PROP_OOO_TABLE_CELL_ATTR_ACTIONS, PROP_OOO_LIST_LEVEL_ATTR_ACTIONS, PROP_OOO_CHART_ATTR_ACTIONS }; static sal_uInt16 aElemActionMaps[XML_PROP_TYPE_END] = { PROP_OOO_GRAPHIC_ELEM_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, PROP_OOO_TEXT_ELEM_ACTIONS, PROP_OOO_PARAGRAPH_ELEM_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, MAX_OOO_PROP_ACTIONS, PROP_OOO_TABLE_CELL_ELEM_ACTIONS, MAX_OOO_PROP_ACTIONS, PROP_OOO_CHART_ELEM_ACTIONS }; //------------------------------------------------------------------------------ class XMLTypedPropertiesOOoTContext_Impl : public XMLPersElemContentTContext { ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > m_xAttrList; public: TYPEINFO(); XMLTypedPropertiesOOoTContext_Impl( XMLTransformerBase& rTransformer, const ::rtl::OUString& rQName ); virtual ~XMLTypedPropertiesOOoTContext_Impl(); using XMLPersAttrListTContext::AddAttribute; void AddAttribute( const ::rtl::OUString &sName , const ::rtl::OUString &sValue ); void AddAttribute( sal_uInt16 nPrefix, XMLTokenEnum eToken, const ::rtl::OUString &sValue ); virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& rAttrList ); virtual void Export(); }; TYPEINIT1( XMLTypedPropertiesOOoTContext_Impl, XMLPersElemContentTContext ); XMLTypedPropertiesOOoTContext_Impl::XMLTypedPropertiesOOoTContext_Impl( XMLTransformerBase& rImp, const OUString& rQName ) : XMLPersElemContentTContext( rImp, rQName ), m_xAttrList( new XMLMutableAttributeList() ) { } XMLTypedPropertiesOOoTContext_Impl::~XMLTypedPropertiesOOoTContext_Impl() { } void XMLTypedPropertiesOOoTContext_Impl::AddAttribute( const ::rtl::OUString &sName , const ::rtl::OUString &sValue ) { static_cast< XMLMutableAttributeList * >( m_xAttrList.get() ) ->AddAttribute( sName, sValue ); } void XMLTypedPropertiesOOoTContext_Impl::AddAttribute( sal_uInt16 nPrefix, XMLTokenEnum eToken, const ::rtl::OUString &sValue ) { OUString sName( GetTransformer().GetNamespaceMap().GetQNameByKey( nPrefix, ::xmloff::token::GetXMLToken( eToken ) ) ); static_cast< XMLMutableAttributeList * >( m_xAttrList.get() ) ->AddAttribute( sName, sValue ); } void XMLTypedPropertiesOOoTContext_Impl::StartElement( const Reference< XAttributeList >& ) { // empty, ignore even the attribute list } void XMLTypedPropertiesOOoTContext_Impl::Export() { if( m_xAttrList->getLength() || HasElementContent() ) { GetTransformer().GetDocHandler()->startElement( GetQName(), m_xAttrList ); ExportContent(); GetTransformer().GetDocHandler()->endElement( GetQName() ); } } //------------------------------------------------------------------------------ class XMLPropertiesOOoTContext_Impl : public XMLTransformerContext { ::rtl::Reference < XMLTypedPropertiesOOoTContext_Impl > m_aPropContexts[MAX_PROP_TYPES]; typedef XMLPropType XMLPropTypes[MAX_PROP_TYPES]; XMLPropTypes m_aPropTypes; sal_Bool m_bPersistent; XMLTypedPropertiesOOoTContext_Impl *GetPropContextAndAction( TransformerAction_Impl& rAction, sal_uInt16 nPrefix, const OUString& rLocalName, sal_Bool bElem ); XMLTypedPropertiesOOoTContext_Impl *GetPropContext( XMLPropType eType ); public: TYPEINFO(); XMLPropertiesOOoTContext_Impl( XMLTransformerBase& rTransformer, const ::rtl::OUString& rQName, XMLPropTypes& rTypes, sal_Bool bPersistent ); virtual ~XMLPropertiesOOoTContext_Impl(); XMLTransformerContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rQName, const Reference< XAttributeList >& rAttrList ); virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& rAttrList ); virtual void EndElement(); virtual void Characters( const ::rtl::OUString& rChars ); virtual void Export(); virtual sal_Bool IsPersistent() const; }; TYPEINIT1( XMLPropertiesOOoTContext_Impl, XMLTransformerContext ); XMLTypedPropertiesOOoTContext_Impl *XMLPropertiesOOoTContext_Impl::GetPropContext( XMLPropType eType ) { sal_uInt16 nIndex = MAX_PROP_TYPES; for( sal_uInt16 i=0; i< MAX_PROP_TYPES; i++ ) { if( m_aPropTypes[i] == eType ) { nIndex = i; break; } } if( MAX_PROP_TYPES == nIndex ) return 0; if( !m_aPropContexts[nIndex].is() ) { m_aPropContexts[nIndex] = new XMLTypedPropertiesOOoTContext_Impl( GetTransformer(), GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, ::xmloff::token::GetXMLToken( aPropTokens[m_aPropTypes[nIndex]] ) )); } return m_aPropContexts[nIndex].get(); } XMLTypedPropertiesOOoTContext_Impl *XMLPropertiesOOoTContext_Impl::GetPropContextAndAction( TransformerAction_Impl& rAction, sal_uInt16 nPrefix, const OUString& rLocalName, sal_Bool bElem ) { rAction.m_nActionType = XML_ATACTION_COPY; sal_uInt16 nIndex = 0; XMLTransformerActions::key_type aKey( nPrefix, rLocalName ); sal_uInt16 i=0; while( i < MAX_PROP_TYPES && XML_PROP_TYPE_END!=m_aPropTypes[i]) { sal_uInt16 nActionMap = (bElem ? aElemActionMaps : aAttrActionMaps)[m_aPropTypes[i]]; if( nActionMap < MAX_OOO_PROP_ACTIONS ) { XMLTransformerActions *pActions = GetTransformer().GetUserDefinedActions( nActionMap ); OSL_ENSURE( pActions, "go no actions" ); if( pActions ) { XMLTransformerActions::const_iterator aIter = pActions->find( aKey ); if( !(aIter == pActions->end()) ) { rAction = (*aIter).second; nIndex = i; break; } } } ++i; } #ifdef DBG_UTIL if( !( XML_NAMESPACE_NONE == nPrefix || (XML_NAMESPACE_UNKNOWN_FLAG & nPrefix) || XML_PROP_TYPE_END==m_aPropTypes[1] || (i' ); OSL_ENSURE( !this, aTmp ); } #endif if( !m_aPropContexts[nIndex].is() ) { m_aPropContexts[nIndex] = new XMLTypedPropertiesOOoTContext_Impl( GetTransformer(), GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, ::xmloff::token::GetXMLToken( aPropTokens[m_aPropTypes[nIndex]] ) )); } return m_aPropContexts[nIndex].get(); } XMLPropertiesOOoTContext_Impl::XMLPropertiesOOoTContext_Impl( XMLTransformerBase& rImp, const OUString& rQName, XMLPropTypes& rTypes, sal_Bool bPersistent ) : XMLTransformerContext( rImp, rQName ), m_bPersistent( bPersistent ) { for( sal_uInt16 i=0; i < MAX_PROP_TYPES; ++i ) { // remember the types that belong to the attribute and element lists m_aPropTypes[i] = rTypes[i]; } } XMLPropertiesOOoTContext_Impl::~XMLPropertiesOOoTContext_Impl() { } XMLTransformerContext *XMLPropertiesOOoTContext_Impl::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rQName, const Reference< XAttributeList >& rAttrList ) { TransformerAction_Impl aAction; return GetPropContextAndAction( aAction, nPrefix, rLocalName, sal_True ) ->CreateChildContext( nPrefix, rLocalName, rQName, rAttrList ); } void XMLPropertiesOOoTContext_Impl::StartElement( const Reference< XAttributeList >& rAttrList ) { Reference< XAttributeList > xAttrList( rAttrList ); XMLTypedPropertiesOOoTContext_Impl * pIntervalMinorDivisorContext = 0; double fIntervalMajor = 0.0; double fIntervalMinor = 0.0; sal_Bool bMoveProtect = sal_False; sal_Bool bSizeProtect = sal_False; OUString aProtectAttrValue; XMLTypedPropertiesOOoTContext_Impl * pProtectContext = 0; /* Attribute has to be priority over attribute . The filter from OpenDocument file format to OpenOffice.org file format produces styles with both attributes. (#i49139#) */ sal_Bool bExistStyleMirror( sal_False ); OUString aStyleMirrorAttrValue; sal_Bool bExistDrawMirror( sal_False ); OUString aDrawMirrorAttrValue; XMLTypedPropertiesOOoTContext_Impl* pMirrorContext( 0L ); sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { const OUString sAttrName = xAttrList->getNameByIndex( i ); const OUString sAttrValue = xAttrList->getValueByIndex( i ); OUString aLocalName; sal_uInt16 nPrefix = GetTransformer().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); TransformerAction_Impl aAction; XMLTypedPropertiesOOoTContext_Impl *pContext = GetPropContextAndAction( aAction, nPrefix, aLocalName, sal_False ); switch( aAction.m_nActionType ) { case XML_ATACTION_REMOVE: break; case XML_ATACTION_COPY: pContext->AddAttribute( sAttrName, sAttrValue ); break; case XML_ATACTION_COPY_DUPLICATE: { pContext->AddAttribute( sAttrName, sAttrValue ); XMLTypedPropertiesOOoTContext_Impl *pContext2 = GetPropContext( (XMLPropType)aAction.m_nParam1 ); if( pContext2 ) pContext2->AddAttribute( sAttrName, sAttrValue ); } break; case XML_ATACTION_RENAME: { pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(), aAction.GetQNameTokenFromParam1(), sAttrValue ); } break; case XML_ATACTION_ENCODE_STYLE_NAME_REF: { OUString aAttrValue( sAttrValue ); GetTransformer().EncodeStyleName(aAttrValue); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_RENAME_ENCODE_STYLE_NAME_REF: { OUString aAttrValue( sAttrValue ); GetTransformer().EncodeStyleName(aAttrValue); pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(), aAction.GetQNameTokenFromParam1(), aAttrValue ); } break; case XML_ATACTION_NEG_PERCENT: { OUString aAttrValue( sAttrValue ); GetTransformer().NegPercent(aAttrValue); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_RENAME_NEG_PERCENT: { OUString aAttrValue( sAttrValue ); GetTransformer().NegPercent(aAttrValue); pContext->AddAttribute( aAction.GetQNamePrefixFromParam1(), aAction.GetQNameTokenFromParam1(), aAttrValue ); } break; case XML_ATACTION_INCH2IN: { OUString aAttrValue( sAttrValue ); XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue ); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_INCH2IN_DUPLICATE: { OUString aAttrValue( sAttrValue ); XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue ); pContext->AddAttribute( sAttrName, aAttrValue ); XMLTypedPropertiesOOoTContext_Impl *pContext2 = GetPropContext( (XMLPropType)aAction.m_nParam1 ); if( pContext2 ) pContext2->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_INCHS2INS: { OUString aAttrValue( sAttrValue ); XMLTransformerBase::ReplaceInchWithIn( aAttrValue ); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_PTACTION_LINE_MODE: { OUString aAttrValue( GetXMLToken( IsXMLToken( sAttrValue, XML_TRUE ) ? XML_CONTINUOUS : XML_SKIP_WHITE_SPACE) ); OUString aAttrQName( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_UNDERLINE_MODE ) ) ); pContext->AddAttribute( aAttrQName, aAttrValue ); aAttrQName = GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_LINE_THROUGH_MODE ) ); pContext->AddAttribute( aAttrQName, aAttrValue ); } break; case XML_PTACTION_KEEP_WITH_NEXT: { OUString aAttrValue( GetXMLToken( IsXMLToken( sAttrValue, XML_TRUE ) ? XML_ALWAYS : XML_AUTO) ); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_PTACTION_UNDERLINE: { XMLTokenEnum eToken = GetTransformer().GetToken( sAttrValue ); sal_Bool bBold = sal_False, bDouble = sal_False; switch( eToken ) { case XML_SINGLE: eToken = XML_SOLID; break; case XML_DOUBLE: eToken = XML_SOLID; bDouble = sal_True; break; case XML_BOLD: eToken = XML_SOLID; bBold = sal_True; break; case XML_BOLD_DOTTED: eToken = XML_DOTTED; bBold = sal_True; break; case XML_BOLD_DASH: eToken = XML_DASH; bBold = sal_True; break; case XML_BOLD_LONG_DASH: eToken = XML_LONG_DASH; bBold = sal_True; break; case XML_BOLD_DOT_DASH: eToken = XML_DOT_DASH; bBold = sal_True; break; case XML_BOLD_DOT_DOT_DASH: eToken = XML_DOT_DOT_DASH; bBold = sal_True; break; case XML_BOLD_WAVE: eToken = XML_WAVE; bBold = sal_True; break; case XML_DOUBLE_WAVE: eToken = XML_WAVE; bDouble = sal_True; break; case XML_NONE: eToken = XML_NONE; bDouble = sal_False; break; default: OSL_FAIL( "xmloff::XMLPropertiesOOoTContext_Impl::StartElement(), unknown underline token!" ); break; } pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_UNDERLINE_STYLE ) ), eToken != XML_TOKEN_END ? GetXMLToken( eToken ) : sAttrValue ); if( bDouble ) pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_UNDERLINE_TYPE ) ), GetXMLToken( XML_DOUBLE ) ); if( bBold ) pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_UNDERLINE_WIDTH ) ), GetXMLToken( XML_BOLD ) ); } break; case XML_PTACTION_LINETHROUGH: { XMLTokenEnum eToken = GetTransformer().GetToken( sAttrValue ); sal_Bool bBold = sal_False, bDouble = sal_False; sal_Unicode c = 0; switch( eToken ) { case XML_SINGLE_LINE: eToken = XML_SOLID; break; case XML_DOUBLE_LINE: eToken = XML_SOLID; bDouble = sal_True; break; case XML_THICK_LINE: eToken = XML_SOLID; bBold = sal_True; break; case XML_SLASH: eToken = XML_SOLID; c = '/'; break; case XML_uX: eToken = XML_SOLID; c = 'X'; break; default: break; } pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_LINE_THROUGH_STYLE ) ), eToken != XML_TOKEN_END ? GetXMLToken( eToken ) : sAttrValue ); if( bDouble ) pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_LINE_THROUGH_TYPE ) ), GetXMLToken( XML_DOUBLE ) ); if( bBold ) pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_LINE_THROUGH_WIDTH ) ), GetXMLToken( XML_BOLD ) ); if( c ) pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_TEXT_LINE_THROUGH_TEXT ) ), OUString::valueOf( c ) ); } break; case XML_PTACTION_SPLINES: { sal_Int32 nSplineType = sAttrValue.toInt32(); OUString aNewAttrName = GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CHART, GetXMLToken( XML_INTERPOLATION ) ); switch( nSplineType ) { // straight lines case 0: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NONE )); break; // cubic spline case 1: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_CUBIC_SPLINE )); break; // B-spline case 2: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_B_SPLINE )); break; default: OSL_FAIL( "invalid spline type" ); pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NONE )); break; } } break; case XML_PTACTION_INTERVAL_MAJOR: pContext->AddAttribute( sAttrName, sAttrValue ); SvXMLUnitConverter::convertDouble( fIntervalMajor, sAttrValue ); break; case XML_PTACTION_INTERVAL_MINOR: SvXMLUnitConverter::convertDouble( fIntervalMinor, sAttrValue ); pIntervalMinorDivisorContext = pContext; break; case XML_PTACTION_SYMBOL: { sal_Int32 nSymbolType = sAttrValue.toInt32(); OUString aNewAttrName = GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_TYPE ) ); if( nSymbolType >= 0 ) { pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NAMED_SYMBOL )); enum XMLTokenEnum eToken = XML_TOKEN_INVALID; switch( nSymbolType ) { // SYMBOL0 case 0: // "square" has an awkward token name eToken = XML_GRADIENTSTYLE_SQUARE; break; // SYMBOL1 case 1: eToken = XML_DIAMOND; break; // SYMBOL2 case 2: eToken = XML_ARROW_DOWN; break; // SYMBOL3 case 3: eToken = XML_ARROW_UP; break; // SYMBOL4 case 4: eToken = XML_ARROW_RIGHT; break; // SYMBOL5 case 5: eToken = XML_ARROW_LEFT; break; // SYMBOL6 case 6: eToken = XML_BOW_TIE; break; // SYMBOL7 case 7: eToken = XML_HOURGLASS; break; default: OSL_FAIL( "invalid named symbol" ); break; } if( eToken != XML_TOKEN_INVALID ) { pContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_NAME )), GetXMLToken( eToken )); } } else { switch( nSymbolType ) { // NONE case -3: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NONE )); break; // AUTO case -2: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_AUTOMATIC )); break; // BITMAPURL case -1: pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_IMAGE )); break; default: OSL_FAIL( "invalid symbol type" ); pContext->AddAttribute( aNewAttrName, GetXMLToken( XML_NONE )); break; } } } break; case XML_PTACTION_SYMBOL_IMAGE_NAME: { // create an xlink:href element for URI attribute XMLPersAttrListTContext *pSymbolImageContext = new XMLPersAttrListTContext( GetTransformer(), GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CHART, GetXMLToken( XML_SYMBOL_IMAGE ))); OUString aAttrValue( sAttrValue ); if( GetTransformer().ConvertURIToOASIS( aAttrValue, sal_True )) { pSymbolImageContext->AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aAttrValue ); pContext->AddContent( pSymbolImageContext ); } } break; // #i25616# case XML_PTACTION_TRANSPARENCY : { OUString aAttrValue( sAttrValue ); GetTransformer().NegPercent(aAttrValue); pContext->AddAttribute( XML_NAMESPACE_DRAW, XML_OPACITY, aAttrValue ); pContext->AddAttribute( XML_NAMESPACE_DRAW, XML_IMAGE_OPACITY, aAttrValue ); } break; case XML_PTACTION_BREAK_INSIDE: { pContext->AddAttribute( XML_NAMESPACE_FO, XML_KEEP_TOGETHER, GetXMLToken( IsXMLToken( sAttrValue, XML_COLUMNSPLIT_AVOID ) ? XML_ALWAYS : XML_AUTO ) ); } break; case XML_ATACTION_CAPTION_ESCAPE_OOO: { OUString aAttrValue( sAttrValue ); if( aAttrValue.indexOf( sal_Unicode('%') ) != -1 ) { sal_Int32 nValue = 0; SvXMLUnitConverter::convertPercent( nValue, sAttrValue ); if( nValue ) { nValue /= 100; rtl::OUStringBuffer aOut; SvXMLUnitConverter::convertPercent( aOut, nValue ); aAttrValue = aOut.makeStringAndClear(); } } else { XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue ); } pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_MOVE_PROTECT: bMoveProtect = IsXMLToken( sAttrValue, XML_TRUE ); pProtectContext = pContext; break; case XML_ATACTION_SIZE_PROTECT: bSizeProtect = IsXMLToken( sAttrValue, XML_TRUE ); pProtectContext = pContext; break; case XML_ATACTION_PROTECT: aProtectAttrValue = sAttrValue; pProtectContext = pContext; break; case XML_ATACTION_DRAW_MIRROR_OOO: // renames draw:mirror to style:mirror and adapts values { // OpenDocument file format: attribute value of wrong (#i49139#) aDrawMirrorAttrValue = GetXMLToken( IsXMLToken( sAttrValue, XML_TRUE ) ? XML_HORIZONTAL : XML_NONE ); bExistDrawMirror = sal_True; pMirrorContext = pContext; } break; // OpenDocument file format: attribute value of wrong (#i49139#) case XML_ATACTION_STYLE_MIRROR_OOO: // adapts style:mirror values { SvXMLTokenEnumerator aTokenEnum( sAttrValue ); OUString aToken; while( aTokenEnum.getNextToken( aToken ) ) { if ( aStyleMirrorAttrValue.getLength() > 0 ) { aStyleMirrorAttrValue += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( " " )); } if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_LEFT_PAGES ) ) { aStyleMirrorAttrValue += GetXMLToken( XML_HORIZONTAL_ON_EVEN ); } else if ( IsXMLToken( aToken, XML_HORIZONTAL_ON_RIGHT_PAGES ) ) { aStyleMirrorAttrValue += GetXMLToken( XML_HORIZONTAL_ON_ODD ); } else { aStyleMirrorAttrValue += aToken; } } bExistStyleMirror = sal_True; pMirrorContext = pContext; } break; case XML_ATACTION_GAMMA_OOO: // converts double value to percentage { double fValue = sAttrValue.toDouble(); sal_Int32 nValue = (sal_Int32)((fValue * 100.0) + ( fValue > 0 ? 0.5 : - 0.5 ) ); rtl::OUStringBuffer aOut; SvXMLUnitConverter::convertPercent( aOut, nValue ); OUString aAttrValue( aOut.makeStringAndClear() ); pContext->AddAttribute( sAttrName, aAttrValue ); } break; case XML_ATACTION_OPACITY_FIX: { sal_Int32 nValue; if( sAttrValue.indexOf( sal_Unicode('%') ) != -1 ) { SvXMLUnitConverter::convertPercent( nValue, sAttrValue ); } else { nValue = sal_Int32( sAttrValue.toDouble() * 100.0 ); } nValue = 100 - nValue; rtl::OUStringBuffer aOut; SvXMLUnitConverter::convertPercent( aOut, nValue ); pContext->AddAttribute( sAttrName, aOut.makeStringAndClear() ); } break; default: OSL_ENSURE( !this, "unknown action" ); break; } } // OpenDocument file format: attribute value of wrong (#i49139#) if ( bExistStyleMirror ) { pMirrorContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_MIRROR ) ), aStyleMirrorAttrValue); } else if ( bExistDrawMirror ) { pMirrorContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_MIRROR ) ), aDrawMirrorAttrValue); } if( bMoveProtect || bSizeProtect || aProtectAttrValue.getLength() ) { if( (bMoveProtect ||bSizeProtect) && IsXMLToken( aProtectAttrValue, XML_NONE ) ) aProtectAttrValue = OUString(); const OUString& rPosition = GetXMLToken( XML_POSITION ); if( bMoveProtect && -1 == aProtectAttrValue.indexOf( rPosition ) ) { if( aProtectAttrValue.getLength() ) aProtectAttrValue += OUString::valueOf( sal_Unicode( ' ' ) ); aProtectAttrValue += rPosition; } const OUString& rSize = GetXMLToken( XML_SIZE ); if( bSizeProtect && -1 == aProtectAttrValue.indexOf( rSize ) ) { if( aProtectAttrValue.getLength() ) aProtectAttrValue += OUString::valueOf( sal_Unicode( ' ' ) ); aProtectAttrValue += rSize; } pProtectContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_STYLE, GetXMLToken( XML_PROTECT ) ), aProtectAttrValue ); } if( pIntervalMinorDivisorContext ) { if( fIntervalMinor != 0.0 ) { sal_Int32 nIntervalMinorDivisor = static_cast< sal_Int32 >( ::rtl::math::round( fIntervalMajor / fIntervalMinor )); ::rtl::OUStringBuffer aBuf; SvXMLUnitConverter::convertNumber( aBuf, nIntervalMinorDivisor ); pIntervalMinorDivisorContext->AddAttribute( GetTransformer().GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CHART, GetXMLToken( XML_INTERVAL_MINOR_DIVISOR )), aBuf.makeStringAndClear()); } } } void XMLPropertiesOOoTContext_Impl::EndElement() { if( !m_bPersistent ) Export(); } void XMLPropertiesOOoTContext_Impl::Characters( const OUString& ) { // ignore them } void XMLPropertiesOOoTContext_Impl::Export() { for( sal_uInt16 i=0; i < MAX_PROP_TYPES; i++ ) { if( m_aPropContexts[i].is() ) m_aPropContexts[i]->Export(); } } sal_Bool XMLPropertiesOOoTContext_Impl::IsPersistent() const { return m_bPersistent; } //------------------------------------------------------------------------------ TYPEINIT1( XMLStyleOOoTContext, XMLPersElemContentTContext ); XMLStyleOOoTContext::XMLStyleOOoTContext( XMLTransformerBase& rImp, const OUString& rQName, XMLFamilyType eT, sal_Bool bPersistent ) : XMLPersElemContentTContext( rImp, rQName ), m_eFamily( eT ), m_bPersistent( bPersistent ) { } XMLStyleOOoTContext::XMLStyleOOoTContext( XMLTransformerBase& rImp, const OUString& rQName, XMLFamilyType eT, sal_uInt16 nPrefix, ::xmloff::token::XMLTokenEnum eToken, sal_Bool bPersistent ) : XMLPersElemContentTContext( rImp, rQName, nPrefix, eToken ), m_eFamily( eT ), m_bPersistent( bPersistent ) { } XMLStyleOOoTContext::~XMLStyleOOoTContext() { } XMLTransformerContext *XMLStyleOOoTContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rQName, const Reference< XAttributeList >& rAttrList ) { XMLTransformerContext *pContext = 0; if( XML_NAMESPACE_STYLE == nPrefix && IsXMLToken( rLocalName, XML_PROPERTIES ) ) { if( aPropTypes[m_eFamily][0] == XML_PROP_TYPE_END ) { OSL_ENSURE( !this, "unexpected properties element" ); pContext = m_bPersistent ? XMLPersElemContentTContext::CreateChildContext( nPrefix, rLocalName, rQName, rAttrList ) : XMLTransformerContext::CreateChildContext( nPrefix, rLocalName, rQName, rAttrList ); } else if( aPropTypes[m_eFamily][1] == XML_PROP_TYPE_END ) { sal_uInt16 nActionMap = aAttrActionMaps[aPropTypes[m_eFamily][0]]; if( nActionMap < MAX_OOO_PROP_ACTIONS ) { pContext = new XMLPropertiesOOoTContext_Impl( GetTransformer(), rQName, aPropTypes[m_eFamily], m_bPersistent ); } else { if( m_bPersistent ) pContext = new XMLPersElemContentTContext( GetTransformer(), rQName, XML_NAMESPACE_STYLE, aPropTokens[aPropTypes[m_eFamily][0]] ); else pContext = new XMLRenameElemTransformerContext( GetTransformer(), rQName, XML_NAMESPACE_STYLE, aPropTokens[aPropTypes[m_eFamily][0]] ); } } else { pContext = new XMLPropertiesOOoTContext_Impl( GetTransformer(), rQName, aPropTypes[m_eFamily], m_bPersistent); } if( m_bPersistent ) AddContent( pContext ); } else { pContext = m_bPersistent ? XMLPersElemContentTContext::CreateChildContext( nPrefix, rLocalName, rQName, rAttrList ) : XMLTransformerContext::CreateChildContext( nPrefix, rLocalName, rQName, rAttrList ); } return pContext; } void XMLStyleOOoTContext::StartElement( const Reference< XAttributeList >& rAttrList ) { XMLTransformerActions *pActions = GetTransformer().GetUserDefinedActions( OOO_STYLE_ACTIONS ); OSL_ENSURE( pActions, "go no actions" ); Reference< XAttributeList > xAttrList( rAttrList ); XMLMutableAttributeList *pMutableAttrList = 0; sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { const OUString sAttrName = xAttrList->getNameByIndex( i ); OUString aLocalName; sal_uInt16 nPrefix = GetTransformer().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); XMLTransformerActions::key_type aKey( nPrefix, aLocalName ); XMLTransformerActions::const_iterator aIter = pActions->find( aKey ); if( !(aIter == pActions->end() ) ) { if( !pMutableAttrList ) { pMutableAttrList = new XMLMutableAttributeList( xAttrList ); xAttrList = pMutableAttrList; } const OUString sAttrValue = xAttrList->getValueByIndex( i ); switch( (*aIter).second.m_nActionType ) { case XML_ATACTION_STYLE_FAMILY: { sal_Bool bControl = sal_False; if( XML_FAMILY_TYPE_END == m_eFamily ) { if( IsXMLToken( sAttrValue, XML_GRAPHICS ) ) m_eFamily = XML_FAMILY_TYPE_GRAPHIC; else if( IsXMLToken( sAttrValue, XML_PRESENTATION ) ) m_eFamily = XML_FAMILY_TYPE_PRESENTATION; else if( IsXMLToken( sAttrValue, XML_DRAWING_PAGE ) ) m_eFamily = XML_FAMILY_TYPE_DRAWING_PAGE; else if( IsXMLToken( sAttrValue, XML_TEXT) ) m_eFamily = XML_FAMILY_TYPE_TEXT; else if( IsXMLToken( sAttrValue, XML_PARAGRAPH) ) m_eFamily = XML_FAMILY_TYPE_PARAGRAPH; else if( IsXMLToken( sAttrValue, XML_RUBY) ) m_eFamily = XML_FAMILY_TYPE_RUBY; else if( IsXMLToken( sAttrValue, XML_SECTION) ) m_eFamily = XML_FAMILY_TYPE_SECTION; else if( IsXMLToken( sAttrValue, XML_TABLE) ) m_eFamily = XML_FAMILY_TYPE_TABLE; else if( IsXMLToken( sAttrValue, XML_TABLE_COLUMN) ) m_eFamily = XML_FAMILY_TYPE_TABLE_COLUMN; else if( IsXMLToken( sAttrValue, XML_TABLE_ROW) ) m_eFamily = XML_FAMILY_TYPE_TABLE_ROW; else if( IsXMLToken( sAttrValue, XML_TABLE_CELL) ) m_eFamily = XML_FAMILY_TYPE_TABLE_CELL; else if( IsXMLToken( sAttrValue, XML_CHART) ) m_eFamily = XML_FAMILY_TYPE_CHART; else if( IsXMLToken( sAttrValue, XML_CONTROL) ) { m_eFamily = XML_FAMILY_TYPE_PARAGRAPH; bControl = sal_True; } } if( XML_FAMILY_TYPE_GRAPHIC == m_eFamily ) { pMutableAttrList->SetValueByIndex( i, GetXMLToken( XML_GRAPHIC ) ); } else if( bControl ) { pMutableAttrList->SetValueByIndex( i, GetXMLToken( XML_PARAGRAPH ) ); } } break; case XML_ATACTION_INCH2IN: { OUString aAttrValue( sAttrValue ); if( XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue ) ) pMutableAttrList->SetValueByIndex( i, aAttrValue ); } break; case XML_ATACTION_ENCODE_STYLE_NAME: { OUString aAttrValue( sAttrValue ); if( GetTransformer().EncodeStyleName(aAttrValue) ) { pMutableAttrList->SetValueByIndex( i, aAttrValue ); OUString aNewAttrQName( GetTransformer().GetNamespaceMap(). GetQNameByKey( nPrefix, ::xmloff::token::GetXMLToken( XML_DISPLAY_NAME ) ) ); pMutableAttrList->AddAttribute( aNewAttrQName, sAttrValue ); } } break; case XML_ATACTION_ENCODE_STYLE_NAME_REF: { OUString aAttrValue( sAttrValue ); if( GetTransformer().EncodeStyleName(aAttrValue) ) pMutableAttrList->SetValueByIndex( i, aAttrValue ); } break; case XML_ATACTION_NEG_PERCENT: { OUString aAttrValue( sAttrValue ); if( GetTransformer().NegPercent(aAttrValue) ) pMutableAttrList->SetValueByIndex( i, aAttrValue ); } break; case XML_ATACTION_URI_OOO: { OUString aAttrValue( sAttrValue ); if( GetTransformer().ConvertURIToOASIS( aAttrValue, static_cast< sal_Bool >((*aIter).second.m_nParam1))) pMutableAttrList->SetValueByIndex( i, aAttrValue ); } break; default: OSL_ENSURE( !this, "unknown action" ); break; } } } if( XML_FAMILY_TYPE_END == m_eFamily ) m_eFamily = XML_FAMILY_TYPE_TEXT; if( m_bPersistent ) XMLPersElemContentTContext::StartElement( xAttrList ); else GetTransformer().GetDocHandler()->startElement( GetExportQName(), xAttrList ); } void XMLStyleOOoTContext::EndElement() { if( m_bPersistent ) XMLPersElemContentTContext::EndElement(); else GetTransformer().GetDocHandler()->endElement( GetExportQName() ); } void XMLStyleOOoTContext::Characters( const OUString& ) { // element content only: } sal_Bool XMLStyleOOoTContext::IsPersistent() const { return m_bPersistent; } XMLTransformerActions *XMLStyleOOoTContext::CreateTransformerActions( sal_uInt16 nType ) { XMLTransformerActionInit *pInit = 0; switch( nType ) { case PROP_OOO_GRAPHIC_ATTR_ACTIONS: pInit = aGraphicPropertyOOoAttrActionTable; break; case PROP_OOO_GRAPHIC_ELEM_ACTIONS: pInit = aGraphicPropertyOOoElemActionTable; break; case PROP_OOO_DRAWING_PAGE_ATTR_ACTIONS: pInit = aDrawingPagePropertyOOoAttrActionTable; break; case PROP_OOO_PAGE_LAYOUT_ATTR_ACTIONS: pInit = aPageLayoutPropertyOOoAttrActionTable; break; case PROP_OOO_HEADER_FOOTER_ATTR_ACTIONS: pInit = aHeaderFooterPropertyOOoAttrActionTable; break; case PROP_OOO_TEXT_ATTR_ACTIONS: pInit = aTextPropertyOOoAttrActionTable; break; case PROP_OOO_TEXT_ELEM_ACTIONS: pInit = aTextPropertyOOoElemActionTable; break; case PROP_OOO_PARAGRAPH_ATTR_ACTIONS: pInit = aParagraphPropertyOOoAttrActionTable; break; case PROP_OOO_PARAGRAPH_ELEM_ACTIONS: pInit = aParagraphPropertyOOoElemActionTable; break; case PROP_OOO_SECTION_ATTR_ACTIONS: pInit = aSectionPropertyOOoAttrActionTable; break; case PROP_OOO_TABLE_ATTR_ACTIONS: pInit = aTablePropertyOOoAttrActionTable; break; case PROP_OOO_TABLE_COLUMN_ATTR_ACTIONS: pInit = aTableColumnPropertyOOoAttrActionTable; break; case PROP_OOO_TABLE_ROW_ATTR_ACTIONS: pInit = aTableRowPropertyOOoAttrActionTable; break; case PROP_OOO_TABLE_CELL_ATTR_ACTIONS: pInit = aTableCellPropertyOOoAttrActionTable; break; case PROP_OOO_TABLE_CELL_ELEM_ACTIONS: pInit = aTableCellPropertyOOoElemActionTable; break; case PROP_OOO_LIST_LEVEL_ATTR_ACTIONS: pInit = aListLevelPropertyOOoAttrActionTable; break; case PROP_OOO_CHART_ATTR_ACTIONS: pInit = aChartPropertyOOoAttrActionTable; break; case PROP_OOO_CHART_ELEM_ACTIONS: pInit = aChartPropertyOOoElemActionTable; break; } XMLTransformerActions *pActions = 0; if( pInit ) pActions = new XMLTransformerActions( pInit ); return pActions; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */