/************************************************************** * * 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 #include #include "XMLShapePropertySetContext.hxx" #include #include #include "com/sun/star/beans/XPropertySetInfo.hpp" #include #include #include #include #include #include "xmloff/xmlerror.hxx" #include #include "sdpropls.hxx" using ::rtl::OUString; using ::rtl::OUStringBuffer; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using ::xmloff::token::IsXMLToken; using ::xmloff::token::XML_TEXT_PROPERTIES; using ::xmloff::token::XML_GRAPHIC_PROPERTIES; using ::xmloff::token::XML_PARAGRAPH_PROPERTIES; ////////////////////////////////////////////////////////////////////////////// XMLShapeStyleContext::XMLShapeStyleContext( 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 ), m_bIsNumRuleAlreadyConverted( sal_False ) { } XMLShapeStyleContext::~XMLShapeStyleContext() { } void XMLShapeStyleContext::SetAttribute( sal_uInt16 nPrefixKey, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) { if ((0 == m_sControlDataStyleName.getLength()) && (::xmloff::token::GetXMLToken(::xmloff::token::XML_DATA_STYLE_NAME) == rLocalName)) { m_sControlDataStyleName = rValue; } else if( (XML_NAMESPACE_STYLE == nPrefixKey) && IsXMLToken( rLocalName, ::xmloff::token::XML_LIST_STYLE_NAME ) ) { m_sListStyleName = rValue; } else { XMLPropStyleContext::SetAttribute( nPrefixKey, rLocalName, rValue ); if( (XML_NAMESPACE_STYLE == nPrefixKey) && ( IsXMLToken( rLocalName, ::xmloff::token::XML_NAME ) || IsXMLToken( rLocalName, ::xmloff::token::XML_DISPLAY_NAME ) ) ) { if( GetName().getLength() && GetDisplayName().getLength() && GetName() != GetDisplayName() ) { const_cast< SvXMLImport&>( GetImport() ). AddStyleDisplayName( GetFamily(), GetName(), GetDisplayName() ); } } } } SvXMLImportContext *XMLShapeStyleContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { SvXMLImportContext *pContext = 0; if( XML_NAMESPACE_STYLE == nPrefix ) { sal_uInt32 nFamily = 0; 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_GRAPHIC_PROPERTIES ) ) nFamily = XML_TYPE_PROP_GRAPHIC; if( nFamily ) { UniReference < SvXMLImportPropertyMapper > xImpPrMap = GetStyles()->GetImportPropertyMapper( GetFamily() ); if( xImpPrMap.is() ) pContext = new XMLShapePropertySetContext( GetImport(), nPrefix, rLocalName, xAttrList, nFamily, GetProperties(), xImpPrMap ); } } if( !pContext ) pContext = XMLPropStyleContext::CreateChildContext( nPrefix, rLocalName, xAttrList ); return pContext; } void XMLShapeStyleContext::FillPropertySet( const Reference< beans::XPropertySet > & rPropSet ) { if( !m_bIsNumRuleAlreadyConverted ) { m_bIsNumRuleAlreadyConverted = sal_True; // for compatibility to beta files, search for CTF_SD_NUMBERINGRULES_NAME to // import numbering rules from the style:properties element const UniReference< XMLPropertySetMapper >&rMapper = GetStyles()->GetImportPropertyMapper( GetFamily() )->getPropertySetMapper(); ::std::vector< XMLPropertyState > &rProperties = GetProperties(); ::std::vector< XMLPropertyState >::iterator end( rProperties.end() ); ::std::vector< XMLPropertyState >::iterator property; // first, look for the old format, where we had a text:list-style-name // attribute in the style:properties element for( property = rProperties.begin(); property != end; property++ ) { // find properties with context if( (property->mnIndex != -1) && (rMapper->GetEntryContextId( property->mnIndex ) == CTF_SD_NUMBERINGRULES_NAME) ) break; } // if we did not find an old list-style-name in the properties, and we need one // because we got a style:list-style attribute in the style-style element // we generate one if( (property == end) && ( 0 != m_sListStyleName.getLength() ) ) { sal_Int32 nIndex = rMapper->FindEntryIndex( CTF_SD_NUMBERINGRULES_NAME ); DBG_ASSERT( -1 != nIndex, "can't find numbering rules property entry, can't set numbering rule!" ); XMLPropertyState aNewState( nIndex ); rProperties.push_back( aNewState ); end = rProperties.end(); property = end - 1; } // so, if we have an old or a new list style name, we set its value to // a numbering rule if( property != end ) { if( 0 == m_sListStyleName.getLength() ) { property->maValue >>= m_sListStyleName; } const SvxXMLListStyleContext *pListStyle = GetImport().GetTextImport()->FindAutoListStyle( m_sListStyleName ); DBG_ASSERT( pListStyle, "list-style not found for shape style" ); if( pListStyle ) { uno::Reference< container::XIndexReplace > xNumRule( pListStyle->CreateNumRule( GetImport().GetModel() ) ); pListStyle->FillUnoNumRule(xNumRule, NULL /* const SvI18NMap * ??? */ ); property->maValue <<= xNumRule; } else { property->mnIndex = -1; } } } struct _ContextID_Index_Pair aContextIDs[] = { { CTF_DASHNAME , -1 }, { CTF_LINESTARTNAME , -1 }, { CTF_LINEENDNAME , -1 }, { CTF_FILLGRADIENTNAME, -1 }, { CTF_FILLTRANSNAME , -1 }, { CTF_FILLHATCHNAME , -1 }, { CTF_FILLBITMAPNAME , -1 }, { CTF_SD_OLE_VIS_AREA_IMPORT_LEFT, -1 }, { CTF_SD_OLE_VIS_AREA_IMPORT_TOP, -1 }, { CTF_SD_OLE_VIS_AREA_IMPORT_WIDTH, -1 }, { CTF_SD_OLE_VIS_AREA_IMPORT_HEIGHT, -1 }, { -1, -1 } }; static sal_uInt16 aFamilies[] = { 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< XPropertySetInfo > xInfo; // get property set mapper UniReference xPropMapper( xImpPrMap->getPropertySetMapper() ); for( sal_uInt16 i=0; aContextIDs[i].nContextID != -1; i++ ) { sal_Int32 nIndex = aContextIDs[i].nIndex; if( nIndex != -1 ) switch( aContextIDs[i].nContextID ) { case CTF_DASHNAME: case CTF_LINESTARTNAME: case CTF_LINEENDNAME: case CTF_FILLGRADIENTNAME: case CTF_FILLTRANSNAME: case CTF_FILLHATCHNAME: case CTF_FILLBITMAPNAME: { struct XMLPropertyState& rState = GetProperties()[nIndex]; OUString sStyleName; rState.maValue >>= sStyleName; sStyleName = GetImport().GetStyleDisplayName( aFamilies[i], sStyleName ); try { // set property const OUString& rPropertyName = xPropMapper->GetEntryAPIName(rState.mnIndex); if( !xInfo.is() ) xInfo = rPropSet->getPropertySetInfo(); if ( xInfo->hasPropertyByName( rPropertyName ) ) { rPropSet->setPropertyValue( rPropertyName, Any( sStyleName ) ); } } catch ( ::com::sun::star::lang::IllegalArgumentException& e ) { Sequence aSeq(1); aSeq[0] = sStyleName; GetImport().SetError( XMLERROR_STYLE_PROP_VALUE | XMLERROR_FLAG_WARNING, aSeq, e.Message, NULL ); } break; } case CTF_SD_OLE_VIS_AREA_IMPORT_LEFT: case CTF_SD_OLE_VIS_AREA_IMPORT_TOP: case CTF_SD_OLE_VIS_AREA_IMPORT_WIDTH: case CTF_SD_OLE_VIS_AREA_IMPORT_HEIGHT: { struct XMLPropertyState& rState = GetProperties()[nIndex]; const OUString& rPropertyName = xPropMapper->GetEntryAPIName(rState.mnIndex); try { if( !xInfo.is() ) xInfo = rPropSet->getPropertySetInfo(); if ( xInfo->hasPropertyByName( rPropertyName ) ) { rPropSet->setPropertyValue( rPropertyName, rState.maValue ); } } catch ( ::com::sun::star::lang::IllegalArgumentException& e ) { Sequence aSeq; GetImport().SetError( XMLERROR_STYLE_PROP_VALUE | XMLERROR_FLAG_WARNING, aSeq, e.Message, NULL ); } break; } } } if (m_sControlDataStyleName.getLength()) { // we had a data-style-name attribute // set the formatting on the control model of the control shape uno::Reference< drawing::XControlShape > xControlShape(rPropSet, uno::UNO_QUERY); DBG_ASSERT(xControlShape.is(), "XMLShapeStyleContext::FillPropertySet: data style for a non-control shape!"); if (xControlShape.is()) { uno::Reference< beans::XPropertySet > xControlModel(xControlShape->getControl(), uno::UNO_QUERY); DBG_ASSERT(xControlModel.is(), "XMLShapeStyleContext::FillPropertySet: no control model for the shape!"); if (xControlModel.is()) { GetImport().GetFormImport()->applyControlNumberStyle(xControlModel, m_sControlDataStyleName); } } } } void XMLShapeStyleContext::Finish( sal_Bool /*bOverwrite*/ ) { }