163bba73cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 363bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 463bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file 563bba73cSAndrew Rist * distributed with this work for additional information 663bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 763bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the 863bba73cSAndrew Rist * "License"); you may not use this file except in compliance 963bba73cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1163bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1363bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing, 1463bba73cSAndrew Rist * software distributed under the License is distributed on an 1563bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1663bba73cSAndrew Rist * KIND, either express or implied. See the License for the 1763bba73cSAndrew Rist * specific language governing permissions and limitations 1863bba73cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 2063bba73cSAndrew Rist *************************************************************/ 2163bba73cSAndrew Rist 2263bba73cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <memory> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include "unointerfacetouniqueidentifiermapper.hxx" 30cdf0e10cSrcweir #include <com/sun/star/presentation/ClickAction.hpp> 31cdf0e10cSrcweir #include <com/sun/star/lang/ServiceNotRegisteredException.hpp> 32cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp> 33cdf0e10cSrcweir #include <com/sun/star/text/XText.hpp> 34cdf0e10cSrcweir #include <com/sun/star/chart/XChartDocument.hpp> 35cdf0e10cSrcweir #include <com/sun/star/drawing/XControlShape.hpp> 36cdf0e10cSrcweir #include <com/sun/star/style/XStyle.hpp> 37cdf0e10cSrcweir #include <com/sun/star/drawing/XGluePointsSupplier.hpp> 38cdf0e10cSrcweir #include <com/sun/star/container/XIdentifierAccess.hpp> 39cdf0e10cSrcweir #include <com/sun/star/drawing/GluePoint2.hpp> 40cdf0e10cSrcweir #include <com/sun/star/drawing/Alignment.hpp> 41cdf0e10cSrcweir #include <com/sun/star/drawing/EscapeDirection.hpp> 42cdf0e10cSrcweir #include <com/sun/star/table/XColumnRowRange.hpp> 43cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 44cdf0e10cSrcweir #include "PropertySetMerger.hxx" 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include <xmloff/shapeexport.hxx> 47cdf0e10cSrcweir #include "sdpropls.hxx" 48cdf0e10cSrcweir #include "sdxmlexp_impl.hxx" 49cdf0e10cSrcweir #include <xmloff/families.hxx> 50cdf0e10cSrcweir #include <tools/debug.hxx> 51cdf0e10cSrcweir #include <xmloff/contextid.hxx> 52cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 53cdf0e10cSrcweir #include <tools/string.hxx> 54cdf0e10cSrcweir #include <sot/clsids.hxx> 55cdf0e10cSrcweir #include <tools/globname.hxx> 56cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyState.hpp> 57cdf0e10cSrcweir 58cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 59cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 60cdf0e10cSrcweir #include <com/sun/star/drawing/XCustomShapeEngine.hpp> 61cdf0e10cSrcweir 62cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 63cdf0e10cSrcweir 64cdf0e10cSrcweir using ::rtl::OUString; 65cdf0e10cSrcweir using ::rtl::OUStringBuffer; 66cdf0e10cSrcweir 67cdf0e10cSrcweir using namespace ::com::sun::star; 68cdf0e10cSrcweir using namespace ::xmloff::token; 69cdf0e10cSrcweir 70cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 71cdf0e10cSrcweir 72cdf0e10cSrcweir XMLShapeExport::XMLShapeExport(SvXMLExport& rExp, 73cdf0e10cSrcweir SvXMLExportPropertyMapper *pExtMapper ) 74cdf0e10cSrcweir : mrExport( rExp ), 75cdf0e10cSrcweir mnNextUniqueShapeId(1), 76cdf0e10cSrcweir maShapesInfos(), 77cdf0e10cSrcweir maCurrentShapesIter(maShapesInfos.end()), 78cdf0e10cSrcweir mbExportLayer( sal_False ), 79cdf0e10cSrcweir // #88546# init to sal_False 80cdf0e10cSrcweir mbHandleProgressBar( sal_False ), 81cdf0e10cSrcweir msZIndex( RTL_CONSTASCII_USTRINGPARAM("ZOrder") ), 82cdf0e10cSrcweir msPrintable( RTL_CONSTASCII_USTRINGPARAM("Printable") ), 83cdf0e10cSrcweir msVisible( RTL_CONSTASCII_USTRINGPARAM("Visible") ), 84cdf0e10cSrcweir msEmptyPres( RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), 85cdf0e10cSrcweir msModel( RTL_CONSTASCII_USTRINGPARAM("Model") ), 86cdf0e10cSrcweir msStartShape( RTL_CONSTASCII_USTRINGPARAM("StartShape") ), 87cdf0e10cSrcweir msEndShape( RTL_CONSTASCII_USTRINGPARAM("EndShape") ), 88cdf0e10cSrcweir msOnClick( RTL_CONSTASCII_USTRINGPARAM("OnClick") ), 89cdf0e10cSrcweir #ifdef ISSUE66550_HLINK_FOR_SHAPES 90cdf0e10cSrcweir msOnAction( RTL_CONSTASCII_USTRINGPARAM("OnAction") ), 91cdf0e10cSrcweir msAction( RTL_CONSTASCII_USTRINGPARAM("Action") ), 92cdf0e10cSrcweir msURL( RTL_CONSTASCII_USTRINGPARAM("URL") ), 93cdf0e10cSrcweir #endif 94cdf0e10cSrcweir msEventType( RTL_CONSTASCII_USTRINGPARAM("EventType") ), 95cdf0e10cSrcweir msPresentation( RTL_CONSTASCII_USTRINGPARAM("Presentation") ), 96cdf0e10cSrcweir msMacroName( RTL_CONSTASCII_USTRINGPARAM("MacroName") ), 97cdf0e10cSrcweir msScript( RTL_CONSTASCII_USTRINGPARAM("Script") ), 98cdf0e10cSrcweir msLibrary( RTL_CONSTASCII_USTRINGPARAM("Library") ), 99cdf0e10cSrcweir msClickAction( RTL_CONSTASCII_USTRINGPARAM("ClickAction") ), 100cdf0e10cSrcweir msBookmark( RTL_CONSTASCII_USTRINGPARAM("Bookmark") ), 101cdf0e10cSrcweir msEffect( RTL_CONSTASCII_USTRINGPARAM("Effect") ), 102cdf0e10cSrcweir msPlayFull( RTL_CONSTASCII_USTRINGPARAM("PlayFull") ), 103cdf0e10cSrcweir msVerb( RTL_CONSTASCII_USTRINGPARAM("Verb") ), 104cdf0e10cSrcweir msSoundURL( RTL_CONSTASCII_USTRINGPARAM("SoundURL") ), 105cdf0e10cSrcweir msSpeed( RTL_CONSTASCII_USTRINGPARAM("Speed") ), 106cdf0e10cSrcweir msStarBasic( RTL_CONSTASCII_USTRINGPARAM("StarBasic") ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir // construct PropertyHandlerFactory 109cdf0e10cSrcweir mxSdPropHdlFactory = new XMLSdPropHdlFactory( mrExport.GetModel(), rExp ); 110cdf0e10cSrcweir // construct PropertySetMapper 111cdf0e10cSrcweir mxPropertySetMapper = CreateShapePropMapper( mrExport ); 112cdf0e10cSrcweir if( pExtMapper ) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir UniReference < SvXMLExportPropertyMapper > xExtMapper( pExtMapper ); 115cdf0e10cSrcweir mxPropertySetMapper->ChainExportMapper( xExtMapper ); 116cdf0e10cSrcweir } 117cdf0e10cSrcweir 118cdf0e10cSrcweir /* 119cdf0e10cSrcweir // chain text attributes 120cdf0e10cSrcweir xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(rExp)); 121cdf0e10cSrcweir */ 122cdf0e10cSrcweir 123cdf0e10cSrcweir mrExport.GetAutoStylePool()->AddFamily( 124cdf0e10cSrcweir XML_STYLE_FAMILY_SD_GRAPHICS_ID, 125cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), 126cdf0e10cSrcweir GetPropertySetMapper(), 127cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX))); 128cdf0e10cSrcweir mrExport.GetAutoStylePool()->AddFamily( 129cdf0e10cSrcweir XML_STYLE_FAMILY_SD_PRESENTATION_ID, 130cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_NAME)), 131cdf0e10cSrcweir GetPropertySetMapper(), 132cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_PRESENTATION_PREFIX))); 133cdf0e10cSrcweir 134cdf0e10cSrcweir maCurrentInfo = maShapeInfos.end(); 135cdf0e10cSrcweir 136cdf0e10cSrcweir // create table export helper and let him add his families in time 137cdf0e10cSrcweir GetShapeTableExport(); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 141cdf0e10cSrcweir 142cdf0e10cSrcweir XMLShapeExport::~XMLShapeExport() 143cdf0e10cSrcweir { 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 147cdf0e10cSrcweir 148cdf0e10cSrcweir // sj: replacing CustomShapes with standard objects that are also supported in OpenOffice.org format 149cdf0e10cSrcweir uno::Reference< drawing::XShape > XMLShapeExport::checkForCustomShapeReplacement( const uno::Reference< drawing::XShape >& xShape ) 150cdf0e10cSrcweir { 151cdf0e10cSrcweir uno::Reference< drawing::XShape > xCustomShapeReplacement; 152cdf0e10cSrcweir 153cdf0e10cSrcweir if( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 ) 154cdf0e10cSrcweir { 155cdf0e10cSrcweir String aType( (OUString)xShape->getShapeType() ); 156cdf0e10cSrcweir if( aType.EqualsAscii( (const sal_Char*)"com.sun.star.drawing.CustomShape" ) ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY ); 159cdf0e10cSrcweir if( xSet.is() ) 160cdf0e10cSrcweir { 161cdf0e10cSrcweir rtl::OUString aEngine; 162cdf0e10cSrcweir xSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeEngine" ) ) ) >>= aEngine; 163cdf0e10cSrcweir if ( !aEngine.getLength() ) 164cdf0e10cSrcweir aEngine = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.EnhancedCustomShapeEngine" ) ); 165cdf0e10cSrcweir 166cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 167cdf0e10cSrcweir /* 168cdf0e10cSrcweir uno::Reference< drawing::XShape > aXShape = GetXShapeForSdrObject( (SdrObjCustomShape*)pCustomShape ); 169cdf0e10cSrcweir if ( !aXShape.is() ) 170cdf0e10cSrcweir aXShape = new SvxCustomShape( (SdrObjCustomShape*)pCustomShape ); 171cdf0e10cSrcweir */ 172cdf0e10cSrcweir if ( aEngine.getLength() && xFactory.is() ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir uno::Sequence< uno::Any > aArgument( 1 ); 175cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aPropValues( 2 ); 176cdf0e10cSrcweir aPropValues[ 0 ].Name = rtl::OUString::createFromAscii( "CustomShape" ); 177cdf0e10cSrcweir aPropValues[ 0 ].Value <<= xShape; 178cdf0e10cSrcweir sal_Bool bForceGroupWithText = sal_True; 179cdf0e10cSrcweir aPropValues[ 1 ].Name = rtl::OUString::createFromAscii( "ForceGroupWithText" ); 180cdf0e10cSrcweir aPropValues[ 1 ].Value <<= bForceGroupWithText; 181cdf0e10cSrcweir aArgument[ 0 ] <<= aPropValues; 182cdf0e10cSrcweir uno::Reference< uno::XInterface > xInterface( xFactory->createInstanceWithArguments( aEngine, aArgument ) ); 183cdf0e10cSrcweir if ( xInterface.is() ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir uno::Reference< drawing::XCustomShapeEngine > xCustomShapeEngine( 186cdf0e10cSrcweir uno::Reference< drawing::XCustomShapeEngine >( xInterface, uno::UNO_QUERY ) ); 187cdf0e10cSrcweir if ( xCustomShapeEngine.is() ) 188cdf0e10cSrcweir xCustomShapeReplacement = xCustomShapeEngine->render(); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir } 191cdf0e10cSrcweir } 192cdf0e10cSrcweir } 193cdf0e10cSrcweir } 194cdf0e10cSrcweir return xCustomShapeReplacement; 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir // This method collects all automatic styles for the given XShape 198cdf0e10cSrcweir void XMLShapeExport::collectShapeAutoStyles(const uno::Reference< drawing::XShape >& xShape ) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir if( maCurrentShapesIter == maShapesInfos.end() ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no call to seekShapes()!" ); 203cdf0e10cSrcweir return; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir sal_Int32 nZIndex = 0; 206cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY ); 207cdf0e10cSrcweir if( xSet.is() ) 208cdf0e10cSrcweir xSet->getPropertyValue(msZIndex) >>= nZIndex; 209cdf0e10cSrcweir 210cdf0e10cSrcweir ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second; 211cdf0e10cSrcweir 212cdf0e10cSrcweir if( (sal_Int32)aShapeInfoVector.size() <= nZIndex ) 213cdf0e10cSrcweir { 214cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): no shape info allocated for a given shape" ); 215cdf0e10cSrcweir return; 216cdf0e10cSrcweir } 217cdf0e10cSrcweir 218cdf0e10cSrcweir ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex]; 219cdf0e10cSrcweir 220cdf0e10cSrcweir uno::Reference< drawing::XShape > xCustomShapeReplacement = checkForCustomShapeReplacement( xShape ); 221cdf0e10cSrcweir if ( xCustomShapeReplacement.is() ) 222cdf0e10cSrcweir aShapeInfo.xCustomShapeReplacement = xCustomShapeReplacement; 223cdf0e10cSrcweir 224cdf0e10cSrcweir // ----------------------------- 225cdf0e10cSrcweir // first compute the shapes type 226cdf0e10cSrcweir // ----------------------------- 227cdf0e10cSrcweir ImpCalcShapeType(xShape, aShapeInfo.meShapeType); 228cdf0e10cSrcweir 229a5258243SPedro Giffuni // #i118485# enabled XmlShapeTypeDrawChartShape and XmlShapeTypeDrawOLE2Shape 230a5258243SPedro Giffuni // to have text 231cdf0e10cSrcweir const bool bObjSupportsText = 232cdf0e10cSrcweir // aShapeInfo.meShapeType != XmlShapeTypeDrawControlShape && 233cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypePresChartShape && 234cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypePresOLE2Shape && 235cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDrawSheetShape && 236cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypePresSheetShape && 237cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDraw3DSceneObject && 238cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDraw3DCubeObject && 239cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDraw3DSphereObject && 240cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDraw3DLatheObject && 241cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDraw3DExtrudeObject && 242cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape && 243cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypePresPageShape && 244cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape; 245cdf0e10cSrcweir 246cdf0e10cSrcweir const bool bObjSupportsStyle = 247cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeDrawGroupShape; 248cdf0e10cSrcweir 249cdf0e10cSrcweir sal_Bool bIsEmptyPresObj = sal_False; 250cdf0e10cSrcweir 251cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 252cdf0e10cSrcweir if ( aShapeInfo.xCustomShapeReplacement.is() ) 253cdf0e10cSrcweir xPropSet.clear(); 254cdf0e10cSrcweir 255cdf0e10cSrcweir // ---------------- 256cdf0e10cSrcweir // prep text styles 257cdf0e10cSrcweir // ---------------- 258cdf0e10cSrcweir if( xPropSet.is() && bObjSupportsText ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY); 261cdf0e10cSrcweir if(xText.is() && xText->getString().getLength()) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 264cdf0e10cSrcweir 265cdf0e10cSrcweir if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(msEmptyPres) ) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir uno::Any aAny = xPropSet->getPropertyValue(msEmptyPres); 268cdf0e10cSrcweir aAny >>= bIsEmptyPresObj; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir if(!bIsEmptyPresObj) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir GetExport().GetTextParagraphExport()->collectTextAutoStyles( xText ); 274cdf0e10cSrcweir } 275cdf0e10cSrcweir } 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir // ------------------------------ 279cdf0e10cSrcweir // compute the shape parent style 280cdf0e10cSrcweir // ------------------------------ 281cdf0e10cSrcweir if( xPropSet.is() ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropertySetInfo( xPropSet->getPropertySetInfo() ); 284cdf0e10cSrcweir 285cdf0e10cSrcweir OUString aParentName; 286cdf0e10cSrcweir uno::Reference< style::XStyle > xStyle; 287cdf0e10cSrcweir 288cdf0e10cSrcweir if( bObjSupportsStyle ) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir if( xPropertySetInfo.is() && xPropertySetInfo->hasPropertyByName( OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) ) 291cdf0e10cSrcweir xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style"))) >>= xStyle; 292cdf0e10cSrcweir 293cdf0e10cSrcweir if(xStyle.is()) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir // get family ID 296cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xStylePropSet(xStyle, uno::UNO_QUERY); 297cdf0e10cSrcweir DBG_ASSERT( xStylePropSet.is(), "style without a XPropertySet?" ); 298cdf0e10cSrcweir try 299cdf0e10cSrcweir { 300cdf0e10cSrcweir if(xStylePropSet.is()) 301cdf0e10cSrcweir { 302cdf0e10cSrcweir OUString aFamilyName; 303cdf0e10cSrcweir xStylePropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Family"))) >>= aFamilyName; 304cdf0e10cSrcweir if(aFamilyName.getLength() && !aFamilyName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM("graphics")))) 305cdf0e10cSrcweir aShapeInfo.mnFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir } 308cdf0e10cSrcweir catch(beans::UnknownPropertyException aException) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir // Ignored. 311cdf0e10cSrcweir DBG_ASSERT(false, 312cdf0e10cSrcweir "XMLShapeExport::collectShapeAutoStyles: style has no 'Family' property"); 313cdf0e10cSrcweir } 314cdf0e10cSrcweir 315cdf0e10cSrcweir // get parent-style name 316cdf0e10cSrcweir if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == aShapeInfo.mnFamily) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir aParentName = msPresentationStylePrefix; 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir aParentName += xStyle->getName(); 322cdf0e10cSrcweir } 323cdf0e10cSrcweir } 324cdf0e10cSrcweir 325cdf0e10cSrcweir // filter propset 326cdf0e10cSrcweir std::vector< XMLPropertyState > xPropStates; 327cdf0e10cSrcweir 328cdf0e10cSrcweir sal_Int32 nCount = 0; 329cdf0e10cSrcweir if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir xPropStates = GetPropertySetMapper()->Filter( xPropSet ); 332cdf0e10cSrcweir 333cdf0e10cSrcweir if (XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType) 334cdf0e10cSrcweir { 335cdf0e10cSrcweir // for control shapes, we additionally need the number format style (if any) 336cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControl(xShape, uno::UNO_QUERY); 337cdf0e10cSrcweir DBG_ASSERT(xControl.is(), "XMLShapeExport::collectShapeAutoStyles: ShapeType control, but no XControlShape!"); 338cdf0e10cSrcweir if (xControl.is()) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xControlModel(xControl->getControl(), uno::UNO_QUERY); 341cdf0e10cSrcweir DBG_ASSERT(xControlModel.is(), "XMLShapeExport::collectShapeAutoStyles: no control model on the control shape!"); 342cdf0e10cSrcweir 343cdf0e10cSrcweir ::rtl::OUString sNumberStyle = mrExport.GetFormExport()->getControlNumberStyle(xControlModel); 344cdf0e10cSrcweir if (0 != sNumberStyle.getLength()) 345cdf0e10cSrcweir { 346cdf0e10cSrcweir sal_Int32 nIndex = GetPropertySetMapper()->getPropertySetMapper()->FindEntryIndex(CTF_SD_CONTROL_SHAPE_DATA_STYLE); 347cdf0e10cSrcweir // TODO : this retrieval of the index could be moved into the ctor, holding the index 348cdf0e10cSrcweir // as member, thus saving time. 349cdf0e10cSrcweir DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id!"); 350cdf0e10cSrcweir 351cdf0e10cSrcweir XMLPropertyState aNewState(nIndex, uno::makeAny(sNumberStyle)); 352cdf0e10cSrcweir xPropStates.push_back(aNewState); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir } 355cdf0e10cSrcweir } 356cdf0e10cSrcweir 357cdf0e10cSrcweir std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin(); 358cdf0e10cSrcweir std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end(); 359cdf0e10cSrcweir while( aIter != aEnd ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir if( aIter->mnIndex != -1 ) 362cdf0e10cSrcweir nCount++; 363cdf0e10cSrcweir aIter++; 364cdf0e10cSrcweir } 365cdf0e10cSrcweir } 366cdf0e10cSrcweir 367cdf0e10cSrcweir if(nCount == 0) 368cdf0e10cSrcweir { 369cdf0e10cSrcweir // no hard attributes, use parent style name for export 370cdf0e10cSrcweir aShapeInfo.msStyleName = aParentName; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir else 373cdf0e10cSrcweir { 374cdf0e10cSrcweir // there are filtered properties -> hard attributes 375cdf0e10cSrcweir // try to find this style in AutoStylePool 376cdf0e10cSrcweir aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Find(aShapeInfo.mnFamily, aParentName, xPropStates); 377cdf0e10cSrcweir 378cdf0e10cSrcweir if(!aShapeInfo.msStyleName.getLength()) 379cdf0e10cSrcweir { 380cdf0e10cSrcweir // Style did not exist, add it to AutoStalePool 381cdf0e10cSrcweir aShapeInfo.msStyleName = mrExport.GetAutoStylePool()->Add(aShapeInfo.mnFamily, aParentName, xPropStates); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir } 384cdf0e10cSrcweir 385cdf0e10cSrcweir // optionaly generate auto style for text attributes 386cdf0e10cSrcweir if( (!bIsEmptyPresObj || (aShapeInfo.meShapeType != XmlShapeTypePresPageShape)) && bObjSupportsText ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir xPropStates = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->Filter( xPropSet ); 389cdf0e10cSrcweir 390cdf0e10cSrcweir // ---------------------------------------------------------------------- 391cdf0e10cSrcweir // yet more additionally, we need to care for the ParaAdjust property 392cdf0e10cSrcweir if ( XmlShapeTypeDrawControlShape == aShapeInfo.meShapeType ) 393cdf0e10cSrcweir { 394cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 395cdf0e10cSrcweir uno::Reference< beans::XPropertyState > xPropState( xPropSet, uno::UNO_QUERY ); 396cdf0e10cSrcweir if ( xPropSetInfo.is() && xPropState.is() ) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir // this is because: 399cdf0e10cSrcweir // * if controls shapes have a ParaAdjust property, then this is the Align property of the control model 400cdf0e10cSrcweir // * control models are allowed to have an Align of "void" 401cdf0e10cSrcweir // * the Default for control model's Align is TextAlign_LEFT 402cdf0e10cSrcweir // * defaults for style properties are not written, but we need to write the "left", 403*531ea755SJohn Bampton // because we need to distinguish this "left" from the case where not align attribute 404cdf0e10cSrcweir // is present which means "void" 405cdf0e10cSrcweir // 102407 - 2002-11-01 - fs@openoffice.org 406cdf0e10cSrcweir static const ::rtl::OUString s_sParaAdjustPropertyName( RTL_CONSTASCII_USTRINGPARAM( "ParaAdjust" ) ); 407cdf0e10cSrcweir if ( xPropSetInfo->hasPropertyByName( s_sParaAdjustPropertyName ) 408cdf0e10cSrcweir && ( beans::PropertyState_DEFAULT_VALUE == xPropState->getPropertyState( s_sParaAdjustPropertyName ) ) 409cdf0e10cSrcweir ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir sal_Int32 nIndex = GetExport().GetTextParagraphExport()->GetParagraphPropertyMapper()->getPropertySetMapper()->FindEntryIndex( CTF_SD_SHAPE_PARA_ADJUST ); 412cdf0e10cSrcweir // TODO : this retrieval of the index should be moved into the ctor, holding the index 413cdf0e10cSrcweir // as member, thus saving time. 414cdf0e10cSrcweir DBG_ASSERT(-1 != nIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for the ParaAdjust context id!"); 415cdf0e10cSrcweir 416cdf0e10cSrcweir uno::Any aParaAdjustValue = xPropSet->getPropertyValue( s_sParaAdjustPropertyName ); 417cdf0e10cSrcweir XMLPropertyState aAlignDefaultState( nIndex, aParaAdjustValue ); 418cdf0e10cSrcweir 419cdf0e10cSrcweir xPropStates.push_back( aAlignDefaultState ); 420cdf0e10cSrcweir } 421cdf0e10cSrcweir } 422cdf0e10cSrcweir } 423cdf0e10cSrcweir // ---------------------------------------------------------------------- 424cdf0e10cSrcweir 425cdf0e10cSrcweir nCount = 0; 426cdf0e10cSrcweir std::vector< XMLPropertyState >::iterator aIter = xPropStates.begin(); 427cdf0e10cSrcweir std::vector< XMLPropertyState >::iterator aEnd = xPropStates.end(); 428cdf0e10cSrcweir while( aIter != aEnd ) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir if( aIter->mnIndex != -1 ) 431cdf0e10cSrcweir nCount++; 432cdf0e10cSrcweir aIter++; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir if( nCount ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir const OUString aEmpty; 438cdf0e10cSrcweir aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Find( XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates ); 439cdf0e10cSrcweir if(!aShapeInfo.msTextStyleName.getLength()) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir // Style did not exist, add it to AutoStalePool 442cdf0e10cSrcweir aShapeInfo.msTextStyleName = mrExport.GetAutoStylePool()->Add(XML_STYLE_FAMILY_TEXT_PARAGRAPH, aEmpty, xPropStates); 443cdf0e10cSrcweir } 444cdf0e10cSrcweir } 445cdf0e10cSrcweir } 446cdf0e10cSrcweir } 447cdf0e10cSrcweir 448cdf0e10cSrcweir // ---------------------------------------- 449cdf0e10cSrcweir // prepare animation informations if needed 450cdf0e10cSrcweir // ---------------------------------------- 451cdf0e10cSrcweir if( mxAnimationsExporter.is() ) 452cdf0e10cSrcweir mxAnimationsExporter->prepare( xShape, mrExport ); 453cdf0e10cSrcweir 454cdf0e10cSrcweir // check for special shapes 455cdf0e10cSrcweir 456cdf0e10cSrcweir switch( aShapeInfo.meShapeType ) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir case XmlShapeTypeDrawConnectorShape: 459cdf0e10cSrcweir { 460cdf0e10cSrcweir uno::Reference< uno::XInterface > xConnection; 461cdf0e10cSrcweir 462cdf0e10cSrcweir // create shape ids for export later 463cdf0e10cSrcweir xPropSet->getPropertyValue( msStartShape ) >>= xConnection; 464cdf0e10cSrcweir if( xConnection.is() ) 465cdf0e10cSrcweir mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection ); 466cdf0e10cSrcweir 467cdf0e10cSrcweir xPropSet->getPropertyValue( msEndShape ) >>= xConnection; 468cdf0e10cSrcweir if( xConnection.is() ) 469cdf0e10cSrcweir mrExport.getInterfaceToIdentifierMapper().registerReference( xConnection ); 470cdf0e10cSrcweir break; 471cdf0e10cSrcweir } 472cdf0e10cSrcweir case XmlShapeTypePresTableShape: 473cdf0e10cSrcweir case XmlShapeTypeDrawTableShape: 474cdf0e10cSrcweir { 475cdf0e10cSrcweir try 476cdf0e10cSrcweir { 477cdf0e10cSrcweir uno::Reference< table::XColumnRowRange > xRange( xSet->getPropertyValue( msModel ), uno::UNO_QUERY_THROW ); 478cdf0e10cSrcweir GetShapeTableExport()->collectTableAutoStyles( xRange ); 479cdf0e10cSrcweir } 480cdf0e10cSrcweir catch( uno::Exception& ) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::collectShapeAutoStyles(): exception caught while collection auto styles for a table!" ); 483cdf0e10cSrcweir } 484cdf0e10cSrcweir break; 485cdf0e10cSrcweir } 486cdf0e10cSrcweir default: 487cdf0e10cSrcweir break; 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir maShapeInfos.push_back( aShapeInfo ); 491cdf0e10cSrcweir maCurrentInfo = maShapeInfos.begin(); 492cdf0e10cSrcweir 493cdf0e10cSrcweir // ----------------------------------------------------- 494cdf0e10cSrcweir // check for shape collections (group shape or 3d scene) 495cdf0e10cSrcweir // and collect contained shapes style infos 496cdf0e10cSrcweir // ----------------------------------------------------- 497cdf0e10cSrcweir const uno::Reference< drawing::XShape >& xCollection = aShapeInfo.xCustomShapeReplacement.is() 498cdf0e10cSrcweir ? aShapeInfo.xCustomShapeReplacement : xShape; 499cdf0e10cSrcweir { 500cdf0e10cSrcweir uno::Reference< drawing::XShapes > xShapes( xCollection, uno::UNO_QUERY ); 501cdf0e10cSrcweir if( xShapes.is() ) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir collectShapesAutoStyles( xShapes ); 504cdf0e10cSrcweir } 505cdf0e10cSrcweir } 506cdf0e10cSrcweir } 507cdf0e10cSrcweir 508cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 509cdf0e10cSrcweir 510cdf0e10cSrcweir // --> OD 2008-05-08 #refactorlists# 511cdf0e10cSrcweir namespace 512cdf0e10cSrcweir { 513cdf0e10cSrcweir class NewTextListsHelper 514cdf0e10cSrcweir { 515cdf0e10cSrcweir public: 516cdf0e10cSrcweir NewTextListsHelper( SvXMLExport& rExp ) 517cdf0e10cSrcweir : mrExport( rExp ) 518cdf0e10cSrcweir { 519cdf0e10cSrcweir mrExport.GetTextParagraphExport()->PushNewTextListsHelper(); 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir ~NewTextListsHelper() 523cdf0e10cSrcweir { 524cdf0e10cSrcweir mrExport.GetTextParagraphExport()->PopTextListsHelper(); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir private: 528cdf0e10cSrcweir SvXMLExport& mrExport; 529cdf0e10cSrcweir }; 530cdf0e10cSrcweir } 531cdf0e10cSrcweir // This method exports the given XShape 532cdf0e10cSrcweir void XMLShapeExport::exportShape(const uno::Reference< drawing::XShape >& xShape, 533cdf0e10cSrcweir sal_Int32 nFeatures /* = SEF_DEFAULT */, 534cdf0e10cSrcweir com::sun::star::awt::Point* pRefPoint /* = NULL */, 535cdf0e10cSrcweir SvXMLAttributeList* pAttrList /* = NULL */ ) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir if( maCurrentShapesIter == maShapesInfos.end() ) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::exportShape(): no auto styles where collected before export" ); 540cdf0e10cSrcweir return; 541cdf0e10cSrcweir } 542cdf0e10cSrcweir sal_Int32 nZIndex = 0; 543cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY ); 544cdf0e10cSrcweir 545cdf0e10cSrcweir 546cdf0e10cSrcweir ::std::auto_ptr< SvXMLElementExport > mpHyperlinkElement; 547cdf0e10cSrcweir 548cdf0e10cSrcweir // export hyperlinks with <a><shape/></a>. Currently only in draw since draw 549cdf0e10cSrcweir // does not support document events 550cdf0e10cSrcweir if( xSet.is() && (GetExport().GetModelType() == SvtModuleOptions::E_DRAW) ) try 551cdf0e10cSrcweir { 552cdf0e10cSrcweir presentation::ClickAction eAction = presentation::ClickAction_NONE; 553cdf0e10cSrcweir xSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("OnClick"))) >>= eAction; 554cdf0e10cSrcweir 555cdf0e10cSrcweir if( (eAction == presentation::ClickAction_DOCUMENT) || 556cdf0e10cSrcweir (eAction == presentation::ClickAction_BOOKMARK) ) 557cdf0e10cSrcweir { 558cdf0e10cSrcweir OUString sURL; 559cdf0e10cSrcweir xSet->getPropertyValue(msBookmark) >>= sURL; 560cdf0e10cSrcweir 561cdf0e10cSrcweir if( sURL.getLength() ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL ); 564cdf0e10cSrcweir mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 565cdf0e10cSrcweir mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 566cdf0e10cSrcweir mpHyperlinkElement.reset( new SvXMLElementExport(mrExport, XML_NAMESPACE_DRAW, XML_A, sal_True, sal_True) ); 567cdf0e10cSrcweir } 568cdf0e10cSrcweir } 569cdf0e10cSrcweir } 570cdf0e10cSrcweir catch( uno::Exception& ) 571cdf0e10cSrcweir { 572cdf0e10cSrcweir DBG_ERROR("XMLShapeExport::exportShape(): exception during hyperlink export"); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir 576cdf0e10cSrcweir if( xSet.is() ) 577cdf0e10cSrcweir xSet->getPropertyValue(msZIndex) >>= nZIndex; 578cdf0e10cSrcweir 579cdf0e10cSrcweir ImplXMLShapeExportInfoVector& aShapeInfoVector = (*maCurrentShapesIter).second; 580cdf0e10cSrcweir 581cdf0e10cSrcweir if( (sal_Int32)aShapeInfoVector.size() <= nZIndex ) 582cdf0e10cSrcweir { 583cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::exportShape(): no shape info collected for a given shape" ); 584cdf0e10cSrcweir return; 585cdf0e10cSrcweir } 586cdf0e10cSrcweir 587cdf0e10cSrcweir // --> OD 2008-05-08 #refactorlists# 588cdf0e10cSrcweir NewTextListsHelper aNewTextListsHelper( mrExport ); 589cdf0e10cSrcweir // <-- 590cdf0e10cSrcweir 591cdf0e10cSrcweir const ImplXMLShapeExportInfo& aShapeInfo = aShapeInfoVector[nZIndex]; 592cdf0e10cSrcweir 593cdf0e10cSrcweir 594cdf0e10cSrcweir #ifdef DBG_UTIL 595cdf0e10cSrcweir // --------------------------------------- 596cdf0e10cSrcweir // check if this is the correct ShapesInfo 597cdf0e10cSrcweir // --------------------------------------- 598cdf0e10cSrcweir uno::Reference< container::XChild > xChild( xShape, uno::UNO_QUERY ); 599cdf0e10cSrcweir if( xChild.is() ) 600cdf0e10cSrcweir { 601cdf0e10cSrcweir uno::Reference< drawing::XShapes > xParent( xChild->getParent(), uno::UNO_QUERY ); 602cdf0e10cSrcweir DBG_ASSERT( xParent.is() && xParent.get() == (*maCurrentShapesIter).first.get(), "XMLShapeExport::exportShape(): Wrong call to XMLShapeExport::seekShapes()" ); 603cdf0e10cSrcweir } 604cdf0e10cSrcweir 605cdf0e10cSrcweir // ----------------------------- 606cdf0e10cSrcweir // first compute the shapes type 607cdf0e10cSrcweir // ----------------------------- 608cdf0e10cSrcweir { 609cdf0e10cSrcweir XmlShapeType eShapeType(XmlShapeTypeNotYetSet); 610cdf0e10cSrcweir ImpCalcShapeType(xShape, eShapeType); 611cdf0e10cSrcweir 612cdf0e10cSrcweir DBG_ASSERT( eShapeType == aShapeInfo.meShapeType, "exportShape callings do not correspond to collectShapeAutoStyles calls!" ); 613cdf0e10cSrcweir } 614cdf0e10cSrcweir #endif 615cdf0e10cSrcweir 616cdf0e10cSrcweir // ---------------------------------------- 617cdf0e10cSrcweir // collect animation informations if needed 618cdf0e10cSrcweir // ---------------------------------------- 619cdf0e10cSrcweir if( mxAnimationsExporter.is() ) 620cdf0e10cSrcweir mxAnimationsExporter->collect( xShape, mrExport ); 621cdf0e10cSrcweir 622cdf0e10cSrcweir // ------------------------------- 623cdf0e10cSrcweir // export shapes name if he has one 624cdf0e10cSrcweir // --> OD 2006-03-13 #i51726# 625cdf0e10cSrcweir // Export of the shape name for text documents only if the OpenDocument 626cdf0e10cSrcweir // file format is written - exceptions are group shapes. 627cdf0e10cSrcweir // Note: Writer documents in OpenOffice.org file format doesn't contain 628cdf0e10cSrcweir // any names for shapes, except for group shapes. 629cdf0e10cSrcweir // ------------------------------- 630cdf0e10cSrcweir { 631cdf0e10cSrcweir // --> OD 2006-03-10 #i51726# 632cdf0e10cSrcweir if ( ( GetExport().GetModelType() != SvtModuleOptions::E_WRITER && 633cdf0e10cSrcweir GetExport().GetModelType() != SvtModuleOptions::E_WRITERWEB && 634cdf0e10cSrcweir GetExport().GetModelType() != SvtModuleOptions::E_WRITERGLOBAL ) || 635cdf0e10cSrcweir ( GetExport().getExportFlags() & EXPORT_OASIS ) != 0 || 636cdf0e10cSrcweir aShapeInfo.meShapeType == XmlShapeTypeDrawGroupShape || 637cdf0e10cSrcweir ( aShapeInfo.meShapeType == XmlShapeTypeDrawCustomShape && 638cdf0e10cSrcweir aShapeInfo.xCustomShapeReplacement.is() ) ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY ); 641cdf0e10cSrcweir if( xNamed.is() ) 642cdf0e10cSrcweir { 643cdf0e10cSrcweir const OUString aName( xNamed->getName() ); 644cdf0e10cSrcweir if( aName.getLength() ) 645cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_NAME, aName ); 646cdf0e10cSrcweir } 647cdf0e10cSrcweir } 648cdf0e10cSrcweir // <-- 649cdf0e10cSrcweir } 650cdf0e10cSrcweir 651cdf0e10cSrcweir // ------------------ 652cdf0e10cSrcweir // export style name 653cdf0e10cSrcweir // ------------------ 654cdf0e10cSrcweir if( aShapeInfo.msStyleName.getLength() != 0 ) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir if(XML_STYLE_FAMILY_SD_GRAPHICS_ID == aShapeInfo.mnFamily) 657cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) ); 658cdf0e10cSrcweir else 659cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_STYLE_NAME, mrExport.EncodeStyleName( aShapeInfo.msStyleName) ); 660cdf0e10cSrcweir } 661cdf0e10cSrcweir 662cdf0e10cSrcweir // ------------------ 663cdf0e10cSrcweir // export text style name 664cdf0e10cSrcweir // ------------------ 665cdf0e10cSrcweir if( aShapeInfo.msTextStyleName.getLength() != 0 ) 666cdf0e10cSrcweir { 667cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TEXT_STYLE_NAME, aShapeInfo.msTextStyleName ); 668cdf0e10cSrcweir } 669cdf0e10cSrcweir 670cdf0e10cSrcweir // -------------------------- 671cdf0e10cSrcweir // export shapes id if needed 672cdf0e10cSrcweir // -------------------------- 673cdf0e10cSrcweir { 674cdf0e10cSrcweir uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY ); 675cdf0e10cSrcweir const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRef ); 676cdf0e10cSrcweir if( rShapeId.getLength() ) 677cdf0e10cSrcweir { 678cdf0e10cSrcweir mrExport.AddAttributeIdLegacy(XML_NAMESPACE_DRAW, rShapeId); 679cdf0e10cSrcweir } 680cdf0e10cSrcweir } 681cdf0e10cSrcweir 682cdf0e10cSrcweir // -------------------------- 683cdf0e10cSrcweir // export layer information 684cdf0e10cSrcweir // -------------------------- 685cdf0e10cSrcweir if( IsLayerExportEnabled() ) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir // check for group or scene shape and not export layer if this is one 688cdf0e10cSrcweir uno::Reference< drawing::XShapes > xShapes( xShape, uno::UNO_QUERY ); 689cdf0e10cSrcweir if( !xShapes.is() ) 690cdf0e10cSrcweir { 691cdf0e10cSrcweir try 692cdf0e10cSrcweir { 693cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); 694cdf0e10cSrcweir OUString aLayerName; 695cdf0e10cSrcweir xProps->getPropertyValue( OUString::createFromAscii( "LayerName" ) ) >>= aLayerName; 696cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_LAYER, aLayerName ); 697cdf0e10cSrcweir 698cdf0e10cSrcweir } 699cdf0e10cSrcweir catch( uno::Exception e ) 700cdf0e10cSrcweir { 701cdf0e10cSrcweir DBG_ERROR( "could not export layer name for shape!" ); 702cdf0e10cSrcweir } 703cdf0e10cSrcweir } 704cdf0e10cSrcweir } 705cdf0e10cSrcweir 706cdf0e10cSrcweir // export draw:display (do not export in ODF 1.2 or older) 707cdf0e10cSrcweir if( xSet.is() && ( mrExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012 ) ) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir if( aShapeInfo.meShapeType != XmlShapeTypeDrawPageShape && aShapeInfo.meShapeType != XmlShapeTypePresPageShape && 710cdf0e10cSrcweir aShapeInfo.meShapeType != XmlShapeTypeHandoutShape && aShapeInfo.meShapeType != XmlShapeTypeDrawChartShape ) 711cdf0e10cSrcweir 712cdf0e10cSrcweir try 713cdf0e10cSrcweir { 714cdf0e10cSrcweir sal_Bool bVisible = sal_True; 715cdf0e10cSrcweir sal_Bool bPrintable = sal_True; 716cdf0e10cSrcweir 717cdf0e10cSrcweir xSet->getPropertyValue(msVisible) >>= bVisible; 718cdf0e10cSrcweir xSet->getPropertyValue(msPrintable) >>= bPrintable; 719cdf0e10cSrcweir 720cdf0e10cSrcweir XMLTokenEnum eDisplayToken = XML_TOKEN_INVALID; 721cdf0e10cSrcweir const unsigned short nDisplay = (bVisible ? 2 : 0) | (bPrintable ? 1 : 0); 722cdf0e10cSrcweir switch( nDisplay ) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir case 0: eDisplayToken = XML_NONE; break; 725cdf0e10cSrcweir case 1: eDisplayToken = XML_PRINTER; break; 726cdf0e10cSrcweir case 2: eDisplayToken = XML_SCREEN; break; 727cdf0e10cSrcweir // case 3: eDisplayToken = XML_ALWAYS break; this is the default 728cdf0e10cSrcweir } 729cdf0e10cSrcweir 730cdf0e10cSrcweir if( eDisplayToken != XML_TOKEN_INVALID ) 731cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW_EXT, XML_DISPLAY, eDisplayToken ); 732cdf0e10cSrcweir } 733cdf0e10cSrcweir catch( uno::Exception& ) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::exportShape(), exception caught!" ); 736cdf0e10cSrcweir } 737cdf0e10cSrcweir } 738cdf0e10cSrcweir 739cdf0e10cSrcweir // #82003# test export count 740cdf0e10cSrcweir // #91587# ALWAYS increment since now ALL to be exported shapes are counted. 741cdf0e10cSrcweir if(mrExport.GetShapeExport()->IsHandleProgressBarEnabled()) 742cdf0e10cSrcweir { 743cdf0e10cSrcweir mrExport.GetProgressBarHelper()->Increment(); 744cdf0e10cSrcweir } 745cdf0e10cSrcweir 746cdf0e10cSrcweir onExport( xShape ); 747cdf0e10cSrcweir 748cdf0e10cSrcweir // -------------------- 749cdf0e10cSrcweir // export shape element 750cdf0e10cSrcweir // -------------------- 751cdf0e10cSrcweir switch(aShapeInfo.meShapeType) 752cdf0e10cSrcweir { 753cdf0e10cSrcweir case XmlShapeTypeDrawRectangleShape: 754cdf0e10cSrcweir { 755cdf0e10cSrcweir ImpExportRectangleShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 756cdf0e10cSrcweir break; 757cdf0e10cSrcweir } 758cdf0e10cSrcweir case XmlShapeTypeDrawEllipseShape: 759cdf0e10cSrcweir { 760cdf0e10cSrcweir ImpExportEllipseShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 761cdf0e10cSrcweir break; 762cdf0e10cSrcweir } 763cdf0e10cSrcweir case XmlShapeTypeDrawLineShape: 764cdf0e10cSrcweir { 765cdf0e10cSrcweir ImpExportLineShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 766cdf0e10cSrcweir break; 767cdf0e10cSrcweir } 768cdf0e10cSrcweir case XmlShapeTypeDrawPolyPolygonShape: // closed PolyPolygon 769cdf0e10cSrcweir case XmlShapeTypeDrawPolyLineShape: // open PolyPolygon 770cdf0e10cSrcweir case XmlShapeTypeDrawClosedBezierShape: // closed PolyPolygon containing curves 771cdf0e10cSrcweir case XmlShapeTypeDrawOpenBezierShape: // open PolyPolygon containing curves 772cdf0e10cSrcweir { 773cdf0e10cSrcweir ImpExportPolygonShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 774cdf0e10cSrcweir break; 775cdf0e10cSrcweir } 776cdf0e10cSrcweir 777cdf0e10cSrcweir case XmlShapeTypeDrawTextShape: 778cdf0e10cSrcweir case XmlShapeTypePresTitleTextShape: 779cdf0e10cSrcweir case XmlShapeTypePresOutlinerShape: 780cdf0e10cSrcweir case XmlShapeTypePresSubtitleShape: 781cdf0e10cSrcweir case XmlShapeTypePresNotesShape: 782cdf0e10cSrcweir case XmlShapeTypePresHeaderShape: 783cdf0e10cSrcweir case XmlShapeTypePresFooterShape: 784cdf0e10cSrcweir case XmlShapeTypePresSlideNumberShape: 785cdf0e10cSrcweir case XmlShapeTypePresDateTimeShape: 786cdf0e10cSrcweir { 787cdf0e10cSrcweir ImpExportTextBoxShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 788cdf0e10cSrcweir break; 789cdf0e10cSrcweir } 790cdf0e10cSrcweir 791cdf0e10cSrcweir case XmlShapeTypeDrawGraphicObjectShape: 792cdf0e10cSrcweir case XmlShapeTypePresGraphicObjectShape: 793cdf0e10cSrcweir { 794cdf0e10cSrcweir ImpExportGraphicObjectShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 795cdf0e10cSrcweir break; 796cdf0e10cSrcweir } 797cdf0e10cSrcweir 798cdf0e10cSrcweir case XmlShapeTypeDrawChartShape: 799cdf0e10cSrcweir case XmlShapeTypePresChartShape: 800cdf0e10cSrcweir { 801cdf0e10cSrcweir ImpExportChartShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint, pAttrList ); 802cdf0e10cSrcweir break; 803cdf0e10cSrcweir } 804cdf0e10cSrcweir 805cdf0e10cSrcweir case XmlShapeTypeDrawControlShape: 806cdf0e10cSrcweir { 807cdf0e10cSrcweir ImpExportControlShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 808cdf0e10cSrcweir break; 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir case XmlShapeTypeDrawConnectorShape: 812cdf0e10cSrcweir { 813cdf0e10cSrcweir ImpExportConnectorShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 814cdf0e10cSrcweir break; 815cdf0e10cSrcweir } 816cdf0e10cSrcweir 817cdf0e10cSrcweir case XmlShapeTypeDrawMeasureShape: 818cdf0e10cSrcweir { 819cdf0e10cSrcweir ImpExportMeasureShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 820cdf0e10cSrcweir break; 821cdf0e10cSrcweir } 822cdf0e10cSrcweir 823cdf0e10cSrcweir case XmlShapeTypeDrawOLE2Shape: 824cdf0e10cSrcweir case XmlShapeTypePresOLE2Shape: 825cdf0e10cSrcweir case XmlShapeTypeDrawSheetShape: 826cdf0e10cSrcweir case XmlShapeTypePresSheetShape: 827cdf0e10cSrcweir { 828cdf0e10cSrcweir ImpExportOLE2Shape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 829cdf0e10cSrcweir break; 830cdf0e10cSrcweir } 831cdf0e10cSrcweir 832cdf0e10cSrcweir case XmlShapeTypePresTableShape: 833cdf0e10cSrcweir case XmlShapeTypeDrawTableShape: 834cdf0e10cSrcweir { 835cdf0e10cSrcweir ImpExportTableShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 836cdf0e10cSrcweir break; 837cdf0e10cSrcweir } 838cdf0e10cSrcweir 839cdf0e10cSrcweir case XmlShapeTypeDrawPageShape: 840cdf0e10cSrcweir case XmlShapeTypePresPageShape: 841cdf0e10cSrcweir case XmlShapeTypeHandoutShape: 842cdf0e10cSrcweir { 843cdf0e10cSrcweir ImpExportPageShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 844cdf0e10cSrcweir break; 845cdf0e10cSrcweir } 846cdf0e10cSrcweir 847cdf0e10cSrcweir case XmlShapeTypeDrawCaptionShape: 848cdf0e10cSrcweir { 849cdf0e10cSrcweir ImpExportCaptionShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 850cdf0e10cSrcweir break; 851cdf0e10cSrcweir } 852cdf0e10cSrcweir 853cdf0e10cSrcweir case XmlShapeTypeDraw3DCubeObject: 854cdf0e10cSrcweir case XmlShapeTypeDraw3DSphereObject: 855cdf0e10cSrcweir case XmlShapeTypeDraw3DLatheObject: 856cdf0e10cSrcweir case XmlShapeTypeDraw3DExtrudeObject: 857cdf0e10cSrcweir { 858cdf0e10cSrcweir ImpExport3DShape(xShape, aShapeInfo.meShapeType); 859cdf0e10cSrcweir break; 860cdf0e10cSrcweir } 861cdf0e10cSrcweir 862cdf0e10cSrcweir case XmlShapeTypeDraw3DSceneObject: 863cdf0e10cSrcweir { 864cdf0e10cSrcweir ImpExport3DSceneShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 865cdf0e10cSrcweir break; 866cdf0e10cSrcweir } 867cdf0e10cSrcweir 868cdf0e10cSrcweir case XmlShapeTypeDrawGroupShape: 869cdf0e10cSrcweir { 870cdf0e10cSrcweir // empty group 871cdf0e10cSrcweir ImpExportGroupShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 872cdf0e10cSrcweir break; 873cdf0e10cSrcweir } 874cdf0e10cSrcweir 875cdf0e10cSrcweir case XmlShapeTypeDrawFrameShape: 876cdf0e10cSrcweir { 877cdf0e10cSrcweir ImpExportFrameShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 878cdf0e10cSrcweir break; 879cdf0e10cSrcweir } 880cdf0e10cSrcweir 881cdf0e10cSrcweir case XmlShapeTypeDrawAppletShape: 882cdf0e10cSrcweir { 883cdf0e10cSrcweir ImpExportAppletShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 884cdf0e10cSrcweir break; 885cdf0e10cSrcweir } 886cdf0e10cSrcweir 887cdf0e10cSrcweir case XmlShapeTypeDrawPluginShape: 888cdf0e10cSrcweir { 889cdf0e10cSrcweir ImpExportPluginShape(xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 890cdf0e10cSrcweir break; 891cdf0e10cSrcweir } 892cdf0e10cSrcweir 893cdf0e10cSrcweir case XmlShapeTypeDrawCustomShape: 894cdf0e10cSrcweir { 895cdf0e10cSrcweir if ( aShapeInfo.xCustomShapeReplacement.is() ) 896cdf0e10cSrcweir ImpExportGroupShape( aShapeInfo.xCustomShapeReplacement, XmlShapeTypeDrawGroupShape, nFeatures, pRefPoint ); 897cdf0e10cSrcweir else 898cdf0e10cSrcweir ImpExportCustomShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 899cdf0e10cSrcweir break; 900cdf0e10cSrcweir } 901cdf0e10cSrcweir 902cdf0e10cSrcweir case XmlShapeTypePresMediaShape: 903cdf0e10cSrcweir case XmlShapeTypeDrawMediaShape: 904cdf0e10cSrcweir { 905cdf0e10cSrcweir ImpExportMediaShape( xShape, aShapeInfo.meShapeType, nFeatures, pRefPoint ); 906cdf0e10cSrcweir break; 907cdf0e10cSrcweir } 908cdf0e10cSrcweir 909cdf0e10cSrcweir case XmlShapeTypePresOrgChartShape: 910cdf0e10cSrcweir case XmlShapeTypeUnknown: 911cdf0e10cSrcweir case XmlShapeTypeNotYetSet: 912cdf0e10cSrcweir default: 913cdf0e10cSrcweir { 914cdf0e10cSrcweir // this should never happen and is an error 915cdf0e10cSrcweir DBG_ERROR("XMLEXP: WriteShape: unknown or unexpected type of shape in export!"); 916cdf0e10cSrcweir break; 917cdf0e10cSrcweir } 918cdf0e10cSrcweir } 919cdf0e10cSrcweir 920cdf0e10cSrcweir mpHyperlinkElement.reset(); 921cdf0e10cSrcweir 922cdf0e10cSrcweir // #97489# #97111# 923cdf0e10cSrcweir // if there was an error and no element for the shape was exported 924cdf0e10cSrcweir // we need to clear the attribute list or the attributes will be 925cdf0e10cSrcweir // set on the next exported element, which can result in corrupt 926cdf0e10cSrcweir // xml files due to duplicate attributes 927cdf0e10cSrcweir 928cdf0e10cSrcweir mrExport.CheckAttrList(); // asserts in non pro if we have attributes left 929cdf0e10cSrcweir mrExport.ClearAttrList(); // clears the attributes 930cdf0e10cSrcweir } 931cdf0e10cSrcweir 932cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 933cdf0e10cSrcweir 934cdf0e10cSrcweir // This method collects all automatic styles for the shapes inside the given XShapes collection 935cdf0e10cSrcweir void XMLShapeExport::collectShapesAutoStyles( const uno::Reference < drawing::XShapes >& xShapes ) 936cdf0e10cSrcweir { 937cdf0e10cSrcweir ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter; 938cdf0e10cSrcweir seekShapes( xShapes ); 939cdf0e10cSrcweir 940cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 941cdf0e10cSrcweir const sal_Int32 nShapeCount(xShapes->getCount()); 942cdf0e10cSrcweir for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++) 943cdf0e10cSrcweir { 944cdf0e10cSrcweir xShapes->getByIndex(nShapeId) >>= xShape; 945cdf0e10cSrcweir DBG_ASSERT( xShape.is(), "Shape without a XShape?" ); 946cdf0e10cSrcweir if(!xShape.is()) 947cdf0e10cSrcweir continue; 948cdf0e10cSrcweir 949cdf0e10cSrcweir collectShapeAutoStyles( xShape ); 950cdf0e10cSrcweir } 951cdf0e10cSrcweir 952cdf0e10cSrcweir maCurrentShapesIter = aOldCurrentShapesIter; 953cdf0e10cSrcweir } 954cdf0e10cSrcweir 955cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 956cdf0e10cSrcweir 957cdf0e10cSrcweir // This method exports all XShape inside the given XShapes collection 958cdf0e10cSrcweir void XMLShapeExport::exportShapes( const uno::Reference < drawing::XShapes >& xShapes, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */ ) 959cdf0e10cSrcweir { 960cdf0e10cSrcweir ShapesInfos::iterator aOldCurrentShapesIter = maCurrentShapesIter; 961cdf0e10cSrcweir seekShapes( xShapes ); 962cdf0e10cSrcweir 963cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 964cdf0e10cSrcweir const sal_Int32 nShapeCount(xShapes->getCount()); 965cdf0e10cSrcweir for(sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++) 966cdf0e10cSrcweir { 967cdf0e10cSrcweir xShapes->getByIndex(nShapeId) >>= xShape; 968cdf0e10cSrcweir DBG_ASSERT( xShape.is(), "Shape without a XShape?" ); 969cdf0e10cSrcweir if(!xShape.is()) 970cdf0e10cSrcweir continue; 971cdf0e10cSrcweir 972cdf0e10cSrcweir exportShape( xShape, nFeatures, pRefPoint ); 973cdf0e10cSrcweir } 974cdf0e10cSrcweir 975cdf0e10cSrcweir maCurrentShapesIter = aOldCurrentShapesIter; 976cdf0e10cSrcweir } 977cdf0e10cSrcweir 978cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 979cdf0e10cSrcweir 980cdf0e10cSrcweir void XMLShapeExport::seekShapes( const uno::Reference< drawing::XShapes >& xShapes ) throw() 981cdf0e10cSrcweir { 982cdf0e10cSrcweir if( xShapes.is() ) 983cdf0e10cSrcweir { 984cdf0e10cSrcweir maCurrentShapesIter = maShapesInfos.find( xShapes ); 985cdf0e10cSrcweir if( maCurrentShapesIter == maShapesInfos.end() ) 986cdf0e10cSrcweir { 987cdf0e10cSrcweir ImplXMLShapeExportInfoVector aNewInfoVector; 988cdf0e10cSrcweir aNewInfoVector.resize( (ShapesInfos::size_type) xShapes->getCount() ); 989cdf0e10cSrcweir maShapesInfos[ xShapes ] = aNewInfoVector; 990cdf0e10cSrcweir 991cdf0e10cSrcweir maCurrentShapesIter = maShapesInfos.find( xShapes ); 992cdf0e10cSrcweir 993cdf0e10cSrcweir DBG_ASSERT( maCurrentShapesIter != maShapesInfos.end(), "XMLShapeExport::seekShapes(): insert into stl::map failed" ); 994cdf0e10cSrcweir } 995cdf0e10cSrcweir 996cdf0e10cSrcweir DBG_ASSERT( (*maCurrentShapesIter).second.size() == (ShapesInfos::size_type)xShapes->getCount(), "XMLShapeExport::seekShapes(): XShapes size varied between calls" ); 997cdf0e10cSrcweir 998cdf0e10cSrcweir } 999cdf0e10cSrcweir else 1000cdf0e10cSrcweir { 1001cdf0e10cSrcweir maCurrentShapesIter = maShapesInfos.end(); 1002cdf0e10cSrcweir } 1003cdf0e10cSrcweir } 1004cdf0e10cSrcweir 1005cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 1006cdf0e10cSrcweir 1007cdf0e10cSrcweir void XMLShapeExport::exportAutoStyles() 1008cdf0e10cSrcweir { 1009cdf0e10cSrcweir // export all autostyle infos 1010cdf0e10cSrcweir 1011cdf0e10cSrcweir // ...for graphic 1012cdf0e10cSrcweir // if(IsFamilyGraphicUsed()) 1013cdf0e10cSrcweir { 1014cdf0e10cSrcweir GetExport().GetAutoStylePool()->exportXML( 1015cdf0e10cSrcweir XML_STYLE_FAMILY_SD_GRAPHICS_ID 1016cdf0e10cSrcweir , GetExport().GetDocHandler(), 1017cdf0e10cSrcweir GetExport().GetMM100UnitConverter(), 1018cdf0e10cSrcweir GetExport().GetNamespaceMap() 1019cdf0e10cSrcweir ); 1020cdf0e10cSrcweir } 1021cdf0e10cSrcweir 1022cdf0e10cSrcweir // ...for presentation 1023cdf0e10cSrcweir // if(IsFamilyPresentationUsed()) 1024cdf0e10cSrcweir { 1025cdf0e10cSrcweir GetExport().GetAutoStylePool()->exportXML( 1026cdf0e10cSrcweir XML_STYLE_FAMILY_SD_PRESENTATION_ID 1027cdf0e10cSrcweir , GetExport().GetDocHandler(), 1028cdf0e10cSrcweir GetExport().GetMM100UnitConverter(), 1029cdf0e10cSrcweir GetExport().GetNamespaceMap() 1030cdf0e10cSrcweir ); 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir if( mxShapeTableExport.is() ) 1034cdf0e10cSrcweir mxShapeTableExport->exportAutoStyles(); 1035cdf0e10cSrcweir } 1036cdf0e10cSrcweir 1037cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 1038cdf0e10cSrcweir 1039cdf0e10cSrcweir /// returns the export property mapper for external chaining 1040cdf0e10cSrcweir SvXMLExportPropertyMapper* XMLShapeExport::CreateShapePropMapper( 1041cdf0e10cSrcweir SvXMLExport& rExport ) 1042cdf0e10cSrcweir { 1043cdf0e10cSrcweir UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rExport.GetModel(), rExport ); 1044cdf0e10cSrcweir UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory ); 1045cdf0e10cSrcweir SvXMLExportPropertyMapper* pResult = 1046cdf0e10cSrcweir new XMLShapeExportPropertyMapper( xMapper, 1047cdf0e10cSrcweir (XMLTextListAutoStylePool*)&rExport.GetTextParagraphExport()->GetListAutoStylePool(), 1048cdf0e10cSrcweir rExport ); 1049cdf0e10cSrcweir // chain text attributes 1050cdf0e10cSrcweir return pResult; 1051cdf0e10cSrcweir } 1052cdf0e10cSrcweir 1053cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 1054cdf0e10cSrcweir 1055cdf0e10cSrcweir void XMLShapeExport::ImpCalcShapeType(const uno::Reference< drawing::XShape >& xShape, 1056cdf0e10cSrcweir XmlShapeType& eShapeType) 1057cdf0e10cSrcweir { 1058cdf0e10cSrcweir // set in every case, so init here 1059cdf0e10cSrcweir eShapeType = XmlShapeTypeUnknown; 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir uno::Reference< drawing::XShapeDescriptor > xShapeDescriptor(xShape, uno::UNO_QUERY); 1062cdf0e10cSrcweir if(xShapeDescriptor.is()) 1063cdf0e10cSrcweir { 1064cdf0e10cSrcweir String aType((OUString)xShapeDescriptor->getShapeType()); 1065cdf0e10cSrcweir 1066cdf0e10cSrcweir if(aType.EqualsAscii((const sal_Char*)"com.sun.star.", 0, 13)) 1067cdf0e10cSrcweir { 1068cdf0e10cSrcweir if(aType.EqualsAscii("drawing.", 13, 8)) 1069cdf0e10cSrcweir { 1070cdf0e10cSrcweir // drawing shapes 1071cdf0e10cSrcweir if (aType.EqualsAscii("Rectangle", 21, 9)) { eShapeType = XmlShapeTypeDrawRectangleShape; } 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir // #i72177# Note: Correcting CustomShape, CustomShape->Custom, len from 9 (was wrong anyways) to 6. 1074cdf0e10cSrcweir // As can be seen at the other compares, the appendix "Shape" is left out of the comparison. 1075cdf0e10cSrcweir else if(aType.EqualsAscii("Custom", 21, 6)) { eShapeType = XmlShapeTypeDrawCustomShape; } 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir else if(aType.EqualsAscii("Ellipse", 21, 7)) { eShapeType = XmlShapeTypeDrawEllipseShape; } 1078cdf0e10cSrcweir else if(aType.EqualsAscii("Control", 21, 7)) { eShapeType = XmlShapeTypeDrawControlShape; } 1079cdf0e10cSrcweir else if(aType.EqualsAscii("Connector", 21, 9)) { eShapeType = XmlShapeTypeDrawConnectorShape; } 1080cdf0e10cSrcweir else if(aType.EqualsAscii("Measure", 21, 7)) { eShapeType = XmlShapeTypeDrawMeasureShape; } 1081cdf0e10cSrcweir else if(aType.EqualsAscii("Line", 21, 4)) { eShapeType = XmlShapeTypeDrawLineShape; } 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir // #i72177# Note: This covers two types by purpose, PolyPolygonShape and PolyPolygonPathShape 1084cdf0e10cSrcweir else if(aType.EqualsAscii("PolyPolygon", 21, 11)) { eShapeType = XmlShapeTypeDrawPolyPolygonShape; } 1085cdf0e10cSrcweir 1086cdf0e10cSrcweir // #i72177# Note: This covers two types by purpose, PolyLineShape and PolyLinePathShape 1087cdf0e10cSrcweir else if(aType.EqualsAscii("PolyLine", 21, 8)) { eShapeType = XmlShapeTypeDrawPolyLineShape; } 1088cdf0e10cSrcweir 1089cdf0e10cSrcweir else if(aType.EqualsAscii("OpenBezier", 21, 10)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; } 1090cdf0e10cSrcweir else if(aType.EqualsAscii("ClosedBezier", 21, 12)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; } 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir // #i72177# FreeHand (opened and closed) now supports the types OpenFreeHandShape and 1093cdf0e10cSrcweir // ClosedFreeHandShape respectively. Represent them as bezier shapes 1094cdf0e10cSrcweir else if(aType.EqualsAscii("OpenFreeHand", 21, 12)) { eShapeType = XmlShapeTypeDrawOpenBezierShape; } 1095cdf0e10cSrcweir else if(aType.EqualsAscii("ClosedFreeHand", 21, 14)) { eShapeType = XmlShapeTypeDrawClosedBezierShape; } 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir else if(aType.EqualsAscii("GraphicObject", 21, 13)) { eShapeType = XmlShapeTypeDrawGraphicObjectShape; } 1098cdf0e10cSrcweir else if(aType.EqualsAscii("Group", 21, 5)) { eShapeType = XmlShapeTypeDrawGroupShape; } 1099cdf0e10cSrcweir else if(aType.EqualsAscii("Text", 21, 4)) { eShapeType = XmlShapeTypeDrawTextShape; } 1100cdf0e10cSrcweir else if(aType.EqualsAscii("OLE2", 21, 4)) 1101cdf0e10cSrcweir { 1102cdf0e10cSrcweir eShapeType = XmlShapeTypeDrawOLE2Shape; 1103cdf0e10cSrcweir 1104cdf0e10cSrcweir // get info about presentation shape 1105cdf0e10cSrcweir uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY); 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir if(xPropSet.is()) 1108cdf0e10cSrcweir { 1109cdf0e10cSrcweir rtl::OUString sCLSID; 1110cdf0e10cSrcweir if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID) 1111cdf0e10cSrcweir { 1112cdf0e10cSrcweir if (sCLSID.equals(mrExport.GetChartExport()->getChartCLSID())) 1113cdf0e10cSrcweir { 1114cdf0e10cSrcweir eShapeType = XmlShapeTypeDrawChartShape; 1115cdf0e10cSrcweir } 1116cdf0e10cSrcweir else if ( 1117cdf0e10cSrcweir sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName())) 1118cdf0e10cSrcweir // #110680# 1119cdf0e10cSrcweir // same reaction for binfilter 1120cdf0e10cSrcweir || sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName())) 1121cdf0e10cSrcweir ) 1122cdf0e10cSrcweir { 1123cdf0e10cSrcweir eShapeType = XmlShapeTypeDrawSheetShape; 1124cdf0e10cSrcweir } 1125cdf0e10cSrcweir else 1126cdf0e10cSrcweir { 1127cdf0e10cSrcweir // general OLE2 Object 1128cdf0e10cSrcweir } 1129cdf0e10cSrcweir } 1130cdf0e10cSrcweir } 1131cdf0e10cSrcweir } 1132cdf0e10cSrcweir else if(aType.EqualsAscii("Page", 21, 4)) { eShapeType = XmlShapeTypeDrawPageShape; } 1133cdf0e10cSrcweir else if(aType.EqualsAscii("Frame", 21, 5)) { eShapeType = XmlShapeTypeDrawFrameShape; } 1134cdf0e10cSrcweir else if(aType.EqualsAscii("Caption", 21, 7)) { eShapeType = XmlShapeTypeDrawCaptionShape; } 1135cdf0e10cSrcweir else if(aType.EqualsAscii("Plugin", 21, 6)) { eShapeType = XmlShapeTypeDrawPluginShape; } 1136cdf0e10cSrcweir else if(aType.EqualsAscii("Applet", 21, 6)) { eShapeType = XmlShapeTypeDrawAppletShape; } 1137cdf0e10cSrcweir else if(aType.EqualsAscii("MediaShape", 21, 10)) { eShapeType = XmlShapeTypeDrawMediaShape; } 1138cdf0e10cSrcweir else if(aType.EqualsAscii("TableShape", 21, 10)) { eShapeType = XmlShapeTypeDrawTableShape; } 1139cdf0e10cSrcweir 1140cdf0e10cSrcweir // 3D shapes 1141cdf0e10cSrcweir else if(aType.EqualsAscii("Scene", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DSceneObject; } 1142cdf0e10cSrcweir else if(aType.EqualsAscii("Cube", 21 + 7, 4)) { eShapeType = XmlShapeTypeDraw3DCubeObject; } 1143cdf0e10cSrcweir else if(aType.EqualsAscii("Sphere", 21 + 7, 6)) { eShapeType = XmlShapeTypeDraw3DSphereObject; } 1144cdf0e10cSrcweir else if(aType.EqualsAscii("Lathe", 21 + 7, 5)) { eShapeType = XmlShapeTypeDraw3DLatheObject; } 1145cdf0e10cSrcweir else if(aType.EqualsAscii("Extrude", 21 + 7, 7)) { eShapeType = XmlShapeTypeDraw3DExtrudeObject; } 1146cdf0e10cSrcweir } 1147cdf0e10cSrcweir else if(aType.EqualsAscii("presentation.", 13, 13)) 1148cdf0e10cSrcweir { 1149cdf0e10cSrcweir // presentation shapes 1150cdf0e10cSrcweir if (aType.EqualsAscii("TitleText", 26, 9)) { eShapeType = XmlShapeTypePresTitleTextShape; } 1151cdf0e10cSrcweir else if(aType.EqualsAscii("Outliner", 26, 8)) { eShapeType = XmlShapeTypePresOutlinerShape; } 1152cdf0e10cSrcweir else if(aType.EqualsAscii("Subtitle", 26, 8)) { eShapeType = XmlShapeTypePresSubtitleShape; } 1153cdf0e10cSrcweir else if(aType.EqualsAscii("GraphicObject", 26, 13)) { eShapeType = XmlShapeTypePresGraphicObjectShape; } 1154cdf0e10cSrcweir else if(aType.EqualsAscii("Page", 26, 4)) { eShapeType = XmlShapeTypePresPageShape; } 1155cdf0e10cSrcweir else if(aType.EqualsAscii("OLE2", 26, 4)) 1156cdf0e10cSrcweir { 1157cdf0e10cSrcweir eShapeType = XmlShapeTypePresOLE2Shape; 1158cdf0e10cSrcweir 1159cdf0e10cSrcweir // get info about presentation shape 1160cdf0e10cSrcweir uno::Reference <beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY); 1161cdf0e10cSrcweir 1162cdf0e10cSrcweir if(xPropSet.is()) try 1163cdf0e10cSrcweir { 1164cdf0e10cSrcweir rtl::OUString sCLSID; 1165cdf0e10cSrcweir if(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sCLSID) 1166cdf0e10cSrcweir { 1167cdf0e10cSrcweir if( sCLSID.equals(rtl::OUString( SvGlobalName( SO3_SC_CLASSID ).GetHexName())) || 1168cdf0e10cSrcweir sCLSID.equals(rtl::OUString( SvGlobalName( BF_SO3_SC_CLASSID ).GetHexName())) ) 1169cdf0e10cSrcweir { 1170cdf0e10cSrcweir eShapeType = XmlShapeTypePresSheetShape; 1171cdf0e10cSrcweir } 1172cdf0e10cSrcweir } 1173cdf0e10cSrcweir } 1174cdf0e10cSrcweir catch( uno::Exception& ) 1175cdf0e10cSrcweir { 1176cdf0e10cSrcweir DBG_ERROR( "XMLShapeExport::ImpCalcShapeType(), expected ole shape to have the CLSID property?" ); 1177cdf0e10cSrcweir } 1178cdf0e10cSrcweir } 1179cdf0e10cSrcweir else if(aType.EqualsAscii("Chart", 26, 5)) { eShapeType = XmlShapeTypePresChartShape; } 1180cdf0e10cSrcweir else if(aType.EqualsAscii("OrgChart", 26, 8)) { eShapeType = XmlShapeTypePresOrgChartShape; } 1181cdf0e10cSrcweir else if(aType.EqualsAscii("CalcShape", 26, 9)) { eShapeType = XmlShapeTypePresSheetShape; } 1182cdf0e10cSrcweir else if(aType.EqualsAscii("TableShape", 26, 10)) { eShapeType = XmlShapeTypePresTableShape; } 1183cdf0e10cSrcweir else if(aType.EqualsAscii("Notes", 26, 5)) { eShapeType = XmlShapeTypePresNotesShape; } 1184cdf0e10cSrcweir else if(aType.EqualsAscii("HandoutShape", 26, 12)) { eShapeType = XmlShapeTypeHandoutShape; } 1185cdf0e10cSrcweir else if(aType.EqualsAscii("HeaderShape", 26, 11)) { eShapeType = XmlShapeTypePresHeaderShape; } 1186cdf0e10cSrcweir else if(aType.EqualsAscii("FooterShape", 26, 11)) { eShapeType = XmlShapeTypePresFooterShape; } 1187cdf0e10cSrcweir else if(aType.EqualsAscii("SlideNumberShape", 26, 16)) { eShapeType = XmlShapeTypePresSlideNumberShape; } 1188cdf0e10cSrcweir else if(aType.EqualsAscii("DateTimeShape", 26, 13)) { eShapeType = XmlShapeTypePresDateTimeShape; } 1189cdf0e10cSrcweir else if(aType.EqualsAscii("MediaShape", 26, 10)) { eShapeType = XmlShapeTypePresMediaShape; } 1190cdf0e10cSrcweir } 1191cdf0e10cSrcweir } 1192cdf0e10cSrcweir } 1193cdf0e10cSrcweir } 1194cdf0e10cSrcweir 1195cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 1196cdf0e10cSrcweir 1197cdf0e10cSrcweir extern SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[]; 1198cdf0e10cSrcweir extern SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[]; 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir /** exports all user defined glue points */ 1201cdf0e10cSrcweir void XMLShapeExport::ImpExportGluePoints( const uno::Reference< drawing::XShape >& xShape ) 1202cdf0e10cSrcweir { 1203cdf0e10cSrcweir uno::Reference< drawing::XGluePointsSupplier > xSupplier( xShape, uno::UNO_QUERY ); 1204cdf0e10cSrcweir if( !xSupplier.is() ) 1205cdf0e10cSrcweir return; 1206cdf0e10cSrcweir 1207cdf0e10cSrcweir uno::Reference< container::XIdentifierAccess > xGluePoints( xSupplier->getGluePoints(), uno::UNO_QUERY ); 1208cdf0e10cSrcweir if( !xGluePoints.is() ) 1209cdf0e10cSrcweir return; 1210cdf0e10cSrcweir 1211cdf0e10cSrcweir drawing::GluePoint2 aGluePoint; 1212cdf0e10cSrcweir 1213cdf0e10cSrcweir uno::Sequence< sal_Int32 > aIdSequence( xGluePoints->getIdentifiers() ); 1214cdf0e10cSrcweir 1215cdf0e10cSrcweir const sal_Int32 nCount = aIdSequence.getLength(); 1216cdf0e10cSrcweir for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) 1217cdf0e10cSrcweir { 1218cdf0e10cSrcweir const sal_Int32 nIdentifier = aIdSequence[nIndex]; 1219cdf0e10cSrcweir if( (xGluePoints->getByIdentifier( nIdentifier ) >>= aGluePoint) && aGluePoint.IsUserDefined ) 1220cdf0e10cSrcweir { 1221cdf0e10cSrcweir // export only user defined glue points 1222cdf0e10cSrcweir 1223cdf0e10cSrcweir const OUString sId( OUString::valueOf( nIdentifier ) ); 1224cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_ID, sId ); 1225cdf0e10cSrcweir 1226cdf0e10cSrcweir mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.X); 1227cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X, msBuffer.makeStringAndClear()); 1228cdf0e10cSrcweir 1229cdf0e10cSrcweir mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aGluePoint.Position.Y); 1230cdf0e10cSrcweir mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y, msBuffer.makeStringAndClear()); 1231cdf0e10cSrcweir 1232cdf0e10cSrcweir if( !aGluePoint.IsRelative ) 1233cdf0e10cSrcweir { 1234cdf0e10cSrcweir SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.PositionAlignment, aXML_GlueAlignment_EnumMap ); 1235cdf0e10cSrcweir mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ALIGN, msBuffer.makeStringAndClear() ); 1236cdf0e10cSrcweir } 1237cdf0e10cSrcweir 1238cdf0e10cSrcweir if( aGluePoint.Escape != drawing::EscapeDirection_SMART ) 1239cdf0e10cSrcweir { 1240cdf0e10cSrcweir SvXMLUnitConverter::convertEnum( msBuffer, aGluePoint.Escape, aXML_GlueEscapeDirection_EnumMap ); 1241cdf0e10cSrcweir mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_ESCAPE_DIRECTION, msBuffer.makeStringAndClear() ); 1242cdf0e10cSrcweir } 1243cdf0e10cSrcweir 1244cdf0e10cSrcweir SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_DRAW, XML_GLUE_POINT, sal_True, sal_True); 1245cdf0e10cSrcweir } 1246cdf0e10cSrcweir } 1247cdf0e10cSrcweir } 1248cdf0e10cSrcweir 1249cdf0e10cSrcweir void XMLShapeExport::ExportGraphicDefaults() 1250cdf0e10cSrcweir { 1251cdf0e10cSrcweir XMLStyleExport aStEx(mrExport, OUString(), mrExport.GetAutoStylePool().get()); 1252cdf0e10cSrcweir 1253cdf0e10cSrcweir // construct PropertySetMapper 1254cdf0e10cSrcweir UniReference< SvXMLExportPropertyMapper > xPropertySetMapper( CreateShapePropMapper( mrExport ) ); 1255cdf0e10cSrcweir ((XMLShapeExportPropertyMapper*)xPropertySetMapper.get())->SetAutoStyles( sal_False ); 1256cdf0e10cSrcweir 1257cdf0e10cSrcweir // chain text attributes 1258cdf0e10cSrcweir xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(mrExport)); 1259cdf0e10cSrcweir 1260cdf0e10cSrcweir // chain special Writer/text frame default attributes 1261cdf0e10cSrcweir xPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaDefaultExtPropMapper(mrExport)); 1262cdf0e10cSrcweir 1263cdf0e10cSrcweir // write graphic family default style 1264cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xFact( mrExport.GetModel(), uno::UNO_QUERY ); 1265cdf0e10cSrcweir if( xFact.is() ) 1266cdf0e10cSrcweir { 1267cdf0e10cSrcweir try 1268cdf0e10cSrcweir { 1269cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xDefaults( xFact->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.Defaults") ) ), uno::UNO_QUERY ); 1270cdf0e10cSrcweir if( xDefaults.is() ) 1271cdf0e10cSrcweir { 1272cdf0e10cSrcweir aStEx.exportDefaultStyle( xDefaults, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper ); 1273cdf0e10cSrcweir 1274cdf0e10cSrcweir // write graphic family styles 1275cdf0e10cSrcweir aStEx.exportStyleFamily("graphics", OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_SD_GRAPHICS_NAME)), xPropertySetMapper, sal_False, XML_STYLE_FAMILY_SD_GRAPHICS_ID); 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir } 1278cdf0e10cSrcweir catch( lang::ServiceNotRegisteredException& ) 1279cdf0e10cSrcweir { 1280cdf0e10cSrcweir } 1281cdf0e10cSrcweir } 1282cdf0e10cSrcweir } 1283cdf0e10cSrcweir 1284cdf0e10cSrcweir void XMLShapeExport::onExport( const com::sun::star::uno::Reference < com::sun::star::drawing::XShape >& ) 1285cdf0e10cSrcweir { 1286cdf0e10cSrcweir } 1287cdf0e10cSrcweir 1288cdf0e10cSrcweir const rtl::Reference< XMLTableExport >& XMLShapeExport::GetShapeTableExport() 1289cdf0e10cSrcweir { 1290cdf0e10cSrcweir if( !mxShapeTableExport.is() ) 1291cdf0e10cSrcweir { 1292cdf0e10cSrcweir rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrExport.GetModel(), mrExport ) ); 1293cdf0e10cSrcweir UniReference < XMLPropertySetMapper > xMapper( new XMLShapePropertySetMapper( xFactory.get() ) ); 1294cdf0e10cSrcweir rtl::Reference< SvXMLExportPropertyMapper > xPropertySetMapper( new XMLShapeExportPropertyMapper( xMapper, (XMLTextListAutoStylePool*)&mrExport.GetTextParagraphExport()->GetListAutoStylePool(), mrExport ) ); 1295cdf0e10cSrcweir mxShapeTableExport = new XMLTableExport( mrExport, xPropertySetMapper, xFactory ); 1296cdf0e10cSrcweir } 1297cdf0e10cSrcweir 1298cdf0e10cSrcweir return mxShapeTableExport; 1299cdf0e10cSrcweir } 1300