| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_xmloff.hxx" |
| #include <com/sun/star/style/XStyle.hpp> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/style/PageStyleLayout.hpp> |
| #include <com/sun/star/beans/XMultiPropertyStates.hpp> |
| #include <xmloff/nmspmap.hxx> |
| #include "xmloff/xmlnmspe.hxx" |
| #include <xmloff/xmltoken.hxx> |
| #include <xmloff/XMLTextMasterPageContext.hxx> |
| #include "XMLTextHeaderFooterContext.hxx" |
| #include <xmloff/xmlimp.hxx> |
| #include "PageMasterImportContext.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 ::com::sun::star::style; |
| using namespace ::com::sun::star::text; |
| using namespace ::com::sun::star::beans; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::lang; |
| //using namespace ::com::sun::star::text; |
| using namespace ::xmloff::token; |
| |
| Reference < XStyle > XMLTextMasterPageContext::Create() |
| { |
| Reference < XStyle > xNewStyle; |
| |
| Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(), |
| UNO_QUERY ); |
| if( xFactory.is() ) |
| { |
| Reference < XInterface > xIfc = |
| xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "com.sun.star.style.PageStyle")) ); |
| if( xIfc.is() ) |
| xNewStyle = Reference < XStyle >( xIfc, UNO_QUERY ); |
| } |
| |
| return xNewStyle; |
| } |
| TYPEINIT1( XMLTextMasterPageContext, SvXMLStyleContext ); |
| |
| XMLTextMasterPageContext::XMLTextMasterPageContext( SvXMLImport& rImport, |
| sal_uInt16 nPrfx, const OUString& rLName, |
| const Reference< XAttributeList > & xAttrList, |
| sal_Bool bOverwrite ) |
| : SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_MASTER_PAGE ) |
| , sIsPhysical( RTL_CONSTASCII_USTRINGPARAM( "IsPhysical" ) ) |
| , sPageStyleLayout( RTL_CONSTASCII_USTRINGPARAM( "PageStyleLayout" ) ) |
| , sFollowStyle( RTL_CONSTASCII_USTRINGPARAM( "FollowStyle" ) ) |
| , bInsertHeader( sal_False ) |
| , bInsertFooter( sal_False ) |
| , bInsertHeaderLeft( sal_False ) |
| , bInsertFooterLeft( sal_False ) |
| , bHeaderInserted( sal_False ) |
| , bFooterInserted( sal_False ) |
| , bHeaderLeftInserted( sal_False ) |
| , bFooterLeftInserted( sal_False ) |
| { |
| OUString sName, sDisplayName; |
| 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( XML_NAMESPACE_STYLE == nPrefix ) |
| { |
| if( IsXMLToken( aLocalName, XML_NAME ) ) |
| { |
| sName = xAttrList->getValueByIndex( i ); |
| } |
| else if( IsXMLToken( aLocalName, XML_DISPLAY_NAME ) ) |
| { |
| sDisplayName = xAttrList->getValueByIndex( i ); |
| } |
| else if( IsXMLToken( aLocalName, XML_NEXT_STYLE_NAME ) ) |
| { |
| sFollow = xAttrList->getValueByIndex( i ); |
| } |
| else if( IsXMLToken( aLocalName, XML_PAGE_LAYOUT_NAME ) ) |
| { |
| sPageMasterName = xAttrList->getValueByIndex( i ); |
| } |
| } |
| } |
| |
| if( sDisplayName.getLength() ) |
| { |
| rImport.AddStyleDisplayName( XML_STYLE_FAMILY_MASTER_PAGE, sName, |
| sDisplayName ); |
| } |
| else |
| { |
| sDisplayName = sName; |
| } |
| |
| if( 0 == sDisplayName.getLength() ) |
| return; |
| |
| Reference < XNameContainer > xPageStyles = |
| GetImport().GetTextImport()->GetPageStyles(); |
| if( !xPageStyles.is() ) |
| return; |
| |
| Any aAny; |
| sal_Bool bNew = sal_False; |
| if( xPageStyles->hasByName( sDisplayName ) ) |
| { |
| aAny = xPageStyles->getByName( sDisplayName ); |
| aAny >>= xStyle; |
| } |
| else |
| { |
| xStyle = Create(); |
| if( !xStyle.is() ) |
| return; |
| |
| aAny <<= xStyle; |
| xPageStyles->insertByName( sDisplayName, aAny ); |
| bNew = sal_True; |
| } |
| |
| Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); |
| Reference< XPropertySetInfo > xPropSetInfo = |
| xPropSet->getPropertySetInfo(); |
| if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) ) |
| { |
| aAny = xPropSet->getPropertyValue( sIsPhysical ); |
| bNew = !*(sal_Bool *)aAny.getValue(); |
| } |
| SetNew( bNew ); |
| |
| if( bOverwrite || bNew ) |
| { |
| Reference < XMultiPropertyStates > xMultiStates( xPropSet, |
| UNO_QUERY ); |
| OSL_ENSURE( xMultiStates.is(), |
| "text page style does not support multi property set" ); |
| if( xMultiStates.is() ) |
| xMultiStates->setAllPropertiesToDefault(); |
| |
| bInsertHeader = bInsertFooter = sal_True; |
| bInsertHeaderLeft = bInsertFooterLeft = sal_True; |
| } |
| } |
| |
| XMLTextMasterPageContext::~XMLTextMasterPageContext() |
| { |
| } |
| |
| SvXMLImportContext *XMLTextMasterPageContext::CreateChildContext( |
| sal_uInt16 nPrefix, |
| const OUString& rLocalName, |
| const Reference< XAttributeList > & xAttrList ) |
| { |
| SvXMLImportContext *pContext = 0; |
| |
| const SvXMLTokenMap& rTokenMap = |
| GetImport().GetTextImport()->GetTextMasterPageElemTokenMap(); |
| |
| sal_Bool bInsert = sal_False, bFooter = sal_False, bLeft = sal_False; |
| switch( rTokenMap.Get( nPrefix, rLocalName ) ) |
| { |
| case XML_TOK_TEXT_MP_HEADER: |
| if( bInsertHeader && !bHeaderInserted ) |
| { |
| bInsert = sal_True; |
| bHeaderInserted = sal_True; |
| } |
| break; |
| case XML_TOK_TEXT_MP_FOOTER: |
| if( bInsertFooter && !bFooterInserted ) |
| { |
| bInsert = bFooter = sal_True; |
| bFooterInserted = sal_True; |
| } |
| break; |
| case XML_TOK_TEXT_MP_HEADER_LEFT: |
| if( bInsertHeaderLeft && bHeaderInserted && !bHeaderLeftInserted ) |
| bInsert = bLeft = sal_True; |
| break; |
| case XML_TOK_TEXT_MP_FOOTER_LEFT: |
| if( bInsertFooterLeft && bFooterInserted && !bFooterLeftInserted ) |
| bInsert = bFooter = bLeft = sal_True; |
| break; |
| } |
| |
| if( bInsert && xStyle.is() ) |
| { |
| pContext = CreateHeaderFooterContext( nPrefix, rLocalName, |
| xAttrList, |
| bFooter, bLeft ); |
| } |
| else |
| { |
| pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName, |
| xAttrList ); |
| } |
| |
| return pContext; |
| } |
| |
| SvXMLImportContext *XMLTextMasterPageContext::CreateHeaderFooterContext( |
| sal_uInt16 nPrefix, |
| const ::rtl::OUString& rLocalName, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList, |
| const sal_Bool bFooter, |
| const sal_Bool bLeft ) |
| { |
| Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); |
| return new XMLTextHeaderFooterContext( GetImport(), |
| nPrefix, rLocalName, |
| xAttrList, |
| xPropSet, |
| bFooter, bLeft ); |
| } |
| |
| void XMLTextMasterPageContext::Finish( sal_Bool bOverwrite ) |
| { |
| if( xStyle.is() && (IsNew() || bOverwrite) ) |
| { |
| Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY ); |
| if( sPageMasterName.getLength() ) |
| { |
| XMLPropStyleContext* pStyle = |
| GetImport().GetTextImport()->FindPageMaster( sPageMasterName ); |
| if (pStyle) |
| { |
| pStyle->FillPropertySet(xPropSet); |
| } |
| } |
| |
| Reference < XNameContainer > xPageStyles = |
| GetImport().GetTextImport()->GetPageStyles(); |
| if( !xPageStyles.is() ) |
| return; |
| |
| Reference< XPropertySetInfo > xPropSetInfo = |
| xPropSet->getPropertySetInfo(); |
| if( xPropSetInfo->hasPropertyByName( sFollowStyle ) ) |
| { |
| OUString sDisplayFollow( |
| GetImport().GetStyleDisplayName( |
| XML_STYLE_FAMILY_MASTER_PAGE, sFollow ) ); |
| if( !sDisplayFollow.getLength() || |
| !xPageStyles->hasByName( sDisplayFollow ) ) |
| sDisplayFollow = xStyle->getName(); |
| |
| Any aAny = xPropSet->getPropertyValue( sFollowStyle ); |
| OUString sCurrFollow; |
| aAny >>= sCurrFollow; |
| if( sCurrFollow != sDisplayFollow ) |
| { |
| aAny <<= sDisplayFollow; |
| xPropSet->setPropertyValue( sFollowStyle, aAny ); |
| } |
| } |
| } |
| } |