diff options
Diffstat (limited to 'xmloff/source/draw/ximpstyl.cxx')
-rw-r--r-- | xmloff/source/draw/ximpstyl.cxx | 1660 |
1 files changed, 1660 insertions, 0 deletions
diff --git a/xmloff/source/draw/ximpstyl.cxx b/xmloff/source/draw/ximpstyl.cxx new file mode 100644 index 000000000000..dad2aa296dee --- /dev/null +++ b/xmloff/source/draw/ximpstyl.cxx @@ -0,0 +1,1660 @@ +/* -*- 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 + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_xmloff.hxx" + + +#include "ximpstyl.hxx" +#include <xmloff/XMLShapeStyleContext.hxx> +#include "xmloff/xmlnmspe.hxx" +#include <xmloff/xmltoken.hxx> +#include <xmloff/xmluconv.hxx> +#include "ximpnote.hxx" +#include <tools/debug.hxx> + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/presentation/XPresentationPage.hpp> +#include <com/sun/star/drawing/XDrawPages.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> +#include <com/sun/star/presentation/XHandoutMasterSupplier.hpp> +#include <comphelper/namecontainer.hxx> +#include <xmloff/xmlprcon.hxx> +#include <xmloff/families.hxx> +#include <com/sun/star/container/XNameContainer.hpp> +#include <svl/zforlist.hxx> +#include "PropertySetMerger.hxx" +#include "sdpropls.hxx" +#include "layerimp.hxx" +#include <xmloff/XMLGraphicsDefaultStyle.hxx> +#include "XMLNumberStylesImport.hxx" +#include "xmloff/xmlerror.hxx" + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using namespace ::xmloff::token; + +////////////////////////////////////////////////////////////////////////////// + +class SdXMLDrawingPagePropertySetContext : public SvXMLPropertySetContext +{ +public: + + TYPEINFO(); + + SdXMLDrawingPagePropertySetContext( SvXMLImport& rImport, sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList >& xAttrList, + ::std::vector< XMLPropertyState > &rProps, + const UniReference < SvXMLImportPropertyMapper > &rMap ); + + virtual ~SdXMLDrawingPagePropertySetContext(); + + using SvXMLPropertySetContext::CreateChildContext; + virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList, + ::std::vector< XMLPropertyState > &rProperties, + const XMLPropertyState& rProp); +}; + +TYPEINIT1( SdXMLDrawingPagePropertySetContext, SvXMLPropertySetContext ); + +SdXMLDrawingPagePropertySetContext::SdXMLDrawingPagePropertySetContext( + SvXMLImport& rImport, sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList, + ::std::vector< XMLPropertyState > &rProps, + const UniReference < SvXMLImportPropertyMapper > &rMap ) : + SvXMLPropertySetContext( rImport, nPrfx, rLName, xAttrList, + XML_TYPE_PROP_DRAWING_PAGE, rProps, rMap ) +{ +} + +SdXMLDrawingPagePropertySetContext::~SdXMLDrawingPagePropertySetContext() +{ +} + +SvXMLImportContext *SdXMLDrawingPagePropertySetContext::CreateChildContext( + sal_uInt16 p_nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList, + ::std::vector< XMLPropertyState > &rProperties, + const XMLPropertyState& rProp ) +{ + SvXMLImportContext *pContext = 0; + + switch( mxMapper->getPropertySetMapper()->GetEntryContextId( rProp.mnIndex ) ) + { + case CTF_PAGE_SOUND_URL: + { + const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString aLocalName; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(xAttrList->getNameByIndex(i), &aLocalName); + + if( (nPrefix == XML_NAMESPACE_XLINK) && IsXMLToken( aLocalName, XML_HREF ) ) + { + uno::Any aAny( GetImport().GetAbsoluteReference( xAttrList->getValueByIndex(i) ) ); + XMLPropertyState aPropState( rProp.mnIndex, aAny ); + rProperties.push_back( aPropState ); + } + } + break; + } + } + + if( !pContext ) + pContext = SvXMLPropertySetContext::CreateChildContext( p_nPrefix, rLocalName, + xAttrList, + rProperties, rProp ); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// + +class SdXMLDrawingPageStyleContext : public XMLPropStyleContext +{ +public: + TYPEINFO(); + + SdXMLDrawingPageStyleContext( + SvXMLImport& rImport, + sal_uInt16 nPrfx, + const rtl::OUString& rLName, + const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList, + SvXMLStylesContext& rStyles, + sal_uInt16 nFamily = XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID); + virtual ~SdXMLDrawingPageStyleContext(); + + SvXMLImportContext * CreateChildContext( + sal_uInt16 nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList ); + + virtual void Finish( sal_Bool bOverwrite ); + + // #i35918# + virtual void FillPropertySet( + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet > & rPropSet ); +}; + +TYPEINIT1( SdXMLDrawingPageStyleContext, XMLPropStyleContext ); + +SdXMLDrawingPageStyleContext::SdXMLDrawingPageStyleContext( + SvXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList, + SvXMLStylesContext& rStyles, + sal_uInt16 nFamily) +: XMLPropStyleContext(rImport, nPrfx, rLName, xAttrList, rStyles, nFamily ) +{ +} + +SdXMLDrawingPageStyleContext::~SdXMLDrawingPageStyleContext() +{ +} + +SvXMLImportContext *SdXMLDrawingPageStyleContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + if( XML_NAMESPACE_STYLE == nPrefix && + IsXMLToken( rLocalName, XML_DRAWING_PAGE_PROPERTIES ) ) + { + UniReference < SvXMLImportPropertyMapper > xImpPrMap = + GetStyles()->GetImportPropertyMapper( GetFamily() ); + if( xImpPrMap.is() ) + pContext = new SdXMLDrawingPagePropertySetContext( GetImport(), nPrefix, + rLocalName, xAttrList, + GetProperties(), + xImpPrMap ); + } + + if( !pContext ) + pContext = XMLPropStyleContext::CreateChildContext( nPrefix, rLocalName, + xAttrList ); + + return pContext; +} + +void SdXMLDrawingPageStyleContext::Finish( sal_Bool bOverwrite ) +{ + XMLPropStyleContext::Finish( bOverwrite ); + + ::std::vector< XMLPropertyState > &rProperties = GetProperties(); + + const UniReference< XMLPropertySetMapper >& rImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() )->getPropertySetMapper(); + + ::std::vector< XMLPropertyState >::iterator property = rProperties.begin(); + for(; property != rProperties.end(); property++) + { + if( property->mnIndex == -1 ) + continue; + + sal_Int16 nContextID = rImpPrMap->GetEntryContextId(property->mnIndex); + switch( nContextID ) + { + case CTF_DATE_TIME_FORMAT: + { + OUString sStyleName; + (*property).maValue >>= sStyleName; + + sal_Int32 nStyle = 0; + + SdXMLNumberFormatImportContext* pSdNumStyle = + PTR_CAST( SdXMLNumberFormatImportContext, + GetStyles()->FindStyleChildContext( XML_STYLE_FAMILY_DATA_STYLE, sStyleName, sal_True ) ); + + if( pSdNumStyle ) + nStyle = pSdNumStyle->GetDrawKey(); + + (*property).maValue <<= nStyle; + } + break; + } + } + +} + +// #i35918# +void SdXMLDrawingPageStyleContext::FillPropertySet( + const Reference< beans::XPropertySet > & rPropSet ) +{ + const sal_uInt16 MAX_SPECIAL_DRAW_STYLES = 7; + struct _ContextID_Index_Pair aContextIDs[MAX_SPECIAL_DRAW_STYLES+1] = + { + { CTF_DASHNAME , -1 }, + { CTF_LINESTARTNAME , -1 }, + { CTF_LINEENDNAME , -1 }, + { CTF_FILLGRADIENTNAME, -1 }, + { CTF_FILLTRANSNAME , -1 }, + { CTF_FILLHATCHNAME , -1 }, + { CTF_FILLBITMAPNAME , -1 }, + { -1, -1 } + }; + static sal_uInt16 aFamilies[MAX_SPECIAL_DRAW_STYLES] = + { + XML_STYLE_FAMILY_SD_STROKE_DASH_ID, + XML_STYLE_FAMILY_SD_MARKER_ID, + XML_STYLE_FAMILY_SD_MARKER_ID, + XML_STYLE_FAMILY_SD_GRADIENT_ID, + XML_STYLE_FAMILY_SD_GRADIENT_ID, + XML_STYLE_FAMILY_SD_HATCH_ID, + XML_STYLE_FAMILY_SD_FILL_IMAGE_ID + }; + + UniReference < SvXMLImportPropertyMapper > xImpPrMap = + GetStyles()->GetImportPropertyMapper( GetFamily() ); + DBG_ASSERT( xImpPrMap.is(), "There is the import prop mapper" ); + if( xImpPrMap.is() ) + xImpPrMap->FillPropertySet( GetProperties(), rPropSet, aContextIDs ); + + Reference< beans::XPropertySetInfo > xInfo; + for( sal_uInt16 i=0; i<MAX_SPECIAL_DRAW_STYLES; i++ ) + { + sal_Int32 nIndex = aContextIDs[i].nIndex; + if( nIndex != -1 ) + { + struct XMLPropertyState& rState = GetProperties()[nIndex]; + OUString sStyleName; + rState.maValue >>= sStyleName; + sStyleName = GetImport().GetStyleDisplayName( aFamilies[i], + sStyleName ); + // get property set mapper + UniReference<XMLPropertySetMapper> rPropMapper = + xImpPrMap->getPropertySetMapper(); + + // set property + const OUString& rPropertyName = + rPropMapper->GetEntryAPIName(rState.mnIndex); + if( !xInfo.is() ) + xInfo = rPropSet->getPropertySetInfo(); + if ( xInfo->hasPropertyByName( rPropertyName ) ) + { + rPropSet->setPropertyValue( rPropertyName, Any( sStyleName ) ); + } + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +TYPEINIT1( SdXMLPageMasterStyleContext, SvXMLStyleContext ); + +SdXMLPageMasterStyleContext::SdXMLPageMasterStyleContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList>& xAttrList) +: SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PAGEMASTERSTYLECONEXT_ID), + mnBorderBottom( 0L ), + mnBorderLeft( 0L ), + mnBorderRight( 0L ), + mnBorderTop( 0L ), + mnWidth( 0L ), + mnHeight( 0L ), + meOrientation(GetSdImport().IsDraw() ? view::PaperOrientation_PORTRAIT : view::PaperOrientation_LANDSCAPE) +{ + // set family to something special at SvXMLStyleContext + // for differences in search-methods + + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString sAttrName = xAttrList->getNameByIndex(i); + OUString aLocalName; + sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName); + OUString sValue = xAttrList->getValueByIndex(i); + const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPageMasterStyleAttrTokenMap(); + + switch(rAttrTokenMap.Get(nPrefix, aLocalName)) + { + case XML_TOK_PAGEMASTERSTYLE_MARGIN_TOP: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderTop, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_MARGIN_BOTTOM: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderBottom, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_MARGIN_LEFT: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderLeft, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_MARGIN_RIGHT: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnBorderRight, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_PAGE_WIDTH: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnWidth, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_PAGE_HEIGHT: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnHeight, sValue); + break; + } + case XML_TOK_PAGEMASTERSTYLE_PAGE_ORIENTATION: + { + if( IsXMLToken( sValue, XML_PORTRAIT ) ) + meOrientation = view::PaperOrientation_PORTRAIT; + else + meOrientation = view::PaperOrientation_LANDSCAPE; + break; + } + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +SdXMLPageMasterStyleContext::~SdXMLPageMasterStyleContext() +{ +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +TYPEINIT1( SdXMLPageMasterContext, SvXMLStyleContext ); + +SdXMLPageMasterContext::SdXMLPageMasterContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList>& xAttrList) +: SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PAGEMASTERCONEXT_ID), + mpPageMasterStyle( 0L ) +{ + // set family to something special at SvXMLStyleContext + // for differences in search-methods + + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString sAttrName = xAttrList->getNameByIndex(i); + OUString aLocalName; + sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName); + OUString sValue = xAttrList->getValueByIndex(i); + const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPageMasterAttrTokenMap(); + + switch(rAttrTokenMap.Get(nPrefix, aLocalName)) + { + case XML_TOK_PAGEMASTER_NAME: + { + msName = sValue; + break; + } + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +SdXMLPageMasterContext::~SdXMLPageMasterContext() +{ + // release remembered contexts, they are no longer needed + if(mpPageMasterStyle) + { + mpPageMasterStyle->ReleaseRef(); + mpPageMasterStyle = 0L; + } +} + +////////////////////////////////////////////////////////////////////////////// + +SvXMLImportContext *SdXMLPageMasterContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList ) +{ + SvXMLImportContext* pContext = 0; + + if(nPrefix == XML_NAMESPACE_STYLE && IsXMLToken( rLocalName, XML_PAGE_LAYOUT_PROPERTIES) ) + { + pContext = new SdXMLPageMasterStyleContext(GetSdImport(), nPrefix, rLocalName, xAttrList); + + // remember SdXMLPresentationPlaceholderContext for later evaluation + if(pContext) + { + pContext->AddRef(); + DBG_ASSERT(!mpPageMasterStyle, "PageMasterStyle is set, there seem to be two of them (!)"); + mpPageMasterStyle = (SdXMLPageMasterStyleContext*)pContext; + } + } + + // call base class + if(!pContext) + pContext = SvXMLStyleContext::CreateChildContext(nPrefix, rLocalName, xAttrList); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +TYPEINIT1( SdXMLPresentationPageLayoutContext, SvXMLStyleContext ); + +SdXMLPresentationPageLayoutContext::SdXMLPresentationPageLayoutContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList) +: SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_SD_PRESENTATIONPAGELAYOUT_ID), + mnTypeId( 20 ) // AUTOLAYOUT_NONE +{ + // set family to somethiong special at SvXMLStyleContext + // for differences in search-methods + + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( sal_Int16 i=0; i < nAttrCount; i++ ) + { + const OUString& rAttrName = xAttrList->getNameByIndex( i ); + OUString aLocalName; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); + + if(nPrefix == XML_NAMESPACE_STYLE && IsXMLToken( aLocalName, XML_NAME ) ) + { + msName = xAttrList->getValueByIndex( i ); + } + } +} + +SdXMLPresentationPageLayoutContext::~SdXMLPresentationPageLayoutContext() +{ +} + +SvXMLImportContext *SdXMLPresentationPageLayoutContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList ) +{ + SvXMLImportContext* pContext = 0; + + if(nPrefix == XML_NAMESPACE_PRESENTATION && IsXMLToken( rLocalName, XML_PLACEHOLDER ) ) + { + // presentation:placeholder inside style:presentation-page-layout context + pContext = new SdXMLPresentationPlaceholderContext( + GetSdImport(), nPrefix, rLocalName, xAttrList); + + // remember SdXMLPresentationPlaceholderContext for later evaluation + if(pContext) + { + pContext->AddRef(); + maList.push_back( (SdXMLPresentationPlaceholderContext*)pContext ); + } + } + + // call base class + if(!pContext) + pContext = SvXMLStyleContext::CreateChildContext(nPrefix, rLocalName, xAttrList); + + return pContext; +} + +void SdXMLPresentationPageLayoutContext::EndElement() +{ + // build presentation page layout type here + // calc mnTpeId due to content of maList + // at the moment only use number of types used there + if( !maList.empty() ) + { + SdXMLPresentationPlaceholderContext* pObj0 = maList[ 0 ]; + if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("handout")))) + { + switch( maList.size() ) + { + case 1: + mnTypeId = 22; // AUTOLAYOUT_HANDOUT1 + break; + case 2: + mnTypeId = 23; // AUTOLAYOUT_HANDOUT2 + break; + case 3: + mnTypeId = 24; // AUTOLAYOUT_HANDOUT3 + break; + case 4: + mnTypeId = 25; // AUTOLAYOUT_HANDOUT4 + break; + case 9: + mnTypeId = 31; // AUTOLAYOUT_HANDOUT9 + break; + default: + mnTypeId = 26; // AUTOLAYOUT_HANDOUT6 + } + } + else + { + switch( maList.size() ) + { + case 1: + { + if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("title")))) + { + mnTypeId = 19; // AUTOLAYOUT_ONLY_TITLE + } + else + { + mnTypeId = 32; // AUTOLAYOUT_ONLY_TEXT + } + break; + } + case 2: + { + SdXMLPresentationPlaceholderContext* pObj1 = maList[ 1 ]; + + if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("subtitle")))) + { + mnTypeId = 0; // AUTOLAYOUT_TITLE + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("outline")))) + { + mnTypeId = 1; // AUTOLAYOUT_ENUM + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("chart")))) + { + mnTypeId = 2; // AUTOLAYOUT_CHART + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("table")))) + { + mnTypeId = 8; // AUTOLAYOUT_TAB + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("object")))) + { + mnTypeId = 11; // AUTOLAYOUT_OBJ + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline")))) + { + if(pObj0->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_title")))) + { + // AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE + mnTypeId = 28; + } + else + { + // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE + mnTypeId = 29; + } + } + else + { + mnTypeId = 21; // AUTOLAYOUT_NOTES + } + break; + } + case 3: + { + SdXMLPresentationPlaceholderContext* pObj1 = maList[ 1 ]; + SdXMLPresentationPlaceholderContext* pObj2 = maList[ 2 ]; + + if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("outline")))) + { + if(pObj2->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("outline")))) + { + mnTypeId = 3; // AUTOLAYOUT_2TEXT + } + else if(pObj2->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("chart")))) + { + mnTypeId = 4; // AUTOLAYOUT_TEXTCHART + } + else if(pObj2->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("graphic")))) + { + mnTypeId = 6; // AUTOLAYOUT_TEXTCLIP + } + else + { + if(pObj1->GetX() < pObj2->GetX()) + { + mnTypeId = 10; // AUTOLAYOUT_TEXTOBJ -> outline left, object right + } + else + { + mnTypeId = 17; // AUTOLAYOUT_TEXTOVEROBJ -> outline top, object right + } + } + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("chart")))) + { + mnTypeId = 7; // AUTOLAYOUT_CHARTTEXT + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("graphic")))) + { + if(pObj2->GetName().equals(OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline")))) + { + // AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART + mnTypeId = 30; + } + else + { + mnTypeId = 9; // AUTOLAYOUT_CLIPTEXT + } + } + else if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("vertical_outline")))) + { + // AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART + mnTypeId = 27; + } + else + { + if(pObj1->GetX() < pObj2->GetX()) + { + mnTypeId = 13; // AUTOLAYOUT_OBJTEXT -> left, right + } + else + { + mnTypeId = 14; // AUTOLAYOUT_OBJOVERTEXT -> top, bottom + } + } + break; + } + case 4: + { + SdXMLPresentationPlaceholderContext* pObj1 = maList[ 1 ]; + SdXMLPresentationPlaceholderContext* pObj2 = maList[ 2 ]; + + if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("object")))) + { + if(pObj1->GetX() < pObj2->GetX()) + { + mnTypeId = 16; // AUTOLAYOUT_2OBJOVERTEXT + } + else + { + mnTypeId = 15; // AUTOLAYOUT_2OBJTEXT + } + } + else + { + mnTypeId = 12; // AUTOLAYOUT_TEXT2OBJ + } + break; + } + case 5: + { + SdXMLPresentationPlaceholderContext* pObj1 = maList[ 1 ]; + + if(pObj1->GetName().equals( + OUString(RTL_CONSTASCII_USTRINGPARAM("object")))) + { + mnTypeId = 18; // AUTOLAYOUT_4OBJ + } + else + { + mnTypeId = 33; // AUTOLAYOUT_4CLIPART + } + break; + + } + case 7: + { + mnTypeId = 33; // AUTOLAYOUT_6CLIPART + break; + } + default: + { + mnTypeId = 20; // AUTOLAYOUT_NONE + break; + } + } + } + + // release remembered contexts, they are no longer needed + for ( size_t i = maList.size(); i > 0; ) + maList[ --i ]->ReleaseRef(); + maList.clear(); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +SdXMLPresentationPlaceholderContext::SdXMLPresentationPlaceholderContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, const + OUString& rLName, + const uno::Reference< xml::sax::XAttributeList>& xAttrList) +: SvXMLImportContext( rImport, nPrfx, rLName), + mnX(0L), + mnY(0L), + mnWidth(1L), + mnHeight(1L) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString sAttrName = xAttrList->getNameByIndex(i); + OUString aLocalName; + sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName); + OUString sValue = xAttrList->getValueByIndex(i); + const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetPresentationPlaceholderAttrTokenMap(); + + switch(rAttrTokenMap.Get(nPrefix, aLocalName)) + { + case XML_TOK_PRESENTATIONPLACEHOLDER_OBJECTNAME: + { + msName = sValue; + break; + } + case XML_TOK_PRESENTATIONPLACEHOLDER_X: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnX, sValue); + break; + } + case XML_TOK_PRESENTATIONPLACEHOLDER_Y: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnY, sValue); + break; + } + case XML_TOK_PRESENTATIONPLACEHOLDER_WIDTH: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnWidth, sValue); + break; + } + case XML_TOK_PRESENTATIONPLACEHOLDER_HEIGHT: + { + GetSdImport().GetMM100UnitConverter().convertMeasure(mnHeight, sValue); + break; + } + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +SdXMLPresentationPlaceholderContext::~SdXMLPresentationPlaceholderContext() +{ +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +TYPEINIT1( SdXMLMasterPageContext, SdXMLGenericPageContext ); + +SdXMLMasterPageContext::SdXMLMasterPageContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList>& xAttrList, + uno::Reference< drawing::XShapes >& rShapes) +: SdXMLGenericPageContext( rImport, nPrfx, rLName, xAttrList, rShapes ) +{ + const sal_Bool bHandoutMaster = IsXMLToken( rLName, XML_HANDOUT_MASTER ); + + const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString sAttrName = xAttrList->getNameByIndex( i ); + OUString aLocalName; + sal_uInt16 nPrefix = GetSdImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); + OUString sValue = xAttrList->getValueByIndex( i ); + const SvXMLTokenMap& rAttrTokenMap = GetSdImport().GetMasterPageAttrTokenMap(); + + switch(rAttrTokenMap.Get(nPrefix, aLocalName)) + { + case XML_TOK_MASTERPAGE_NAME: + { + msName = sValue; + break; + } + case XML_TOK_MASTERPAGE_DISPLAY_NAME: + { + msDisplayName = sValue; + break; + } + case XML_TOK_MASTERPAGE_PAGE_MASTER_NAME: + { + msPageMasterName = sValue; + break; + } + case XML_TOK_MASTERPAGE_STYLE_NAME: + { + msStyleName = sValue; + break; + } + case XML_TOK_MASTERPAGE_PAGE_LAYOUT_NAME: + { + maPageLayoutName = sValue; + break; + } + case XML_TOK_MASTERPAGE_USE_HEADER_NAME: + { + maUseHeaderDeclName = sValue; + break; + } + case XML_TOK_MASTERPAGE_USE_FOOTER_NAME: + { + maUseFooterDeclName = sValue; + break; + } + case XML_TOK_MASTERPAGE_USE_DATE_TIME_NAME: + { + maUseDateTimeDeclName = sValue; + break; + } + } + } + + if( !msDisplayName.getLength() ) + msDisplayName = msName; + else if( msDisplayName != msName ) + GetImport().AddStyleDisplayName( XML_STYLE_FAMILY_MASTER_PAGE, msName, msDisplayName ); + + GetImport().GetShapeImport()->startPage( GetLocalShapesContext() ); + + // set page name? + if(!bHandoutMaster && msDisplayName.getLength() && GetLocalShapesContext().is()) + { + uno::Reference < container::XNamed > xNamed(GetLocalShapesContext(), uno::UNO_QUERY); + if(xNamed.is()) + xNamed->setName(msDisplayName); + } + + // set page-master? + if(msPageMasterName.getLength()) + { + SetPageMaster( msPageMasterName ); + } + + SetStyle( msStyleName ); + + SetLayout(); + + DeleteAllShapes(); +} + +////////////////////////////////////////////////////////////////////////////// + +SdXMLMasterPageContext::~SdXMLMasterPageContext() +{ +} + +////////////////////////////////////////////////////////////////////////////// + +void SdXMLMasterPageContext::EndElement() +{ + // set styles on master-page + if(msName.getLength() && GetSdImport().GetShapeImport()->GetStylesContext()) + { + SvXMLImportContext* pContext = GetSdImport().GetShapeImport()->GetStylesContext(); + if( pContext && pContext->ISA( SvXMLStyleContext ) ) + ((SdXMLStylesContext*)pContext)->SetMasterPageStyles(*this); + } + + SdXMLGenericPageContext::EndElement(); + GetImport().GetShapeImport()->endPage(GetLocalShapesContext()); +} + +////////////////////////////////////////////////////////////////////////////// + +SvXMLImportContext* SdXMLMasterPageContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext* pContext = 0; + const SvXMLTokenMap& rTokenMap = GetSdImport().GetMasterPageElemTokenMap(); + + // some special objects inside style:masterpage context + switch(rTokenMap.Get(nPrefix, rLocalName)) + { + case XML_TOK_MASTERPAGE_STYLE: + { + if(GetSdImport().GetShapeImport()->GetStylesContext()) + { + // style:style inside master-page context -> presentation style + XMLShapeStyleContext* pNew = new XMLShapeStyleContext( + GetSdImport(), nPrefix, rLocalName, xAttrList, + *GetSdImport().GetShapeImport()->GetStylesContext(), + XML_STYLE_FAMILY_SD_PRESENTATION_ID); + + // add this style to the outer StylesContext class for later processing + if(pNew) + { + pContext = pNew; + GetSdImport().GetShapeImport()->GetStylesContext()->AddStyle(*pNew); + } + } + break; + } + case XML_TOK_MASTERPAGE_NOTES: + { + if( GetSdImport().IsImpress() ) + { + // get notes page + uno::Reference< presentation::XPresentationPage > xPresPage(GetLocalShapesContext(), uno::UNO_QUERY); + if(xPresPage.is()) + { + uno::Reference< drawing::XDrawPage > xNotesDrawPage(xPresPage->getNotesPage(), uno::UNO_QUERY); + if(xNotesDrawPage.is()) + { + uno::Reference< drawing::XShapes > xNewShapes(xNotesDrawPage, uno::UNO_QUERY); + if(xNewShapes.is()) + { + // presentation:notes inside master-page context + pContext = new SdXMLNotesContext( GetSdImport(), nPrefix, rLocalName, xAttrList, xNewShapes); + } + } + } + } + } + } + + // call base class + if(!pContext) + pContext = SdXMLGenericPageContext::CreateChildContext(nPrefix, rLocalName, xAttrList); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +TYPEINIT1( SdXMLStylesContext, SvXMLStyleContext ); + +SdXMLStylesContext::SdXMLStylesContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList, + sal_Bool bIsAutoStyle) +: SvXMLStylesContext(rImport, nPrfx, rLName, xAttrList), + mbIsAutoStyle(bIsAutoStyle) +{ + Reference< lang::XMultiServiceFactory > xMSF = rImport.getServiceFactory(); + mpNumFormatter = new SvNumberFormatter( xMSF, LANGUAGE_SYSTEM ); + mpNumFmtHelper = new SvXMLNumFmtHelper( mpNumFormatter, xMSF ); +} + +////////////////////////////////////////////////////////////////////////////// + +SdXMLStylesContext::~SdXMLStylesContext() +{ + delete mpNumFmtHelper; + delete mpNumFormatter; +} + +////////////////////////////////////////////////////////////////////////////// + +SvXMLStyleContext* SdXMLStylesContext::CreateStyleChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList) +{ + SvXMLStyleContext* pContext = 0; + const SvXMLTokenMap& rStyleTokenMap = GetSdImport().GetStylesElemTokenMap(); + + switch(rStyleTokenMap.Get(nPrefix, rLocalName)) + { + case XML_TOK_STYLES_PAGE_MASTER: + { + // style:page-master inside office:styles context + pContext = new SdXMLPageMasterContext(GetSdImport(), nPrefix, rLocalName, xAttrList); + break; + } + case XML_TOK_STYLES_PRESENTATION_PAGE_LAYOUT: + { + // style:presentation-page-layout inside office:styles context + pContext = new SdXMLPresentationPageLayoutContext(GetSdImport(), nPrefix, rLocalName, xAttrList); + break; + } + } + + if(!pContext) + { + const SvXMLTokenMap& rTokenMap = mpNumFmtHelper->GetStylesElemTokenMap(); + sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName ); + switch (nToken) + { + case XML_TOK_STYLES_DATE_STYLE: + case XML_TOK_STYLES_TIME_STYLE: + // number:date-style or number:time-style + pContext = new SdXMLNumberFormatImportContext( GetSdImport(), nPrefix, rLocalName, mpNumFmtHelper->getData(), nToken, xAttrList, *this ); + break; + + case XML_TOK_STYLES_NUMBER_STYLE: + case XML_TOK_STYLES_CURRENCY_STYLE: + case XML_TOK_STYLES_PERCENTAGE_STYLE: + case XML_TOK_STYLES_BOOLEAN_STYLE: + case XML_TOK_STYLES_TEXT_STYLE: + pContext = new SvXMLNumFormatContext( GetSdImport(), nPrefix, rLocalName, + mpNumFmtHelper->getData(), nToken, xAttrList, *this ); + break; + } + } + + if(!pContext && nPrefix == XML_NAMESPACE_PRESENTATION ) + { + if( IsXMLToken( rLocalName, XML_HEADER_DECL ) || + IsXMLToken( rLocalName, XML_FOOTER_DECL ) || + IsXMLToken( rLocalName, XML_DATE_TIME_DECL ) ) + { + pContext = new SdXMLHeaderFooterDeclContext( GetImport(), nPrefix, rLocalName, xAttrList ); + } + } + + if(!pContext && (nPrefix == XML_NAMESPACE_TABLE) && IsXMLToken( rLocalName, XML_TABLE_TEMPLATE ) ) + { + pContext = GetImport().GetShapeImport()->GetShapeTableImport()->CreateTableTemplateContext(nPrefix, rLocalName, xAttrList ); + } + + // call base class + if(!pContext) + pContext = SvXMLStylesContext::CreateStyleChildContext(nPrefix, rLocalName, xAttrList); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// + +SvXMLStyleContext* SdXMLStylesContext::CreateStyleStyleChildContext( + sal_uInt16 nFamily, + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList) +{ + SvXMLStyleContext* pContext = 0; + + switch( nFamily ) + { + case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID: + pContext = new SdXMLDrawingPageStyleContext(GetSdImport(), nPrefix, rLocalName, xAttrList, *this ); + break; + case XML_STYLE_FAMILY_TABLE_CELL: + case XML_STYLE_FAMILY_TABLE_COLUMN: + case XML_STYLE_FAMILY_TABLE_ROW: + pContext = new XMLShapeStyleContext( GetSdImport(), nPrefix, rLocalName, xAttrList, *this, nFamily ); + break; + } + + // call base class + if(!pContext) + pContext = SvXMLStylesContext::CreateStyleStyleChildContext(nFamily, nPrefix, rLocalName, xAttrList); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// + +SvXMLStyleContext* SdXMLStylesContext::CreateDefaultStyleStyleChildContext( + sal_uInt16 nFamily, + sal_uInt16 nPrefix, + const OUString& rLocalName, + const Reference< XAttributeList > & xAttrList ) +{ + SvXMLStyleContext* pContext = 0; + + switch( nFamily ) + { + case XML_STYLE_FAMILY_SD_GRAPHICS_ID: + pContext = new XMLGraphicsDefaultStyle(GetSdImport(), nPrefix, rLocalName, xAttrList, *this ); + break; + } + + // call base class + if(!pContext) + pContext = SvXMLStylesContext::CreateDefaultStyleStyleChildContext(nFamily, nPrefix, rLocalName, xAttrList); + + return pContext; +} + +////////////////////////////////////////////////////////////////////////////// + +sal_uInt16 SdXMLStylesContext::GetFamily( const OUString& rFamily ) const +{ + // call base class + return SvXMLStylesContext::GetFamily(rFamily); +} + +////////////////////////////////////////////////////////////////////////////// + +UniReference< SvXMLImportPropertyMapper > SdXMLStylesContext::GetImportPropertyMapper( + sal_uInt16 nFamily) const +{ + UniReference < SvXMLImportPropertyMapper > xMapper; + + switch( nFamily ) + { + case XML_STYLE_FAMILY_SD_DRAWINGPAGE_ID: + { + if(!xPresImpPropMapper.is()) + { + UniReference< XMLShapeImportHelper > aImpHelper = ((SvXMLImport&)GetImport()).GetShapeImport(); + ((SdXMLStylesContext*)this)->xPresImpPropMapper = + aImpHelper->GetPresPagePropsMapper(); + } + xMapper = xPresImpPropMapper; + break; + } + + case XML_STYLE_FAMILY_TABLE_COLUMN: + case XML_STYLE_FAMILY_TABLE_ROW: + case XML_STYLE_FAMILY_TABLE_CELL: + { + const rtl::Reference< XMLTableImport >& xTableImport( const_cast< SvXMLImport& >( GetImport() ).GetShapeImport()->GetShapeTableImport() ); + + switch( nFamily ) + { + case XML_STYLE_FAMILY_TABLE_COLUMN: xMapper = xTableImport->GetColumnImportPropertySetMapper().get(); break; + case XML_STYLE_FAMILY_TABLE_ROW: xMapper = xTableImport->GetRowImportPropertySetMapper().get(); break; + case XML_STYLE_FAMILY_TABLE_CELL: xMapper = xTableImport->GetCellImportPropertySetMapper().get(); break; + } + break; + } + } + + // call base class + if( !xMapper.is() ) + xMapper = SvXMLStylesContext::GetImportPropertyMapper(nFamily); + return xMapper; +} + +////////////////////////////////////////////////////////////////////////////// +// Process all style and object info +// +void SdXMLStylesContext::EndElement() +{ + if(mbIsAutoStyle) + { + // AutoStyles for text import + GetImport().GetTextImport()->SetAutoStyles( this ); + + // AutoStyles for chart + GetImport().GetChartImport()->SetAutoStylesContext( this ); + + // AutoStyles for forms + GetImport().GetFormImport()->setAutoStyleContext( this ); + + // associate AutoStyles with styles in preparation to setting Styles on shapes + for(sal_uInt32 a(0L); a < GetStyleCount(); a++) + { + const SvXMLStyleContext* pStyle = GetStyle(a); + if(pStyle && pStyle->ISA(XMLShapeStyleContext)) + { + XMLShapeStyleContext* pDocStyle = (XMLShapeStyleContext*)pStyle; + + SvXMLStylesContext* pStylesContext = GetSdImport().GetShapeImport()->GetStylesContext(); + if( pStylesContext ) + { + pStyle = pStylesContext->FindStyleChildContext(pStyle->GetFamily(), pStyle->GetParentName()); + + if(pStyle && pStyle->ISA(XMLShapeStyleContext)) + { + XMLShapeStyleContext* pParentStyle = (XMLShapeStyleContext*)pStyle; + if(pParentStyle->GetStyle().is()) + { + pDocStyle->SetStyle(pParentStyle->GetStyle()); + } + } + } + } + } + + FinishStyles( false ); + } + else + { + // Process styles list + ImpSetGraphicStyles(); + ImpSetCellStyles(); + GetImport().GetShapeImport()->GetShapeTableImport()->finishStyles(); + + // put style infos in the info set for other components ( content import f.e. ) + uno::Reference< beans::XPropertySet > xInfoSet( GetImport().getImportInfo() ); + if( xInfoSet.is() ) + { + uno::Reference< beans::XPropertySetInfo > xInfoSetInfo( xInfoSet->getPropertySetInfo() ); + + if( xInfoSetInfo->hasPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageLayouts" ) ) ) ) + xInfoSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageLayouts" ) ), uno::makeAny( getPageLayouts() ) ); + } + + } +} + +////////////////////////////////////////////////////////////////////////////// +// set master-page styles (all with family="presentation" and a special +// prefix) on given master-page. +// +void SdXMLStylesContext::SetMasterPageStyles(SdXMLMasterPageContext& rMaster) const +{ + UniString sPrefix(rMaster.GetDisplayName()); + sPrefix += sal_Unicode('-'); + + if(GetSdImport().GetLocalDocStyleFamilies().is() && GetSdImport().GetLocalDocStyleFamilies()->hasByName(rMaster.GetDisplayName())) try + { + uno::Reference< container::XNameAccess > xMasterPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(rMaster.GetDisplayName()), UNO_QUERY_THROW ); + ImpSetGraphicStyles(xMasterPageStyles, XML_STYLE_FAMILY_SD_PRESENTATION_ID, sPrefix); + } + catch( uno::Exception& ) + { + OSL_FAIL( "xmloff::SdXMLStylesContext::SetMasterPageStyles(), exception caught!" ); + } +} + +////////////////////////////////////////////////////////////////////////////// +// Process styles list: +// set graphic styles (all with family="graphics"). Remember xStyle at list element. +// +void SdXMLStylesContext::ImpSetGraphicStyles() const +{ + if(GetSdImport().GetLocalDocStyleFamilies().is()) try + { + const OUString sGraphicStyleName(OUString(RTL_CONSTASCII_USTRINGPARAM("graphics"))); + uno::Reference< container::XNameAccess > xGraphicPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(sGraphicStyleName), uno::UNO_QUERY_THROW ); + + UniString aPrefix; + ImpSetGraphicStyles(xGraphicPageStyles, XML_STYLE_FAMILY_SD_GRAPHICS_ID, aPrefix); + } + catch( uno::Exception& ) + { + OSL_FAIL( "xmloff::SdXMLStylesContext::ImpSetGraphicStyles(), exception caught!" ); + } +} + +void SdXMLStylesContext::ImpSetCellStyles() const +{ + if(GetSdImport().GetLocalDocStyleFamilies().is()) try + { + const OUString sCellStyleName(OUString(RTL_CONSTASCII_USTRINGPARAM("cell"))); + uno::Reference< container::XNameAccess > xGraphicPageStyles( GetSdImport().GetLocalDocStyleFamilies()->getByName(sCellStyleName), uno::UNO_QUERY_THROW ); + + UniString aPrefix; + ImpSetGraphicStyles(xGraphicPageStyles, XML_STYLE_FAMILY_TABLE_CELL, aPrefix); + } + catch( uno::Exception& ) + { + OSL_FAIL( "xmloff::SdXMLStylesContext::ImpSetCellStyles(), exception caught!" ); + } +} + +////////////////////////////////////////////////////////////////////////////// +// help function used by ImpSetGraphicStyles() and ImpSetMasterPageStyles() +// +void SdXMLStylesContext::ImpSetGraphicStyles( uno::Reference< container::XNameAccess >& xPageStyles, sal_uInt16 nFamily, const UniString& rPrefix) const +{ + xub_StrLen nPrefLen(rPrefix.Len()); + + sal_uInt32 a; + + // set defaults + for( a = 0; a < GetStyleCount(); a++) + { + const SvXMLStyleContext* pStyle = GetStyle(a); + + if(nFamily == pStyle->GetFamily() && pStyle->IsDefaultStyle()) + { + ((SvXMLStyleContext*)pStyle)->SetDefaults(); + } + } + + // create all styles and set properties + for( a = 0; a < GetStyleCount(); a++) + { + try + { + const SvXMLStyleContext* pStyle = GetStyle(a); + if(nFamily == pStyle->GetFamily() && !pStyle->IsDefaultStyle()) + { + OUString aStyleName(pStyle->GetDisplayName()); + if( nPrefLen ) + { + sal_Int32 nStylePrefLen = aStyleName.lastIndexOf( sal_Unicode('-') ) + 1; + if( (nPrefLen != nStylePrefLen) || (aStyleName.compareTo( rPrefix, nPrefLen ) != 0) ) + continue; + + aStyleName = aStyleName.copy( nPrefLen ); + } + + uno::Reference< style::XStyle > xStyle; + if(xPageStyles->hasByName(aStyleName)) + { + xPageStyles->getByName(aStyleName) >>= xStyle; + + // set properties of existing styles to default + uno::Reference< beans::XPropertySet > xPropSet( xStyle, uno::UNO_QUERY ); + uno::Reference< beans::XPropertySetInfo > xPropSetInfo; + if( xPropSet.is() ) + xPropSetInfo = xPropSet->getPropertySetInfo(); + + uno::Reference< beans::XPropertyState > xPropState( xStyle, uno::UNO_QUERY ); + + if( xPropState.is() ) + { + UniReference < XMLPropertySetMapper > xPrMap; + UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetImportPropertyMapper( nFamily ); + DBG_ASSERT( xImpPrMap.is(), "There is the import prop mapper" ); + if( xImpPrMap.is() ) + xPrMap = xImpPrMap->getPropertySetMapper(); + if( xPrMap.is() ) + { + const sal_Int32 nCount = xPrMap->GetEntryCount(); + for( sal_Int32 i = 0; i < nCount; i++ ) + { + const OUString& rName = xPrMap->GetEntryAPIName( i ); + if( xPropSetInfo->hasPropertyByName( rName ) && beans::PropertyState_DIRECT_VALUE == xPropState->getPropertyState( rName ) ) + { + xPropState->setPropertyToDefault( rName ); + } + } + } + } + } + else + { + // graphics style does not exist, create and add it + uno::Reference< lang::XSingleServiceFactory > xServiceFact(xPageStyles, uno::UNO_QUERY); + if(xServiceFact.is()) + { + uno::Reference< style::XStyle > xNewStyle( xServiceFact->createInstance(), uno::UNO_QUERY); + + if(xNewStyle.is()) + { + // remember style + xStyle = xNewStyle; + + // add new style to graphics style pool + uno::Reference< container::XNameContainer > xInsertContainer(xPageStyles, uno::UNO_QUERY); + if(xInsertContainer.is()) + xInsertContainer->insertByName(aStyleName, uno::Any( xStyle ) ); + } + } + } + + if(xStyle.is()) + { + // set properties at style + XMLPropStyleContext* pPropStyle = dynamic_cast< XMLPropStyleContext* >( const_cast< SvXMLStyleContext* >( pStyle ) ); + uno::Reference< beans::XPropertySet > xPropSet(xStyle, uno::UNO_QUERY); + + if(xPropSet.is() && pPropStyle) + { + pPropStyle->FillPropertySet(xPropSet); + pPropStyle->SetStyle(xStyle); + } + } + } + } + catch( Exception& e) + { + uno::Sequence<OUString> aSeq(0); + const_cast<SdXMLImport*>(&GetSdImport())->SetError( XMLERROR_FLAG_WARNING | XMLERROR_API, aSeq, e.Message, NULL ); + } + } + + // now set parents for all styles (when necessary) + for(a = 0L; a < GetStyleCount(); a++) + { + const SvXMLStyleContext* pStyle = GetStyle(a); + + if(pStyle && pStyle->GetName().getLength() && (nFamily == pStyle->GetFamily())) try + { + OUString aStyleName(pStyle->GetDisplayName()); + if( nPrefLen ) + { + sal_Int32 nStylePrefLen = aStyleName.lastIndexOf( sal_Unicode('-') ) + 1; + if( (nPrefLen != nStylePrefLen) || (aStyleName.compareTo( rPrefix, nPrefLen ) != 0) ) + continue; + + aStyleName = aStyleName.copy( nPrefLen ); + } + + uno::Reference< style::XStyle > xStyle( xPageStyles->getByName(aStyleName), UNO_QUERY ); + if(xStyle.is()) + { + // set parent style name + ::rtl::OUString sParentStyleDisplayName( const_cast< SvXMLImport& >( GetImport() ).GetStyleDisplayName( pStyle->GetFamily(), pStyle->GetParentName() ) ); + if( nPrefLen ) + { + sal_Int32 nStylePrefLen = sParentStyleDisplayName.lastIndexOf( sal_Unicode('-') ) + 1; + if( (nPrefLen != nStylePrefLen) || (sParentStyleDisplayName.compareTo( rPrefix, nPrefLen ) != 0) ) + continue; + + sParentStyleDisplayName = sParentStyleDisplayName.copy( nPrefLen ); + } + xStyle->setParentStyle( sParentStyleDisplayName ); + } + } + catch( Exception& e ) + { + uno::Sequence<OUString> aSeq(0); + const_cast<SdXMLImport*>(&GetSdImport())->SetError( XMLERROR_FLAG_WARNING | XMLERROR_API, aSeq, e.Message, NULL ); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// helper function to create the uno component that hold the mappings from +// xml auto layout name to internal autolayout id + +uno::Reference< container::XNameAccess > SdXMLStylesContext::getPageLayouts() const +{ + uno::Reference< container::XNameContainer > xLayouts( comphelper::NameContainer_createInstance( ::getCppuType((const sal_Int32*)0)) ); + + for(sal_uInt32 a(0L); a < GetStyleCount(); a++) + { + const SvXMLStyleContext* pStyle = GetStyle(a); + if(pStyle && pStyle->ISA(SdXMLPresentationPageLayoutContext)) + { + xLayouts->insertByName( pStyle->GetName(), uno::makeAny( + (sal_Int32)((SdXMLPresentationPageLayoutContext*)pStyle)->GetTypeId() ) ); + } + } + + return uno::Reference< container::XNameAccess >::query( xLayouts ); +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// +TYPEINIT1( SdXMLMasterStylesContext, SvXMLImportContext ); + +SdXMLMasterStylesContext::SdXMLMasterStylesContext( + SdXMLImport& rImport, + sal_uInt16 nPrfx, + const rtl::OUString& rLName) +: SvXMLImportContext( rImport, nPrfx, rLName) +{ +} + +SdXMLMasterStylesContext::~SdXMLMasterStylesContext() +{ + for ( size_t i = maMasterPageList.size(); i > 0; ) + maMasterPageList[ --i ]->ReleaseRef(); + maMasterPageList.clear(); +} + +SvXMLImportContext* SdXMLMasterStylesContext::CreateChildContext( + sal_uInt16 nPrefix, + const rtl::OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList >& xAttrList) +{ + SvXMLImportContext* pContext = 0; + + if(nPrefix == XML_NAMESPACE_STYLE + && IsXMLToken( rLocalName, XML_MASTER_PAGE ) ) + { + // style:masterpage inside office:styles context + uno::Reference< drawing::XDrawPage > xNewMasterPage; + uno::Reference< drawing::XDrawPages > xMasterPages(GetSdImport().GetLocalMasterPages(), uno::UNO_QUERY); + + if( xMasterPages.is() ) + { + if(GetSdImport().GetNewMasterPageCount() + 1 > xMasterPages->getCount()) + { + // new page, create and insert + xNewMasterPage = xMasterPages->insertNewByIndex(xMasterPages->getCount()); + } + else + { + // existing page, use it + xMasterPages->getByIndex(GetSdImport().GetNewMasterPageCount()) >>= xNewMasterPage; + } + + // increment global import page counter + GetSdImport().IncrementNewMasterPageCount(); + + if(xNewMasterPage.is()) + { + uno::Reference< drawing::XShapes > xNewShapes(xNewMasterPage, uno::UNO_QUERY); + if(xNewShapes.is() && GetSdImport().GetShapeImport()->GetStylesContext()) + { + pContext = new SdXMLMasterPageContext(GetSdImport(), + nPrefix, rLocalName, xAttrList, xNewShapes); + + if(pContext) + { + pContext->AddRef(); + maMasterPageList.push_back( (SdXMLMasterPageContext*)pContext ); + } + } + } + } + } + else if(nPrefix == XML_NAMESPACE_STYLE + && IsXMLToken( rLocalName, XML_HANDOUT_MASTER ) ) + { + uno::Reference< presentation::XHandoutMasterSupplier > xHandoutSupp( GetSdImport().GetModel(), uno::UNO_QUERY ); + if( xHandoutSupp.is() ) + { + uno::Reference< drawing::XShapes > xHandoutPage( xHandoutSupp->getHandoutMasterPage(), uno::UNO_QUERY ); + if(xHandoutPage.is() && GetSdImport().GetShapeImport()->GetStylesContext()) + { + pContext = new SdXMLMasterPageContext(GetSdImport(), + nPrefix, rLocalName, xAttrList, xHandoutPage); + } + } + } + else if( (nPrefix == XML_NAMESPACE_DRAW )&& IsXMLToken( rLocalName, XML_LAYER_SET ) ) + { + pContext = new SdXMLLayerSetContext( GetImport(), nPrefix, rLocalName, xAttrList ); + } + + // call base class + if(!pContext) + pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName, xAttrList); + + return pContext; +} + +/////////////////////////////////////////////////////////////////////// + +SdXMLHeaderFooterDeclContext::SdXMLHeaderFooterDeclContext( SvXMLImport& rImport, sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) +: SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList ) +{ + const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for(sal_Int16 i=0; i < nAttrCount; i++) + { + OUString aLocalName; + const OUString aValue( xAttrList->getValueByIndex(i) ); + sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(xAttrList->getNameByIndex(i), &aLocalName); + + if( nPrefix == XML_NAMESPACE_PRESENTATION ) + { + if( IsXMLToken( aLocalName, XML_NAME ) ) + { + maStrName = aValue; + } + else if( IsXMLToken( aLocalName, XML_SOURCE ) ) + { + mbFixed = IsXMLToken( aValue, XML_FIXED ); + } + } + else if( nPrefix == XML_NAMESPACE_STYLE ) + { + if( IsXMLToken( aLocalName, XML_DATA_STYLE_NAME ) ) + { + maStrDateTimeFormat = aValue; + } + } + } +} + +sal_Bool SdXMLHeaderFooterDeclContext::IsTransient() const +{ + return sal_True; +} + +void SdXMLHeaderFooterDeclContext::EndElement() +{ + SdXMLImport& rImport = *dynamic_cast< SdXMLImport* >( &GetImport() ); + if( IsXMLToken( GetLocalName(), XML_HEADER_DECL ) ) + { + rImport.AddHeaderDecl( maStrName, maStrText ); + } + else if( IsXMLToken( GetLocalName(), XML_FOOTER_DECL ) ) + { + rImport.AddFooterDecl( maStrName, maStrText ); + } + else if( IsXMLToken( GetLocalName(), XML_DATE_TIME_DECL ) ) + { + rImport.AddDateTimeDecl( maStrName, maStrText, mbFixed, maStrDateTimeFormat ); + } +} + +void SdXMLHeaderFooterDeclContext::Characters( const ::rtl::OUString& rChars ) +{ + maStrText += rChars; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |