/************************************************************** * * 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 #ifndef __SGI_STL_SET #include #endif #include "xmloff/xmlnmspe.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include "xmloff/xmlerror.hxx" //UUUU #include 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::container; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::lang; using namespace ::xmloff::token; //UUUU using namespace com::sun::star::drawing; void XMLPropStyleContext::SetAttribute( sal_uInt16 nPrefixKey, const OUString& rLocalName, const OUString& rValue ) { if( XML_NAMESPACE_STYLE == nPrefixKey && IsXMLToken( rLocalName, XML_FAMILY ) ) { DBG_ASSERT( GetFamily() == ((SvXMLStylesContext *)&mxStyles)->GetFamily( rValue ), "unexpected style family" ); } else { SvXMLStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue ); } } TYPEINIT1( XMLPropStyleContext, SvXMLStyleContext ); //UUUU OldFillStyleDefinitionSet XMLPropStyleContext::maStandardSet; OldFillStyleDefinitionSet XMLPropStyleContext::maHeaderSet; OldFillStyleDefinitionSet XMLPropStyleContext::maFooterSet; OldFillStyleDefinitionSet XMLPropStyleContext::maParaSet; XMLPropStyleContext::XMLPropStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< XAttributeList > & xAttrList, SvXMLStylesContext& rStyles, sal_uInt16 nFamily, sal_Bool bDefault) : SvXMLStyleContext(rImport, nPrfx, rLName, xAttrList, nFamily, bDefault), msIsPhysical(RTL_CONSTASCII_USTRINGPARAM("IsPhysical")), msFollowStyle(RTL_CONSTASCII_USTRINGPARAM("FollowStyle")), mxStyles(&rStyles) { } XMLPropStyleContext::~XMLPropStyleContext() { } const OldFillStyleDefinitionSet& XMLPropStyleContext::getStandardSet() { if(maStandardSet.empty()) { maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackColorRGB"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackTransparent"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackColorTransparency"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackGraphicURL"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackGraphicFilter"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackGraphicLocation"))); maStandardSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BackGraphicTransparency"))); } return maStandardSet; } const OldFillStyleDefinitionSet& XMLPropStyleContext::getHeaderSet() { if(maHeaderSet.empty()) { maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackColorRGB"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackTransparent"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackColorTransparency"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackGraphicURL"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackGraphicFilter"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackGraphicLocation"))); maHeaderSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeaderBackGraphicTransparency"))); } return maHeaderSet; } const OldFillStyleDefinitionSet& XMLPropStyleContext::getFooterSet() { if(maFooterSet.empty()) { maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackColorRGB"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackTransparent"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackColorTransparency"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackGraphicURL"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackGraphicFilter"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackGraphicLocation"))); maFooterSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FooterBackGraphicTransparency"))); } return maFooterSet; } const OldFillStyleDefinitionSet& XMLPropStyleContext::getParaSet() { if(maParaSet.empty()) { // Caution: here it is *not* 'ParaBackColorRGB' as it should be, but indeed // 'ParaBackColor' is used, see aXMLParaPropMap definition (line 313) maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackColor"))); maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackTransparent"))); maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackGraphicLocation"))); maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackGraphicFilter"))); maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackGraphicURL"))); // These are not used in aXMLParaPropMap definition, thus not needed here // maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackColorTransparency"))); // maParaSet.insert(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaBackGraphicTransparency"))); } return maParaSet; } SvXMLImportContext *XMLPropStyleContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList > & xAttrList ) { SvXMLImportContext *pContext = 0; sal_uInt32 nFamily = 0; if( XML_NAMESPACE_STYLE == nPrefix ) { if( IsXMLToken( rLocalName, XML_GRAPHIC_PROPERTIES ) ) nFamily = XML_TYPE_PROP_GRAPHIC; else if( IsXMLToken( rLocalName, XML_DRAWING_PAGE_PROPERTIES ) ) nFamily = XML_TYPE_PROP_DRAWING_PAGE; else if( IsXMLToken( rLocalName, XML_TEXT_PROPERTIES ) ) nFamily = XML_TYPE_PROP_TEXT; else if( IsXMLToken( rLocalName, XML_PARAGRAPH_PROPERTIES ) ) nFamily = XML_TYPE_PROP_PARAGRAPH; else if( IsXMLToken( rLocalName, XML_RUBY_PROPERTIES ) ) nFamily = XML_TYPE_PROP_RUBY; else if( IsXMLToken( rLocalName, XML_SECTION_PROPERTIES ) ) nFamily = XML_TYPE_PROP_SECTION; else if( IsXMLToken( rLocalName, XML_TABLE_PROPERTIES ) ) nFamily = XML_TYPE_PROP_TABLE; else if( IsXMLToken( rLocalName, XML_TABLE_COLUMN_PROPERTIES ) ) nFamily = XML_TYPE_PROP_TABLE_COLUMN; else if( IsXMLToken( rLocalName, XML_TABLE_ROW_PROPERTIES ) ) nFamily = XML_TYPE_PROP_TABLE_ROW; else if( IsXMLToken( rLocalName, XML_TABLE_CELL_PROPERTIES ) ) nFamily = XML_TYPE_PROP_TABLE_CELL; else if( IsXMLToken( rLocalName, XML_CHART_PROPERTIES ) ) nFamily = XML_TYPE_PROP_CHART; } if( nFamily ) { UniReference < SvXMLImportPropertyMapper > xImpPrMap = ((SvXMLStylesContext *)&mxStyles)->GetImportPropertyMapper( GetFamily() ); if( xImpPrMap.is() ) pContext = new SvXMLPropertySetContext( GetImport(), nPrefix, rLocalName, xAttrList, nFamily, maProperties, xImpPrMap ); } if( !pContext ) pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName, xAttrList ); return pContext; } void XMLPropStyleContext::FillPropertySet( const Reference< XPropertySet > & rPropSet ) { UniReference < SvXMLImportPropertyMapper > xImpPrMap = ((SvXMLStylesContext *)&mxStyles)->GetImportPropertyMapper( GetFamily() ); DBG_ASSERT( xImpPrMap.is(), "There is the import prop mapper" ); if( xImpPrMap.is() ) xImpPrMap->FillPropertySet( maProperties, rPropSet ); } void XMLPropStyleContext::SetDefaults() { } Reference < XStyle > XMLPropStyleContext::Create() { Reference < XStyle > xNewStyle; OUString sServiceName( ((SvXMLStylesContext *)&mxStyles)->GetServiceName( GetFamily() ) ); if( sServiceName.getLength() ) { Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(), UNO_QUERY ); if( xFactory.is() ) { Reference < XInterface > xIfc = xFactory->createInstance( sServiceName ); if( xIfc.is() ) xNewStyle = Reference < XStyle >( xIfc, UNO_QUERY ); } } return xNewStyle; } typedef ::std::set < OUString, ::comphelper::UStringLess > PropertyNameSet; void XMLPropStyleContext::CreateAndInsert( sal_Bool bOverwrite ) { SvXMLStylesContext* pSvXMLStylesContext = static_cast< SvXMLStylesContext* >(&mxStyles); UniReference < SvXMLImportPropertyMapper > xImpPrMap = pSvXMLStylesContext->GetImportPropertyMapper(GetFamily()); OSL_ENSURE(xImpPrMap.is(), "There is no import prop mapper"); //UUUU need to filter out old fill definitions when the new ones are used. The new // ones are used when a FillStyle is defined const bool bTakeCareOfDrawingLayerFillStyle(xImpPrMap.is() && GetFamily() == XML_STYLE_FAMILY_TEXT_PARAGRAPH); bool bDrawingLayerFillStylesUsed(false); if(bTakeCareOfDrawingLayerFillStyle) { // check if new FillStyles are used and if so mark old ones with -1 static ::rtl::OUString s_FillStyle(RTL_CONSTASCII_USTRINGPARAM("FillStyle")); if(doNewDrawingLayerFillStyleDefinitionsExist(s_FillStyle)) { deactivateOldFillStyleDefinitions(getParaSet()); bDrawingLayerFillStylesUsed = true; } } if( pSvXMLStylesContext->IsAutomaticStyle() && ( GetFamily() == XML_STYLE_FAMILY_TEXT_TEXT || GetFamily() == XML_STYLE_FAMILY_TEXT_PARAGRAPH ) ) { //UUUU Need to translate StyleName from temp MapNames to names // used in already imported items (already exist in the pool). This // is required for AutomaticStyles since these do *not* use FillPropertySet // and thus just trigger CheckSpecialContext in XMLTextStyleContext::FillPropertySet // (which may be double action anyways). The mechanism there to use _ContextID_Index_Pair // is not working for AutomaticStyles and is already too late, too (this // method is already called before XMLTextStyleContext::FillPropertySet gets called) if(bDrawingLayerFillStylesUsed) { translateNameBasedDrawingLayerFillStyleDefinitionsToStyleDisplayNames(); } Reference < XAutoStyleFamily > xAutoFamily = pSvXMLStylesContext->GetAutoStyles( GetFamily() ); if( !xAutoFamily.is() ) return; if( xImpPrMap.is() ) { Sequence< PropertyValue > aValues; xImpPrMap->FillPropertySequence( maProperties, aValues ); sal_Int32 nLen = aValues.getLength(); if( nLen ) { if( GetFamily() == XML_STYLE_FAMILY_TEXT_PARAGRAPH ) { aValues.realloc( nLen + 2 ); PropertyValue *pProps = aValues.getArray() + nLen; pProps->Name = rtl::OUString::createFromAscii("ParaStyleName"); OUString sParent( GetParentName() ); if( sParent.getLength() ) sParent = GetImport().GetStyleDisplayName( GetFamily(), sParent ); else sParent = rtl::OUString::createFromAscii("Standard"); pProps->Value <<= sParent; ++pProps; pProps->Name = rtl::OUString::createFromAscii("ParaConditionalStyleName"); pProps->Value <<= sParent; } Reference < XAutoStyle > xAutoStyle = xAutoFamily->insertStyle( aValues ); if( xAutoStyle.is() ) { Sequence< OUString > aPropNames(1); aPropNames[0] = GetFamily() == XML_STYLE_FAMILY_TEXT_PARAGRAPH ? rtl::OUString::createFromAscii("ParaAutoStyleName") : rtl::OUString::createFromAscii("CharAutoStyleName"); Sequence< Any > aAny = xAutoStyle->getPropertyValues( aPropNames ); if( aAny.hasElements() ) { OUString aName; aAny[0] >>= aName; SetAutoName( aName ); } } } } } else { const OUString& rName = GetDisplayName(); if( 0 == rName.getLength() || IsDefaultStyle() ) return; Reference < XNameContainer > xFamilies = pSvXMLStylesContext->GetStylesContainer( GetFamily() ); if( !xFamilies.is() ) return; sal_Bool bNew = sal_False; if( xFamilies->hasByName( rName ) ) { Any aAny = xFamilies->getByName( rName ); aAny >>= mxStyle; } else { mxStyle = Create(); if( !mxStyle.is() ) return; Any aAny; aAny <<= mxStyle; xFamilies->insertByName( rName, aAny ); bNew = sal_True; } Reference < XPropertySet > xPropSet( mxStyle, UNO_QUERY ); Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); if( !bNew && xPropSetInfo->hasPropertyByName( msIsPhysical ) ) { Any aAny = xPropSet->getPropertyValue( msIsPhysical ); bNew = !*(sal_Bool *)aAny.getValue(); } SetNew( bNew ); if( rName != GetName() ) GetImport().AddStyleDisplayName( GetFamily(), GetName(), rName ); if( bOverwrite || bNew ) { Reference< XPropertyState > xPropState( xPropSet, uno::UNO_QUERY ); UniReference < XMLPropertySetMapper > xPrMap; if( xImpPrMap.is() ) xPrMap = xImpPrMap->getPropertySetMapper(); if( xPrMap.is() ) { Reference < XMultiPropertyStates > xMultiStates( xPropSet, UNO_QUERY ); if( xMultiStates.is() ) { xMultiStates->setAllPropertiesToDefault(); } else { PropertyNameSet aNameSet; sal_Int32 nCount = xPrMap->GetEntryCount(); sal_Int32 i; for( i = 0; i < nCount; i++ ) { const OUString& rPrName = xPrMap->GetEntryAPIName( i ); if( xPropSetInfo->hasPropertyByName( rPrName ) ) aNameSet.insert( rPrName ); } nCount = aNameSet.size(); Sequence < OUString > aNames( nCount ); OUString *pNames = aNames.getArray(); PropertyNameSet::iterator aIter = aNameSet.begin(); while( aIter != aNameSet.end() ) *pNames++ = *aIter++; Sequence < PropertyState > aStates( xPropState->getPropertyStates( aNames ) ); const PropertyState *pStates = aStates.getConstArray(); pNames = aNames.getArray(); for( i = 0; i < nCount; i++ ) { if( PropertyState_DIRECT_VALUE == *pStates++ ) xPropState->setPropertyToDefault( pNames[i] ); } } } if (mxStyle.is()) mxStyle->setParentStyle(OUString()); FillPropertySet( xPropSet ); } else { SetValid( sal_False ); } } } void XMLPropStyleContext::Finish( sal_Bool bOverwrite ) { if( mxStyle.is() && (IsNew() || bOverwrite) ) { // The families cintaner must exist Reference < XNameContainer > xFamilies = ((SvXMLStylesContext *)&mxStyles)->GetStylesContainer( GetFamily() ); DBG_ASSERT( xFamilies.is(), "Families lost" ); if( !xFamilies.is() ) return; // connect parent OUString sParent( GetParentName() ); if( sParent.getLength() ) sParent = GetImport().GetStyleDisplayName( GetFamily(), sParent ); if( sParent.getLength() && !xFamilies->hasByName( sParent ) ) sParent = OUString(); if( sParent != mxStyle->getParentStyle() ) { // this may except if setting the parent style forms a // circle in the style depencies; especially if the parent // style is the same as the current style try { mxStyle->setParentStyle( sParent ); } catch( uno::Exception e ) { // according to the API definition, I would expect a // container::NoSuchElementException. But it throws an // uno::RuntimeException instead. I catch // uno::Exception in order to process both of them. // We can't set the parent style. For a proper // Error-Message, we should pass in the name of the // style, as well as the desired parent style. Sequence aSequence(2); // getName() throws no non-Runtime exception: aSequence[0] = mxStyle->getName(); aSequence[1] = sParent; GetImport().SetError( XMLERROR_FLAG_ERROR | XMLERROR_PARENT_STYLE_NOT_ALLOWED, aSequence, e.Message, NULL ); } } // connect follow OUString sFollow( GetFollow() ); if( sFollow.getLength() ) sFollow = GetImport().GetStyleDisplayName( GetFamily(), sFollow ); if( !sFollow.getLength() || !xFamilies->hasByName( sFollow ) ) sFollow = mxStyle->getName(); Reference < XPropertySet > xPropSet( mxStyle, UNO_QUERY ); Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); if( xPropSetInfo->hasPropertyByName( msFollowStyle ) ) { Any aAny = xPropSet->getPropertyValue( msFollowStyle ); OUString sCurrFollow; aAny >>= sCurrFollow; if( sCurrFollow != sFollow ) { aAny <<= sFollow; xPropSet->setPropertyValue( msFollowStyle, aAny ); } } } } //UUUU bool XMLPropStyleContext::doNewDrawingLayerFillStyleDefinitionsExist( const OUString& rFillStyleTag) const { if(maProperties.size() && rFillStyleTag.getLength()) { const UniReference< XMLPropertySetMapper >& rMapper = GetStyles()->GetImportPropertyMapper(GetFamily())->getPropertySetMapper(); if(rMapper.is()) { for(::std::vector< XMLPropertyState >::const_iterator a = maProperties.begin(); a != maProperties.end(); a++) { if(a->mnIndex != -1) { const OUString& rPropName = rMapper->GetEntryAPIName(a->mnIndex); if(rPropName == rFillStyleTag) { FillStyle eFillStyle(FillStyle_NONE); if(a->maValue >>= eFillStyle) { // okay, type was good, FillStyle is set } else { // also try an int (see XFillStyleItem::PutValue) sal_Int32 nFillStyle(0); if(a->maValue >>= nFillStyle) { eFillStyle = static_cast< FillStyle >(nFillStyle); } } // we found the entry, check it return FillStyle_NONE != eFillStyle; } } } } } return false; } //UUUU bool XMLPropStyleContext::deactivateOldFillStyleDefinitions( const OldFillStyleDefinitionSet& rHashSetOfTags) { bool bRetval(false); if(!rHashSetOfTags.empty() && maProperties.size()) { const UniReference< XMLPropertySetMapper >& rMapper = GetStyles()->GetImportPropertyMapper(GetFamily())->getPropertySetMapper(); if(rMapper.is()) { for(::std::vector< XMLPropertyState >::iterator a = maProperties.begin(); a != maProperties.end(); a++) { if(a->mnIndex != -1) { const OUString& rPropName = rMapper->GetEntryAPIName(a->mnIndex); if(rHashSetOfTags.find(rPropName) != rHashSetOfTags.end()) { // mark entry as inactive a->mnIndex = -1; bRetval = true; } } } } } return bRetval; } //UUUU bool XMLPropStyleContext::translateNameBasedDrawingLayerFillStyleDefinitionsToStyleDisplayNames() { bool bRetval(false); if(maProperties.size()) { const UniReference< XMLPropertySetMapper >& rMapper = GetStyles()->GetImportPropertyMapper(GetFamily())->getPropertySetMapper(); if(rMapper.is()) { static OUString s_FillGradientName(RTL_CONSTASCII_USTRINGPARAM("FillGradientName")); static OUString s_FillHatchName(RTL_CONSTASCII_USTRINGPARAM("FillHatchName")); static OUString s_FillBitmapName(RTL_CONSTASCII_USTRINGPARAM("FillBitmapName")); static OUString s_FillTransparenceGradientName(RTL_CONSTASCII_USTRINGPARAM("FillTransparenceGradientName")); for(::std::vector< XMLPropertyState >::iterator a = maProperties.begin(); a != maProperties.end(); a++) { if(a->mnIndex != -1) { const OUString& rPropName = rMapper->GetEntryAPIName(a->mnIndex); sal_uInt16 aStyleFamily(0); if(rPropName == s_FillGradientName || rPropName == s_FillTransparenceGradientName) { aStyleFamily = XML_STYLE_FAMILY_SD_GRADIENT_ID; } else if(rPropName == s_FillHatchName) { aStyleFamily = XML_STYLE_FAMILY_SD_HATCH_ID; } else if(rPropName == s_FillBitmapName) { aStyleFamily = XML_STYLE_FAMILY_SD_FILL_IMAGE_ID; } if(aStyleFamily) { OUString sStyleName; a->maValue >>= sStyleName; sStyleName = GetImport().GetStyleDisplayName( aStyleFamily, sStyleName ); a->maValue <<= sStyleName; bRetval = true; } } } } } return bRetval; } //eof