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 22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 23cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 24cdf0e10cSrcweir 25cdf0e10cSrcweir #include <tools/debug.hxx> 26cdf0e10cSrcweir #include <com/sun/star/document/XEventsSupplier.hpp> 27cdf0e10cSrcweir #include <com/sun/star/container/XNameReplace.hpp> 28cdf0e10cSrcweir #include <com/sun/star/presentation/ClickAction.hpp> 29cdf0e10cSrcweir #include <com/sun/star/drawing/FillStyle.hpp> 30cdf0e10cSrcweir #include <com/sun/star/drawing/LineStyle.hpp> 31cdf0e10cSrcweir #include "unointerfacetouniqueidentifiermapper.hxx" 32cdf0e10cSrcweir #include <com/sun/star/drawing/XGluePointsSupplier.hpp> 33cdf0e10cSrcweir #include <com/sun/star/container/XIdentifierAccess.hpp> 34cdf0e10cSrcweir #include <com/sun/star/drawing/GluePoint2.hpp> 35cdf0e10cSrcweir #include <com/sun/star/drawing/Alignment.hpp> 36cdf0e10cSrcweir #include <com/sun/star/drawing/EscapeDirection.hpp> 37cdf0e10cSrcweir #include <com/sun/star/media/ZoomLevel.hpp> 38cdf0e10cSrcweir #include <com/sun/star/awt/Rectangle.hpp> 39cdf0e10cSrcweir #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> 40cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 41cdf0e10cSrcweir #include <comphelper/extract.hxx> 42cdf0e10cSrcweir #include "ximpshap.hxx" 43cdf0e10cSrcweir #include <xmloff/XMLBase64ImportContext.hxx> 44cdf0e10cSrcweir #include <xmloff/XMLShapeStyleContext.hxx> 45cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 46cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp> 47cdf0e10cSrcweir #include <com/sun/star/drawing/CircleKind.hpp> 48cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 49cdf0e10cSrcweir #include <com/sun/star/awt/XControlModel.hpp> 50cdf0e10cSrcweir #include <com/sun/star/drawing/XControlShape.hpp> 51cdf0e10cSrcweir #include <com/sun/star/drawing/PointSequenceSequence.hpp> 52cdf0e10cSrcweir #include <com/sun/star/drawing/PointSequence.hpp> 53cdf0e10cSrcweir #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> 54cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp> 55cdf0e10cSrcweir #include <com/sun/star/util/XCloneable.hpp> 56cdf0e10cSrcweir #include <com/sun/star/beans/XMultiPropertyStates.hpp> 57cdf0e10cSrcweir #include "xexptran.hxx" 58cdf0e10cSrcweir #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> 59cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySetInfo.hpp> 60cdf0e10cSrcweir #include <com/sun/star/drawing/ConnectorType.hpp> 61cdf0e10cSrcweir #include <com/sun/star/drawing/HomogenMatrix3.hpp> 62cdf0e10cSrcweir #include "PropertySetMerger.hxx" 63cdf0e10cSrcweir #include <xmloff/families.hxx> 64cdf0e10cSrcweir #include "ximpstyl.hxx" 65cdf0e10cSrcweir #include"xmloff/xmlnmspe.hxx" 66cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 67cdf0e10cSrcweir #include "EnhancedCustomShapeToken.hxx" 68cdf0e10cSrcweir #include "XMLReplacementImageContext.hxx" 69cdf0e10cSrcweir #include "XMLImageMapContext.hxx" 70cdf0e10cSrcweir #include "sdpropls.hxx" 71cdf0e10cSrcweir #include "eventimp.hxx" 72cdf0e10cSrcweir #include "descriptionimp.hxx" 73cdf0e10cSrcweir #include "ximpcustomshape.hxx" 74cdf0e10cSrcweir #include "XMLEmbeddedObjectImportContext.hxx" 75cdf0e10cSrcweir #include "xmloff/xmlerror.hxx" 76cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx> 77cdf0e10cSrcweir #include <tools/string.hxx> 78cdf0e10cSrcweir #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp> 79ddde725dSArmin Le Grand #include <com/sun/star/container/XChild.hpp> 80cdf0e10cSrcweir #include <com/sun/star/text/XTextDocument.hpp> 816381da86SArmin Le Grand #include <basegfx/vector/b2dvector.hxx> 82242c6546SArmin Le Grand #include <basegfx/point/b2dpoint.hxx> 831f882ec4SArmin Le Grand #include <basegfx/polygon/b2dpolygon.hxx> 841f882ec4SArmin Le Grand #include <basegfx/polygon/b2dpolygontools.hxx> 851f882ec4SArmin Le Grand #include <basegfx/polygon/b2dpolypolygontools.hxx> 861f882ec4SArmin Le Grand #include <basegfx/matrix/b2dhommatrixtools.hxx> 87cdf0e10cSrcweir 88cdf0e10cSrcweir using ::rtl::OUString; 89cdf0e10cSrcweir using ::rtl::OUStringBuffer; 90cdf0e10cSrcweir 91cdf0e10cSrcweir using namespace ::com::sun::star; 92cdf0e10cSrcweir using namespace ::com::sun::star::uno; 93cdf0e10cSrcweir using namespace ::com::sun::star::drawing; 94cdf0e10cSrcweir using namespace ::com::sun::star::style; 95cdf0e10cSrcweir using namespace ::com::sun::star::container; 96cdf0e10cSrcweir using namespace ::com::sun::star::document; 97cdf0e10cSrcweir using namespace ::xmloff::token; 98cdf0e10cSrcweir using namespace ::xmloff::EnhancedCustomShapeToken; 99cdf0e10cSrcweir 100cdf0e10cSrcweir SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[] = 101cdf0e10cSrcweir { 102cdf0e10cSrcweir { XML_TOP_LEFT, drawing::Alignment_TOP_LEFT }, 103cdf0e10cSrcweir { XML_TOP, drawing::Alignment_TOP }, 104cdf0e10cSrcweir { XML_TOP_RIGHT, drawing::Alignment_TOP_RIGHT }, 105cdf0e10cSrcweir { XML_LEFT, drawing::Alignment_LEFT }, 106cdf0e10cSrcweir { XML_CENTER, drawing::Alignment_CENTER }, 107cdf0e10cSrcweir { XML_RIGHT, drawing::Alignment_RIGHT }, 108cdf0e10cSrcweir { XML_BOTTOM_LEFT, drawing::Alignment_BOTTOM_LEFT }, 109cdf0e10cSrcweir { XML_BOTTOM, drawing::Alignment_BOTTOM }, 110cdf0e10cSrcweir { XML_BOTTOM_RIGHT, drawing::Alignment_BOTTOM_RIGHT }, 111cdf0e10cSrcweir { XML_TOKEN_INVALID, 0 } 112cdf0e10cSrcweir }; 113cdf0e10cSrcweir 114cdf0e10cSrcweir SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[] = 115cdf0e10cSrcweir { 116cdf0e10cSrcweir { XML_AUTO, drawing::EscapeDirection_SMART }, 117cdf0e10cSrcweir { XML_LEFT, drawing::EscapeDirection_LEFT }, 118cdf0e10cSrcweir { XML_RIGHT, drawing::EscapeDirection_RIGHT }, 119cdf0e10cSrcweir { XML_UP, drawing::EscapeDirection_UP }, 120cdf0e10cSrcweir { XML_DOWN, drawing::EscapeDirection_DOWN }, 121cdf0e10cSrcweir { XML_HORIZONTAL, drawing::EscapeDirection_HORIZONTAL }, 122cdf0e10cSrcweir { XML_VERTICAL, drawing::EscapeDirection_VERTICAL }, 123cdf0e10cSrcweir { XML_TOKEN_INVALID, 0 } 124cdf0e10cSrcweir }; 125cdf0e10cSrcweir 126cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 127cdf0e10cSrcweir 128cdf0e10cSrcweir static bool ImpIsEmptyURL( const ::rtl::OUString& rURL ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir if( rURL.getLength() == 0 ) 131cdf0e10cSrcweir return true; 132cdf0e10cSrcweir 133cdf0e10cSrcweir // #i13140# Also compare against 'toplevel' URLs. which also 134cdf0e10cSrcweir // result in empty filename strings. 135cdf0e10cSrcweir if( 0 == rURL.compareToAscii( "#./" ) ) 136cdf0e10cSrcweir return true; 137cdf0e10cSrcweir 138cdf0e10cSrcweir return false; 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 142cdf0e10cSrcweir 143cdf0e10cSrcweir TYPEINIT1( SvXMLShapeContext, SvXMLImportContext ); 144cdf0e10cSrcweir TYPEINIT1( SdXMLShapeContext, SvXMLShapeContext ); 145cdf0e10cSrcweir 146cdf0e10cSrcweir SdXMLShapeContext::SdXMLShapeContext( 147cdf0e10cSrcweir SvXMLImport& rImport, 148cdf0e10cSrcweir sal_uInt16 nPrfx, 149cdf0e10cSrcweir const OUString& rLocalName, 150cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 151cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 152cdf0e10cSrcweir sal_Bool bTemporaryShape) 153cdf0e10cSrcweir : SvXMLShapeContext( rImport, nPrfx, rLocalName, bTemporaryShape ) 154cdf0e10cSrcweir , mxShapes( rShapes ) 155cdf0e10cSrcweir , mxAttrList(xAttrList) 156cdf0e10cSrcweir , mbListContextPushed( false ) 157cdf0e10cSrcweir , mnStyleFamily(XML_STYLE_FAMILY_SD_GRAPHICS_ID) 158cdf0e10cSrcweir , mbIsPlaceholder(sal_False) 159cdf0e10cSrcweir , mbClearDefaultAttributes( true ) 160cdf0e10cSrcweir , mbIsUserTransformed(sal_False) 161cdf0e10cSrcweir , mnZOrder(-1) 162cdf0e10cSrcweir , maSize(1, 1) 163cdf0e10cSrcweir , maPosition(0, 0) 1646381da86SArmin Le Grand , maUsedTransformation() 165cdf0e10cSrcweir , mbVisible(true) 166cdf0e10cSrcweir , mbPrintable(true) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 171cdf0e10cSrcweir 172cdf0e10cSrcweir SdXMLShapeContext::~SdXMLShapeContext() 173cdf0e10cSrcweir { 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 177cdf0e10cSrcweir 178cdf0e10cSrcweir SvXMLImportContext *SdXMLShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, 179cdf0e10cSrcweir const OUString& rLocalName, 180cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList>& xAttrList ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir SvXMLImportContext * pContext = NULL; 183cdf0e10cSrcweir 184cdf0e10cSrcweir // #i68101# 185cdf0e10cSrcweir if( p_nPrefix == XML_NAMESPACE_SVG && 186cdf0e10cSrcweir (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) 187cdf0e10cSrcweir { 188cdf0e10cSrcweir pContext = new SdXMLDescriptionContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape ); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir else if( p_nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir pContext = new SdXMLEventsContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape ); 193cdf0e10cSrcweir } 194cdf0e10cSrcweir else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_GLUE_POINT ) ) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir addGluePoint( xAttrList ); 197cdf0e10cSrcweir } 198cdf0e10cSrcweir else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_THUMBNAIL ) ) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir // search attributes for xlink:href 201cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 202cdf0e10cSrcweir for(sal_Int16 i=0; i < nAttrCount; i++) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 205cdf0e10cSrcweir OUString aLocalName; 206cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 207cdf0e10cSrcweir 208cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_XLINK ) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_HREF ) ) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir maThumbnailURL = xAttrList->getValueByIndex( i ); 213cdf0e10cSrcweir break; 214cdf0e10cSrcweir } 215cdf0e10cSrcweir } 216cdf0e10cSrcweir } 217cdf0e10cSrcweir } 218cdf0e10cSrcweir else 219cdf0e10cSrcweir { 220cdf0e10cSrcweir // create text cursor on demand 221cdf0e10cSrcweir if( !mxCursor.is() ) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY ); 224cdf0e10cSrcweir if( xText.is() ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir UniReference < XMLTextImportHelper > xTxtImport = 227cdf0e10cSrcweir GetImport().GetTextImport(); 228cdf0e10cSrcweir mxOldCursor = xTxtImport->GetCursor(); 229cdf0e10cSrcweir mxCursor = xText->createTextCursor(); 230cdf0e10cSrcweir if( mxCursor.is() ) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir xTxtImport->SetCursor( mxCursor ); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 235cdf0e10cSrcweir // remember old list item and block (#91964#) and reset them 236cdf0e10cSrcweir // for the text frame 237cdf0e10cSrcweir xTxtImport->PushListContext(); 238cdf0e10cSrcweir mbListContextPushed = true; 239cdf0e10cSrcweir } 240cdf0e10cSrcweir } 241cdf0e10cSrcweir 242cdf0e10cSrcweir // if we have a text cursor, lets try to import some text 243cdf0e10cSrcweir if( mxCursor.is() ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir pContext = GetImport().GetTextImport()->CreateTextChildContext( 246cdf0e10cSrcweir GetImport(), p_nPrefix, rLocalName, xAttrList ); 247cdf0e10cSrcweir } 248cdf0e10cSrcweir } 249cdf0e10cSrcweir 250cdf0e10cSrcweir // call parent for content 251cdf0e10cSrcweir if(!pContext) 252cdf0e10cSrcweir pContext = SvXMLImportContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList ); 253cdf0e10cSrcweir 254cdf0e10cSrcweir return pContext; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir void SdXMLShapeContext::addGluePoint( const uno::Reference< xml::sax::XAttributeList>& xAttrList ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir // get the glue points container for this shape if its not already there 260cdf0e10cSrcweir if( !mxGluePoints.is() ) 261cdf0e10cSrcweir { 262cdf0e10cSrcweir uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY ); 263cdf0e10cSrcweir if( !xSupplier.is() ) 264cdf0e10cSrcweir return; 265cdf0e10cSrcweir 266cdf0e10cSrcweir mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() ); 267cdf0e10cSrcweir 268cdf0e10cSrcweir if( !mxGluePoints.is() ) 269cdf0e10cSrcweir return; 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir drawing::GluePoint2 aGluePoint; 273cdf0e10cSrcweir aGluePoint.IsUserDefined = sal_True; 274cdf0e10cSrcweir aGluePoint.Position.X = 0; 275cdf0e10cSrcweir aGluePoint.Position.Y = 0; 276cdf0e10cSrcweir aGluePoint.Escape = drawing::EscapeDirection_SMART; 277cdf0e10cSrcweir aGluePoint.PositionAlignment = drawing::Alignment_CENTER; 278cdf0e10cSrcweir aGluePoint.IsRelative = sal_True; 279cdf0e10cSrcweir 280cdf0e10cSrcweir sal_Int32 nId = -1; 281cdf0e10cSrcweir 282cdf0e10cSrcweir // read attributes for the 3DScene 283cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 284cdf0e10cSrcweir for(sal_Int16 i=0; i < nAttrCount; i++) 285cdf0e10cSrcweir { 286cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 287cdf0e10cSrcweir OUString aLocalName; 288cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 289cdf0e10cSrcweir const OUString sValue( xAttrList->getValueByIndex( i ) ); 290cdf0e10cSrcweir 291cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_SVG ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_X ) ) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.X, sValue); 296cdf0e10cSrcweir } 297cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_Y ) ) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.Y, sValue); 300cdf0e10cSrcweir } 301cdf0e10cSrcweir } 302cdf0e10cSrcweir else if( nPrefix == XML_NAMESPACE_DRAW ) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_ID ) ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir nId = sValue.toInt32(); 307cdf0e10cSrcweir } 308cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_ALIGN ) ) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir sal_uInt16 eKind; 311cdf0e10cSrcweir if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueAlignment_EnumMap ) ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir aGluePoint.PositionAlignment = (drawing::Alignment)eKind; 314cdf0e10cSrcweir aGluePoint.IsRelative = sal_False; 315cdf0e10cSrcweir } 316cdf0e10cSrcweir } 317cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_ESCAPE_DIRECTION ) ) 318cdf0e10cSrcweir { 319cdf0e10cSrcweir sal_uInt16 eKind; 320cdf0e10cSrcweir if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueEscapeDirection_EnumMap ) ) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir aGluePoint.Escape = (drawing::EscapeDirection)eKind; 323cdf0e10cSrcweir } 324cdf0e10cSrcweir } 325cdf0e10cSrcweir } 326cdf0e10cSrcweir } 327cdf0e10cSrcweir 328cdf0e10cSrcweir if( nId != -1 ) 329cdf0e10cSrcweir { 330cdf0e10cSrcweir try 331cdf0e10cSrcweir { 332cdf0e10cSrcweir sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aGluePoint ) ); 333cdf0e10cSrcweir GetImport().GetShapeImport()->addGluePointMapping( mxShape, nId, nInternalId ); 334cdf0e10cSrcweir } 335cdf0e10cSrcweir catch( uno::Exception& ) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir DBG_ERROR( "exception during setting of glue points!"); 338cdf0e10cSrcweir } 339cdf0e10cSrcweir } 340cdf0e10cSrcweir } 341cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 342cdf0e10cSrcweir 343cdf0e10cSrcweir void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir 348cdf0e10cSrcweir void SdXMLShapeContext::EndElement() 349cdf0e10cSrcweir { 350cdf0e10cSrcweir if(mxCursor.is()) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir // delete addition newline 353cdf0e10cSrcweir const OUString aEmpty; 354cdf0e10cSrcweir mxCursor->gotoEnd( sal_False ); 355cdf0e10cSrcweir mxCursor->goLeft( 1, sal_True ); 356cdf0e10cSrcweir mxCursor->setString( aEmpty ); 357cdf0e10cSrcweir 358cdf0e10cSrcweir // reset cursor 359cdf0e10cSrcweir GetImport().GetTextImport()->ResetCursor(); 360cdf0e10cSrcweir } 361cdf0e10cSrcweir 362cdf0e10cSrcweir if(mxOldCursor.is()) 363cdf0e10cSrcweir GetImport().GetTextImport()->SetCursor( mxOldCursor ); 364cdf0e10cSrcweir 365cdf0e10cSrcweir // reinstall old list item (if necessary) #91964# 366cdf0e10cSrcweir if (mbListContextPushed) { 367cdf0e10cSrcweir GetImport().GetTextImport()->PopListContext(); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir if( msHyperlink.getLength() != 0 ) try 371cdf0e10cSrcweir { 372cdf0e10cSrcweir const OUString sBookmark( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) ); 373cdf0e10cSrcweir 374cdf0e10cSrcweir Reference< XEventsSupplier > xEventsSupplier( mxShape, UNO_QUERY ); 375cdf0e10cSrcweir if( xEventsSupplier.is() ) 376cdf0e10cSrcweir { 377cdf0e10cSrcweir const OUString sEventType( RTL_CONSTASCII_USTRINGPARAM( "EventType" ) ); 378cdf0e10cSrcweir const OUString sClickAction( RTL_CONSTASCII_USTRINGPARAM( "ClickAction" ) ); 379cdf0e10cSrcweir 380cdf0e10cSrcweir Reference< XNameReplace > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW ); 381cdf0e10cSrcweir 382cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aProperties( 3 ); 383cdf0e10cSrcweir aProperties[0].Name = sEventType; 384cdf0e10cSrcweir aProperties[0].Handle = -1; 385cdf0e10cSrcweir aProperties[0].Value <<= OUString( RTL_CONSTASCII_USTRINGPARAM("Presentation") ); 386cdf0e10cSrcweir aProperties[0].State = beans::PropertyState_DIRECT_VALUE; 387cdf0e10cSrcweir 388cdf0e10cSrcweir aProperties[1].Name = sClickAction; 389cdf0e10cSrcweir aProperties[1].Handle = -1; 390cdf0e10cSrcweir aProperties[1].Value <<= ::com::sun::star::presentation::ClickAction_DOCUMENT; 391cdf0e10cSrcweir aProperties[1].State = beans::PropertyState_DIRECT_VALUE; 392cdf0e10cSrcweir 393cdf0e10cSrcweir aProperties[2].Name = sBookmark; 394cdf0e10cSrcweir aProperties[2].Handle = -1; 395cdf0e10cSrcweir aProperties[2].Value <<= msHyperlink; 396cdf0e10cSrcweir aProperties[2].State = beans::PropertyState_DIRECT_VALUE; 397cdf0e10cSrcweir 398cdf0e10cSrcweir const OUString sAPIEventName( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ); 399cdf0e10cSrcweir xEvents->replaceByName( sAPIEventName, Any( aProperties ) ); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir else 402cdf0e10cSrcweir { 403cdf0e10cSrcweir // in draw use the Bookmark property 404cdf0e10cSrcweir Reference< beans::XPropertySet > xSet( mxShape, UNO_QUERY_THROW ); 405cdf0e10cSrcweir xSet->setPropertyValue( sBookmark, Any( msHyperlink ) ); 406cdf0e10cSrcweir xSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ), Any( ::com::sun::star::presentation::ClickAction_DOCUMENT ) ); 407cdf0e10cSrcweir } 408cdf0e10cSrcweir } 409cdf0e10cSrcweir catch( Exception& ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir DBG_ERROR("xmloff::SdXMLShapeContext::EndElement(), exception caught while setting hyperlink!"); 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir if( mxLockable.is() ) 415cdf0e10cSrcweir mxLockable->removeActionLock(); 416cdf0e10cSrcweir } 417cdf0e10cSrcweir 418cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 419cdf0e10cSrcweir 420cdf0e10cSrcweir void SdXMLShapeContext::AddShape(uno::Reference< drawing::XShape >& xShape) 421cdf0e10cSrcweir { 422cdf0e10cSrcweir if(xShape.is()) 423cdf0e10cSrcweir { 424cdf0e10cSrcweir // set shape local 425cdf0e10cSrcweir mxShape = xShape; 426cdf0e10cSrcweir 427cdf0e10cSrcweir if(maShapeName.getLength()) 428cdf0e10cSrcweir { 429cdf0e10cSrcweir uno::Reference< container::XNamed > xNamed( mxShape, uno::UNO_QUERY ); 430cdf0e10cSrcweir if( xNamed.is() ) 431cdf0e10cSrcweir xNamed->setName( maShapeName ); 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir UniReference< XMLShapeImportHelper > xImp( GetImport().GetShapeImport() ); 435cdf0e10cSrcweir xImp->addShape( xShape, mxAttrList, mxShapes ); 436cdf0e10cSrcweir 437cdf0e10cSrcweir if( mbClearDefaultAttributes ) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir uno::Reference<beans::XMultiPropertyStates> xMultiPropertyStates(xShape, uno::UNO_QUERY ); 440cdf0e10cSrcweir if (xMultiPropertyStates.is()) 441cdf0e10cSrcweir xMultiPropertyStates->setAllPropertiesToDefault(); 442cdf0e10cSrcweir } 443cdf0e10cSrcweir 444cdf0e10cSrcweir if( !mbVisible || !mbPrintable ) try 445cdf0e10cSrcweir { 446cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY_THROW ); 447cdf0e10cSrcweir if( !mbVisible ) 448cdf0e10cSrcweir xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ), uno::Any( sal_False ) ); 449cdf0e10cSrcweir 450cdf0e10cSrcweir if( !mbPrintable ) 451cdf0e10cSrcweir xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Printable" ) ), uno::Any( sal_False ) ); 452cdf0e10cSrcweir } 453cdf0e10cSrcweir catch( Exception& ) 454cdf0e10cSrcweir { 455cdf0e10cSrcweir DBG_ERROR( "SdXMLShapeContext::AddShape(), exception caught!" ); 456cdf0e10cSrcweir } 457cdf0e10cSrcweir 458cdf0e10cSrcweir // #107848# 459cdf0e10cSrcweir if(!mbTemporaryShape && (!GetImport().HasTextImport() 460cdf0e10cSrcweir || !GetImport().GetTextImport()->IsInsideDeleteContext())) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir xImp->shapeWithZIndexAdded( xShape, mnZOrder ); 463cdf0e10cSrcweir } 464cdf0e10cSrcweir 465cdf0e10cSrcweir if( maShapeId.getLength() ) 466cdf0e10cSrcweir { 467598d8f9fSArmin Le Grand const SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(this); 468598d8f9fSArmin Le Grand 469598d8f9fSArmin Le Grand /* avoid registering when LateRegister is needed. E.g. MultiImage support where in-between multiple 470598d8f9fSArmin Le Grand xShapes with the same ID would be registered. Registration is done after deciding which image 471598d8f9fSArmin Le Grand to keep, see calls to solveMultipleImages */ 472598d8f9fSArmin Le Grand if(!pGSC || !pGSC->getLateAddToIdentifierMapper()) 473598d8f9fSArmin Le Grand { 474cdf0e10cSrcweir uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY ); 475cdf0e10cSrcweir GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef ); 476cdf0e10cSrcweir } 477598d8f9fSArmin Le Grand } 478cdf0e10cSrcweir 479cdf0e10cSrcweir // #91065# count only if counting for shape import is enabled 480cdf0e10cSrcweir if(GetImport().GetShapeImport()->IsHandleProgressBarEnabled()) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir // #80365# increment progress bar at load once for each draw object 483cdf0e10cSrcweir GetImport().GetProgressBarHelper()->Increment(); 484cdf0e10cSrcweir } 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir mxLockable = uno::Reference< document::XActionLockable >::query( xShape ); 488cdf0e10cSrcweir 489cdf0e10cSrcweir if( mxLockable.is() ) 490cdf0e10cSrcweir mxLockable->addActionLock(); 491cdf0e10cSrcweir 492cdf0e10cSrcweir } 493cdf0e10cSrcweir 494cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 495cdf0e10cSrcweir 496cdf0e10cSrcweir void SdXMLShapeContext::AddShape(const char* pServiceName ) 497cdf0e10cSrcweir { 498cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xServiceFact(GetImport().GetModel(), uno::UNO_QUERY); 499cdf0e10cSrcweir if(xServiceFact.is()) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir try 502cdf0e10cSrcweir { 503cdf0e10cSrcweir // --> OD 2006-02-22 #b6382898# 504cdf0e10cSrcweir // Since fix for issue i33294 the Writer model doesn't support 505cdf0e10cSrcweir // com.sun.star.drawing.OLE2Shape anymore. 506cdf0e10cSrcweir // To handle Draw OLE objects it's decided to import these 507cdf0e10cSrcweir // objects as com.sun.star.drawing.OLE2Shape and convert these 508cdf0e10cSrcweir // objects after the import into com.sun.star.drawing.GraphicObjectShape. 509cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 510cdf0e10cSrcweir if ( OUString::createFromAscii(pServiceName).compareToAscii( "com.sun.star.drawing.OLE2Shape" ) == 0 && 511cdf0e10cSrcweir uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() ) 512cdf0e10cSrcweir { 513cdf0e10cSrcweir xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii("com.sun.star.drawing.temporaryForXMLImportOLE2Shape")), uno::UNO_QUERY); 514cdf0e10cSrcweir } 515cdf0e10cSrcweir else 516cdf0e10cSrcweir { 517cdf0e10cSrcweir xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii(pServiceName)), uno::UNO_QUERY); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir // <-- 520cdf0e10cSrcweir if( xShape.is() ) 521cdf0e10cSrcweir AddShape( xShape ); 522cdf0e10cSrcweir } 523cdf0e10cSrcweir catch( const uno::Exception& e ) 524cdf0e10cSrcweir { 525cdf0e10cSrcweir uno::Sequence<rtl::OUString> aSeq( 1 ); 526cdf0e10cSrcweir aSeq[0] = OUString::createFromAscii(pServiceName); 527cdf0e10cSrcweir GetImport().SetError( XMLERROR_FLAG_ERROR | XMLERROR_API, 528cdf0e10cSrcweir aSeq, e.Message, NULL ); 529cdf0e10cSrcweir } 530cdf0e10cSrcweir } 531cdf0e10cSrcweir } 532cdf0e10cSrcweir 533cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 534cdf0e10cSrcweir 535cdf0e10cSrcweir void SdXMLShapeContext::SetTransformation() 536cdf0e10cSrcweir { 537cdf0e10cSrcweir if(mxShape.is()) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 540cdf0e10cSrcweir if(xPropSet.is()) 541cdf0e10cSrcweir { 5426381da86SArmin Le Grand maUsedTransformation.identity(); 543cdf0e10cSrcweir 544cdf0e10cSrcweir if(maSize.Width != 1 || maSize.Height != 1) 545cdf0e10cSrcweir { 546cdf0e10cSrcweir // take care there are no zeros used by error 547cdf0e10cSrcweir if(0 == maSize.Width) 548cdf0e10cSrcweir maSize.Width = 1; 549cdf0e10cSrcweir if(0 == maSize.Height) 550cdf0e10cSrcweir maSize.Height = 1; 551cdf0e10cSrcweir 552cdf0e10cSrcweir // set global size. This should always be used. 5536381da86SArmin Le Grand maUsedTransformation.scale(maSize.Width, maSize.Height); 554cdf0e10cSrcweir } 555cdf0e10cSrcweir 556cdf0e10cSrcweir if(maPosition.X != 0 || maPosition.Y != 0) 557cdf0e10cSrcweir { 558cdf0e10cSrcweir // if global position is used, add it to transformation 5596381da86SArmin Le Grand maUsedTransformation.translate(maPosition.X, maPosition.Y); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir 562cdf0e10cSrcweir if(mnTransform.NeedsAction()) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir // transformation is used, apply to object. 565cdf0e10cSrcweir // NOTICE: The transformation is applied AFTER evtl. used 566cdf0e10cSrcweir // global positioning and scaling is used, so any shear or 567cdf0e10cSrcweir // rotate used herein is applied around the (0,0) position 568cdf0e10cSrcweir // of the PAGE object !!! 569cdf0e10cSrcweir ::basegfx::B2DHomMatrix aMat; 570cdf0e10cSrcweir mnTransform.GetFullTransform(aMat); 571cdf0e10cSrcweir 572cdf0e10cSrcweir // now add to transformation 5736381da86SArmin Le Grand maUsedTransformation *= aMat; 574cdf0e10cSrcweir } 575cdf0e10cSrcweir 576cdf0e10cSrcweir // now set transformation for this object 577cdf0e10cSrcweir uno::Any aAny; 578cdf0e10cSrcweir drawing::HomogenMatrix3 aMatrix; 579cdf0e10cSrcweir 5806381da86SArmin Le Grand aMatrix.Line1.Column1 = maUsedTransformation.get(0, 0); 5816381da86SArmin Le Grand aMatrix.Line1.Column2 = maUsedTransformation.get(0, 1); 5826381da86SArmin Le Grand aMatrix.Line1.Column3 = maUsedTransformation.get(0, 2); 583cdf0e10cSrcweir 5846381da86SArmin Le Grand aMatrix.Line2.Column1 = maUsedTransformation.get(1, 0); 5856381da86SArmin Le Grand aMatrix.Line2.Column2 = maUsedTransformation.get(1, 1); 5866381da86SArmin Le Grand aMatrix.Line2.Column3 = maUsedTransformation.get(1, 2); 587cdf0e10cSrcweir 5886381da86SArmin Le Grand aMatrix.Line3.Column1 = maUsedTransformation.get(2, 0); 5896381da86SArmin Le Grand aMatrix.Line3.Column2 = maUsedTransformation.get(2, 1); 5906381da86SArmin Le Grand aMatrix.Line3.Column3 = maUsedTransformation.get(2, 2); 591cdf0e10cSrcweir 592cdf0e10cSrcweir aAny <<= aMatrix; 593cdf0e10cSrcweir 594cdf0e10cSrcweir xPropSet->setPropertyValue( 595cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")), aAny); 596cdf0e10cSrcweir } 597cdf0e10cSrcweir } 598cdf0e10cSrcweir } 599cdf0e10cSrcweir 600cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 601cdf0e10cSrcweir 602cdf0e10cSrcweir void SdXMLShapeContext::SetStyle( bool bSupportsStyle /* = true */) 603cdf0e10cSrcweir { 604cdf0e10cSrcweir try 605cdf0e10cSrcweir { 606cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 607cdf0e10cSrcweir if( !xPropSet.is() ) 608cdf0e10cSrcweir return; 609cdf0e10cSrcweir 610cdf0e10cSrcweir do 611cdf0e10cSrcweir { 612cdf0e10cSrcweir XMLPropStyleContext* pDocStyle = NULL; 613cdf0e10cSrcweir 614cdf0e10cSrcweir // set style on shape 615cdf0e10cSrcweir if(maDrawStyleName.getLength() == 0) 616cdf0e10cSrcweir break; 617cdf0e10cSrcweir 618cdf0e10cSrcweir const SvXMLStyleContext* pStyle = 0L; 619cdf0e10cSrcweir sal_Bool bAutoStyle(sal_False); 620cdf0e10cSrcweir 621cdf0e10cSrcweir if(GetImport().GetShapeImport()->GetAutoStylesContext()) 622cdf0e10cSrcweir pStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName); 623cdf0e10cSrcweir 624cdf0e10cSrcweir if(pStyle) 625cdf0e10cSrcweir bAutoStyle = sal_True; 626cdf0e10cSrcweir 627cdf0e10cSrcweir if(!pStyle && GetImport().GetShapeImport()->GetStylesContext()) 628cdf0e10cSrcweir pStyle = GetImport().GetShapeImport()->GetStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName); 629cdf0e10cSrcweir 630cdf0e10cSrcweir OUString aStyleName = maDrawStyleName; 631cdf0e10cSrcweir uno::Reference< style::XStyle > xStyle; 632cdf0e10cSrcweir 633cdf0e10cSrcweir if( pStyle && pStyle->ISA(XMLShapeStyleContext) ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir pDocStyle = PTR_CAST( XMLShapeStyleContext, pStyle ); 636cdf0e10cSrcweir 637cdf0e10cSrcweir if( pDocStyle->GetStyle().is() ) 638cdf0e10cSrcweir { 639cdf0e10cSrcweir xStyle = pDocStyle->GetStyle(); 640cdf0e10cSrcweir } 641cdf0e10cSrcweir else 642cdf0e10cSrcweir { 643cdf0e10cSrcweir aStyleName = pDocStyle->GetParentName(); 644cdf0e10cSrcweir } 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir if( !xStyle.is() && aStyleName.getLength() ) 648cdf0e10cSrcweir { 649cdf0e10cSrcweir try 650cdf0e10cSrcweir { 651cdf0e10cSrcweir 652cdf0e10cSrcweir uno::Reference< style::XStyleFamiliesSupplier > xFamiliesSupplier( GetImport().GetModel(), uno::UNO_QUERY ); 653cdf0e10cSrcweir 654cdf0e10cSrcweir if( xFamiliesSupplier.is() ) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir uno::Reference< container::XNameAccess > xFamilies( xFamiliesSupplier->getStyleFamilies() ); 657cdf0e10cSrcweir if( xFamilies.is() ) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir 660cdf0e10cSrcweir uno::Reference< container::XNameAccess > xFamily; 661cdf0e10cSrcweir 662cdf0e10cSrcweir if( XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily ) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir aStyleName = GetImport().GetStyleDisplayName( 665cdf0e10cSrcweir XML_STYLE_FAMILY_SD_PRESENTATION_ID, 666cdf0e10cSrcweir aStyleName ); 667cdf0e10cSrcweir sal_Int32 nPos = aStyleName.lastIndexOf( sal_Unicode('-') ); 668cdf0e10cSrcweir if( -1 != nPos ) 669cdf0e10cSrcweir { 670cdf0e10cSrcweir OUString aFamily( aStyleName.copy( 0, nPos ) ); 671cdf0e10cSrcweir 672cdf0e10cSrcweir xFamilies->getByName( aFamily ) >>= xFamily; 673cdf0e10cSrcweir aStyleName = aStyleName.copy( nPos + 1 ); 674cdf0e10cSrcweir } 675cdf0e10cSrcweir } 676cdf0e10cSrcweir else 677cdf0e10cSrcweir { 678cdf0e10cSrcweir // get graphics familie 679cdf0e10cSrcweir xFamilies->getByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) ) ) >>= xFamily; 680cdf0e10cSrcweir aStyleName = GetImport().GetStyleDisplayName( 681cdf0e10cSrcweir XML_STYLE_FAMILY_SD_GRAPHICS_ID, 682cdf0e10cSrcweir aStyleName ); 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir if( xFamily.is() ) 686cdf0e10cSrcweir xFamily->getByName( aStyleName ) >>= xStyle; 687cdf0e10cSrcweir } 688cdf0e10cSrcweir } 689cdf0e10cSrcweir } 690cdf0e10cSrcweir catch( uno::Exception& ) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir DBG_ERROR( "could not find style for shape!" ); 693cdf0e10cSrcweir } 694cdf0e10cSrcweir } 695cdf0e10cSrcweir 696cdf0e10cSrcweir if( bSupportsStyle && xStyle.is() ) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir try 699cdf0e10cSrcweir { 700cdf0e10cSrcweir // set style on object 701cdf0e10cSrcweir uno::Any aAny; 702cdf0e10cSrcweir aAny <<= xStyle; 703cdf0e10cSrcweir xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style")), aAny); 704cdf0e10cSrcweir } 705cdf0e10cSrcweir catch( uno::Exception& ) 706cdf0e10cSrcweir { 707cdf0e10cSrcweir DBG_ERROR( "could not find style for shape!" ); 708cdf0e10cSrcweir } 709cdf0e10cSrcweir } 710cdf0e10cSrcweir 711cdf0e10cSrcweir // if this is an auto style, set its properties 712cdf0e10cSrcweir if(bAutoStyle && pDocStyle) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir // set PropertySet on object 715cdf0e10cSrcweir pDocStyle->FillPropertySet(xPropSet); 716cdf0e10cSrcweir } 717cdf0e10cSrcweir 718cdf0e10cSrcweir } while(0); 719cdf0e10cSrcweir 720cdf0e10cSrcweir // try to set text auto style 721cdf0e10cSrcweir do 722cdf0e10cSrcweir { 723cdf0e10cSrcweir // set style on shape 724cdf0e10cSrcweir if( 0 == maTextStyleName.getLength() ) 725cdf0e10cSrcweir break; 726cdf0e10cSrcweir 727cdf0e10cSrcweir if( NULL == GetImport().GetShapeImport()->GetAutoStylesContext()) 728cdf0e10cSrcweir break; 729cdf0e10cSrcweir 730cdf0e10cSrcweir const SvXMLStyleContext* pTempStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(XML_STYLE_FAMILY_TEXT_PARAGRAPH, maTextStyleName); 731cdf0e10cSrcweir XMLPropStyleContext* pStyle = PTR_CAST( XMLPropStyleContext, pTempStyle ); // use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice 732cdf0e10cSrcweir if( pStyle == NULL ) 733cdf0e10cSrcweir break; 734cdf0e10cSrcweir 735cdf0e10cSrcweir // set PropertySet on object 736cdf0e10cSrcweir pStyle->FillPropertySet(xPropSet); 737cdf0e10cSrcweir 738cdf0e10cSrcweir } while(0); 739cdf0e10cSrcweir } 740cdf0e10cSrcweir catch( uno::Exception& ) 741cdf0e10cSrcweir { 742cdf0e10cSrcweir } 743cdf0e10cSrcweir } 744cdf0e10cSrcweir 745cdf0e10cSrcweir void SdXMLShapeContext::SetLayer() 746cdf0e10cSrcweir { 747cdf0e10cSrcweir if( maLayerName.getLength() ) 748cdf0e10cSrcweir { 749cdf0e10cSrcweir try 750cdf0e10cSrcweir { 751cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 752cdf0e10cSrcweir if(xPropSet.is() ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir uno::Any aAny; 755cdf0e10cSrcweir aAny <<= maLayerName; 756cdf0e10cSrcweir 757cdf0e10cSrcweir xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("LayerName")), aAny); 758cdf0e10cSrcweir return; 759cdf0e10cSrcweir } 760cdf0e10cSrcweir } 761cdf0e10cSrcweir catch( uno::Exception e ) 762cdf0e10cSrcweir { 763cdf0e10cSrcweir } 764cdf0e10cSrcweir } 765cdf0e10cSrcweir } 766cdf0e10cSrcweir 767cdf0e10cSrcweir void SdXMLShapeContext::SetThumbnail() 768cdf0e10cSrcweir { 769cdf0e10cSrcweir if( 0 == maThumbnailURL.getLength() ) 770cdf0e10cSrcweir return; 771cdf0e10cSrcweir 772cdf0e10cSrcweir try 773cdf0e10cSrcweir { 774cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 775cdf0e10cSrcweir if( !xPropSet.is() ) 776cdf0e10cSrcweir return; 777cdf0e10cSrcweir 778cdf0e10cSrcweir const OUString sProperty(RTL_CONSTASCII_USTRINGPARAM("ThumbnailGraphicURL")); 779cdf0e10cSrcweir 780cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 781cdf0e10cSrcweir if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( sProperty ) ) 782cdf0e10cSrcweir { 783cdf0e10cSrcweir // load the thumbnail graphic and export it to a wmf stream so we can set 784cdf0e10cSrcweir // it at the api 785cdf0e10cSrcweir 786cdf0e10cSrcweir const OUString aInternalURL( GetImport().ResolveGraphicObjectURL( maThumbnailURL, sal_False ) ); 787cdf0e10cSrcweir xPropSet->setPropertyValue( sProperty, uno::makeAny( aInternalURL ) ); 788cdf0e10cSrcweir } 789cdf0e10cSrcweir } 790cdf0e10cSrcweir catch( uno::Exception e ) 791cdf0e10cSrcweir { 792cdf0e10cSrcweir } 793cdf0e10cSrcweir } 794cdf0e10cSrcweir 795cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 796cdf0e10cSrcweir void SdXMLShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 797cdf0e10cSrcweir { 798cdf0e10cSrcweir bool bHaveXmlId( false ); 799cdf0e10cSrcweir if( (XML_NAMESPACE_DRAW == nPrefix) || (XML_NAMESPACE_DRAW_EXT == nPrefix) ) 800cdf0e10cSrcweir { 801cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_ZINDEX ) ) 802cdf0e10cSrcweir { 803cdf0e10cSrcweir mnZOrder = rValue.toInt32(); 804cdf0e10cSrcweir } 805cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_ID ) ) 806cdf0e10cSrcweir { 807cdf0e10cSrcweir if (!bHaveXmlId) { maShapeId = rValue; }; 808cdf0e10cSrcweir } 809cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_NAME ) ) 810cdf0e10cSrcweir { 811cdf0e10cSrcweir maShapeName = rValue; 812cdf0e10cSrcweir } 813cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) ) 814cdf0e10cSrcweir { 815cdf0e10cSrcweir maDrawStyleName = rValue; 816cdf0e10cSrcweir } 817cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_TEXT_STYLE_NAME ) ) 818cdf0e10cSrcweir { 819cdf0e10cSrcweir maTextStyleName = rValue; 820cdf0e10cSrcweir } 821cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_LAYER ) ) 822cdf0e10cSrcweir { 823cdf0e10cSrcweir maLayerName = rValue; 824cdf0e10cSrcweir } 825cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_TRANSFORM ) ) 826cdf0e10cSrcweir { 827cdf0e10cSrcweir mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter()); 828cdf0e10cSrcweir } 829cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_DISPLAY ) ) 830cdf0e10cSrcweir { 831cdf0e10cSrcweir mbVisible = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_SCREEN ); 832cdf0e10cSrcweir mbPrintable = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_PRINTER ); 833cdf0e10cSrcweir } 834cdf0e10cSrcweir } 835cdf0e10cSrcweir else if( XML_NAMESPACE_PRESENTATION == nPrefix ) 836cdf0e10cSrcweir { 837cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_USER_TRANSFORMED ) ) 838cdf0e10cSrcweir { 839cdf0e10cSrcweir mbIsUserTransformed = IsXMLToken( rValue, XML_TRUE ); 840cdf0e10cSrcweir } 841cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_PLACEHOLDER ) ) 842cdf0e10cSrcweir { 843cdf0e10cSrcweir mbIsPlaceholder = IsXMLToken( rValue, XML_TRUE ); 844cdf0e10cSrcweir if( mbIsPlaceholder ) 845cdf0e10cSrcweir mbClearDefaultAttributes = false; 846cdf0e10cSrcweir } 847cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_CLASS ) ) 848cdf0e10cSrcweir { 849cdf0e10cSrcweir maPresentationClass = rValue; 850cdf0e10cSrcweir } 851cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) ) 852cdf0e10cSrcweir { 853cdf0e10cSrcweir maDrawStyleName = rValue; 854cdf0e10cSrcweir mnStyleFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID; 855cdf0e10cSrcweir } 856cdf0e10cSrcweir } 857cdf0e10cSrcweir else if( XML_NAMESPACE_SVG == nPrefix ) 858cdf0e10cSrcweir { 859cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X ) ) 860cdf0e10cSrcweir { 861cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maPosition.X, rValue); 862cdf0e10cSrcweir } 863cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_Y ) ) 864cdf0e10cSrcweir { 865cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maPosition.Y, rValue); 866cdf0e10cSrcweir } 867cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_WIDTH ) ) 868cdf0e10cSrcweir { 869cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maSize.Width, rValue); 870cdf0e10cSrcweir if( maSize.Width > 0 ) 871cdf0e10cSrcweir maSize.Width += 1; 872cdf0e10cSrcweir else if( maSize.Width < 0 ) 873cdf0e10cSrcweir maSize.Width -= 1; 874cdf0e10cSrcweir } 875cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_HEIGHT ) ) 876cdf0e10cSrcweir { 877cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maSize.Height, rValue); 878cdf0e10cSrcweir if( maSize.Height > 0 ) 879cdf0e10cSrcweir maSize.Height += 1; 880cdf0e10cSrcweir else if( maSize.Height < 0 ) 881cdf0e10cSrcweir maSize.Height -= 1; 882cdf0e10cSrcweir } 883cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_TRANSFORM ) ) 884cdf0e10cSrcweir { 885cdf0e10cSrcweir // because of #85127# take svg:transform into account and hanle like 886cdf0e10cSrcweir // draw:transform for compatibility 887cdf0e10cSrcweir mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter()); 888cdf0e10cSrcweir } 889cdf0e10cSrcweir 890cdf0e10cSrcweir // #i68101# 891cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_TITLE ) ) 892cdf0e10cSrcweir { 893cdf0e10cSrcweir maShapeTitle = rValue; 894cdf0e10cSrcweir } 895cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_DESC ) ) 896cdf0e10cSrcweir { 897cdf0e10cSrcweir maShapeDescription = rValue; 898cdf0e10cSrcweir } 899cdf0e10cSrcweir } 900cdf0e10cSrcweir else if( (XML_NAMESPACE_NONE == nPrefix) || (XML_NAMESPACE_XML == nPrefix) ) 901cdf0e10cSrcweir { 902cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_ID ) ) 903cdf0e10cSrcweir { 904cdf0e10cSrcweir maShapeId = rValue; 905cdf0e10cSrcweir bHaveXmlId = true; 906cdf0e10cSrcweir } 907cdf0e10cSrcweir } 908cdf0e10cSrcweir } 909cdf0e10cSrcweir 910cdf0e10cSrcweir sal_Bool SdXMLShapeContext::isPresentationShape() const 911cdf0e10cSrcweir { 912cdf0e10cSrcweir if( maPresentationClass.getLength() && (const_cast<SdXMLShapeContext*>(this))->GetImport().GetShapeImport()->IsPresentationShapesSupported() ) 913cdf0e10cSrcweir { 914cdf0e10cSrcweir if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily) 915cdf0e10cSrcweir { 916cdf0e10cSrcweir return sal_True; 917cdf0e10cSrcweir } 918cdf0e10cSrcweir 919cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_HEADER ) || IsXMLToken( maPresentationClass, XML_FOOTER ) || 920cdf0e10cSrcweir IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) || IsXMLToken( maPresentationClass, XML_DATE_TIME ) ) 921cdf0e10cSrcweir { 922cdf0e10cSrcweir return sal_True; 923cdf0e10cSrcweir } 924cdf0e10cSrcweir } 925cdf0e10cSrcweir 926cdf0e10cSrcweir return sal_False; 927cdf0e10cSrcweir } 928cdf0e10cSrcweir 929*f3b8b509SArmin Le Grand void SdXMLShapeContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate ) 930*f3b8b509SArmin Le Grand { 931*f3b8b509SArmin Le Grand const SdXMLShapeContext* pCandidate = dynamic_cast< const SdXMLShapeContext* >(&rCandidate); 932*f3b8b509SArmin Le Grand 933*f3b8b509SArmin Le Grand if(!mxGluePoints.is() && pCandidate) 934*f3b8b509SArmin Le Grand { 935*f3b8b509SArmin Le Grand // try to rescue GluePoints from rCandidate to local if we not yet have GluePoints by copying them 936*f3b8b509SArmin Le Grand uno::Reference< drawing::XGluePointsSupplier > xSourceSupplier( pCandidate->getShape(), uno::UNO_QUERY ); 937*f3b8b509SArmin Le Grand if( !xSourceSupplier.is() ) 938*f3b8b509SArmin Le Grand return; 939*f3b8b509SArmin Le Grand 940*f3b8b509SArmin Le Grand uno::Reference< container::XIdentifierAccess > xSourceGluePoints( xSourceSupplier->getGluePoints(), uno::UNO_QUERY ); 941*f3b8b509SArmin Le Grand if( !xSourceGluePoints.is() ) 942*f3b8b509SArmin Le Grand return; 943*f3b8b509SArmin Le Grand 944*f3b8b509SArmin Le Grand uno::Sequence< sal_Int32 > aSourceIdSequence( xSourceGluePoints->getIdentifiers() ); 945*f3b8b509SArmin Le Grand const sal_Int32 nSourceCount(aSourceIdSequence.getLength()); 946*f3b8b509SArmin Le Grand UniReference< XMLShapeImportHelper > xSourceShapeImportHelper(const_cast< SdXMLShapeContext* >(pCandidate)->GetImport().GetShapeImport()); 947*f3b8b509SArmin Le Grand 948*f3b8b509SArmin Le Grand if(nSourceCount) 949*f3b8b509SArmin Le Grand { 950*f3b8b509SArmin Le Grand // rCandidate has GluePoints; prepare the GluePoint container for the local shape 951*f3b8b509SArmin Le Grand uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY ); 952*f3b8b509SArmin Le Grand if( !xSupplier.is() ) 953*f3b8b509SArmin Le Grand return; 954*f3b8b509SArmin Le Grand 955*f3b8b509SArmin Le Grand mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() ); 956*f3b8b509SArmin Le Grand 957*f3b8b509SArmin Le Grand if( !mxGluePoints.is() ) 958*f3b8b509SArmin Le Grand return; 959*f3b8b509SArmin Le Grand 960*f3b8b509SArmin Le Grand drawing::GluePoint2 aSourceGluePoint; 961*f3b8b509SArmin Le Grand 962*f3b8b509SArmin Le Grand for( sal_Int32 nSourceIndex(0); nSourceIndex < nSourceCount; nSourceIndex++ ) 963*f3b8b509SArmin Le Grand { 964*f3b8b509SArmin Le Grand const sal_Int32 nSourceIdentifier = aSourceIdSequence[nSourceIndex]; 965*f3b8b509SArmin Le Grand 966*f3b8b509SArmin Le Grand // loop over GluePoints which are UserDefined (avoid the auto mapped ones) 967*f3b8b509SArmin Le Grand if((xSourceGluePoints->getByIdentifier( nSourceIdentifier ) >>= aSourceGluePoint) 968*f3b8b509SArmin Le Grand && aSourceGluePoint.IsUserDefined) 969*f3b8b509SArmin Le Grand { 970*f3b8b509SArmin Le Grand // get original mappingID back, this is the draw:id imported with a draw:glue-point 971*f3b8b509SArmin Le Grand const sal_Int32 nDestinnationId = xSourceShapeImportHelper->findGluePointMapping( 972*f3b8b509SArmin Le Grand pCandidate->getShape(), 973*f3b8b509SArmin Le Grand nSourceIdentifier ); 974*f3b8b509SArmin Le Grand 975*f3b8b509SArmin Le Grand if(-1 != nSourceIdentifier) 976*f3b8b509SArmin Le Grand { 977*f3b8b509SArmin Le Grand // if we got that we are able to add a copy of that GluePoint to the local 978*f3b8b509SArmin Le Grand // context and xShape since we have all information that the source shape 979*f3b8b509SArmin Le Grand // and context had at import time 980*f3b8b509SArmin Le Grand try 981*f3b8b509SArmin Le Grand { 982*f3b8b509SArmin Le Grand const sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aSourceGluePoint ) ); 983*f3b8b509SArmin Le Grand GetImport().GetShapeImport()->addGluePointMapping( mxShape, nDestinnationId, nInternalId ); 984*f3b8b509SArmin Le Grand } 985*f3b8b509SArmin Le Grand catch( uno::Exception& ) 986*f3b8b509SArmin Le Grand { 987*f3b8b509SArmin Le Grand DBG_ERROR( "exception during setting of glue points!"); 988*f3b8b509SArmin Le Grand } 989*f3b8b509SArmin Le Grand } 990*f3b8b509SArmin Le Grand } 991*f3b8b509SArmin Le Grand } 992*f3b8b509SArmin Le Grand } 993*f3b8b509SArmin Le Grand } 994*f3b8b509SArmin Le Grand } 995*f3b8b509SArmin Le Grand 996cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 997cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 998cdf0e10cSrcweir 999cdf0e10cSrcweir TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext ); 1000cdf0e10cSrcweir 1001cdf0e10cSrcweir SdXMLRectShapeContext::SdXMLRectShapeContext( 1002cdf0e10cSrcweir SvXMLImport& rImport, 1003cdf0e10cSrcweir sal_uInt16 nPrfx, 1004cdf0e10cSrcweir const OUString& rLocalName, 1005cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1006cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1007cdf0e10cSrcweir sal_Bool bTemporaryShape) 1008cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1009cdf0e10cSrcweir mnRadius( 0L ) 1010cdf0e10cSrcweir { 1011cdf0e10cSrcweir } 1012cdf0e10cSrcweir 1013cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1014cdf0e10cSrcweir 1015cdf0e10cSrcweir SdXMLRectShapeContext::~SdXMLRectShapeContext() 1016cdf0e10cSrcweir { 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir 1019cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1020cdf0e10cSrcweir 1021cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1022cdf0e10cSrcweir void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1023cdf0e10cSrcweir { 1024cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 1025cdf0e10cSrcweir { 1026cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) ) 1027cdf0e10cSrcweir { 1028cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue); 1029cdf0e10cSrcweir return; 1030cdf0e10cSrcweir } 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1034cdf0e10cSrcweir } 1035cdf0e10cSrcweir 1036cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1039cdf0e10cSrcweir { 1040cdf0e10cSrcweir // create rectangle shape 1041cdf0e10cSrcweir AddShape("com.sun.star.drawing.RectangleShape"); 1042cdf0e10cSrcweir if(mxShape.is()) 1043cdf0e10cSrcweir { 1044cdf0e10cSrcweir // Add, set Style and properties from base shape 1045cdf0e10cSrcweir SetStyle(); 1046cdf0e10cSrcweir SetLayer(); 1047cdf0e10cSrcweir 1048cdf0e10cSrcweir // set pos, size, shear and rotate 1049cdf0e10cSrcweir SetTransformation(); 1050cdf0e10cSrcweir 1051cdf0e10cSrcweir if(mnRadius) 1052cdf0e10cSrcweir { 1053cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 1054cdf0e10cSrcweir if(xPropSet.is()) 1055cdf0e10cSrcweir { 1056cdf0e10cSrcweir try 1057cdf0e10cSrcweir { 1058cdf0e10cSrcweir xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) ); 1059cdf0e10cSrcweir } 1060cdf0e10cSrcweir catch( uno::Exception& ) 1061cdf0e10cSrcweir { 1062cdf0e10cSrcweir DBG_ERROR( "exception during setting of corner radius!"); 1063cdf0e10cSrcweir } 1064cdf0e10cSrcweir } 1065cdf0e10cSrcweir } 1066cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1067cdf0e10cSrcweir } 1068cdf0e10cSrcweir } 1069cdf0e10cSrcweir 1070cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1071cdf0e10cSrcweir ////////////////////////////////////////3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir TYPEINIT1( SdXMLLineShapeContext, SdXMLShapeContext ); 1074cdf0e10cSrcweir 1075cdf0e10cSrcweir SdXMLLineShapeContext::SdXMLLineShapeContext( 1076cdf0e10cSrcweir SvXMLImport& rImport, 1077cdf0e10cSrcweir sal_uInt16 nPrfx, 1078cdf0e10cSrcweir const OUString& rLocalName, 1079cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1080cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1081cdf0e10cSrcweir sal_Bool bTemporaryShape) 1082cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1083cdf0e10cSrcweir mnX1( 0L ), 1084cdf0e10cSrcweir mnY1( 0L ), 1085cdf0e10cSrcweir mnX2( 1L ), 1086cdf0e10cSrcweir mnY2( 1L ) 1087cdf0e10cSrcweir { 1088cdf0e10cSrcweir } 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir SdXMLLineShapeContext::~SdXMLLineShapeContext() 1093cdf0e10cSrcweir { 1094cdf0e10cSrcweir } 1095cdf0e10cSrcweir 1096cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1099cdf0e10cSrcweir void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1100cdf0e10cSrcweir { 1101cdf0e10cSrcweir if( XML_NAMESPACE_SVG == nPrefix ) 1102cdf0e10cSrcweir { 1103cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X1 ) ) 1104cdf0e10cSrcweir { 1105cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnX1, rValue); 1106cdf0e10cSrcweir return; 1107cdf0e10cSrcweir } 1108cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y1 ) ) 1109cdf0e10cSrcweir { 1110cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnY1, rValue); 1111cdf0e10cSrcweir return; 1112cdf0e10cSrcweir } 1113cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X2 ) ) 1114cdf0e10cSrcweir { 1115cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnX2, rValue); 1116cdf0e10cSrcweir return; 1117cdf0e10cSrcweir } 1118cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y2 ) ) 1119cdf0e10cSrcweir { 1120cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnY2, rValue); 1121cdf0e10cSrcweir return; 1122cdf0e10cSrcweir } 1123cdf0e10cSrcweir } 1124cdf0e10cSrcweir 1125cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1126cdf0e10cSrcweir } 1127cdf0e10cSrcweir 1128cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1129cdf0e10cSrcweir 1130cdf0e10cSrcweir void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1131cdf0e10cSrcweir { 1132cdf0e10cSrcweir // #85920# use SetTransformation() to handle import of simple lines. 1133cdf0e10cSrcweir // This is necessary to kake into account all anchor positions and 1134cdf0e10cSrcweir // other things. All shape imports use the same import schemata now. 1135cdf0e10cSrcweir // create necessary shape (Line Shape) 1136cdf0e10cSrcweir AddShape("com.sun.star.drawing.PolyLineShape"); 1137cdf0e10cSrcweir 1138cdf0e10cSrcweir if(mxShape.is()) 1139cdf0e10cSrcweir { 1140cdf0e10cSrcweir // Add, set Style and properties from base shape 1141cdf0e10cSrcweir SetStyle(); 1142cdf0e10cSrcweir SetLayer(); 1143cdf0e10cSrcweir 1144cdf0e10cSrcweir // get sizes and offsets 1145cdf0e10cSrcweir awt::Point aTopLeft(mnX1, mnY1); 1146cdf0e10cSrcweir awt::Point aBottomRight(mnX2, mnY2); 1147cdf0e10cSrcweir 1148cdf0e10cSrcweir if(mnX1 > mnX2) 1149cdf0e10cSrcweir { 1150cdf0e10cSrcweir aTopLeft.X = mnX2; 1151cdf0e10cSrcweir aBottomRight.X = mnX1; 1152cdf0e10cSrcweir } 1153cdf0e10cSrcweir 1154cdf0e10cSrcweir if(mnY1 > mnY2) 1155cdf0e10cSrcweir { 1156cdf0e10cSrcweir aTopLeft.Y = mnY2; 1157cdf0e10cSrcweir aBottomRight.Y = mnY1; 1158cdf0e10cSrcweir } 1159cdf0e10cSrcweir 1160cdf0e10cSrcweir // set local parameters on shape 1161cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 1162cdf0e10cSrcweir if(xPropSet.is()) 1163cdf0e10cSrcweir { 1164cdf0e10cSrcweir drawing::PointSequenceSequence aPolyPoly(1L); 1165cdf0e10cSrcweir drawing::PointSequence* pOuterSequence = aPolyPoly.getArray(); 1166cdf0e10cSrcweir pOuterSequence->realloc(2L); 1167cdf0e10cSrcweir awt::Point* pInnerSequence = pOuterSequence->getArray(); 1168cdf0e10cSrcweir uno::Any aAny; 1169cdf0e10cSrcweir 1170cdf0e10cSrcweir *pInnerSequence = awt::Point( mnX1 - aTopLeft.X, mnY1 - aTopLeft.Y); 1171cdf0e10cSrcweir pInnerSequence++; 1172cdf0e10cSrcweir *pInnerSequence = awt::Point( mnX2 - aTopLeft.X, mnY2 - aTopLeft.Y); 1173cdf0e10cSrcweir 1174cdf0e10cSrcweir aAny <<= aPolyPoly; 1175cdf0e10cSrcweir xPropSet->setPropertyValue( 1176cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny); 1177cdf0e10cSrcweir } 1178cdf0e10cSrcweir 1179cdf0e10cSrcweir // set sizes for transformation 1180cdf0e10cSrcweir maSize.Width = aBottomRight.X - aTopLeft.X; 1181cdf0e10cSrcweir maSize.Height = aBottomRight.Y - aTopLeft.Y; 1182cdf0e10cSrcweir maPosition.X = aTopLeft.X; 1183cdf0e10cSrcweir maPosition.Y = aTopLeft.Y; 1184cdf0e10cSrcweir 1185cdf0e10cSrcweir // set pos, size, shear and rotate and get copy of matrix 1186cdf0e10cSrcweir SetTransformation(); 1187cdf0e10cSrcweir 1188cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1189cdf0e10cSrcweir } 1190cdf0e10cSrcweir } 1191cdf0e10cSrcweir 1192cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1193cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1194cdf0e10cSrcweir 1195cdf0e10cSrcweir TYPEINIT1( SdXMLEllipseShapeContext, SdXMLShapeContext ); 1196cdf0e10cSrcweir 1197cdf0e10cSrcweir SdXMLEllipseShapeContext::SdXMLEllipseShapeContext( 1198cdf0e10cSrcweir SvXMLImport& rImport, 1199cdf0e10cSrcweir sal_uInt16 nPrfx, 1200cdf0e10cSrcweir const OUString& rLocalName, 1201cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1202cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1203cdf0e10cSrcweir sal_Bool bTemporaryShape) 1204cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1205cdf0e10cSrcweir mnCX( 0L ), 1206cdf0e10cSrcweir mnCY( 0L ), 1207cdf0e10cSrcweir mnRX( 1L ), 1208cdf0e10cSrcweir mnRY( 1L ), 1209cdf0e10cSrcweir meKind( drawing::CircleKind_FULL ), 1210cdf0e10cSrcweir mnStartAngle( 0 ), 1211cdf0e10cSrcweir mnEndAngle( 0 ) 1212cdf0e10cSrcweir { 1213cdf0e10cSrcweir } 1214cdf0e10cSrcweir 1215cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1216cdf0e10cSrcweir 1217cdf0e10cSrcweir SdXMLEllipseShapeContext::~SdXMLEllipseShapeContext() 1218cdf0e10cSrcweir { 1219cdf0e10cSrcweir } 1220cdf0e10cSrcweir 1221cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1222cdf0e10cSrcweir 1223cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1224cdf0e10cSrcweir void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1225cdf0e10cSrcweir { 1226cdf0e10cSrcweir if( XML_NAMESPACE_SVG == nPrefix ) 1227cdf0e10cSrcweir { 1228cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_RX ) ) 1229cdf0e10cSrcweir { 1230cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue); 1231cdf0e10cSrcweir return; 1232cdf0e10cSrcweir } 1233cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_RY ) ) 1234cdf0e10cSrcweir { 1235cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRY, rValue); 1236cdf0e10cSrcweir return; 1237cdf0e10cSrcweir } 1238cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CX ) ) 1239cdf0e10cSrcweir { 1240cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnCX, rValue); 1241cdf0e10cSrcweir return; 1242cdf0e10cSrcweir } 1243cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CY ) ) 1244cdf0e10cSrcweir { 1245cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnCY, rValue); 1246cdf0e10cSrcweir return; 1247cdf0e10cSrcweir } 1248cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_R ) ) 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir // single radius, it's a circle and both radii are the same 1251cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue); 1252cdf0e10cSrcweir mnRY = mnRX; 1253cdf0e10cSrcweir return; 1254cdf0e10cSrcweir } 1255cdf0e10cSrcweir } 1256cdf0e10cSrcweir else if( XML_NAMESPACE_DRAW == nPrefix ) 1257cdf0e10cSrcweir { 1258cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_KIND ) ) 1259cdf0e10cSrcweir { 1260cdf0e10cSrcweir sal_uInt16 eKind; 1261cdf0e10cSrcweir if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_CircleKind_EnumMap ) ) 1262cdf0e10cSrcweir { 1263cdf0e10cSrcweir meKind = eKind; 1264cdf0e10cSrcweir } 1265cdf0e10cSrcweir return; 1266cdf0e10cSrcweir } 1267cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_START_ANGLE ) ) 1268cdf0e10cSrcweir { 1269cdf0e10cSrcweir double dStartAngle; 1270cdf0e10cSrcweir if( SvXMLUnitConverter::convertDouble( dStartAngle, rValue ) ) 1271cdf0e10cSrcweir mnStartAngle = (sal_Int32)(dStartAngle * 100.0); 1272cdf0e10cSrcweir return; 1273cdf0e10cSrcweir } 1274cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_END_ANGLE ) ) 1275cdf0e10cSrcweir { 1276cdf0e10cSrcweir double dEndAngle; 1277cdf0e10cSrcweir if( SvXMLUnitConverter::convertDouble( dEndAngle, rValue ) ) 1278cdf0e10cSrcweir mnEndAngle = (sal_Int32)(dEndAngle * 100.0); 1279cdf0e10cSrcweir return; 1280cdf0e10cSrcweir } 1281cdf0e10cSrcweir } 1282cdf0e10cSrcweir 1283cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1284cdf0e10cSrcweir } 1285cdf0e10cSrcweir 1286cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1287cdf0e10cSrcweir 1288cdf0e10cSrcweir void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1289cdf0e10cSrcweir { 1290cdf0e10cSrcweir // create rectangle shape 1291cdf0e10cSrcweir AddShape("com.sun.star.drawing.EllipseShape"); 1292cdf0e10cSrcweir if(mxShape.is()) 1293cdf0e10cSrcweir { 1294cdf0e10cSrcweir // Add, set Style and properties from base shape 1295cdf0e10cSrcweir SetStyle(); 1296cdf0e10cSrcweir SetLayer(); 1297cdf0e10cSrcweir 129832902674SArmin Le Grand if(mnCX != 0 || mnCY != 0 || mnRX != 1 || mnRY != 1) 129932902674SArmin Le Grand { 130032902674SArmin Le Grand // #121972# center/radius is used, put to pos and size 130132902674SArmin Le Grand maSize.Width = 2 * mnRX; 130232902674SArmin Le Grand maSize.Height = 2 * mnRY; 130332902674SArmin Le Grand maPosition.X = mnCX - mnRX; 130432902674SArmin Le Grand maPosition.Y = mnCY - mnRY; 130532902674SArmin Le Grand } 130632902674SArmin Le Grand 1307cdf0e10cSrcweir // set pos, size, shear and rotate 1308cdf0e10cSrcweir SetTransformation(); 1309cdf0e10cSrcweir 1310cdf0e10cSrcweir if( meKind != drawing::CircleKind_FULL ) 1311cdf0e10cSrcweir { 1312cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY ); 1313cdf0e10cSrcweir if( xPropSet.is() ) 1314cdf0e10cSrcweir { 1315cdf0e10cSrcweir uno::Any aAny; 1316cdf0e10cSrcweir aAny <<= (drawing::CircleKind)meKind; 1317cdf0e10cSrcweir xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")), aAny ); 1318cdf0e10cSrcweir 1319cdf0e10cSrcweir aAny <<= mnStartAngle; 1320cdf0e10cSrcweir xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")), aAny ); 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir aAny <<= mnEndAngle; 1323cdf0e10cSrcweir xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")), aAny ); 1324cdf0e10cSrcweir } 1325cdf0e10cSrcweir } 1326cdf0e10cSrcweir 1327cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1328cdf0e10cSrcweir } 1329cdf0e10cSrcweir } 1330cdf0e10cSrcweir 1331cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1332cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir TYPEINIT1( SdXMLPolygonShapeContext, SdXMLShapeContext ); 1335cdf0e10cSrcweir 1336cdf0e10cSrcweir SdXMLPolygonShapeContext::SdXMLPolygonShapeContext( 1337cdf0e10cSrcweir SvXMLImport& rImport, 1338cdf0e10cSrcweir sal_uInt16 nPrfx, 1339cdf0e10cSrcweir const OUString& rLocalName, 1340cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1341cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, sal_Bool bClosed, sal_Bool bTemporaryShape) 1342cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1343cdf0e10cSrcweir mbClosed( bClosed ) 1344cdf0e10cSrcweir { 1345cdf0e10cSrcweir } 1346cdf0e10cSrcweir 1347cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1348cdf0e10cSrcweir 1349cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1350cdf0e10cSrcweir void SdXMLPolygonShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1351cdf0e10cSrcweir { 1352cdf0e10cSrcweir if( XML_NAMESPACE_SVG == nPrefix ) 1353cdf0e10cSrcweir { 1354cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_VIEWBOX ) ) 1355cdf0e10cSrcweir { 1356cdf0e10cSrcweir maViewBox = rValue; 1357cdf0e10cSrcweir return; 1358cdf0e10cSrcweir } 1359cdf0e10cSrcweir } 1360cdf0e10cSrcweir else if( XML_NAMESPACE_DRAW == nPrefix ) 1361cdf0e10cSrcweir { 1362cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_POINTS ) ) 1363cdf0e10cSrcweir { 1364cdf0e10cSrcweir maPoints = rValue; 1365cdf0e10cSrcweir return; 1366cdf0e10cSrcweir } 1367cdf0e10cSrcweir } 1368cdf0e10cSrcweir 1369cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1370cdf0e10cSrcweir } 1371cdf0e10cSrcweir 1372cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1373cdf0e10cSrcweir 1374cdf0e10cSrcweir SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext() 1375cdf0e10cSrcweir { 1376cdf0e10cSrcweir } 1377cdf0e10cSrcweir 1378cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1379cdf0e10cSrcweir 1380cdf0e10cSrcweir void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1381cdf0e10cSrcweir { 1382cdf0e10cSrcweir // Add, set Style and properties from base shape 1383cdf0e10cSrcweir if(mbClosed) 1384cdf0e10cSrcweir AddShape("com.sun.star.drawing.PolyPolygonShape"); 1385cdf0e10cSrcweir else 1386cdf0e10cSrcweir AddShape("com.sun.star.drawing.PolyLineShape"); 1387cdf0e10cSrcweir 1388cdf0e10cSrcweir if( mxShape.is() ) 1389cdf0e10cSrcweir { 1390cdf0e10cSrcweir SetStyle(); 1391cdf0e10cSrcweir SetLayer(); 1392cdf0e10cSrcweir 1393cdf0e10cSrcweir // set local parameters on shape 1394cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 1395cdf0e10cSrcweir if(xPropSet.is()) 1396cdf0e10cSrcweir { 1397cdf0e10cSrcweir // set polygon 1398cdf0e10cSrcweir if(maPoints.getLength() && maViewBox.getLength()) 1399cdf0e10cSrcweir { 14001f882ec4SArmin Le Grand const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter()); 14011f882ec4SArmin Le Grand basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight()); 14021f882ec4SArmin Le Grand 14031f882ec4SArmin Le Grand // Is this correct? It overrides ViewBox stuff; OTOH it makes no 14041f882ec4SArmin Le Grand // sense to have the geometry content size different from object size 1405cdf0e10cSrcweir if(maSize.Width != 0 && maSize.Height != 0) 1406cdf0e10cSrcweir { 14071f882ec4SArmin Le Grand aSize = basegfx::B2DVector(maSize.Width, maSize.Height); 1408cdf0e10cSrcweir } 1409cdf0e10cSrcweir 14101f882ec4SArmin Le Grand basegfx::B2DPolygon aPolygon; 14111f882ec4SArmin Le Grand 14121f882ec4SArmin Le Grand if(basegfx::tools::importFromSvgPoints(aPolygon, maPoints)) 14131f882ec4SArmin Le Grand { 14141f882ec4SArmin Le Grand if(aPolygon.count()) 14151f882ec4SArmin Le Grand { 14161f882ec4SArmin Le Grand const basegfx::B2DRange aSourceRange( 14171f882ec4SArmin Le Grand aViewBox.GetX(), aViewBox.GetY(), 14181f882ec4SArmin Le Grand aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight()); 14191f882ec4SArmin Le Grand const basegfx::B2DRange aTargetRange( 14201f882ec4SArmin Le Grand aViewBox.GetX(), aViewBox.GetY(), 14211f882ec4SArmin Le Grand aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY()); 14221f882ec4SArmin Le Grand 14231f882ec4SArmin Le Grand if(!aSourceRange.equal(aTargetRange)) 14241f882ec4SArmin Le Grand { 14251f882ec4SArmin Le Grand aPolygon.transform( 14261f882ec4SArmin Le Grand basegfx::tools::createSourceRangeTargetRangeTransform( 14271f882ec4SArmin Le Grand aSourceRange, 14281f882ec4SArmin Le Grand aTargetRange)); 14291f882ec4SArmin Le Grand } 14301f882ec4SArmin Le Grand 14311f882ec4SArmin Le Grand com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence; 1432cdf0e10cSrcweir uno::Any aAny; 14331f882ec4SArmin Le Grand 14341f882ec4SArmin Le Grand basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(basegfx::B2DPolyPolygon(aPolygon), aPointSequenceSequence); 14351f882ec4SArmin Le Grand aAny <<= aPointSequenceSequence; 14361f882ec4SArmin Le Grand xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny); 14371f882ec4SArmin Le Grand } 14381f882ec4SArmin Le Grand } 1439cdf0e10cSrcweir } 1440cdf0e10cSrcweir } 1441cdf0e10cSrcweir 1442cdf0e10cSrcweir // set pos, size, shear and rotate and get copy of matrix 1443cdf0e10cSrcweir SetTransformation(); 1444cdf0e10cSrcweir 1445cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1446cdf0e10cSrcweir } 1447cdf0e10cSrcweir } 1448cdf0e10cSrcweir 1449cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1450cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1451cdf0e10cSrcweir 1452cdf0e10cSrcweir TYPEINIT1( SdXMLPathShapeContext, SdXMLShapeContext ); 1453cdf0e10cSrcweir 1454cdf0e10cSrcweir SdXMLPathShapeContext::SdXMLPathShapeContext( 1455cdf0e10cSrcweir SvXMLImport& rImport, 1456cdf0e10cSrcweir sal_uInt16 nPrfx, 1457cdf0e10cSrcweir const OUString& rLocalName, 1458cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1459cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1460cdf0e10cSrcweir sal_Bool bTemporaryShape) 1461cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1462cdf0e10cSrcweir mbClosed( sal_True ) 1463cdf0e10cSrcweir { 1464cdf0e10cSrcweir } 1465cdf0e10cSrcweir 1466cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1467cdf0e10cSrcweir 1468cdf0e10cSrcweir SdXMLPathShapeContext::~SdXMLPathShapeContext() 1469cdf0e10cSrcweir { 1470cdf0e10cSrcweir } 1471cdf0e10cSrcweir 1472cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1473cdf0e10cSrcweir 1474cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1475cdf0e10cSrcweir void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1476cdf0e10cSrcweir { 1477cdf0e10cSrcweir if( XML_NAMESPACE_SVG == nPrefix ) 1478cdf0e10cSrcweir { 1479cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_VIEWBOX ) ) 1480cdf0e10cSrcweir { 1481cdf0e10cSrcweir maViewBox = rValue; 1482cdf0e10cSrcweir return; 1483cdf0e10cSrcweir } 1484cdf0e10cSrcweir else if( IsXMLToken( rLocalName, XML_D ) ) 1485cdf0e10cSrcweir { 1486cdf0e10cSrcweir maD = rValue; 1487cdf0e10cSrcweir return; 1488cdf0e10cSrcweir } 1489cdf0e10cSrcweir } 1490cdf0e10cSrcweir 1491cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1492cdf0e10cSrcweir } 1493cdf0e10cSrcweir 1494cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1495cdf0e10cSrcweir 1496cdf0e10cSrcweir void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1497cdf0e10cSrcweir { 1498cdf0e10cSrcweir // create polygon shape 1499cdf0e10cSrcweir if(maD.getLength()) 1500cdf0e10cSrcweir { 15011f882ec4SArmin Le Grand const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter()); 15021f882ec4SArmin Le Grand basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight()); 15031f882ec4SArmin Le Grand 15041f882ec4SArmin Le Grand // Is this correct? It overrides ViewBox stuff; OTOH it makes no 15051f882ec4SArmin Le Grand // sense to have the geometry content size different from object size 1506cdf0e10cSrcweir if(maSize.Width != 0 && maSize.Height != 0) 1507cdf0e10cSrcweir { 15081f882ec4SArmin Le Grand aSize = basegfx::B2DVector(maSize.Width, maSize.Height); 1509cdf0e10cSrcweir } 1510cdf0e10cSrcweir 15111f882ec4SArmin Le Grand basegfx::B2DPolyPolygon aPolyPolygon; 15121f882ec4SArmin Le Grand 15131f882ec4SArmin Le Grand if(basegfx::tools::importFromSvgD(aPolyPolygon, maD, true, 0)) 1514cdf0e10cSrcweir { 15151f882ec4SArmin Le Grand if(aPolyPolygon.count()) 15161f882ec4SArmin Le Grand { 15171f882ec4SArmin Le Grand const basegfx::B2DRange aSourceRange( 15181f882ec4SArmin Le Grand aViewBox.GetX(), aViewBox.GetY(), 15191f882ec4SArmin Le Grand aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight()); 15201f882ec4SArmin Le Grand const basegfx::B2DRange aTargetRange( 15211f882ec4SArmin Le Grand aViewBox.GetX(), aViewBox.GetY(), 15221f882ec4SArmin Le Grand aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY()); 15231f882ec4SArmin Le Grand 15241f882ec4SArmin Le Grand if(!aSourceRange.equal(aTargetRange)) 15251f882ec4SArmin Le Grand { 15261f882ec4SArmin Le Grand aPolyPolygon.transform( 15271f882ec4SArmin Le Grand basegfx::tools::createSourceRangeTargetRangeTransform( 15281f882ec4SArmin Le Grand aSourceRange, 15291f882ec4SArmin Le Grand aTargetRange)); 15301f882ec4SArmin Le Grand } 15311f882ec4SArmin Le Grand 15321f882ec4SArmin Le Grand // create shape 15331f882ec4SArmin Le Grand const char* pService; 15341f882ec4SArmin Le Grand 15351f882ec4SArmin Le Grand if(aPolyPolygon.areControlPointsUsed()) 15361f882ec4SArmin Le Grand { 15371f882ec4SArmin Le Grand if(aPolyPolygon.isClosed()) 1538cdf0e10cSrcweir { 1539cdf0e10cSrcweir pService = "com.sun.star.drawing.ClosedBezierShape"; 1540cdf0e10cSrcweir } 1541cdf0e10cSrcweir else 1542cdf0e10cSrcweir { 1543cdf0e10cSrcweir pService = "com.sun.star.drawing.OpenBezierShape"; 1544cdf0e10cSrcweir } 1545cdf0e10cSrcweir } 1546cdf0e10cSrcweir else 1547cdf0e10cSrcweir { 15481f882ec4SArmin Le Grand if(aPolyPolygon.isClosed()) 1549cdf0e10cSrcweir { 1550cdf0e10cSrcweir pService = "com.sun.star.drawing.PolyPolygonShape"; 1551cdf0e10cSrcweir } 1552cdf0e10cSrcweir else 1553cdf0e10cSrcweir { 1554cdf0e10cSrcweir pService = "com.sun.star.drawing.PolyLineShape"; 1555cdf0e10cSrcweir } 1556cdf0e10cSrcweir } 1557cdf0e10cSrcweir 1558cdf0e10cSrcweir // Add, set Style and properties from base shape 1559cdf0e10cSrcweir AddShape(pService); 1560cdf0e10cSrcweir 1561cdf0e10cSrcweir // #89344# test for mxShape.is() and not for mxShapes.is() to support 1562cdf0e10cSrcweir // shape import helper classes WITHOUT XShapes (member mxShapes). This 1563cdf0e10cSrcweir // is used by the writer. 1564cdf0e10cSrcweir if( mxShape.is() ) 1565cdf0e10cSrcweir { 1566cdf0e10cSrcweir SetStyle(); 1567cdf0e10cSrcweir SetLayer(); 1568cdf0e10cSrcweir 1569cdf0e10cSrcweir // set local parameters on shape 1570cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 15711f882ec4SArmin Le Grand 1572cdf0e10cSrcweir if(xPropSet.is()) 1573cdf0e10cSrcweir { 1574cdf0e10cSrcweir uno::Any aAny; 1575cdf0e10cSrcweir 15761f882ec4SArmin Le Grand // set polygon data 15771f882ec4SArmin Le Grand if(aPolyPolygon.areControlPointsUsed()) 1578cdf0e10cSrcweir { 15791f882ec4SArmin Le Grand drawing::PolyPolygonBezierCoords aSourcePolyPolygon; 1580cdf0e10cSrcweir 15811f882ec4SArmin Le Grand basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords( 15821f882ec4SArmin Le Grand aPolyPolygon, 15831f882ec4SArmin Le Grand aSourcePolyPolygon); 1584cdf0e10cSrcweir aAny <<= aSourcePolyPolygon; 1585cdf0e10cSrcweir } 1586cdf0e10cSrcweir else 1587cdf0e10cSrcweir { 15881f882ec4SArmin Le Grand drawing::PointSequenceSequence aSourcePolyPolygon; 15891f882ec4SArmin Le Grand 15901f882ec4SArmin Le Grand basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence( 15911f882ec4SArmin Le Grand aPolyPolygon, 15921f882ec4SArmin Le Grand aSourcePolyPolygon); 15931f882ec4SArmin Le Grand aAny <<= aSourcePolyPolygon; 1594cdf0e10cSrcweir } 15951f882ec4SArmin Le Grand 15961f882ec4SArmin Le Grand xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny); 1597cdf0e10cSrcweir } 1598cdf0e10cSrcweir 1599cdf0e10cSrcweir // set pos, size, shear and rotate 1600cdf0e10cSrcweir SetTransformation(); 1601cdf0e10cSrcweir 1602cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1603cdf0e10cSrcweir } 1604cdf0e10cSrcweir } 1605cdf0e10cSrcweir } 16061f882ec4SArmin Le Grand } 16071f882ec4SArmin Le Grand } 1608cdf0e10cSrcweir 1609cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1610cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1611cdf0e10cSrcweir 1612cdf0e10cSrcweir TYPEINIT1( SdXMLTextBoxShapeContext, SdXMLShapeContext ); 1613cdf0e10cSrcweir 1614cdf0e10cSrcweir SdXMLTextBoxShapeContext::SdXMLTextBoxShapeContext( 1615cdf0e10cSrcweir SvXMLImport& rImport, 1616cdf0e10cSrcweir sal_uInt16 nPrfx, 1617cdf0e10cSrcweir const OUString& rLocalName, 1618cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1619cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1620cdf0e10cSrcweir sal_Bool bTemporaryShape) 1621cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1622cdf0e10cSrcweir mnRadius(0) 1623cdf0e10cSrcweir { 1624cdf0e10cSrcweir } 1625cdf0e10cSrcweir 1626cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1627cdf0e10cSrcweir 1628cdf0e10cSrcweir SdXMLTextBoxShapeContext::~SdXMLTextBoxShapeContext() 1629cdf0e10cSrcweir { 1630cdf0e10cSrcweir } 1631cdf0e10cSrcweir 1632cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1633cdf0e10cSrcweir 1634cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1635cdf0e10cSrcweir void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1636cdf0e10cSrcweir { 1637cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 1638cdf0e10cSrcweir { 1639cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) ) 1640cdf0e10cSrcweir { 1641cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue); 1642cdf0e10cSrcweir return; 1643cdf0e10cSrcweir } 1644cdf0e10cSrcweir } 1645cdf0e10cSrcweir 1646cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1647cdf0e10cSrcweir } 1648cdf0e10cSrcweir 1649cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1650cdf0e10cSrcweir 1651cdf0e10cSrcweir void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&) 1652cdf0e10cSrcweir { 1653cdf0e10cSrcweir // create textbox shape 1654cdf0e10cSrcweir sal_Bool bIsPresShape = sal_False; 1655cdf0e10cSrcweir bool bClearText = false; 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir const char *pService = NULL; 1658cdf0e10cSrcweir 1659cdf0e10cSrcweir if( isPresentationShape() ) 1660cdf0e10cSrcweir { 1661cdf0e10cSrcweir // check if the current document supports presentation shapes 1662cdf0e10cSrcweir if( GetImport().GetShapeImport()->IsPresentationShapesSupported() ) 1663cdf0e10cSrcweir { 1664cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_PRESENTATION_SUBTITLE )) 1665cdf0e10cSrcweir { 1666cdf0e10cSrcweir // XmlShapeTypePresSubtitleShape 1667cdf0e10cSrcweir pService = "com.sun.star.presentation.SubtitleShape"; 1668cdf0e10cSrcweir } 1669cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OUTLINE ) ) 1670cdf0e10cSrcweir { 1671cdf0e10cSrcweir // XmlShapeTypePresOutlinerShape 1672cdf0e10cSrcweir pService = "com.sun.star.presentation.OutlinerShape"; 1673cdf0e10cSrcweir } 1674cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_NOTES ) ) 1675cdf0e10cSrcweir { 1676cdf0e10cSrcweir // XmlShapeTypePresNotesShape 1677cdf0e10cSrcweir pService = "com.sun.star.presentation.NotesShape"; 1678cdf0e10cSrcweir } 1679cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_HEADER ) ) 1680cdf0e10cSrcweir { 1681cdf0e10cSrcweir // XmlShapeTypePresHeaderShape 1682cdf0e10cSrcweir pService = "com.sun.star.presentation.HeaderShape"; 1683cdf0e10cSrcweir bClearText = true; 1684cdf0e10cSrcweir } 1685cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_FOOTER ) ) 1686cdf0e10cSrcweir { 1687cdf0e10cSrcweir // XmlShapeTypePresFooterShape 1688cdf0e10cSrcweir pService = "com.sun.star.presentation.FooterShape"; 1689cdf0e10cSrcweir bClearText = true; 1690cdf0e10cSrcweir } 1691cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) ) 1692cdf0e10cSrcweir { 1693cdf0e10cSrcweir // XmlShapeTypePresSlideNumberShape 1694cdf0e10cSrcweir pService = "com.sun.star.presentation.SlideNumberShape"; 1695cdf0e10cSrcweir bClearText = true; 1696cdf0e10cSrcweir } 1697cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_DATE_TIME ) ) 1698cdf0e10cSrcweir { 1699cdf0e10cSrcweir // XmlShapeTypePresDateTimeShape 1700cdf0e10cSrcweir pService = "com.sun.star.presentation.DateTimeShape"; 1701cdf0e10cSrcweir bClearText = true; 1702cdf0e10cSrcweir } 1703cdf0e10cSrcweir else // IsXMLToken( maPresentationClass, XML_PRESENTATION_TITLE ) ) 1704cdf0e10cSrcweir { 1705cdf0e10cSrcweir // XmlShapeTypePresTitleTextShape 1706cdf0e10cSrcweir pService = "com.sun.star.presentation.TitleTextShape"; 1707cdf0e10cSrcweir } 1708cdf0e10cSrcweir bIsPresShape = sal_True; 1709cdf0e10cSrcweir } 1710cdf0e10cSrcweir } 1711cdf0e10cSrcweir 1712cdf0e10cSrcweir if( NULL == pService ) 1713cdf0e10cSrcweir { 1714cdf0e10cSrcweir // normal text shape 1715cdf0e10cSrcweir pService = "com.sun.star.drawing.TextShape"; 1716cdf0e10cSrcweir } 1717cdf0e10cSrcweir 1718cdf0e10cSrcweir // Add, set Style and properties from base shape 1719cdf0e10cSrcweir AddShape(pService); 1720cdf0e10cSrcweir 1721cdf0e10cSrcweir if( mxShape.is() ) 1722cdf0e10cSrcweir { 1723cdf0e10cSrcweir SetStyle(); 1724cdf0e10cSrcweir SetLayer(); 1725cdf0e10cSrcweir 1726cdf0e10cSrcweir if(bIsPresShape) 1727cdf0e10cSrcweir { 1728cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 1729cdf0e10cSrcweir if(xProps.is()) 1730cdf0e10cSrcweir { 1731cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 1732cdf0e10cSrcweir if( xPropsInfo.is() ) 1733cdf0e10cSrcweir { 1734cdf0e10cSrcweir if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 1735cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) ); 1736cdf0e10cSrcweir 1737cdf0e10cSrcweir if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 1738cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 1739cdf0e10cSrcweir } 1740cdf0e10cSrcweir } 1741cdf0e10cSrcweir } 1742cdf0e10cSrcweir 1743cdf0e10cSrcweir if( bClearText ) 1744cdf0e10cSrcweir { 1745cdf0e10cSrcweir uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY ); 1746cdf0e10cSrcweir OUString aEmpty; 1747cdf0e10cSrcweir xText->setString( aEmpty ); 1748cdf0e10cSrcweir } 1749cdf0e10cSrcweir 1750cdf0e10cSrcweir // set parameters on shape 1751cdf0e10cSrcweir //A AW->CL: Eventually You need to strip scale and translate from the transformation 1752cdf0e10cSrcweir //A to reach the same goal again. 1753cdf0e10cSrcweir //A if(!bIsPresShape || mbIsUserTransformed) 1754cdf0e10cSrcweir //A { 1755cdf0e10cSrcweir //A // set pos and size on shape, this should remove binding 1756cdf0e10cSrcweir //A // to pres object on masterpage 1757cdf0e10cSrcweir //A SetSizeAndPosition(); 1758cdf0e10cSrcweir //A } 1759cdf0e10cSrcweir 1760cdf0e10cSrcweir // set pos, size, shear and rotate 1761cdf0e10cSrcweir SetTransformation(); 1762cdf0e10cSrcweir 1763cdf0e10cSrcweir if(mnRadius) 1764cdf0e10cSrcweir { 1765cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 1766cdf0e10cSrcweir if(xPropSet.is()) 1767cdf0e10cSrcweir { 1768cdf0e10cSrcweir try 1769cdf0e10cSrcweir { 1770cdf0e10cSrcweir xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) ); 1771cdf0e10cSrcweir } 1772cdf0e10cSrcweir catch( uno::Exception& ) 1773cdf0e10cSrcweir { 1774cdf0e10cSrcweir DBG_ERROR( "exception during setting of corner radius!"); 1775cdf0e10cSrcweir } 1776cdf0e10cSrcweir } 1777cdf0e10cSrcweir } 1778cdf0e10cSrcweir 1779cdf0e10cSrcweir SdXMLShapeContext::StartElement(mxAttrList); 1780cdf0e10cSrcweir } 1781cdf0e10cSrcweir } 1782cdf0e10cSrcweir 1783cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1784cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1785cdf0e10cSrcweir 1786cdf0e10cSrcweir TYPEINIT1( SdXMLControlShapeContext, SdXMLShapeContext ); 1787cdf0e10cSrcweir 1788cdf0e10cSrcweir SdXMLControlShapeContext::SdXMLControlShapeContext( 1789cdf0e10cSrcweir SvXMLImport& rImport, 1790cdf0e10cSrcweir sal_uInt16 nPrfx, 1791cdf0e10cSrcweir const OUString& rLocalName, 1792cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1793cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1794cdf0e10cSrcweir sal_Bool bTemporaryShape) 1795cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ) 1796cdf0e10cSrcweir { 1797cdf0e10cSrcweir } 1798cdf0e10cSrcweir 1799cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1800cdf0e10cSrcweir 1801cdf0e10cSrcweir SdXMLControlShapeContext::~SdXMLControlShapeContext() 1802cdf0e10cSrcweir { 1803cdf0e10cSrcweir } 1804cdf0e10cSrcweir 1805cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1806cdf0e10cSrcweir 1807cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1808cdf0e10cSrcweir void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1809cdf0e10cSrcweir { 1810cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 1811cdf0e10cSrcweir { 1812cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CONTROL ) ) 1813cdf0e10cSrcweir { 1814cdf0e10cSrcweir maFormId = rValue; 1815cdf0e10cSrcweir return; 1816cdf0e10cSrcweir } 1817cdf0e10cSrcweir } 1818cdf0e10cSrcweir 1819cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 1820cdf0e10cSrcweir } 1821cdf0e10cSrcweir 1822cdf0e10cSrcweir void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 1823cdf0e10cSrcweir { 1824cdf0e10cSrcweir // create Control shape 1825cdf0e10cSrcweir // add, set style and properties from base shape 1826cdf0e10cSrcweir AddShape("com.sun.star.drawing.ControlShape"); 1827cdf0e10cSrcweir if( mxShape.is() ) 1828cdf0e10cSrcweir { 1829cdf0e10cSrcweir DBG_ASSERT( maFormId.getLength(), "draw:control without a form:id attribute!" ); 1830cdf0e10cSrcweir if( maFormId.getLength() ) 1831cdf0e10cSrcweir { 1832cdf0e10cSrcweir #ifndef SVX_LIGHT 1833cdf0e10cSrcweir if( GetImport().IsFormsSupported() ) 1834cdf0e10cSrcweir { 1835cdf0e10cSrcweir uno::Reference< awt::XControlModel > xControlModel( GetImport().GetFormImport()->lookupControl( maFormId ), uno::UNO_QUERY ); 1836cdf0e10cSrcweir if( xControlModel.is() ) 1837cdf0e10cSrcweir { 1838cdf0e10cSrcweir uno::Reference< drawing::XControlShape > xControl( mxShape, uno::UNO_QUERY ); 1839cdf0e10cSrcweir if( xControl.is() ) 1840cdf0e10cSrcweir xControl->setControl( xControlModel ); 1841cdf0e10cSrcweir 1842cdf0e10cSrcweir } 1843cdf0e10cSrcweir } 1844cdf0e10cSrcweir #endif // #ifndef SVX_LIGHT 1845cdf0e10cSrcweir } 1846cdf0e10cSrcweir 1847cdf0e10cSrcweir SetStyle(); 1848cdf0e10cSrcweir SetLayer(); 1849cdf0e10cSrcweir 1850cdf0e10cSrcweir // set pos, size, shear and rotate 1851cdf0e10cSrcweir SetTransformation(); 1852cdf0e10cSrcweir 1853cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 1854cdf0e10cSrcweir } 1855cdf0e10cSrcweir } 1856cdf0e10cSrcweir 1857cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1858cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 1859cdf0e10cSrcweir 1860cdf0e10cSrcweir TYPEINIT1( SdXMLConnectorShapeContext, SdXMLShapeContext ); 1861cdf0e10cSrcweir 1862cdf0e10cSrcweir SdXMLConnectorShapeContext::SdXMLConnectorShapeContext( 1863cdf0e10cSrcweir SvXMLImport& rImport, 1864cdf0e10cSrcweir sal_uInt16 nPrfx, 1865cdf0e10cSrcweir const OUString& rLocalName, 1866cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 1867cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 1868cdf0e10cSrcweir sal_Bool bTemporaryShape) 1869cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 1870cdf0e10cSrcweir maStart(0,0), 1871cdf0e10cSrcweir maEnd(1,1), 1872cdf0e10cSrcweir mnType( (sal_uInt16)drawing::ConnectorType_STANDARD ), 1873cdf0e10cSrcweir mnStartGlueId(-1), 1874cdf0e10cSrcweir mnEndGlueId(-1), 1875cdf0e10cSrcweir mnDelta1(0), 1876cdf0e10cSrcweir mnDelta2(0), 1877cdf0e10cSrcweir mnDelta3(0) 1878cdf0e10cSrcweir { 1879cdf0e10cSrcweir } 1880cdf0e10cSrcweir 1881cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1882cdf0e10cSrcweir 1883cdf0e10cSrcweir SdXMLConnectorShapeContext::~SdXMLConnectorShapeContext() 1884cdf0e10cSrcweir { 1885cdf0e10cSrcweir } 1886cdf0e10cSrcweir 1887cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1888cdf0e10cSrcweir 1889cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 1890cdf0e10cSrcweir void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 1891cdf0e10cSrcweir { 1892cdf0e10cSrcweir switch( nPrefix ) 1893cdf0e10cSrcweir { 1894cdf0e10cSrcweir case XML_NAMESPACE_DRAW: 1895cdf0e10cSrcweir { 1896cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_START_SHAPE ) ) 1897cdf0e10cSrcweir { 1898cdf0e10cSrcweir maStartShapeId = rValue; 1899cdf0e10cSrcweir return; 1900cdf0e10cSrcweir } 1901cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_START_GLUE_POINT ) ) 1902cdf0e10cSrcweir { 1903cdf0e10cSrcweir mnStartGlueId = rValue.toInt32(); 1904cdf0e10cSrcweir return; 1905cdf0e10cSrcweir } 1906cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_END_SHAPE ) ) 1907cdf0e10cSrcweir { 1908cdf0e10cSrcweir maEndShapeId = rValue; 1909cdf0e10cSrcweir return; 1910cdf0e10cSrcweir } 1911cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_END_GLUE_POINT ) ) 1912cdf0e10cSrcweir { 1913cdf0e10cSrcweir mnEndGlueId = rValue.toInt32(); 1914cdf0e10cSrcweir return; 1915cdf0e10cSrcweir } 1916cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_LINE_SKEW ) ) 1917cdf0e10cSrcweir { 1918cdf0e10cSrcweir SvXMLTokenEnumerator aTokenEnum( rValue ); 1919cdf0e10cSrcweir OUString aToken; 1920cdf0e10cSrcweir if( aTokenEnum.getNextToken( aToken ) ) 1921cdf0e10cSrcweir { 1922cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnDelta1, aToken); 1923cdf0e10cSrcweir if( aTokenEnum.getNextToken( aToken ) ) 1924cdf0e10cSrcweir { 1925cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnDelta2, aToken); 1926cdf0e10cSrcweir if( aTokenEnum.getNextToken( aToken ) ) 1927cdf0e10cSrcweir { 1928cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnDelta3, aToken); 1929cdf0e10cSrcweir } 1930cdf0e10cSrcweir } 1931cdf0e10cSrcweir } 1932cdf0e10cSrcweir return; 1933cdf0e10cSrcweir } 1934cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_TYPE ) ) 1935cdf0e10cSrcweir { 1936cdf0e10cSrcweir SvXMLUnitConverter::convertEnum( mnType, rValue, aXML_ConnectionKind_EnumMap ); 1937cdf0e10cSrcweir return; 1938cdf0e10cSrcweir } 1939242c6546SArmin Le Grand // #121965# draw:transform may be used in ODF1.2, e.g. exports from MS seem to use these 1940242c6546SArmin Le Grand else if( IsXMLToken( rLocalName, XML_TRANSFORM ) ) 1941242c6546SArmin Le Grand { 1942242c6546SArmin Le Grand mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter()); 1943242c6546SArmin Le Grand } 1944cdf0e10cSrcweir } 1945cdf0e10cSrcweir case XML_NAMESPACE_SVG: 1946cdf0e10cSrcweir { 1947cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X1 ) ) 1948cdf0e10cSrcweir { 1949cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue); 1950cdf0e10cSrcweir return; 1951cdf0e10cSrcweir } 1952cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y1 ) ) 1953cdf0e10cSrcweir { 1954cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue); 1955cdf0e10cSrcweir return; 1956cdf0e10cSrcweir } 1957cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X2 ) ) 1958cdf0e10cSrcweir { 1959cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue); 1960cdf0e10cSrcweir return; 1961cdf0e10cSrcweir } 1962cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y2 ) ) 1963cdf0e10cSrcweir { 1964cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue); 1965cdf0e10cSrcweir return; 1966cdf0e10cSrcweir } 1967cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_D ) ) 1968cdf0e10cSrcweir { 19691f882ec4SArmin Le Grand basegfx::B2DPolyPolygon aPolyPolygon; 1970cdf0e10cSrcweir 19711f882ec4SArmin Le Grand if(basegfx::tools::importFromSvgD(aPolyPolygon, rValue, true, 0)) 1972cdf0e10cSrcweir { 19731f882ec4SArmin Le Grand if(aPolyPolygon.count()) 19741f882ec4SArmin Le Grand { 19751f882ec4SArmin Le Grand // set polygon data 19761f882ec4SArmin Le Grand if(aPolyPolygon.areControlPointsUsed()) 19771f882ec4SArmin Le Grand { 19781f882ec4SArmin Le Grand drawing::PolyPolygonBezierCoords aSourcePolyPolygon; 19791f882ec4SArmin Le Grand 19801f882ec4SArmin Le Grand basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords( 19811f882ec4SArmin Le Grand aPolyPolygon, 19821f882ec4SArmin Le Grand aSourcePolyPolygon); 1983cdf0e10cSrcweir maPath <<= aSourcePolyPolygon; 1984cdf0e10cSrcweir } 1985cdf0e10cSrcweir else 1986cdf0e10cSrcweir { 19871f882ec4SArmin Le Grand drawing::PointSequenceSequence aSourcePolyPolygon; 1988cdf0e10cSrcweir 19891f882ec4SArmin Le Grand basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence( 19901f882ec4SArmin Le Grand aPolyPolygon, 19911f882ec4SArmin Le Grand aSourcePolyPolygon); 1992cdf0e10cSrcweir maPath <<= aSourcePolyPolygon; 1993cdf0e10cSrcweir } 1994cdf0e10cSrcweir } 1995cdf0e10cSrcweir } 1996cdf0e10cSrcweir } 19971f882ec4SArmin Le Grand } 19981f882ec4SArmin Le Grand } 1999cdf0e10cSrcweir 2000cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2001cdf0e10cSrcweir } 2002cdf0e10cSrcweir 2003cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2004cdf0e10cSrcweir 2005cdf0e10cSrcweir void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 2006cdf0e10cSrcweir { 2007cdf0e10cSrcweir // #107928# 2008cdf0e10cSrcweir // For security reasons, do not add empty connectors. There may have been an error in EA2 2009cdf0e10cSrcweir // that created empty, far set off connectors (e.g. 63 meters below top of document). This 2010cdf0e10cSrcweir // is not guaranteed, but it's definitely safe to not add empty connectors. 2011cdf0e10cSrcweir sal_Bool bDoAdd(sal_True); 2012cdf0e10cSrcweir 2013cdf0e10cSrcweir if( 0 == maStartShapeId.getLength() 2014cdf0e10cSrcweir && 0 == maEndShapeId.getLength() 2015cdf0e10cSrcweir && maStart.X == maEnd.X 2016cdf0e10cSrcweir && maStart.Y == maEnd.Y 2017cdf0e10cSrcweir && 0 == mnDelta1 2018cdf0e10cSrcweir && 0 == mnDelta2 2019cdf0e10cSrcweir && 0 == mnDelta3 2020cdf0e10cSrcweir ) 2021cdf0e10cSrcweir { 2022cdf0e10cSrcweir bDoAdd = sal_False; 2023cdf0e10cSrcweir } 2024cdf0e10cSrcweir 2025cdf0e10cSrcweir if(bDoAdd) 2026cdf0e10cSrcweir { 2027cdf0e10cSrcweir // create Connector shape 2028cdf0e10cSrcweir // add, set style and properties from base shape 2029cdf0e10cSrcweir AddShape("com.sun.star.drawing.ConnectorShape"); 2030cdf0e10cSrcweir if(mxShape.is()) 2031cdf0e10cSrcweir { 2032242c6546SArmin Le Grand // #121965# if draw:transform is used, apply directly to the start 2033242c6546SArmin Le Grand // and end positions before using these 2034242c6546SArmin Le Grand if(mnTransform.NeedsAction()) 2035242c6546SArmin Le Grand { 2036242c6546SArmin Le Grand // transformation is used, apply to object. 2037242c6546SArmin Le Grand ::basegfx::B2DHomMatrix aMat; 2038242c6546SArmin Le Grand mnTransform.GetFullTransform(aMat); 2039242c6546SArmin Le Grand 2040242c6546SArmin Le Grand if(!aMat.isIdentity()) 2041242c6546SArmin Le Grand { 2042242c6546SArmin Le Grand basegfx::B2DPoint aStart(maStart.X, maStart.Y); 2043242c6546SArmin Le Grand basegfx::B2DPoint aEnd(maEnd.X, maEnd.Y); 2044242c6546SArmin Le Grand 2045242c6546SArmin Le Grand aStart = aMat * aStart; 2046242c6546SArmin Le Grand aEnd = aMat * aEnd; 2047242c6546SArmin Le Grand 2048242c6546SArmin Le Grand maStart.X = basegfx::fround(aStart.getX()); 2049242c6546SArmin Le Grand maStart.Y = basegfx::fround(aStart.getY()); 2050242c6546SArmin Le Grand maEnd.X = basegfx::fround(aEnd.getX()); 2051242c6546SArmin Le Grand maEnd.Y = basegfx::fround(aEnd.getY()); 2052242c6546SArmin Le Grand } 2053242c6546SArmin Le Grand } 2054242c6546SArmin Le Grand 2055cdf0e10cSrcweir // add connection ids 2056cdf0e10cSrcweir if( maStartShapeId.getLength() ) 2057cdf0e10cSrcweir GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_True, maStartShapeId, mnStartGlueId ); 2058cdf0e10cSrcweir if( maEndShapeId.getLength() ) 2059cdf0e10cSrcweir GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_False, maEndShapeId, mnEndGlueId ); 2060cdf0e10cSrcweir 2061cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 2062cdf0e10cSrcweir if( xProps.is() ) 2063cdf0e10cSrcweir { 2064cdf0e10cSrcweir uno::Any aAny; 2065cdf0e10cSrcweir aAny <<= maStart; 2066cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny); 2067cdf0e10cSrcweir 2068cdf0e10cSrcweir aAny <<= maEnd; 2069cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny ); 2070cdf0e10cSrcweir 2071cdf0e10cSrcweir aAny <<= (drawing::ConnectorType)mnType; 2072cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind")), aAny ); 2073cdf0e10cSrcweir 2074cdf0e10cSrcweir aAny <<= mnDelta1; 2075cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta")), aAny ); 2076cdf0e10cSrcweir 2077cdf0e10cSrcweir aAny <<= mnDelta2; 2078cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta")), aAny ); 2079cdf0e10cSrcweir 2080cdf0e10cSrcweir aAny <<= mnDelta3; 2081cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta")), aAny ); 2082cdf0e10cSrcweir } 2083cdf0e10cSrcweir SetStyle(); 2084cdf0e10cSrcweir SetLayer(); 2085cdf0e10cSrcweir 2086cdf0e10cSrcweir if ( maPath.hasValue() ) 2087cdf0e10cSrcweir { 2088cdf0e10cSrcweir // --> OD #i115492# 2089cdf0e10cSrcweir // Ignore svg:d attribute for text documents created by OpenOffice.org 2090cdf0e10cSrcweir // versions before OOo 3.3, because these OOo versions are storing 2091cdf0e10cSrcweir // svg:d values not using the correct unit. 2092cdf0e10cSrcweir bool bApplySVGD( true ); 2093cdf0e10cSrcweir if ( uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() ) 2094cdf0e10cSrcweir { 2095cdf0e10cSrcweir sal_Int32 nUPD( 0 ); 2096cdf0e10cSrcweir sal_Int32 nBuild( 0 ); 2097cdf0e10cSrcweir const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild ); 2098cdf0e10cSrcweir if ( GetImport().IsTextDocInOOoFileFormat() || 2099cdf0e10cSrcweir ( bBuildIdFound && 2100cdf0e10cSrcweir ( ( nUPD == 641 ) || ( nUPD == 645 ) || // prior OOo 2.0 2101cdf0e10cSrcweir ( nUPD == 680 ) || // OOo 2.x 2102cdf0e10cSrcweir ( nUPD == 300 ) || // OOo 3.0 - OOo 3.0.1 2103cdf0e10cSrcweir ( nUPD == 310 ) || // OOo 3.1 - OOo 3.1.1 2104cdf0e10cSrcweir ( nUPD == 320 ) ) ) ) // OOo 3.2 - OOo 3.2.1 2105cdf0e10cSrcweir { 2106cdf0e10cSrcweir bApplySVGD = false; 2107cdf0e10cSrcweir } 2108cdf0e10cSrcweir } 2109cdf0e10cSrcweir 2110cdf0e10cSrcweir if ( bApplySVGD ) 2111cdf0e10cSrcweir { 2112cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ), maPath ); 2113cdf0e10cSrcweir } 2114cdf0e10cSrcweir // <-- 2115cdf0e10cSrcweir } 2116cdf0e10cSrcweir 2117cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 2118cdf0e10cSrcweir } 2119cdf0e10cSrcweir } 2120cdf0e10cSrcweir } 2121cdf0e10cSrcweir 2122cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2123cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2124cdf0e10cSrcweir 2125cdf0e10cSrcweir TYPEINIT1( SdXMLMeasureShapeContext, SdXMLShapeContext ); 2126cdf0e10cSrcweir 2127cdf0e10cSrcweir SdXMLMeasureShapeContext::SdXMLMeasureShapeContext( 2128cdf0e10cSrcweir SvXMLImport& rImport, 2129cdf0e10cSrcweir sal_uInt16 nPrfx, 2130cdf0e10cSrcweir const OUString& rLocalName, 2131cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2132cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 2133cdf0e10cSrcweir sal_Bool bTemporaryShape) 2134cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 2135cdf0e10cSrcweir maStart(0,0), 2136cdf0e10cSrcweir maEnd(1,1) 2137cdf0e10cSrcweir { 2138cdf0e10cSrcweir } 2139cdf0e10cSrcweir 2140cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2141cdf0e10cSrcweir 2142cdf0e10cSrcweir SdXMLMeasureShapeContext::~SdXMLMeasureShapeContext() 2143cdf0e10cSrcweir { 2144cdf0e10cSrcweir } 2145cdf0e10cSrcweir 2146cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2147cdf0e10cSrcweir void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2148cdf0e10cSrcweir { 2149cdf0e10cSrcweir switch( nPrefix ) 2150cdf0e10cSrcweir { 2151cdf0e10cSrcweir case XML_NAMESPACE_SVG: 2152cdf0e10cSrcweir { 2153cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X1 ) ) 2154cdf0e10cSrcweir { 2155cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue); 2156cdf0e10cSrcweir return; 2157cdf0e10cSrcweir } 2158cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y1 ) ) 2159cdf0e10cSrcweir { 2160cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue); 2161cdf0e10cSrcweir return; 2162cdf0e10cSrcweir } 2163cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_X2 ) ) 2164cdf0e10cSrcweir { 2165cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue); 2166cdf0e10cSrcweir return; 2167cdf0e10cSrcweir } 2168cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_Y2 ) ) 2169cdf0e10cSrcweir { 2170cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue); 2171cdf0e10cSrcweir return; 2172cdf0e10cSrcweir } 2173cdf0e10cSrcweir } 2174cdf0e10cSrcweir } 2175cdf0e10cSrcweir 2176cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2177cdf0e10cSrcweir } 2178cdf0e10cSrcweir 2179cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2180cdf0e10cSrcweir 2181cdf0e10cSrcweir void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 2182cdf0e10cSrcweir { 2183cdf0e10cSrcweir // create Measure shape 2184cdf0e10cSrcweir // add, set style and properties from base shape 2185cdf0e10cSrcweir AddShape("com.sun.star.drawing.MeasureShape"); 2186cdf0e10cSrcweir if(mxShape.is()) 2187cdf0e10cSrcweir { 2188cdf0e10cSrcweir SetStyle(); 2189cdf0e10cSrcweir SetLayer(); 2190cdf0e10cSrcweir 2191cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 2192cdf0e10cSrcweir if( xProps.is() ) 2193cdf0e10cSrcweir { 2194cdf0e10cSrcweir uno::Any aAny; 2195cdf0e10cSrcweir aAny <<= maStart; 2196cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny); 2197cdf0e10cSrcweir 2198cdf0e10cSrcweir aAny <<= maEnd; 2199cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny ); 2200cdf0e10cSrcweir } 2201cdf0e10cSrcweir 2202cdf0e10cSrcweir // delete pre created fields 2203cdf0e10cSrcweir uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY ); 2204cdf0e10cSrcweir if( xText.is() ) 2205cdf0e10cSrcweir { 2206cdf0e10cSrcweir const OUString aEmpty( RTL_CONSTASCII_USTRINGPARAM( " " ) ); 2207cdf0e10cSrcweir xText->setString( aEmpty ); 2208cdf0e10cSrcweir } 2209cdf0e10cSrcweir 2210cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 2211cdf0e10cSrcweir } 2212cdf0e10cSrcweir } 2213cdf0e10cSrcweir 2214cdf0e10cSrcweir void SdXMLMeasureShapeContext::EndElement() 2215cdf0e10cSrcweir { 2216cdf0e10cSrcweir do 2217cdf0e10cSrcweir { 2218cdf0e10cSrcweir // delete pre created fields 2219cdf0e10cSrcweir uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY ); 2220cdf0e10cSrcweir if( !xText.is() ) 2221cdf0e10cSrcweir break; 2222cdf0e10cSrcweir 2223cdf0e10cSrcweir uno::Reference< text::XTextCursor > xCursor( xText->createTextCursor() ); 2224cdf0e10cSrcweir if( !xCursor.is() ) 2225cdf0e10cSrcweir break; 2226cdf0e10cSrcweir 2227cdf0e10cSrcweir const OUString aEmpty; 2228cdf0e10cSrcweir xCursor->collapseToStart(); 2229cdf0e10cSrcweir xCursor->goRight( 1, sal_True ); 2230cdf0e10cSrcweir xCursor->setString( aEmpty ); 2231cdf0e10cSrcweir } 2232cdf0e10cSrcweir while(0); 2233cdf0e10cSrcweir 2234cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 2235cdf0e10cSrcweir } 2236cdf0e10cSrcweir 2237cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2238cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2239cdf0e10cSrcweir 2240cdf0e10cSrcweir TYPEINIT1( SdXMLPageShapeContext, SdXMLShapeContext ); 2241cdf0e10cSrcweir 2242cdf0e10cSrcweir SdXMLPageShapeContext::SdXMLPageShapeContext( 2243cdf0e10cSrcweir SvXMLImport& rImport, 2244cdf0e10cSrcweir sal_uInt16 nPrfx, 2245cdf0e10cSrcweir const OUString& rLocalName, 2246cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2247cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 2248cdf0e10cSrcweir sal_Bool bTemporaryShape) 2249cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), mnPageNumber(0) 2250cdf0e10cSrcweir { 2251cdf0e10cSrcweir mbClearDefaultAttributes = false; 2252cdf0e10cSrcweir } 2253cdf0e10cSrcweir 2254cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2255cdf0e10cSrcweir 2256cdf0e10cSrcweir SdXMLPageShapeContext::~SdXMLPageShapeContext() 2257cdf0e10cSrcweir { 2258cdf0e10cSrcweir } 2259cdf0e10cSrcweir 2260cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2261cdf0e10cSrcweir 2262cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2263cdf0e10cSrcweir void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2264cdf0e10cSrcweir { 2265cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 2266cdf0e10cSrcweir { 2267cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_PAGE_NUMBER ) ) 2268cdf0e10cSrcweir { 2269cdf0e10cSrcweir mnPageNumber = rValue.toInt32(); 2270cdf0e10cSrcweir return; 2271cdf0e10cSrcweir } 2272cdf0e10cSrcweir } 2273cdf0e10cSrcweir 2274cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2275cdf0e10cSrcweir } 2276cdf0e10cSrcweir 2277cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2278cdf0e10cSrcweir 2279cdf0e10cSrcweir void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 2280cdf0e10cSrcweir { 2281cdf0e10cSrcweir // create Page shape 2282cdf0e10cSrcweir // add, set style and properties from base shape 2283cdf0e10cSrcweir 2284cdf0e10cSrcweir // #86163# take into account which type of PageShape needs to 2285cdf0e10cSrcweir // be constructed. It's an pres shape if presentation:XML_CLASS == XML_PRESENTATION_PAGE. 2286cdf0e10cSrcweir sal_Bool bIsPresentation = maPresentationClass.getLength() && 2287cdf0e10cSrcweir GetImport().GetShapeImport()->IsPresentationShapesSupported(); 2288cdf0e10cSrcweir 2289cdf0e10cSrcweir uno::Reference< lang::XServiceInfo > xInfo( mxShapes, uno::UNO_QUERY ); 2290cdf0e10cSrcweir const sal_Bool bIsOnHandoutPage = xInfo.is() && xInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutMasterPage")) ); 2291cdf0e10cSrcweir 2292cdf0e10cSrcweir if( bIsOnHandoutPage ) 2293cdf0e10cSrcweir { 2294cdf0e10cSrcweir AddShape("com.sun.star.presentation.HandoutShape"); 2295cdf0e10cSrcweir } 2296cdf0e10cSrcweir else 2297cdf0e10cSrcweir { 2298cdf0e10cSrcweir if(bIsPresentation && !IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) ) 2299cdf0e10cSrcweir { 2300cdf0e10cSrcweir bIsPresentation = sal_False; 2301cdf0e10cSrcweir } 2302cdf0e10cSrcweir 2303cdf0e10cSrcweir if(bIsPresentation) 2304cdf0e10cSrcweir { 2305cdf0e10cSrcweir AddShape("com.sun.star.presentation.PageShape"); 2306cdf0e10cSrcweir } 2307cdf0e10cSrcweir else 2308cdf0e10cSrcweir { 2309cdf0e10cSrcweir AddShape("com.sun.star.drawing.PageShape"); 2310cdf0e10cSrcweir } 2311cdf0e10cSrcweir } 2312cdf0e10cSrcweir 2313cdf0e10cSrcweir if(mxShape.is()) 2314cdf0e10cSrcweir { 2315cdf0e10cSrcweir SetStyle(); 2316cdf0e10cSrcweir SetLayer(); 2317cdf0e10cSrcweir 2318cdf0e10cSrcweir // set pos, size, shear and rotate 2319cdf0e10cSrcweir SetTransformation(); 2320cdf0e10cSrcweir 2321cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 2322cdf0e10cSrcweir if(xPropSet.is()) 2323cdf0e10cSrcweir { 2324cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 2325cdf0e10cSrcweir const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber")); 2326cdf0e10cSrcweir if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr)) 2327cdf0e10cSrcweir xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber )); 2328cdf0e10cSrcweir } 2329cdf0e10cSrcweir 2330cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 2331cdf0e10cSrcweir } 2332cdf0e10cSrcweir } 2333cdf0e10cSrcweir 2334cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2335cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2336cdf0e10cSrcweir 2337cdf0e10cSrcweir TYPEINIT1( SdXMLCaptionShapeContext, SdXMLShapeContext ); 2338cdf0e10cSrcweir 2339cdf0e10cSrcweir SdXMLCaptionShapeContext::SdXMLCaptionShapeContext( 2340cdf0e10cSrcweir SvXMLImport& rImport, 2341cdf0e10cSrcweir sal_uInt16 nPrfx, 2342cdf0e10cSrcweir const OUString& rLocalName, 2343cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2344cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 2345cdf0e10cSrcweir sal_Bool bTemporaryShape) 2346cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 2347cdf0e10cSrcweir // #86616# for correct edge rounding import mnRadius needs to be initialized 2348cdf0e10cSrcweir mnRadius( 0L ) 2349cdf0e10cSrcweir { 2350cdf0e10cSrcweir } 2351cdf0e10cSrcweir 2352cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2353cdf0e10cSrcweir 2354cdf0e10cSrcweir SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext() 2355cdf0e10cSrcweir { 2356cdf0e10cSrcweir } 2357cdf0e10cSrcweir 2358cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2359cdf0e10cSrcweir 2360cdf0e10cSrcweir void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 2361cdf0e10cSrcweir { 2362cdf0e10cSrcweir // create Caption shape 2363cdf0e10cSrcweir // add, set style and properties from base shape 2364cdf0e10cSrcweir AddShape("com.sun.star.drawing.CaptionShape"); 2365cdf0e10cSrcweir if( mxShape.is() ) 2366cdf0e10cSrcweir { 2367cdf0e10cSrcweir SetStyle(); 2368cdf0e10cSrcweir SetLayer(); 2369cdf0e10cSrcweir 2370cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 2371cdf0e10cSrcweir 2372cdf0e10cSrcweir // SJ: If AutoGrowWidthItem is set, SetTransformation will lead to the wrong SnapRect 2373cdf0e10cSrcweir // because NbcAdjustTextFrameWidthAndHeight() is called (text is set later and center alignment 2374cdf0e10cSrcweir // is the default setting, so the top left reference point that is used by the caption point is 2375cdf0e10cSrcweir // no longer correct) There are two ways to solve this problem, temporarily disabling the 2376cdf0e10cSrcweir // autogrowwith as we are doing here or to apply the CaptionPoint after setting text 2377cdf0e10cSrcweir sal_Bool bIsAutoGrowWidth = sal_False; 2378cdf0e10cSrcweir if ( xProps.is() ) 2379cdf0e10cSrcweir { 2380cdf0e10cSrcweir uno::Any aAny( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth") ) ) ); 2381cdf0e10cSrcweir aAny >>= bIsAutoGrowWidth; 2382cdf0e10cSrcweir 2383cdf0e10cSrcweir if ( bIsAutoGrowWidth ) 2384cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_False ) ); 2385cdf0e10cSrcweir } 2386cdf0e10cSrcweir 2387cdf0e10cSrcweir // set pos, size, shear and rotate 2388cdf0e10cSrcweir SetTransformation(); 2389cdf0e10cSrcweir if( xProps.is() ) 2390cdf0e10cSrcweir xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint")), uno::makeAny( maCaptionPoint ) ); 2391cdf0e10cSrcweir 2392cdf0e10cSrcweir if ( bIsAutoGrowWidth ) 2393cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_True ) ); 2394cdf0e10cSrcweir 2395cdf0e10cSrcweir if(mnRadius) 2396cdf0e10cSrcweir { 2397cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 2398cdf0e10cSrcweir if(xPropSet.is()) 2399cdf0e10cSrcweir { 2400cdf0e10cSrcweir try 2401cdf0e10cSrcweir { 2402cdf0e10cSrcweir xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) ); 2403cdf0e10cSrcweir } 2404cdf0e10cSrcweir catch( uno::Exception& ) 2405cdf0e10cSrcweir { 2406cdf0e10cSrcweir DBG_ERROR( "exception during setting of corner radius!"); 2407cdf0e10cSrcweir } 2408cdf0e10cSrcweir } 2409cdf0e10cSrcweir } 2410cdf0e10cSrcweir 2411cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 2412cdf0e10cSrcweir } 2413cdf0e10cSrcweir } 2414cdf0e10cSrcweir 2415cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2416cdf0e10cSrcweir void SdXMLCaptionShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2417cdf0e10cSrcweir { 2418cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 2419cdf0e10cSrcweir { 2420cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CAPTION_POINT_X ) ) 2421cdf0e10cSrcweir { 2422cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.X, rValue); 2423cdf0e10cSrcweir return; 2424cdf0e10cSrcweir } 2425cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CAPTION_POINT_Y ) ) 2426cdf0e10cSrcweir { 2427cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.Y, rValue); 2428cdf0e10cSrcweir return; 2429cdf0e10cSrcweir } 2430cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) ) 2431cdf0e10cSrcweir { 2432cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue); 2433cdf0e10cSrcweir return; 2434cdf0e10cSrcweir } 2435cdf0e10cSrcweir } 2436cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2437cdf0e10cSrcweir } 2438cdf0e10cSrcweir 2439cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2440cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2441cdf0e10cSrcweir 2442cdf0e10cSrcweir TYPEINIT1( SdXMLGraphicObjectShapeContext, SdXMLShapeContext ); 2443cdf0e10cSrcweir 2444cdf0e10cSrcweir SdXMLGraphicObjectShapeContext::SdXMLGraphicObjectShapeContext( 2445cdf0e10cSrcweir SvXMLImport& rImport, 2446cdf0e10cSrcweir sal_uInt16 nPrfx, 2447cdf0e10cSrcweir const OUString& rLocalName, 2448cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2449cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 2450cdf0e10cSrcweir sal_Bool bTemporaryShape) 2451cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 2452598d8f9fSArmin Le Grand maURL(), 2453598d8f9fSArmin Le Grand mbLateAddToIdentifierMapper(false) 2454cdf0e10cSrcweir { 2455cdf0e10cSrcweir } 2456cdf0e10cSrcweir 2457cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2458cdf0e10cSrcweir 2459cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2460cdf0e10cSrcweir void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2461cdf0e10cSrcweir { 2462cdf0e10cSrcweir if( XML_NAMESPACE_XLINK == nPrefix ) 2463cdf0e10cSrcweir { 2464cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_HREF ) ) 2465cdf0e10cSrcweir { 2466cdf0e10cSrcweir maURL = rValue; 2467cdf0e10cSrcweir return; 2468cdf0e10cSrcweir } 2469cdf0e10cSrcweir } 2470cdf0e10cSrcweir 2471cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2472cdf0e10cSrcweir } 2473cdf0e10cSrcweir 2474cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2475cdf0e10cSrcweir 2476cdf0e10cSrcweir void SdXMLGraphicObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& ) 2477cdf0e10cSrcweir { 2478cdf0e10cSrcweir // create graphic object shape 2479cdf0e10cSrcweir const char *pService; 2480cdf0e10cSrcweir 2481cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) && GetImport().GetShapeImport()->IsPresentationShapesSupported() ) 2482cdf0e10cSrcweir { 2483cdf0e10cSrcweir pService = "com.sun.star.presentation.GraphicObjectShape"; 2484cdf0e10cSrcweir } 2485cdf0e10cSrcweir else 2486cdf0e10cSrcweir { 2487cdf0e10cSrcweir pService = "com.sun.star.drawing.GraphicObjectShape"; 2488cdf0e10cSrcweir } 2489cdf0e10cSrcweir 2490cdf0e10cSrcweir AddShape( pService ); 2491cdf0e10cSrcweir 2492cdf0e10cSrcweir if(mxShape.is()) 2493cdf0e10cSrcweir { 2494cdf0e10cSrcweir SetStyle(); 2495cdf0e10cSrcweir SetLayer(); 2496cdf0e10cSrcweir 2497cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropset(mxShape, uno::UNO_QUERY); 2498cdf0e10cSrcweir if(xPropset.is()) 2499cdf0e10cSrcweir { 2500cdf0e10cSrcweir // since OOo 1.x had no line or fill style for graphics, but may create 2501cdf0e10cSrcweir // documents with them, we have to override them here 2502cdf0e10cSrcweir sal_Int32 nUPD, nBuildId; 2503cdf0e10cSrcweir if( GetImport().getBuildIds( nUPD, nBuildId ) && (nUPD == 645) ) try 2504cdf0e10cSrcweir { 2505cdf0e10cSrcweir xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), Any( FillStyle_NONE ) ); 2506cdf0e10cSrcweir xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("LineStyle")), Any( LineStyle_NONE ) ); 2507cdf0e10cSrcweir } 2508cdf0e10cSrcweir catch( Exception& ) 2509cdf0e10cSrcweir { 2510cdf0e10cSrcweir } 2511cdf0e10cSrcweir 2512cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xPropset->getPropertySetInfo() ); 2513cdf0e10cSrcweir if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 2514cdf0e10cSrcweir xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( mbIsPlaceholder ) ); 2515cdf0e10cSrcweir 2516cdf0e10cSrcweir if( !mbIsPlaceholder ) 2517cdf0e10cSrcweir { 2518cdf0e10cSrcweir if( maURL.getLength() ) 2519cdf0e10cSrcweir { 2520cdf0e10cSrcweir uno::Any aAny; 2521cdf0e10cSrcweir aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() ); 2522cdf0e10cSrcweir try 2523cdf0e10cSrcweir { 2524cdf0e10cSrcweir xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny ); 2525cdf0e10cSrcweir xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny ); 2526cdf0e10cSrcweir } 2527cdf0e10cSrcweir catch (lang::IllegalArgumentException const &) 2528cdf0e10cSrcweir { 2529cdf0e10cSrcweir } 2530cdf0e10cSrcweir } 2531cdf0e10cSrcweir } 2532cdf0e10cSrcweir } 2533cdf0e10cSrcweir 2534cdf0e10cSrcweir if(mbIsUserTransformed) 2535cdf0e10cSrcweir { 2536cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2537cdf0e10cSrcweir if(xProps.is()) 2538cdf0e10cSrcweir { 2539cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 2540cdf0e10cSrcweir if( xPropsInfo.is() ) 2541cdf0e10cSrcweir { 2542cdf0e10cSrcweir if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 2543cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 2544cdf0e10cSrcweir } 2545cdf0e10cSrcweir } 2546cdf0e10cSrcweir } 2547cdf0e10cSrcweir 2548cdf0e10cSrcweir // set pos, size, shear and rotate 2549cdf0e10cSrcweir SetTransformation(); 2550cdf0e10cSrcweir 2551cdf0e10cSrcweir SdXMLShapeContext::StartElement(mxAttrList); 2552cdf0e10cSrcweir } 2553cdf0e10cSrcweir } 2554cdf0e10cSrcweir 2555cdf0e10cSrcweir void SdXMLGraphicObjectShapeContext::EndElement() 2556cdf0e10cSrcweir { 2557cdf0e10cSrcweir if( mxBase64Stream.is() ) 2558cdf0e10cSrcweir { 2559cdf0e10cSrcweir OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) ); 2560cdf0e10cSrcweir if( sURL.getLength() ) 2561cdf0e10cSrcweir { 2562cdf0e10cSrcweir try 2563cdf0e10cSrcweir { 2564cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2565cdf0e10cSrcweir if(xProps.is()) 2566cdf0e10cSrcweir { 2567cdf0e10cSrcweir const uno::Any aAny( uno::makeAny( sURL ) ); 2568cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny ); 2569cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny ); 2570cdf0e10cSrcweir } 2571cdf0e10cSrcweir } 2572cdf0e10cSrcweir catch (lang::IllegalArgumentException const &) 2573cdf0e10cSrcweir { 2574cdf0e10cSrcweir } 2575cdf0e10cSrcweir } 2576cdf0e10cSrcweir } 2577cdf0e10cSrcweir 2578cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 2579cdf0e10cSrcweir } 2580cdf0e10cSrcweir 2581cdf0e10cSrcweir 2582cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2583cdf0e10cSrcweir 2584cdf0e10cSrcweir SvXMLImportContext* SdXMLGraphicObjectShapeContext::CreateChildContext( 2585cdf0e10cSrcweir sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 2586cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 2587cdf0e10cSrcweir { 2588cdf0e10cSrcweir SvXMLImportContext* pContext = NULL; 2589cdf0e10cSrcweir 2590cdf0e10cSrcweir if( (XML_NAMESPACE_OFFICE == nPrefix) && 2591cdf0e10cSrcweir xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) ) 2592cdf0e10cSrcweir { 2593cdf0e10cSrcweir if( !maURL.getLength() && !mxBase64Stream.is() ) 2594cdf0e10cSrcweir { 2595cdf0e10cSrcweir mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64(); 2596cdf0e10cSrcweir if( mxBase64Stream.is() ) 2597cdf0e10cSrcweir pContext = new XMLBase64ImportContext( GetImport(), nPrefix, 2598cdf0e10cSrcweir rLocalName, xAttrList, 2599cdf0e10cSrcweir mxBase64Stream ); 2600cdf0e10cSrcweir } 2601cdf0e10cSrcweir } 2602cdf0e10cSrcweir 2603cdf0e10cSrcweir // delegate to parent class if no context could be created 2604cdf0e10cSrcweir if ( NULL == pContext ) 2605cdf0e10cSrcweir pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, 2606cdf0e10cSrcweir xAttrList); 2607cdf0e10cSrcweir 2608cdf0e10cSrcweir return pContext; 2609cdf0e10cSrcweir } 2610cdf0e10cSrcweir 2611cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2612cdf0e10cSrcweir 2613cdf0e10cSrcweir SdXMLGraphicObjectShapeContext::~SdXMLGraphicObjectShapeContext() 2614cdf0e10cSrcweir { 2615cdf0e10cSrcweir 2616cdf0e10cSrcweir } 2617cdf0e10cSrcweir 2618cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2619cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2620cdf0e10cSrcweir 2621cdf0e10cSrcweir TYPEINIT1( SdXMLChartShapeContext, SdXMLShapeContext ); 2622cdf0e10cSrcweir 2623cdf0e10cSrcweir SdXMLChartShapeContext::SdXMLChartShapeContext( 2624cdf0e10cSrcweir SvXMLImport& rImport, 2625cdf0e10cSrcweir sal_uInt16 nPrfx, 2626cdf0e10cSrcweir const OUString& rLocalName, 2627cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2628cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 2629cdf0e10cSrcweir sal_Bool bTemporaryShape) 2630cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 2631cdf0e10cSrcweir mpChartContext( NULL ) 2632cdf0e10cSrcweir { 2633cdf0e10cSrcweir } 2634cdf0e10cSrcweir 2635cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2636cdf0e10cSrcweir 2637cdf0e10cSrcweir SdXMLChartShapeContext::~SdXMLChartShapeContext() 2638cdf0e10cSrcweir { 2639cdf0e10cSrcweir if( mpChartContext ) 2640cdf0e10cSrcweir delete mpChartContext; 2641cdf0e10cSrcweir } 2642cdf0e10cSrcweir 2643cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2644cdf0e10cSrcweir 2645cdf0e10cSrcweir void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList) 2646cdf0e10cSrcweir { 2647cdf0e10cSrcweir const sal_Bool bIsPresentation = isPresentationShape(); 2648cdf0e10cSrcweir 2649cdf0e10cSrcweir AddShape( bIsPresentation ? "com.sun.star.presentation.ChartShape" : "com.sun.star.drawing.OLE2Shape" ); 2650cdf0e10cSrcweir 2651cdf0e10cSrcweir if(mxShape.is()) 2652cdf0e10cSrcweir { 2653cdf0e10cSrcweir SetStyle(); 2654cdf0e10cSrcweir SetLayer(); 2655cdf0e10cSrcweir 2656cdf0e10cSrcweir if( !mbIsPlaceholder ) 2657cdf0e10cSrcweir { 2658cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2659cdf0e10cSrcweir if(xProps.is()) 2660cdf0e10cSrcweir { 2661cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 2662cdf0e10cSrcweir if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 2663cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) ); 2664cdf0e10cSrcweir 2665cdf0e10cSrcweir uno::Any aAny; 2666cdf0e10cSrcweir 2667cdf0e10cSrcweir const OUString aCLSID( RTL_CONSTASCII_USTRINGPARAM("12DCAE26-281F-416F-a234-c3086127382e")); 2668cdf0e10cSrcweir 2669cdf0e10cSrcweir aAny <<= aCLSID; 2670cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), aAny ); 2671cdf0e10cSrcweir 2672cdf0e10cSrcweir #ifndef SVX_LIGHT 2673cdf0e10cSrcweir aAny = xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ); 2674cdf0e10cSrcweir uno::Reference< frame::XModel > xChartModel; 2675cdf0e10cSrcweir if( aAny >>= xChartModel ) 2676cdf0e10cSrcweir { 2677cdf0e10cSrcweir mpChartContext = GetImport().GetChartImport()->CreateChartContext( GetImport(), XML_NAMESPACE_SVG, GetXMLToken(XML_CHART), xChartModel, xAttrList ); 2678cdf0e10cSrcweir } 2679cdf0e10cSrcweir #endif 2680cdf0e10cSrcweir } 2681cdf0e10cSrcweir } 2682cdf0e10cSrcweir 2683cdf0e10cSrcweir if(mbIsUserTransformed) 2684cdf0e10cSrcweir { 2685cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2686cdf0e10cSrcweir if(xProps.is()) 2687cdf0e10cSrcweir { 2688cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 2689cdf0e10cSrcweir if( xPropsInfo.is() ) 2690cdf0e10cSrcweir { 2691cdf0e10cSrcweir if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 2692cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 2693cdf0e10cSrcweir } 2694cdf0e10cSrcweir } 2695cdf0e10cSrcweir } 2696cdf0e10cSrcweir 2697cdf0e10cSrcweir 2698cdf0e10cSrcweir // set pos, size, shear and rotate 2699cdf0e10cSrcweir SetTransformation(); 2700cdf0e10cSrcweir 2701cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 2702cdf0e10cSrcweir 2703cdf0e10cSrcweir if( mpChartContext ) 2704cdf0e10cSrcweir mpChartContext->StartElement( xAttrList ); 2705cdf0e10cSrcweir } 2706cdf0e10cSrcweir } 2707cdf0e10cSrcweir 2708cdf0e10cSrcweir void SdXMLChartShapeContext::EndElement() 2709cdf0e10cSrcweir { 2710cdf0e10cSrcweir if( mpChartContext ) 2711cdf0e10cSrcweir mpChartContext->EndElement(); 2712cdf0e10cSrcweir 2713cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 2714cdf0e10cSrcweir } 2715cdf0e10cSrcweir 2716cdf0e10cSrcweir void SdXMLChartShapeContext::Characters( const ::rtl::OUString& rChars ) 2717cdf0e10cSrcweir { 2718cdf0e10cSrcweir if( mpChartContext ) 2719cdf0e10cSrcweir mpChartContext->Characters( rChars ); 2720cdf0e10cSrcweir } 2721cdf0e10cSrcweir 2722cdf0e10cSrcweir SvXMLImportContext * SdXMLChartShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 2723cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList ) 2724cdf0e10cSrcweir { 2725cdf0e10cSrcweir if( mpChartContext ) 2726cdf0e10cSrcweir return mpChartContext->CreateChildContext( nPrefix, rLocalName, xAttrList ); 2727cdf0e10cSrcweir 2728cdf0e10cSrcweir return NULL; 2729cdf0e10cSrcweir } 2730cdf0e10cSrcweir 2731cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2732cdf0e10cSrcweir 2733cdf0e10cSrcweir TYPEINIT1( SdXMLObjectShapeContext, SdXMLShapeContext ); 2734cdf0e10cSrcweir 2735cdf0e10cSrcweir SdXMLObjectShapeContext::SdXMLObjectShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 2736cdf0e10cSrcweir const rtl::OUString& rLocalName, 2737cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2738cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes, 2739cdf0e10cSrcweir sal_Bool bTemporaryShape) 2740cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ) 2741cdf0e10cSrcweir { 2742cdf0e10cSrcweir } 2743cdf0e10cSrcweir 2744cdf0e10cSrcweir SdXMLObjectShapeContext::~SdXMLObjectShapeContext() 2745cdf0e10cSrcweir { 2746cdf0e10cSrcweir } 2747cdf0e10cSrcweir 2748cdf0e10cSrcweir void SdXMLObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& ) 2749cdf0e10cSrcweir { 2750cdf0e10cSrcweir // #96717# in theorie, if we don't have a url we shouldn't even 2751cdf0e10cSrcweir // export this ole shape. But practical its to risky right now 2752cdf0e10cSrcweir // to change this so we better dispose this on load 2753cdf0e10cSrcweir //if( !mbIsPlaceholder && ImpIsEmptyURL(maHref) ) 2754cdf0e10cSrcweir // return; 2755cdf0e10cSrcweir 2756cdf0e10cSrcweir // #100592# this BugFix prevents that a shape is created. CL 2757cdf0e10cSrcweir // is thinking about an alternative. 2758cdf0e10cSrcweir // #i13140# Check for more than empty string in maHref, there are 2759cdf0e10cSrcweir // other possibilities that maHref results in empty container 2760cdf0e10cSrcweir // storage names 2761cdf0e10cSrcweir if( !(GetImport().getImportFlags() & IMPORT_EMBEDDED) && !mbIsPlaceholder && ImpIsEmptyURL(maHref) ) 2762cdf0e10cSrcweir return; 2763cdf0e10cSrcweir 2764cdf0e10cSrcweir const char* pService = "com.sun.star.drawing.OLE2Shape"; 2765cdf0e10cSrcweir 2766cdf0e10cSrcweir sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported(); 2767cdf0e10cSrcweir 2768cdf0e10cSrcweir if( bIsPresShape ) 2769cdf0e10cSrcweir { 2770cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) ) 2771cdf0e10cSrcweir { 2772cdf0e10cSrcweir pService = "com.sun.star.presentation.ChartShape"; 2773cdf0e10cSrcweir } 2774cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ) 2775cdf0e10cSrcweir { 2776cdf0e10cSrcweir pService = "com.sun.star.presentation.CalcShape"; 2777cdf0e10cSrcweir } 2778cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) ) 2779cdf0e10cSrcweir { 2780cdf0e10cSrcweir pService = "com.sun.star.presentation.OLE2Shape"; 2781cdf0e10cSrcweir } 2782cdf0e10cSrcweir } 2783cdf0e10cSrcweir 2784cdf0e10cSrcweir AddShape( pService ); 2785cdf0e10cSrcweir 2786cdf0e10cSrcweir if( mxShape.is() ) 2787cdf0e10cSrcweir { 2788cdf0e10cSrcweir SetLayer(); 2789cdf0e10cSrcweir 2790cdf0e10cSrcweir if(bIsPresShape) 2791cdf0e10cSrcweir { 2792cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2793cdf0e10cSrcweir if(xProps.is()) 2794cdf0e10cSrcweir { 2795cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 2796cdf0e10cSrcweir if( xPropsInfo.is() ) 2797cdf0e10cSrcweir { 2798cdf0e10cSrcweir if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 2799cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) ); 2800cdf0e10cSrcweir 2801cdf0e10cSrcweir if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 2802cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 2803cdf0e10cSrcweir } 2804cdf0e10cSrcweir } 2805cdf0e10cSrcweir } 2806cdf0e10cSrcweir 2807cdf0e10cSrcweir if( !mbIsPlaceholder && maHref.getLength() ) 2808cdf0e10cSrcweir { 2809cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 2810cdf0e10cSrcweir 2811cdf0e10cSrcweir if( xProps.is() ) 2812cdf0e10cSrcweir { 2813cdf0e10cSrcweir OUString aPersistName = GetImport().ResolveEmbeddedObjectURL( maHref, maCLSID ); 2814cdf0e10cSrcweir 2815cdf0e10cSrcweir if ( GetImport().IsPackageURL( maHref ) ) 2816cdf0e10cSrcweir { 2817cdf0e10cSrcweir const OUString sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" )); 2818cdf0e10cSrcweir 2819cdf0e10cSrcweir if ( aPersistName.compareTo( sURL, sURL.getLength() ) == 0 ) 2820cdf0e10cSrcweir aPersistName = aPersistName.copy( sURL.getLength() ); 2821cdf0e10cSrcweir 2822cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ), 2823cdf0e10cSrcweir uno::makeAny( aPersistName ) ); 2824cdf0e10cSrcweir } 2825cdf0e10cSrcweir else 2826cdf0e10cSrcweir { 2827cdf0e10cSrcweir // this is OOo link object 2828cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LinkURL" ) ), 2829cdf0e10cSrcweir uno::makeAny( aPersistName ) ); 2830cdf0e10cSrcweir } 2831cdf0e10cSrcweir } 2832cdf0e10cSrcweir } 2833cdf0e10cSrcweir 2834cdf0e10cSrcweir // set pos, size, shear and rotate 2835cdf0e10cSrcweir SetTransformation(); 2836cdf0e10cSrcweir 2837cdf0e10cSrcweir SetStyle(); 2838cdf0e10cSrcweir 2839cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 2840cdf0e10cSrcweir } 2841cdf0e10cSrcweir } 2842cdf0e10cSrcweir 2843cdf0e10cSrcweir void SdXMLObjectShapeContext::EndElement() 2844cdf0e10cSrcweir { 2845a5258243SPedro Giffuni // #i67705# 2846a5258243SPedro Giffuni const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion()); 2847a5258243SPedro Giffuni 2848a5258243SPedro Giffuni if(nGeneratorVersion < SvXMLImport::OOo_34x) 2849a5258243SPedro Giffuni { 2850a5258243SPedro Giffuni // #i118485# 2851a5258243SPedro Giffuni // If it's an old file from us written before OOo3.4, we need to correct 2852a5258243SPedro Giffuni // FillStyle and LineStyle for OLE2 objects. The error was that the old paint 2853a5258243SPedro Giffuni // implementations just ignored added fill/linestyles completely, thus 2854a5258243SPedro Giffuni // those objects need to be corrected to not show blue and hairline which 2855a5258243SPedro Giffuni // always was the default, but would be shown now 2856a5258243SPedro Giffuni uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2857a5258243SPedro Giffuni 2858a5258243SPedro Giffuni if( xProps.is() ) 2859a5258243SPedro Giffuni { 2860a5258243SPedro Giffuni xProps->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), uno::makeAny(drawing::FillStyle_NONE)); 2861a5258243SPedro Giffuni xProps->setPropertyValue(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineStyle")), uno::makeAny(drawing::LineStyle_NONE)); 2862a5258243SPedro Giffuni } 2863a5258243SPedro Giffuni } 2864a5258243SPedro Giffuni 2865cdf0e10cSrcweir // #100592# 2866cdf0e10cSrcweir if( mxBase64Stream.is() ) 2867cdf0e10cSrcweir { 2868cdf0e10cSrcweir OUString aPersistName( GetImport().ResolveEmbeddedObjectURLFromBase64() ); 2869cdf0e10cSrcweir const OUString sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" )); 2870cdf0e10cSrcweir 2871cdf0e10cSrcweir aPersistName = aPersistName.copy( sURL.getLength() ); 2872cdf0e10cSrcweir 2873cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 2874cdf0e10cSrcweir if( xProps.is() ) 2875cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ), uno::makeAny( aPersistName ) ); 2876cdf0e10cSrcweir } 2877cdf0e10cSrcweir 2878cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 2879cdf0e10cSrcweir } 2880cdf0e10cSrcweir 2881cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2882cdf0e10cSrcweir void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2883cdf0e10cSrcweir { 2884cdf0e10cSrcweir switch( nPrefix ) 2885cdf0e10cSrcweir { 2886cdf0e10cSrcweir case XML_NAMESPACE_DRAW: 2887cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CLASS_ID ) ) 2888cdf0e10cSrcweir { 2889cdf0e10cSrcweir maCLSID = rValue; 2890cdf0e10cSrcweir return; 2891cdf0e10cSrcweir } 2892cdf0e10cSrcweir break; 2893cdf0e10cSrcweir case XML_NAMESPACE_XLINK: 2894cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_HREF ) ) 2895cdf0e10cSrcweir { 2896cdf0e10cSrcweir maHref = rValue; 2897cdf0e10cSrcweir return; 2898cdf0e10cSrcweir } 2899cdf0e10cSrcweir break; 2900cdf0e10cSrcweir } 2901cdf0e10cSrcweir 2902cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 2903cdf0e10cSrcweir } 2904cdf0e10cSrcweir 2905cdf0e10cSrcweir SvXMLImportContext* SdXMLObjectShapeContext::CreateChildContext( 2906cdf0e10cSrcweir sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 2907cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 2908cdf0e10cSrcweir { 2909cdf0e10cSrcweir // #100592# 2910cdf0e10cSrcweir SvXMLImportContext* pContext = NULL; 2911cdf0e10cSrcweir 2912cdf0e10cSrcweir if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA)) 2913cdf0e10cSrcweir { 2914cdf0e10cSrcweir mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64(); 2915cdf0e10cSrcweir if( mxBase64Stream.is() ) 2916cdf0e10cSrcweir pContext = new XMLBase64ImportContext( GetImport(), nPrefix, 2917cdf0e10cSrcweir rLocalName, xAttrList, 2918cdf0e10cSrcweir mxBase64Stream ); 2919cdf0e10cSrcweir } 2920cdf0e10cSrcweir else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) || 2921cdf0e10cSrcweir ((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) ) 2922cdf0e10cSrcweir { 2923cdf0e10cSrcweir XMLEmbeddedObjectImportContext *pEContext = 2924cdf0e10cSrcweir new XMLEmbeddedObjectImportContext( GetImport(), nPrefix, 2925cdf0e10cSrcweir rLocalName, xAttrList ); 2926cdf0e10cSrcweir maCLSID = pEContext->GetFilterCLSID(); 2927cdf0e10cSrcweir if( maCLSID.getLength() != 0 ) 2928cdf0e10cSrcweir { 2929cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY); 2930cdf0e10cSrcweir if( xPropSet.is() ) 2931cdf0e10cSrcweir { 2932cdf0e10cSrcweir xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), uno::makeAny( maCLSID ) ); 2933cdf0e10cSrcweir 2934cdf0e10cSrcweir uno::Reference< lang::XComponent > xComp; 2935cdf0e10cSrcweir xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp; 2936cdf0e10cSrcweir DBG_ASSERT( xComp.is(), "no xModel for own OLE format" ); 2937cdf0e10cSrcweir pEContext->SetComponent( xComp ); 2938cdf0e10cSrcweir } 2939cdf0e10cSrcweir } 2940cdf0e10cSrcweir pContext = pEContext; 2941cdf0e10cSrcweir } 2942cdf0e10cSrcweir 2943cdf0e10cSrcweir // delegate to parent class if no context could be created 2944cdf0e10cSrcweir if(!pContext) 2945cdf0e10cSrcweir pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList); 2946cdf0e10cSrcweir 2947cdf0e10cSrcweir return pContext; 2948cdf0e10cSrcweir } 2949cdf0e10cSrcweir 2950cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 2951cdf0e10cSrcweir 2952cdf0e10cSrcweir TYPEINIT1( SdXMLAppletShapeContext, SdXMLShapeContext ); 2953cdf0e10cSrcweir 2954cdf0e10cSrcweir SdXMLAppletShapeContext::SdXMLAppletShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 2955cdf0e10cSrcweir const rtl::OUString& rLocalName, 2956cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 2957cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes, 2958cdf0e10cSrcweir sal_Bool bTemporaryShape) 2959cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 2960cdf0e10cSrcweir mbIsScript( sal_False ) 2961cdf0e10cSrcweir { 2962cdf0e10cSrcweir } 2963cdf0e10cSrcweir 2964cdf0e10cSrcweir SdXMLAppletShapeContext::~SdXMLAppletShapeContext() 2965cdf0e10cSrcweir { 2966cdf0e10cSrcweir } 2967cdf0e10cSrcweir 2968cdf0e10cSrcweir void SdXMLAppletShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& ) 2969cdf0e10cSrcweir { 2970cdf0e10cSrcweir const char* pService = "com.sun.star.drawing.AppletShape"; 2971cdf0e10cSrcweir AddShape( pService ); 2972cdf0e10cSrcweir 2973cdf0e10cSrcweir if( mxShape.is() ) 2974cdf0e10cSrcweir { 2975cdf0e10cSrcweir SetLayer(); 2976cdf0e10cSrcweir 2977cdf0e10cSrcweir // set pos, size, shear and rotate 2978cdf0e10cSrcweir SetTransformation(); 2979cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 2980cdf0e10cSrcweir } 2981cdf0e10cSrcweir } 2982cdf0e10cSrcweir 2983cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 2984cdf0e10cSrcweir void SdXMLAppletShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 2985cdf0e10cSrcweir { 2986cdf0e10cSrcweir switch( nPrefix ) 2987cdf0e10cSrcweir { 2988cdf0e10cSrcweir case XML_NAMESPACE_DRAW: 2989cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_APPLET_NAME ) ) 2990cdf0e10cSrcweir { 2991cdf0e10cSrcweir maAppletName = rValue; 2992cdf0e10cSrcweir return; 2993cdf0e10cSrcweir } 2994cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_CODE ) ) 2995cdf0e10cSrcweir { 2996cdf0e10cSrcweir maAppletCode = rValue; 2997cdf0e10cSrcweir return; 2998cdf0e10cSrcweir } 2999cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_MAY_SCRIPT ) ) 3000cdf0e10cSrcweir { 3001cdf0e10cSrcweir mbIsScript = IsXMLToken( rValue, XML_TRUE ); 3002cdf0e10cSrcweir return; 3003cdf0e10cSrcweir } 3004cdf0e10cSrcweir break; 3005cdf0e10cSrcweir case XML_NAMESPACE_XLINK: 3006cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_HREF ) ) 3007cdf0e10cSrcweir { 3008cdf0e10cSrcweir maHref = GetImport().GetAbsoluteReference(rValue); 3009cdf0e10cSrcweir return; 3010cdf0e10cSrcweir } 3011cdf0e10cSrcweir break; 3012cdf0e10cSrcweir } 3013cdf0e10cSrcweir 3014cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 3015cdf0e10cSrcweir } 3016cdf0e10cSrcweir 3017cdf0e10cSrcweir void SdXMLAppletShapeContext::EndElement() 3018cdf0e10cSrcweir { 3019cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 3020cdf0e10cSrcweir if( xProps.is() ) 3021cdf0e10cSrcweir { 3022cdf0e10cSrcweir uno::Any aAny; 3023cdf0e10cSrcweir 3024cdf0e10cSrcweir if ( maSize.Width && maSize.Height ) 3025cdf0e10cSrcweir { 3026cdf0e10cSrcweir // the visual area for applet must be set on loading 3027cdf0e10cSrcweir awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height ); 3028cdf0e10cSrcweir aAny <<= aRect; 3029cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny ); 3030cdf0e10cSrcweir } 3031cdf0e10cSrcweir 3032cdf0e10cSrcweir if( maParams.getLength() ) 3033cdf0e10cSrcweir { 3034cdf0e10cSrcweir aAny <<= maParams; 3035cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ), aAny ); 3036cdf0e10cSrcweir } 3037cdf0e10cSrcweir 3038cdf0e10cSrcweir if( maHref.getLength() ) 3039cdf0e10cSrcweir { 3040cdf0e10cSrcweir aAny <<= maHref; 3041cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ), aAny ); 3042cdf0e10cSrcweir } 3043cdf0e10cSrcweir 3044cdf0e10cSrcweir if( maAppletName.getLength() ) 3045cdf0e10cSrcweir { 3046cdf0e10cSrcweir aAny <<= maAppletName; 3047cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ), aAny ); 3048cdf0e10cSrcweir } 3049cdf0e10cSrcweir 3050cdf0e10cSrcweir if( mbIsScript ) 3051cdf0e10cSrcweir { 3052cdf0e10cSrcweir aAny <<= mbIsScript; 3053cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ), aAny ); 3054cdf0e10cSrcweir 3055cdf0e10cSrcweir } 3056cdf0e10cSrcweir 3057cdf0e10cSrcweir if( maAppletCode.getLength() ) 3058cdf0e10cSrcweir { 3059cdf0e10cSrcweir aAny <<= maAppletCode; 3060cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ), aAny ); 3061cdf0e10cSrcweir } 3062cdf0e10cSrcweir 3063cdf0e10cSrcweir aAny <<= ::rtl::OUString( GetImport().GetDocumentBase() ); 3064cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletDocBase" ) ), aAny ); 3065cdf0e10cSrcweir 3066cdf0e10cSrcweir SetThumbnail(); 3067cdf0e10cSrcweir } 3068cdf0e10cSrcweir 3069cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 3070cdf0e10cSrcweir } 3071cdf0e10cSrcweir 3072cdf0e10cSrcweir SvXMLImportContext * SdXMLAppletShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList ) 3073cdf0e10cSrcweir { 3074cdf0e10cSrcweir if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) ) 3075cdf0e10cSrcweir { 3076cdf0e10cSrcweir OUString aParamName, aParamValue; 3077cdf0e10cSrcweir const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 3078cdf0e10cSrcweir // now parse the attribute list and look for draw:name and draw:value 3079cdf0e10cSrcweir for(sal_Int16 a(0); a < nAttrCount; a++) 3080cdf0e10cSrcweir { 3081cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex(a); 3082cdf0e10cSrcweir OUString aLocalName; 3083cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName); 3084cdf0e10cSrcweir const OUString aValue( xAttrList->getValueByIndex(a) ); 3085cdf0e10cSrcweir 3086cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_DRAW ) 3087cdf0e10cSrcweir { 3088cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_NAME ) ) 3089cdf0e10cSrcweir { 3090cdf0e10cSrcweir aParamName = aValue; 3091cdf0e10cSrcweir } 3092cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_VALUE ) ) 3093cdf0e10cSrcweir { 3094cdf0e10cSrcweir aParamValue = aValue; 3095cdf0e10cSrcweir } 3096cdf0e10cSrcweir } 3097cdf0e10cSrcweir } 3098cdf0e10cSrcweir 3099cdf0e10cSrcweir if( aParamName.getLength() ) 3100cdf0e10cSrcweir { 3101cdf0e10cSrcweir sal_Int32 nIndex = maParams.getLength(); 3102cdf0e10cSrcweir maParams.realloc( nIndex + 1 ); 3103cdf0e10cSrcweir maParams[nIndex].Name = aParamName; 3104cdf0e10cSrcweir maParams[nIndex].Handle = -1; 3105cdf0e10cSrcweir maParams[nIndex].Value <<= aParamValue; 3106cdf0e10cSrcweir maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE; 3107cdf0e10cSrcweir } 3108cdf0e10cSrcweir 3109cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName ); 3110cdf0e10cSrcweir } 3111cdf0e10cSrcweir 3112cdf0e10cSrcweir return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList ); 3113cdf0e10cSrcweir } 3114cdf0e10cSrcweir 3115cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3116cdf0e10cSrcweir 3117cdf0e10cSrcweir TYPEINIT1( SdXMLPluginShapeContext, SdXMLShapeContext ); 3118cdf0e10cSrcweir 3119cdf0e10cSrcweir SdXMLPluginShapeContext::SdXMLPluginShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 3120cdf0e10cSrcweir const rtl::OUString& rLocalName, 3121cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 3122cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes, 3123cdf0e10cSrcweir sal_Bool bTemporaryShape) : 3124cdf0e10cSrcweir SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 3125cdf0e10cSrcweir mbMedia( false ) 3126cdf0e10cSrcweir { 3127cdf0e10cSrcweir } 3128cdf0e10cSrcweir 3129cdf0e10cSrcweir SdXMLPluginShapeContext::~SdXMLPluginShapeContext() 3130cdf0e10cSrcweir { 3131cdf0e10cSrcweir } 3132cdf0e10cSrcweir 3133cdf0e10cSrcweir void SdXMLPluginShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList) 3134cdf0e10cSrcweir { 3135cdf0e10cSrcweir // watch for MimeType attribute to see if we have a media object 3136cdf0e10cSrcweir for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n ) 3137cdf0e10cSrcweir { 3138cdf0e10cSrcweir OUString aLocalName; 3139cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName ); 3140cdf0e10cSrcweir 3141cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) ) 3142cdf0e10cSrcweir { 3143cdf0e10cSrcweir if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) ) 3144cdf0e10cSrcweir mbMedia = true; 3145cdf0e10cSrcweir 3146cdf0e10cSrcweir // leave this loop 3147cdf0e10cSrcweir n = nAttrCount - 1; 3148cdf0e10cSrcweir } 3149cdf0e10cSrcweir } 3150cdf0e10cSrcweir 3151cdf0e10cSrcweir const char* pService; 3152cdf0e10cSrcweir 3153cdf0e10cSrcweir sal_Bool bIsPresShape = sal_False; 3154cdf0e10cSrcweir 3155cdf0e10cSrcweir if( mbMedia ) 3156cdf0e10cSrcweir { 3157cdf0e10cSrcweir pService = "com.sun.star.drawing.MediaShape"; 3158cdf0e10cSrcweir 3159cdf0e10cSrcweir bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported(); 3160cdf0e10cSrcweir if( bIsPresShape ) 3161cdf0e10cSrcweir { 3162cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) ) 3163cdf0e10cSrcweir { 3164cdf0e10cSrcweir pService = "com.sun.star.presentation.MediaShape"; 3165cdf0e10cSrcweir } 3166cdf0e10cSrcweir } 3167cdf0e10cSrcweir } 3168cdf0e10cSrcweir else 3169cdf0e10cSrcweir pService = "com.sun.star.drawing.PluginShape"; 3170cdf0e10cSrcweir 3171cdf0e10cSrcweir AddShape( pService ); 3172cdf0e10cSrcweir 3173cdf0e10cSrcweir if( mxShape.is() ) 3174cdf0e10cSrcweir { 3175cdf0e10cSrcweir SetLayer(); 3176cdf0e10cSrcweir 3177cdf0e10cSrcweir if(bIsPresShape) 3178cdf0e10cSrcweir { 3179cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 3180cdf0e10cSrcweir if(xProps.is()) 3181cdf0e10cSrcweir { 3182cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 3183cdf0e10cSrcweir if( xPropsInfo.is() ) 3184cdf0e10cSrcweir { 3185cdf0e10cSrcweir if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 3186cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) ); 3187cdf0e10cSrcweir 3188cdf0e10cSrcweir if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 3189cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 3190cdf0e10cSrcweir } 3191cdf0e10cSrcweir } 3192cdf0e10cSrcweir } 3193cdf0e10cSrcweir 3194cdf0e10cSrcweir // set pos, size, shear and rotate 3195cdf0e10cSrcweir SetTransformation(); 3196cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 3197cdf0e10cSrcweir } 3198cdf0e10cSrcweir } 3199cdf0e10cSrcweir 3200cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 3201cdf0e10cSrcweir void SdXMLPluginShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 3202cdf0e10cSrcweir { 3203cdf0e10cSrcweir switch( nPrefix ) 3204cdf0e10cSrcweir { 3205cdf0e10cSrcweir case XML_NAMESPACE_DRAW: 3206cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_MIME_TYPE ) ) 3207cdf0e10cSrcweir { 3208cdf0e10cSrcweir maMimeType = rValue; 3209cdf0e10cSrcweir return; 3210cdf0e10cSrcweir } 3211cdf0e10cSrcweir break; 3212cdf0e10cSrcweir case XML_NAMESPACE_XLINK: 3213cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_HREF ) ) 3214cdf0e10cSrcweir { 3215cdf0e10cSrcweir maHref = GetImport().GetAbsoluteReference(rValue); 3216cdf0e10cSrcweir return; 3217cdf0e10cSrcweir } 3218cdf0e10cSrcweir break; 3219cdf0e10cSrcweir } 3220cdf0e10cSrcweir 3221cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 3222cdf0e10cSrcweir } 3223cdf0e10cSrcweir 3224cdf0e10cSrcweir void SdXMLPluginShapeContext::EndElement() 3225cdf0e10cSrcweir { 3226cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 3227cdf0e10cSrcweir 3228cdf0e10cSrcweir if( xProps.is() ) 3229cdf0e10cSrcweir { 3230cdf0e10cSrcweir uno::Any aAny; 3231cdf0e10cSrcweir 3232cdf0e10cSrcweir if ( maSize.Width && maSize.Height ) 3233cdf0e10cSrcweir { 3234cdf0e10cSrcweir const rtl::OUString sVisibleArea( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ); 3235cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > aXPropSetInfo( xProps->getPropertySetInfo() ); 3236cdf0e10cSrcweir if ( !aXPropSetInfo.is() || aXPropSetInfo->hasPropertyByName( sVisibleArea ) ) 3237cdf0e10cSrcweir { 3238cdf0e10cSrcweir // the visual area for a plugin must be set on loading 3239cdf0e10cSrcweir awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height ); 3240cdf0e10cSrcweir aAny <<= aRect; 3241cdf0e10cSrcweir xProps->setPropertyValue( sVisibleArea, aAny ); 3242cdf0e10cSrcweir } 3243cdf0e10cSrcweir } 3244cdf0e10cSrcweir 3245cdf0e10cSrcweir if( !mbMedia ) 3246cdf0e10cSrcweir { 3247cdf0e10cSrcweir // in case we have a plugin object 3248cdf0e10cSrcweir if( maParams.getLength() ) 3249cdf0e10cSrcweir { 3250cdf0e10cSrcweir aAny <<= maParams; 3251cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ), aAny ); 3252cdf0e10cSrcweir } 3253cdf0e10cSrcweir 3254cdf0e10cSrcweir if( maMimeType.getLength() ) 3255cdf0e10cSrcweir { 3256cdf0e10cSrcweir aAny <<= maMimeType; 3257cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ), aAny ); 3258cdf0e10cSrcweir } 3259cdf0e10cSrcweir 3260cdf0e10cSrcweir if( maHref.getLength() ) 3261cdf0e10cSrcweir { 3262cdf0e10cSrcweir aAny <<= maHref; 3263cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ), aAny ); 3264cdf0e10cSrcweir } 3265cdf0e10cSrcweir } 3266cdf0e10cSrcweir else 3267cdf0e10cSrcweir { 3268cdf0e10cSrcweir // in case we have a media object 3269cdf0e10cSrcweir 3270cdf0e10cSrcweir OUString sTempRef; 3271cdf0e10cSrcweir 3272cdf0e10cSrcweir // check for package URL 3273cdf0e10cSrcweir if( GetImport().IsPackageURL( maHref ) ) 3274cdf0e10cSrcweir { 3275cdf0e10cSrcweir sTempRef = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) ); 3276cdf0e10cSrcweir } 3277cdf0e10cSrcweir 3278cdf0e10cSrcweir sTempRef += maHref; 3279cdf0e10cSrcweir 3280cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ), uno::makeAny( sTempRef ) ); 3281cdf0e10cSrcweir 3282cdf0e10cSrcweir for( sal_Int32 nParam = 0; nParam < maParams.getLength(); ++nParam ) 3283cdf0e10cSrcweir { 3284cdf0e10cSrcweir const OUString& rName = maParams[ nParam ].Name; 3285cdf0e10cSrcweir 3286cdf0e10cSrcweir if( 0 == rName.compareToAscii( "Loop" ) ) 3287cdf0e10cSrcweir { 3288cdf0e10cSrcweir OUString aValueStr; 3289cdf0e10cSrcweir maParams[ nParam ].Value >>= aValueStr; 3290cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) ), 3291cdf0e10cSrcweir uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) ); 3292cdf0e10cSrcweir } 3293cdf0e10cSrcweir else if( 0 == rName.compareToAscii( "Mute" ) ) 3294cdf0e10cSrcweir { 3295cdf0e10cSrcweir OUString aValueStr; 3296cdf0e10cSrcweir maParams[ nParam ].Value >>= aValueStr; 3297cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) ), 3298cdf0e10cSrcweir uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) ); 3299cdf0e10cSrcweir } 3300cdf0e10cSrcweir else if( 0 == rName.compareToAscii( "VolumeDB" ) ) 3301cdf0e10cSrcweir { 3302cdf0e10cSrcweir OUString aValueStr; 3303cdf0e10cSrcweir maParams[ nParam ].Value >>= aValueStr; 3304cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ), 3305cdf0e10cSrcweir uno::makeAny( static_cast< sal_Int16 >( aValueStr.toInt32() ) ) ); 3306cdf0e10cSrcweir } 3307cdf0e10cSrcweir else if( 0 == rName.compareToAscii( "Zoom" ) ) 3308cdf0e10cSrcweir { 3309cdf0e10cSrcweir OUString aZoomStr; 3310cdf0e10cSrcweir media::ZoomLevel eZoomLevel; 3311cdf0e10cSrcweir 3312cdf0e10cSrcweir maParams[ nParam ].Value >>= aZoomStr; 3313cdf0e10cSrcweir 3314cdf0e10cSrcweir if( 0 == aZoomStr.compareToAscii( "25%" ) ) 3315cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_ZOOM_1_TO_4; 3316cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "50%" ) ) 3317cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_ZOOM_1_TO_2; 3318cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "100%" ) ) 3319cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_ORIGINAL; 3320cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "200%" ) ) 3321cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_ZOOM_2_TO_1; 3322cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "400%" ) ) 3323cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_ZOOM_4_TO_1; 3324cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "fit" ) ) 3325cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW; 3326cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "fixedfit" ) ) 3327cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT; 3328cdf0e10cSrcweir else if( 0 == aZoomStr.compareToAscii( "fullscreen" ) ) 3329cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_FULLSCREEN; 3330cdf0e10cSrcweir else 3331cdf0e10cSrcweir eZoomLevel = media::ZoomLevel_NOT_AVAILABLE; 3332cdf0e10cSrcweir 3333cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ), uno::makeAny( eZoomLevel ) ); 3334cdf0e10cSrcweir } 3335cdf0e10cSrcweir } 3336cdf0e10cSrcweir } 3337cdf0e10cSrcweir 3338cdf0e10cSrcweir SetThumbnail(); 3339cdf0e10cSrcweir } 3340cdf0e10cSrcweir 3341cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 3342cdf0e10cSrcweir } 3343cdf0e10cSrcweir 3344cdf0e10cSrcweir SvXMLImportContext * SdXMLPluginShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList ) 3345cdf0e10cSrcweir { 3346cdf0e10cSrcweir if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) ) 3347cdf0e10cSrcweir { 3348cdf0e10cSrcweir OUString aParamName, aParamValue; 3349cdf0e10cSrcweir const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 3350cdf0e10cSrcweir // now parse the attribute list and look for draw:name and draw:value 3351cdf0e10cSrcweir for(sal_Int16 a(0); a < nAttrCount; a++) 3352cdf0e10cSrcweir { 3353cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex(a); 3354cdf0e10cSrcweir OUString aLocalName; 3355cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName); 3356cdf0e10cSrcweir const OUString aValue( xAttrList->getValueByIndex(a) ); 3357cdf0e10cSrcweir 3358cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_DRAW ) 3359cdf0e10cSrcweir { 3360cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_NAME ) ) 3361cdf0e10cSrcweir { 3362cdf0e10cSrcweir aParamName = aValue; 3363cdf0e10cSrcweir } 3364cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_VALUE ) ) 3365cdf0e10cSrcweir { 3366cdf0e10cSrcweir aParamValue = aValue; 3367cdf0e10cSrcweir } 3368cdf0e10cSrcweir } 3369cdf0e10cSrcweir 3370cdf0e10cSrcweir if( aParamName.getLength() ) 3371cdf0e10cSrcweir { 3372cdf0e10cSrcweir sal_Int32 nIndex = maParams.getLength(); 3373cdf0e10cSrcweir maParams.realloc( nIndex + 1 ); 3374cdf0e10cSrcweir maParams[nIndex].Name = aParamName; 3375cdf0e10cSrcweir maParams[nIndex].Handle = -1; 3376cdf0e10cSrcweir maParams[nIndex].Value <<= aParamValue; 3377cdf0e10cSrcweir maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE; 3378cdf0e10cSrcweir } 3379cdf0e10cSrcweir } 3380cdf0e10cSrcweir 3381cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName ); 3382cdf0e10cSrcweir } 3383cdf0e10cSrcweir 3384cdf0e10cSrcweir return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList ); 3385cdf0e10cSrcweir } 3386cdf0e10cSrcweir 3387cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3388cdf0e10cSrcweir 3389cdf0e10cSrcweir TYPEINIT1( SdXMLFloatingFrameShapeContext, SdXMLShapeContext ); 3390cdf0e10cSrcweir 3391cdf0e10cSrcweir SdXMLFloatingFrameShapeContext::SdXMLFloatingFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 3392cdf0e10cSrcweir const rtl::OUString& rLocalName, 3393cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 3394cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes, 3395cdf0e10cSrcweir sal_Bool bTemporaryShape) 3396cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ) 3397cdf0e10cSrcweir { 3398cdf0e10cSrcweir } 3399cdf0e10cSrcweir 3400cdf0e10cSrcweir SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext() 3401cdf0e10cSrcweir { 3402cdf0e10cSrcweir } 3403cdf0e10cSrcweir 3404cdf0e10cSrcweir void SdXMLFloatingFrameShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& ) 3405cdf0e10cSrcweir { 3406cdf0e10cSrcweir const char* pService = "com.sun.star.drawing.FrameShape"; 3407cdf0e10cSrcweir AddShape( pService ); 3408cdf0e10cSrcweir 3409cdf0e10cSrcweir if( mxShape.is() ) 3410cdf0e10cSrcweir { 3411cdf0e10cSrcweir SetLayer(); 3412cdf0e10cSrcweir 3413cdf0e10cSrcweir // set pos, size, shear and rotate 3414cdf0e10cSrcweir SetTransformation(); 3415cdf0e10cSrcweir 3416cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 3417cdf0e10cSrcweir if( xProps.is() ) 3418cdf0e10cSrcweir { 3419cdf0e10cSrcweir uno::Any aAny; 3420cdf0e10cSrcweir 3421cdf0e10cSrcweir if( maFrameName.getLength() ) 3422cdf0e10cSrcweir { 3423cdf0e10cSrcweir aAny <<= maFrameName; 3424cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ), aAny ); 3425cdf0e10cSrcweir } 3426cdf0e10cSrcweir 3427cdf0e10cSrcweir if( maHref.getLength() ) 3428cdf0e10cSrcweir { 3429cdf0e10cSrcweir aAny <<= maHref; 3430cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ), aAny ); 3431cdf0e10cSrcweir } 3432cdf0e10cSrcweir } 3433cdf0e10cSrcweir 3434cdf0e10cSrcweir SetStyle(); 3435cdf0e10cSrcweir 3436cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 3437cdf0e10cSrcweir } 3438cdf0e10cSrcweir } 3439cdf0e10cSrcweir 3440cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 3441cdf0e10cSrcweir void SdXMLFloatingFrameShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 3442cdf0e10cSrcweir { 3443cdf0e10cSrcweir switch( nPrefix ) 3444cdf0e10cSrcweir { 3445cdf0e10cSrcweir case XML_NAMESPACE_DRAW: 3446cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_FRAME_NAME ) ) 3447cdf0e10cSrcweir { 3448cdf0e10cSrcweir maFrameName = rValue; 3449cdf0e10cSrcweir return; 3450cdf0e10cSrcweir } 3451cdf0e10cSrcweir break; 3452cdf0e10cSrcweir case XML_NAMESPACE_XLINK: 3453cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_HREF ) ) 3454cdf0e10cSrcweir { 3455cdf0e10cSrcweir maHref = GetImport().GetAbsoluteReference(rValue); 3456cdf0e10cSrcweir return; 3457cdf0e10cSrcweir } 3458cdf0e10cSrcweir break; 3459cdf0e10cSrcweir } 3460cdf0e10cSrcweir 3461cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 3462cdf0e10cSrcweir } 3463cdf0e10cSrcweir 3464cdf0e10cSrcweir void SdXMLFloatingFrameShapeContext::EndElement() 3465cdf0e10cSrcweir { 3466cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY ); 3467cdf0e10cSrcweir 3468cdf0e10cSrcweir if( xProps.is() ) 3469cdf0e10cSrcweir { 3470cdf0e10cSrcweir if ( maSize.Width && maSize.Height ) 3471cdf0e10cSrcweir { 3472cdf0e10cSrcweir // the visual area for a floating frame must be set on loading 3473cdf0e10cSrcweir awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height ); 3474cdf0e10cSrcweir uno::Any aAny; 3475cdf0e10cSrcweir aAny <<= aRect; 3476cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny ); 3477cdf0e10cSrcweir } 3478cdf0e10cSrcweir } 3479cdf0e10cSrcweir 3480cdf0e10cSrcweir SetThumbnail(); 3481cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 3482cdf0e10cSrcweir } 3483cdf0e10cSrcweir 3484cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3485cdf0e10cSrcweir 3486cdf0e10cSrcweir TYPEINIT1( SdXMLFrameShapeContext, SdXMLShapeContext ); 3487cdf0e10cSrcweir 3488cdf0e10cSrcweir SdXMLFrameShapeContext::SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 3489cdf0e10cSrcweir const rtl::OUString& rLocalName, 3490cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 3491cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes, 3492cdf0e10cSrcweir sal_Bool bTemporaryShape) 3493cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), 3494ddde725dSArmin Le Grand multiImageImportHelper(), 3495ddde725dSArmin Le Grand mbSupportsReplacement( sal_False ), 3496ddde725dSArmin Le Grand mxImplContext(), 3497ddde725dSArmin Le Grand mxReplImplContext() 3498cdf0e10cSrcweir { 3499cdf0e10cSrcweir uno::Reference < util::XCloneable > xClone( xAttrList, uno::UNO_QUERY ); 3500cdf0e10cSrcweir if( xClone.is() ) 3501cdf0e10cSrcweir mxAttrList.set( xClone->createClone(), uno::UNO_QUERY ); 3502cdf0e10cSrcweir else 3503cdf0e10cSrcweir mxAttrList = new SvXMLAttributeList( xAttrList ); 3504cdf0e10cSrcweir 3505cdf0e10cSrcweir } 3506cdf0e10cSrcweir 3507cdf0e10cSrcweir SdXMLFrameShapeContext::~SdXMLFrameShapeContext() 3508cdf0e10cSrcweir { 3509cdf0e10cSrcweir } 3510cdf0e10cSrcweir 3511ddde725dSArmin Le Grand void SdXMLFrameShapeContext::removeGraphicFromImportContext(const SvXMLImportContext& rContext) const 3512ddde725dSArmin Le Grand { 3513ddde725dSArmin Le Grand const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext); 3514ddde725dSArmin Le Grand 3515ddde725dSArmin Le Grand if(pSdXMLGraphicObjectShapeContext) 3516ddde725dSArmin Le Grand { 3517ddde725dSArmin Le Grand try 3518ddde725dSArmin Le Grand { 3519ddde725dSArmin Le Grand uno::Reference< container::XChild > xChild(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW); 3520ddde725dSArmin Le Grand 3521ddde725dSArmin Le Grand if(xChild.is()) 3522ddde725dSArmin Le Grand { 3523ddde725dSArmin Le Grand uno::Reference< drawing::XShapes > xParent(xChild->getParent(), uno::UNO_QUERY_THROW); 3524ddde725dSArmin Le Grand 3525ddde725dSArmin Le Grand if(xParent.is()) 3526ddde725dSArmin Le Grand { 3527ddde725dSArmin Le Grand // remove from parent 3528ddde725dSArmin Le Grand xParent->remove(pSdXMLGraphicObjectShapeContext->getShape()); 3529ddde725dSArmin Le Grand 3530ddde725dSArmin Le Grand // dispose 3531ddde725dSArmin Le Grand uno::Reference< lang::XComponent > xComp(pSdXMLGraphicObjectShapeContext->getShape(), UNO_QUERY); 3532ddde725dSArmin Le Grand 3533ddde725dSArmin Le Grand if(xComp.is()) 3534ddde725dSArmin Le Grand { 3535ddde725dSArmin Le Grand xComp->dispose(); 3536ddde725dSArmin Le Grand } 3537ddde725dSArmin Le Grand } 3538ddde725dSArmin Le Grand } 3539ddde725dSArmin Le Grand } 3540ddde725dSArmin Le Grand catch( uno::Exception& ) 3541ddde725dSArmin Le Grand { 3542ddde725dSArmin Le Grand DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" ); 3543ddde725dSArmin Le Grand } 3544ddde725dSArmin Le Grand } 3545ddde725dSArmin Le Grand } 3546ddde725dSArmin Le Grand 3547ddde725dSArmin Le Grand rtl::OUString SdXMLFrameShapeContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const 3548ddde725dSArmin Le Grand { 3549ddde725dSArmin Le Grand rtl::OUString aRetval; 3550ddde725dSArmin Le Grand const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext); 3551ddde725dSArmin Le Grand 3552ddde725dSArmin Le Grand if(pSdXMLGraphicObjectShapeContext) 3553ddde725dSArmin Le Grand { 3554ddde725dSArmin Le Grand try 3555ddde725dSArmin Le Grand { 3556ddde725dSArmin Le Grand const uno::Reference< beans::XPropertySet > xPropSet(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW); 3557ddde725dSArmin Le Grand 3558ddde725dSArmin Le Grand if(xPropSet.is()) 3559ddde725dSArmin Le Grand { 3560ddde725dSArmin Le Grand xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL"))) >>= aRetval; 3561bfba507cSArmin Le Grand 3562bfba507cSArmin Le Grand if(!aRetval.getLength()) 3563bfba507cSArmin Le Grand { 3564bfba507cSArmin Le Grand // it maybe a link, try GraphicURL 3565bfba507cSArmin Le Grand xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))) >>= aRetval; 3566bfba507cSArmin Le Grand } 3567ddde725dSArmin Le Grand } 3568ddde725dSArmin Le Grand } 3569ddde725dSArmin Le Grand catch( uno::Exception& ) 3570ddde725dSArmin Le Grand { 3571ddde725dSArmin Le Grand DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" ); 3572ddde725dSArmin Le Grand } 3573ddde725dSArmin Le Grand } 3574ddde725dSArmin Le Grand 3575ddde725dSArmin Le Grand return aRetval; 3576ddde725dSArmin Le Grand } 3577ddde725dSArmin Le Grand 3578cdf0e10cSrcweir SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPrefix, 3579cdf0e10cSrcweir const OUString& rLocalName, 3580cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList>& xAttrList ) 3581cdf0e10cSrcweir { 3582cdf0e10cSrcweir SvXMLImportContext * pContext = 0; 3583cdf0e10cSrcweir 3584cdf0e10cSrcweir if( !mxImplContext.Is() ) 3585cdf0e10cSrcweir { 3586cdf0e10cSrcweir pContext = GetImport().GetShapeImport()->CreateFrameChildContext( 3587cdf0e10cSrcweir GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList); 3588cdf0e10cSrcweir 3589cdf0e10cSrcweir mxImplContext = pContext; 3590ddde725dSArmin Le Grand mbSupportsReplacement = IsXMLToken(rLocalName, XML_OBJECT ) || IsXMLToken(rLocalName, XML_OBJECT_OLE); 3591ddde725dSArmin Le Grand setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE)); 3592ddde725dSArmin Le Grand 3593598d8f9fSArmin Le Grand if(getSupportsMultipleContents()) 3594ddde725dSArmin Le Grand { 3595598d8f9fSArmin Le Grand SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext); 3596598d8f9fSArmin Le Grand 3597598d8f9fSArmin Le Grand if(pGSC) 3598598d8f9fSArmin Le Grand { 3599598d8f9fSArmin Le Grand // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID 3600598d8f9fSArmin Le Grand pGSC->setLateAddToIdentifierMapper(true); 3601ddde725dSArmin Le Grand addContent(*mxImplContext); 3602ddde725dSArmin Le Grand } 3603ddde725dSArmin Le Grand } 3604598d8f9fSArmin Le Grand } 3605ddde725dSArmin Le Grand else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == nPrefix && IsXMLToken(rLocalName, XML_IMAGE)) 3606ddde725dSArmin Le Grand { 3607ddde725dSArmin Le Grand // read another image 3608ddde725dSArmin Le Grand pContext = GetImport().GetShapeImport()->CreateFrameChildContext( 3609ddde725dSArmin Le Grand GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList); 3610ddde725dSArmin Le Grand mxImplContext = pContext; 3611ddde725dSArmin Le Grand 3612598d8f9fSArmin Le Grand SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext); 3613598d8f9fSArmin Le Grand 3614598d8f9fSArmin Le Grand if(pGSC) 3615ddde725dSArmin Le Grand { 3616598d8f9fSArmin Le Grand // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID 3617598d8f9fSArmin Le Grand pGSC->setLateAddToIdentifierMapper(true); 3618ddde725dSArmin Le Grand addContent(*mxImplContext); 3619ddde725dSArmin Le Grand } 3620cdf0e10cSrcweir } 3621cdf0e10cSrcweir else if( mbSupportsReplacement && !mxReplImplContext && 3622cdf0e10cSrcweir XML_NAMESPACE_DRAW == nPrefix && 3623cdf0e10cSrcweir IsXMLToken( rLocalName, XML_IMAGE ) ) 3624cdf0e10cSrcweir { 3625cdf0e10cSrcweir // read replacement image 3626cdf0e10cSrcweir SvXMLImportContext *pImplContext = &mxImplContext; 3627cdf0e10cSrcweir SdXMLShapeContext *pSContext = 3628cdf0e10cSrcweir PTR_CAST( SdXMLShapeContext, pImplContext ); 3629cdf0e10cSrcweir if( pSContext ) 3630cdf0e10cSrcweir { 3631cdf0e10cSrcweir uno::Reference < beans::XPropertySet > xPropSet( 3632cdf0e10cSrcweir pSContext->getShape(), uno::UNO_QUERY ); 3633cdf0e10cSrcweir if( xPropSet.is() ) 3634cdf0e10cSrcweir { 3635cdf0e10cSrcweir pContext = new XMLReplacementImageContext( GetImport(), 3636cdf0e10cSrcweir nPrefix, rLocalName, xAttrList, xPropSet ); 3637cdf0e10cSrcweir mxReplImplContext = pContext; 3638cdf0e10cSrcweir } 3639cdf0e10cSrcweir } 3640cdf0e10cSrcweir } 3641cdf0e10cSrcweir else if( 3642cdf0e10cSrcweir ( nPrefix == XML_NAMESPACE_SVG && // #i68101# 3643cdf0e10cSrcweir (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) || 3644cdf0e10cSrcweir (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) || 3645cdf0e10cSrcweir (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) || 3646cdf0e10cSrcweir IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) ) 3647cdf0e10cSrcweir { 3648cdf0e10cSrcweir SvXMLImportContext *pImplContext = &mxImplContext; 3649cdf0e10cSrcweir pContext = PTR_CAST( SdXMLShapeContext, pImplContext )->CreateChildContext( nPrefix, 3650cdf0e10cSrcweir rLocalName, xAttrList ); 3651cdf0e10cSrcweir } 3652cdf0e10cSrcweir else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) ) 3653cdf0e10cSrcweir { 3654cdf0e10cSrcweir SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( &mxImplContext ); 3655cdf0e10cSrcweir if( pSContext ) 3656cdf0e10cSrcweir { 3657cdf0e10cSrcweir uno::Reference < beans::XPropertySet > xPropSet( pSContext->getShape(), uno::UNO_QUERY ); 3658cdf0e10cSrcweir if (xPropSet.is()) 3659cdf0e10cSrcweir { 3660cdf0e10cSrcweir pContext = new XMLImageMapContext(GetImport(), nPrefix, rLocalName, xPropSet); 3661cdf0e10cSrcweir } 3662cdf0e10cSrcweir } 3663cdf0e10cSrcweir } 3664cdf0e10cSrcweir 3665cdf0e10cSrcweir // call parent for content 3666cdf0e10cSrcweir if(!pContext) 3667cdf0e10cSrcweir pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList ); 3668cdf0e10cSrcweir 3669cdf0e10cSrcweir return pContext; 3670cdf0e10cSrcweir } 3671cdf0e10cSrcweir 3672cdf0e10cSrcweir void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&) 3673cdf0e10cSrcweir { 3674cdf0e10cSrcweir // ignore 3675cdf0e10cSrcweir } 3676cdf0e10cSrcweir 3677cdf0e10cSrcweir void SdXMLFrameShapeContext::EndElement() 3678cdf0e10cSrcweir { 3679ddde725dSArmin Le Grand /// solve if multiple image child contexts were imported 3680598d8f9fSArmin Le Grand const SvXMLImportContext* pWinner = solveMultipleImages(); 3681598d8f9fSArmin Le Grand const SdXMLGraphicObjectShapeContext* pGSCWinner = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(pWinner); 3682598d8f9fSArmin Le Grand 3683598d8f9fSArmin Le Grand /// if we have a winner and it's on LateAdd, add it now 3684598d8f9fSArmin Le Grand if(pGSCWinner && pGSCWinner->getLateAddToIdentifierMapper() && pGSCWinner->getShapeId().getLength()) 3685598d8f9fSArmin Le Grand { 3686598d8f9fSArmin Le Grand uno::Reference< uno::XInterface > xRef( pGSCWinner->getShape(), uno::UNO_QUERY ); 3687598d8f9fSArmin Le Grand GetImport().getInterfaceToIdentifierMapper().registerReference( pGSCWinner->getShapeId(), xRef ); 3688598d8f9fSArmin Le Grand } 3689ddde725dSArmin Le Grand 3690cdf0e10cSrcweir if( !mxImplContext.Is() ) 3691cdf0e10cSrcweir { 3692cdf0e10cSrcweir // now check if this is an empty presentation object 3693cdf0e10cSrcweir sal_Int16 nAttrCount = mxAttrList.is() ? mxAttrList->getLength() : 0; 3694cdf0e10cSrcweir for(sal_Int16 a(0); a < nAttrCount; a++) 3695cdf0e10cSrcweir { 3696cdf0e10cSrcweir OUString aLocalName; 3697cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(mxAttrList->getNameByIndex(a), &aLocalName); 3698cdf0e10cSrcweir 3699cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_PRESENTATION ) 3700cdf0e10cSrcweir { 3701cdf0e10cSrcweir if( IsXMLToken( aLocalName, XML_PLACEHOLDER ) ) 3702cdf0e10cSrcweir { 3703cdf0e10cSrcweir mbIsPlaceholder = IsXMLToken( mxAttrList->getValueByIndex(a), XML_TRUE ); 3704cdf0e10cSrcweir } 3705cdf0e10cSrcweir else if( IsXMLToken( aLocalName, XML_CLASS ) ) 3706cdf0e10cSrcweir { 3707cdf0e10cSrcweir maPresentationClass = mxAttrList->getValueByIndex(a); 3708cdf0e10cSrcweir } 3709cdf0e10cSrcweir } 3710cdf0e10cSrcweir } 3711cdf0e10cSrcweir 3712cdf0e10cSrcweir if( (maPresentationClass.getLength() != 0) && mbIsPlaceholder ) 3713cdf0e10cSrcweir { 3714cdf0e10cSrcweir uno::Reference< xml::sax::XAttributeList> xEmpty; 3715cdf0e10cSrcweir 3716cdf0e10cSrcweir enum XMLTokenEnum eToken = XML_TEXT_BOX; 3717cdf0e10cSrcweir 3718cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) ) 3719cdf0e10cSrcweir { 3720cdf0e10cSrcweir eToken = XML_IMAGE; 3721cdf0e10cSrcweir 3722cdf0e10cSrcweir } 3723cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) ) 3724cdf0e10cSrcweir { 3725cdf0e10cSrcweir eToken = XML_PAGE_THUMBNAIL; 3726cdf0e10cSrcweir } 3727cdf0e10cSrcweir else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) || 3728cdf0e10cSrcweir IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) || 3729cdf0e10cSrcweir IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) ) 3730cdf0e10cSrcweir { 3731cdf0e10cSrcweir eToken = XML_OBJECT; 3732cdf0e10cSrcweir } 3733cdf0e10cSrcweir 3734cdf0e10cSrcweir mxImplContext = GetImport().GetShapeImport()->CreateFrameChildContext( 3735cdf0e10cSrcweir GetImport(), XML_NAMESPACE_DRAW, GetXMLToken( eToken ), mxAttrList, mxShapes, xEmpty ); 3736cdf0e10cSrcweir 3737cdf0e10cSrcweir if( mxImplContext.Is() ) 3738cdf0e10cSrcweir { 3739cdf0e10cSrcweir mxImplContext->StartElement( mxAttrList ); 3740cdf0e10cSrcweir mxImplContext->EndElement(); 3741cdf0e10cSrcweir } 3742cdf0e10cSrcweir } 3743cdf0e10cSrcweir } 3744cdf0e10cSrcweir 3745cdf0e10cSrcweir mxImplContext = 0; 3746cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 3747cdf0e10cSrcweir } 3748cdf0e10cSrcweir 3749cdf0e10cSrcweir void SdXMLFrameShapeContext::processAttribute( sal_uInt16, 3750cdf0e10cSrcweir const ::rtl::OUString&, const ::rtl::OUString& ) 3751cdf0e10cSrcweir { 3752cdf0e10cSrcweir // ignore 3753cdf0e10cSrcweir } 3754cdf0e10cSrcweir 3755cdf0e10cSrcweir TYPEINIT1( SdXMLCustomShapeContext, SdXMLShapeContext ); 3756cdf0e10cSrcweir 3757cdf0e10cSrcweir SdXMLCustomShapeContext::SdXMLCustomShapeContext( 3758cdf0e10cSrcweir SvXMLImport& rImport, 3759cdf0e10cSrcweir sal_uInt16 nPrfx, 3760cdf0e10cSrcweir const OUString& rLocalName, 3761cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, 3762cdf0e10cSrcweir uno::Reference< drawing::XShapes >& rShapes, 3763cdf0e10cSrcweir sal_Bool bTemporaryShape) 3764cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ) 3765cdf0e10cSrcweir { 3766cdf0e10cSrcweir } 3767cdf0e10cSrcweir 3768cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3769cdf0e10cSrcweir 3770cdf0e10cSrcweir SdXMLCustomShapeContext::~SdXMLCustomShapeContext() 3771cdf0e10cSrcweir { 3772cdf0e10cSrcweir } 3773cdf0e10cSrcweir 3774cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3775cdf0e10cSrcweir 3776cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 3777cdf0e10cSrcweir void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 3778cdf0e10cSrcweir { 3779cdf0e10cSrcweir if( XML_NAMESPACE_DRAW == nPrefix ) 3780cdf0e10cSrcweir { 3781cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_ENGINE ) ) 3782cdf0e10cSrcweir { 3783cdf0e10cSrcweir maCustomShapeEngine = rValue; 3784cdf0e10cSrcweir return; 3785cdf0e10cSrcweir } 3786cdf0e10cSrcweir if ( IsXMLToken( rLocalName, XML_DATA ) ) 3787cdf0e10cSrcweir { 3788cdf0e10cSrcweir maCustomShapeData = rValue; 3789cdf0e10cSrcweir return; 3790cdf0e10cSrcweir } 3791cdf0e10cSrcweir } 3792cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 3793cdf0e10cSrcweir } 3794cdf0e10cSrcweir 3795cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3796cdf0e10cSrcweir 3797cdf0e10cSrcweir void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList ) 3798cdf0e10cSrcweir { 3799cdf0e10cSrcweir // create rectangle shape 3800cdf0e10cSrcweir AddShape("com.sun.star.drawing.CustomShape"); 3801cdf0e10cSrcweir if ( mxShape.is() ) 3802cdf0e10cSrcweir { 3803cdf0e10cSrcweir // Add, set Style and properties from base shape 3804cdf0e10cSrcweir SetStyle(); 3805cdf0e10cSrcweir SetLayer(); 3806cdf0e10cSrcweir 3807cdf0e10cSrcweir // set pos, size, shear and rotate 3808cdf0e10cSrcweir SetTransformation(); 3809cdf0e10cSrcweir 3810cdf0e10cSrcweir try 3811cdf0e10cSrcweir { 3812cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY ); 3813cdf0e10cSrcweir if( xPropSet.is() ) 3814cdf0e10cSrcweir { 3815cdf0e10cSrcweir if ( maCustomShapeEngine.getLength() ) 3816cdf0e10cSrcweir { 3817cdf0e10cSrcweir uno::Any aAny; 3818cdf0e10cSrcweir aAny <<= maCustomShapeEngine; 3819cdf0e10cSrcweir xPropSet->setPropertyValue( EASGet( EAS_CustomShapeEngine ), aAny ); 3820cdf0e10cSrcweir } 3821cdf0e10cSrcweir if ( maCustomShapeData.getLength() ) 3822cdf0e10cSrcweir { 3823cdf0e10cSrcweir uno::Any aAny; 3824cdf0e10cSrcweir aAny <<= maCustomShapeData; 3825cdf0e10cSrcweir xPropSet->setPropertyValue( EASGet( EAS_CustomShapeData ), aAny ); 3826cdf0e10cSrcweir } 3827cdf0e10cSrcweir } 3828cdf0e10cSrcweir } 3829cdf0e10cSrcweir catch( uno::Exception& ) 3830cdf0e10cSrcweir { 3831cdf0e10cSrcweir DBG_ERROR( "could not set enhanced customshape geometry" ); 3832cdf0e10cSrcweir } 3833cdf0e10cSrcweir SdXMLShapeContext::StartElement(xAttrList); 3834cdf0e10cSrcweir } 3835cdf0e10cSrcweir } 3836cdf0e10cSrcweir 3837cdf0e10cSrcweir void SdXMLCustomShapeContext::EndElement() 3838cdf0e10cSrcweir { 38396381da86SArmin Le Grand // for backward compatibility, the above SetTransformation() may alraedy have 38406381da86SArmin Le Grand // applied a call to SetMirroredX/SetMirroredY. This is not yet added to the 38416381da86SArmin Le Grand // beans::PropertyValues in maCustomShapeGeometry. When applying these now, this 38426381da86SArmin Le Grand // would be lost again. 38436381da86SArmin Le Grand // TTTT: Remove again after aw080 38446381da86SArmin Le Grand if(!maUsedTransformation.isIdentity()) 38456381da86SArmin Le Grand { 38466381da86SArmin Le Grand basegfx::B2DVector aScale, aTranslate; 38476381da86SArmin Le Grand double fRotate, fShearX; 38486381da86SArmin Le Grand 38496381da86SArmin Le Grand maUsedTransformation.decompose(aScale, aTranslate, fRotate, fShearX); 38506381da86SArmin Le Grand 38516381da86SArmin Le Grand bool bFlippedX(aScale.getX() < 0.0); 38526381da86SArmin Le Grand bool bFlippedY(aScale.getY() < 0.0); 38536381da86SArmin Le Grand 38546381da86SArmin Le Grand if(bFlippedX && bFlippedY) 38556381da86SArmin Le Grand { 38566381da86SArmin Le Grand // when both are used it is the same as 180 degree rotation; reset 38576381da86SArmin Le Grand bFlippedX = bFlippedY = false; 38586381da86SArmin Le Grand } 38596381da86SArmin Le Grand 38606381da86SArmin Le Grand if(bFlippedX || bFlippedY) 38616381da86SArmin Le Grand { 38626381da86SArmin Le Grand beans::PropertyValue aNewPoroperty; 38636381da86SArmin Le Grand 38646381da86SArmin Le Grand if(bFlippedX) 38656381da86SArmin Le Grand { 38666381da86SArmin Le Grand aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredX")); 38676381da86SArmin Le Grand } 38686381da86SArmin Le Grand else 38696381da86SArmin Le Grand { 38706381da86SArmin Le Grand aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredY")); 38716381da86SArmin Le Grand } 38726381da86SArmin Le Grand 38736381da86SArmin Le Grand aNewPoroperty.Handle = -1; 38746381da86SArmin Le Grand aNewPoroperty.Value <<= sal_True; 38756381da86SArmin Le Grand aNewPoroperty.State = beans::PropertyState_DIRECT_VALUE; 38766381da86SArmin Le Grand 38776381da86SArmin Le Grand maCustomShapeGeometry.push_back(aNewPoroperty); 38786381da86SArmin Le Grand } 38796381da86SArmin Le Grand } 38806381da86SArmin Le Grand 3881cdf0e10cSrcweir if ( !maCustomShapeGeometry.empty() ) 3882cdf0e10cSrcweir { 3883cdf0e10cSrcweir const rtl::OUString sCustomShapeGeometry ( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeGeometry" ) ); 3884cdf0e10cSrcweir 3885cdf0e10cSrcweir // converting the vector to a sequence 3886cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aSeq( maCustomShapeGeometry.size() ); 3887cdf0e10cSrcweir beans::PropertyValue* pValues = aSeq.getArray(); 3888cdf0e10cSrcweir std::vector< beans::PropertyValue >::const_iterator aIter( maCustomShapeGeometry.begin() ); 3889cdf0e10cSrcweir std::vector< beans::PropertyValue >::const_iterator aEnd( maCustomShapeGeometry.end() ); 3890cdf0e10cSrcweir while ( aIter != aEnd ) 3891cdf0e10cSrcweir *pValues++ = *aIter++; 3892cdf0e10cSrcweir 3893cdf0e10cSrcweir try 3894cdf0e10cSrcweir { 3895cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY ); 3896cdf0e10cSrcweir if( xPropSet.is() ) 3897cdf0e10cSrcweir { 3898cdf0e10cSrcweir uno::Any aAny; 3899cdf0e10cSrcweir aAny <<= aSeq; 3900cdf0e10cSrcweir xPropSet->setPropertyValue( sCustomShapeGeometry, aAny ); 3901cdf0e10cSrcweir } 3902cdf0e10cSrcweir } 3903cdf0e10cSrcweir catch( uno::Exception& ) 3904cdf0e10cSrcweir { 3905cdf0e10cSrcweir DBG_ERROR( "could not set enhanced customshape geometry" ); 3906cdf0e10cSrcweir } 3907cdf0e10cSrcweir 3908cdf0e10cSrcweir sal_Int32 nUPD( 0 ); 3909cdf0e10cSrcweir sal_Int32 nBuild( 0 ); 3910cdf0e10cSrcweir GetImport().getBuildIds( nUPD, nBuild ); 3911cdf0e10cSrcweir if( ((nUPD >= 640 && nUPD <= 645) || (nUPD == 680)) && (nBuild <= 9221) ) 3912cdf0e10cSrcweir { 3913cdf0e10cSrcweir Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( mxShape, UNO_QUERY ); 3914cdf0e10cSrcweir if( xDefaulter.is() ) 3915cdf0e10cSrcweir { 3916cdf0e10cSrcweir rtl::OUString aEmptyType; 3917cdf0e10cSrcweir xDefaulter->createCustomShapeDefaults( aEmptyType ); 3918cdf0e10cSrcweir } 3919cdf0e10cSrcweir } 3920cdf0e10cSrcweir } 3921cdf0e10cSrcweir 3922cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 3923cdf0e10cSrcweir } 3924cdf0e10cSrcweir 3925cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3926cdf0e10cSrcweir 3927cdf0e10cSrcweir SvXMLImportContext* SdXMLCustomShapeContext::CreateChildContext( 3928cdf0e10cSrcweir sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 3929cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 3930cdf0e10cSrcweir { 3931cdf0e10cSrcweir SvXMLImportContext* pContext = NULL; 3932cdf0e10cSrcweir if ( XML_NAMESPACE_DRAW == nPrefix ) 3933cdf0e10cSrcweir { 3934cdf0e10cSrcweir if ( IsXMLToken( rLocalName, XML_ENHANCED_GEOMETRY ) ) 3935cdf0e10cSrcweir { 3936cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xPropSet( mxShape,uno::UNO_QUERY ); 3937cdf0e10cSrcweir if ( xPropSet.is() ) 3938cdf0e10cSrcweir pContext = new XMLEnhancedCustomShapeContext( GetImport(), mxShape, nPrefix, rLocalName, maCustomShapeGeometry ); 3939cdf0e10cSrcweir } 3940cdf0e10cSrcweir } 3941cdf0e10cSrcweir // delegate to parent class if no context could be created 3942cdf0e10cSrcweir if ( NULL == pContext ) 3943cdf0e10cSrcweir pContext = SdXMLShapeContext::CreateChildContext( nPrefix, rLocalName, 3944cdf0e10cSrcweir xAttrList); 3945cdf0e10cSrcweir return pContext; 3946cdf0e10cSrcweir } 3947cdf0e10cSrcweir 3948cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////// 3949cdf0e10cSrcweir 3950cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 3951cdf0e10cSrcweir 3952cdf0e10cSrcweir TYPEINIT1( SdXMLTableShapeContext, SdXMLShapeContext ); 3953cdf0e10cSrcweir 3954cdf0e10cSrcweir SdXMLTableShapeContext::SdXMLTableShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes ) 3955cdf0e10cSrcweir : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, sal_False ) 3956cdf0e10cSrcweir { 3957cdf0e10cSrcweir memset( &maTemplateStylesUsed, 0, sizeof( maTemplateStylesUsed ) ); 3958cdf0e10cSrcweir } 3959cdf0e10cSrcweir 3960cdf0e10cSrcweir SdXMLTableShapeContext::~SdXMLTableShapeContext() 3961cdf0e10cSrcweir { 3962cdf0e10cSrcweir } 3963cdf0e10cSrcweir 3964cdf0e10cSrcweir void SdXMLTableShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) 3965cdf0e10cSrcweir { 3966cdf0e10cSrcweir const char* pService = "com.sun.star.drawing.TableShape"; 3967cdf0e10cSrcweir 3968cdf0e10cSrcweir sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported(); 3969cdf0e10cSrcweir if( bIsPresShape ) 3970cdf0e10cSrcweir { 3971cdf0e10cSrcweir if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ) 3972cdf0e10cSrcweir { 3973cdf0e10cSrcweir pService = "com.sun.star.presentation.TableShape"; 3974cdf0e10cSrcweir } 3975cdf0e10cSrcweir } 3976cdf0e10cSrcweir 3977cdf0e10cSrcweir AddShape( pService ); 3978cdf0e10cSrcweir 3979cdf0e10cSrcweir if( mxShape.is() ) 3980cdf0e10cSrcweir { 3981cdf0e10cSrcweir SetLayer(); 3982cdf0e10cSrcweir 3983cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY); 3984cdf0e10cSrcweir 3985cdf0e10cSrcweir if(bIsPresShape) 3986cdf0e10cSrcweir { 3987cdf0e10cSrcweir if(xProps.is()) 3988cdf0e10cSrcweir { 3989cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() ); 3990cdf0e10cSrcweir if( xPropsInfo.is() ) 3991cdf0e10cSrcweir { 3992cdf0e10cSrcweir if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ))) 3993cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) ); 3994cdf0e10cSrcweir 3995cdf0e10cSrcweir if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ))) 3996cdf0e10cSrcweir xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) ); 3997cdf0e10cSrcweir } 3998cdf0e10cSrcweir } 3999cdf0e10cSrcweir } 4000cdf0e10cSrcweir 4001cdf0e10cSrcweir SetStyle(); 4002cdf0e10cSrcweir 4003cdf0e10cSrcweir if( xProps.is() ) 4004cdf0e10cSrcweir { 4005cdf0e10cSrcweir if( msTemplateStyleName.getLength() ) try 4006cdf0e10cSrcweir { 4007cdf0e10cSrcweir Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetImport().GetModel(), UNO_QUERY_THROW ); 4008cdf0e10cSrcweir Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() ); 4009cdf0e10cSrcweir const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM("table" ) ); 4010cdf0e10cSrcweir Reference< XNameAccess > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW ); 4011cdf0e10cSrcweir Reference< XStyle > xTableStyle( xTableFamily->getByName( msTemplateStyleName ), UNO_QUERY_THROW ); 4012cdf0e10cSrcweir xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TableTemplate" ) ), Any( xTableStyle ) ); 4013cdf0e10cSrcweir } 4014cdf0e10cSrcweir catch( Exception& ) 4015cdf0e10cSrcweir { 4016cdf0e10cSrcweir DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!"); 4017cdf0e10cSrcweir } 4018cdf0e10cSrcweir 4019cdf0e10cSrcweir const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0]; 4020cdf0e10cSrcweir for( int i = 0; pEntry->msApiName && (i < 6); i++, pEntry++ ) 4021cdf0e10cSrcweir { 4022cdf0e10cSrcweir try 4023cdf0e10cSrcweir { 4024cdf0e10cSrcweir const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) ); 4025cdf0e10cSrcweir xProps->setPropertyValue( sAPIPropertyName, Any( maTemplateStylesUsed[i] ) ); 4026cdf0e10cSrcweir } 4027cdf0e10cSrcweir catch( Exception& ) 4028cdf0e10cSrcweir { 4029cdf0e10cSrcweir DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!"); 4030cdf0e10cSrcweir } 4031cdf0e10cSrcweir } 4032cdf0e10cSrcweir } 4033cdf0e10cSrcweir 4034cdf0e10cSrcweir GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes ); 4035cdf0e10cSrcweir 4036cdf0e10cSrcweir const rtl::Reference< XMLTableImport >& xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() ); 4037cdf0e10cSrcweir if( xTableImport.is() && xProps.is() ) 4038cdf0e10cSrcweir { 4039cdf0e10cSrcweir uno::Reference< table::XColumnRowRange > xColumnRowRange( 4040cdf0e10cSrcweir xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ), uno::UNO_QUERY ); 4041cdf0e10cSrcweir 4042cdf0e10cSrcweir if( xColumnRowRange.is() ) 4043cdf0e10cSrcweir mxTableImportContext = xTableImport->CreateTableContext( GetPrefix(), GetLocalName(), xColumnRowRange ); 4044cdf0e10cSrcweir 4045cdf0e10cSrcweir if( mxTableImportContext.Is() ) 4046cdf0e10cSrcweir mxTableImportContext->StartElement( xAttrList ); 4047cdf0e10cSrcweir } 4048cdf0e10cSrcweir } 4049cdf0e10cSrcweir } 4050cdf0e10cSrcweir 4051cdf0e10cSrcweir void SdXMLTableShapeContext::EndElement() 4052cdf0e10cSrcweir { 4053cdf0e10cSrcweir if( mxTableImportContext.Is() ) 4054cdf0e10cSrcweir mxTableImportContext->EndElement(); 4055cdf0e10cSrcweir 4056cdf0e10cSrcweir SdXMLShapeContext::EndElement(); 4057cdf0e10cSrcweir 4058cdf0e10cSrcweir if( mxShape.is() ) 4059cdf0e10cSrcweir { 4060cdf0e10cSrcweir // set pos, size, shear and rotate 4061cdf0e10cSrcweir SetTransformation(); 4062cdf0e10cSrcweir } 4063cdf0e10cSrcweir } 4064cdf0e10cSrcweir 4065cdf0e10cSrcweir // this is called from the parent group for each unparsed attribute in the attribute list 4066cdf0e10cSrcweir void SdXMLTableShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue ) 4067cdf0e10cSrcweir { 4068cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_TABLE ) 4069cdf0e10cSrcweir { 4070cdf0e10cSrcweir if( IsXMLToken( rLocalName, XML_TEMPLATE_NAME ) ) 4071cdf0e10cSrcweir { 4072cdf0e10cSrcweir msTemplateStyleName = rValue; 4073cdf0e10cSrcweir } 4074cdf0e10cSrcweir else 4075cdf0e10cSrcweir { 4076cdf0e10cSrcweir int i = 0; 4077cdf0e10cSrcweir const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0]; 4078cdf0e10cSrcweir while( pEntry->msApiName && (i < 6) ) 4079cdf0e10cSrcweir { 4080cdf0e10cSrcweir if( IsXMLToken( rLocalName, pEntry->meXMLName ) ) 4081cdf0e10cSrcweir { 4082cdf0e10cSrcweir if( IsXMLToken( rValue, XML_TRUE ) ) 4083cdf0e10cSrcweir maTemplateStylesUsed[i] = sal_True; 4084cdf0e10cSrcweir break; 4085cdf0e10cSrcweir } 4086cdf0e10cSrcweir pEntry++; 4087cdf0e10cSrcweir i++; 4088cdf0e10cSrcweir } 4089cdf0e10cSrcweir } 4090cdf0e10cSrcweir } 4091cdf0e10cSrcweir SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue ); 4092cdf0e10cSrcweir } 4093cdf0e10cSrcweir 4094cdf0e10cSrcweir SvXMLImportContext* SdXMLTableShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 4095cdf0e10cSrcweir { 4096cdf0e10cSrcweir if( mxTableImportContext.Is() && (nPrefix == XML_NAMESPACE_TABLE) ) 4097cdf0e10cSrcweir return mxTableImportContext->CreateChildContext(nPrefix, rLocalName, xAttrList); 4098cdf0e10cSrcweir else 4099cdf0e10cSrcweir return SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList); 4100cdf0e10cSrcweir } 4101cdf0e10cSrcweir 4102