1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "unointerfacetouniqueidentifiermapper.hxx" 27 #include <com/sun/star/text/XText.hpp> 28 #include <com/sun/star/container/XNamed.hpp> 29 #include <com/sun/star/container/XEnumerationAccess.hpp> 30 #include <com/sun/star/drawing/CircleKind.hpp> 31 #include <com/sun/star/drawing/ConnectorType.hpp> 32 #include <com/sun/star/drawing/XControlShape.hpp> 33 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> 34 #include <com/sun/star/document/XEventsSupplier.hpp> 35 #include <com/sun/star/drawing/HomogenMatrix3.hpp> 36 #include <com/sun/star/media/ZoomLevel.hpp> 37 #include "anim.hxx" 38 39 #ifndef _XMLOFF_SHAPEEXPORT_HXX 40 #include <xmloff/shapeexport.hxx> 41 #endif 42 #include "sdpropls.hxx" 43 #include <tools/debug.hxx> 44 #include <tools/urlobj.hxx> 45 #include <rtl/ustrbuf.hxx> 46 #include <xmloff/xmlexp.hxx> 47 #include <xmloff/xmluconv.hxx> 48 #include "XMLImageMapExport.hxx" 49 #include "xexptran.hxx" 50 #include <tools/gen.hxx> // FRound 51 #include <xmloff/xmltoken.hxx> 52 #include <xmloff/nmspmap.hxx> 53 54 #include "xmloff/xmlnmspe.hxx" 55 #include <basegfx/matrix/b2dhommatrix.hxx> 56 #include <basegfx/tuple/b2dtuple.hxx> 57 58 using ::rtl::OUString; 59 using ::rtl::OUStringBuffer; 60 61 using namespace ::com::sun::star; 62 using namespace ::xmloff::token; 63 64 65 ////////////////////////////////////////////////////////////////////////////// 66 67 void XMLShapeExport::ImpExportNewTrans(const uno::Reference< beans::XPropertySet >& xPropSet, 68 sal_Int32 nFeatures, awt::Point* pRefPoint) 69 { 70 // get matrix 71 ::basegfx::B2DHomMatrix aMatrix; 72 ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet); 73 74 // decompose and correct abour pRefPoint 75 ::basegfx::B2DTuple aTRScale; 76 double fTRShear(0.0); 77 double fTRRotate(0.0); 78 ::basegfx::B2DTuple aTRTranslate; 79 ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint); 80 81 // use features and write 82 ImpExportNewTrans_FeaturesAndWrite(aTRScale, fTRShear, fTRRotate, aTRTranslate, nFeatures); 83 } 84 85 void XMLShapeExport::ImpExportNewTrans_GetB2DHomMatrix(::basegfx::B2DHomMatrix& rMatrix, 86 const uno::Reference< beans::XPropertySet >& xPropSet) 87 { 88 // --> OD 2004-08-09 #i28749# - Get <TransformationInHoriL2R>, if it exist 89 // and if the document is exported into the OpenOffice.org file format. 90 // This property only exists at service com::sun::star::text::Shape - the 91 // Writer UNO service for shapes. 92 // This code is needed, because the positioning attributes in the 93 // OpenOffice.org file format are given in horizontal left-to-right layout 94 // regardless the layout direction the shape is in. In the OASIS Open Office 95 // file format the positioning attributes are correctly given in the layout 96 // direction the shape is in. Thus, this code provides the conversion from 97 // the OASIS Open Office file format to the OpenOffice.org file format. 98 uno::Any aAny; 99 if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 && 100 xPropSet->getPropertySetInfo()->hasPropertyByName( 101 OUString(RTL_CONSTASCII_USTRINGPARAM("TransformationInHoriL2R"))) ) 102 { 103 aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("TransformationInHoriL2R"))); 104 } 105 else 106 { 107 aAny = xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation"))); 108 } 109 // <-- 110 drawing::HomogenMatrix3 aMatrix; 111 aAny >>= aMatrix; 112 113 rMatrix.set(0, 0, aMatrix.Line1.Column1); 114 rMatrix.set(0, 1, aMatrix.Line1.Column2); 115 rMatrix.set(0, 2, aMatrix.Line1.Column3); 116 rMatrix.set(1, 0, aMatrix.Line2.Column1); 117 rMatrix.set(1, 1, aMatrix.Line2.Column2); 118 rMatrix.set(1, 2, aMatrix.Line2.Column3); 119 rMatrix.set(2, 0, aMatrix.Line3.Column1); 120 rMatrix.set(2, 1, aMatrix.Line3.Column2); 121 rMatrix.set(2, 2, aMatrix.Line3.Column3); 122 } 123 124 void XMLShapeExport::ImpExportNewTrans_DecomposeAndRefPoint(const ::basegfx::B2DHomMatrix& rMatrix, ::basegfx::B2DTuple& rTRScale, 125 double& fTRShear, double& fTRRotate, ::basegfx::B2DTuple& rTRTranslate, com::sun::star::awt::Point* pRefPoint) 126 { 127 // decompose matrix 128 rMatrix.decompose(rTRScale, rTRTranslate, fTRRotate, fTRShear); 129 130 // correct translation about pRefPoint 131 if(pRefPoint) 132 { 133 rTRTranslate -= ::basegfx::B2DTuple(pRefPoint->X, pRefPoint->Y); 134 } 135 } 136 137 void XMLShapeExport::ImpExportNewTrans_FeaturesAndWrite(::basegfx::B2DTuple& rTRScale, double fTRShear, 138 double fTRRotate, ::basegfx::B2DTuple& rTRTranslate, const sal_Int32 nFeatures) 139 { 140 // allways write Size (rTRScale) since this statement carries the union 141 // of the object 142 OUString aStr; 143 OUStringBuffer sStringBuffer; 144 ::basegfx::B2DTuple aTRScale(rTRScale); 145 146 // svg: width 147 if(!(nFeatures & SEF_EXPORT_WIDTH)) 148 { 149 aTRScale.setX(1.0); 150 } 151 else 152 { 153 if( aTRScale.getX() > 0.0 ) 154 aTRScale.setX(aTRScale.getX() - 1.0); 155 else if( aTRScale.getX() < 0.0 ) 156 aTRScale.setX(aTRScale.getX() + 1.0); 157 } 158 159 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(aTRScale.getX())); 160 aStr = sStringBuffer.makeStringAndClear(); 161 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_WIDTH, aStr); 162 163 // svg: height 164 if(!(nFeatures & SEF_EXPORT_HEIGHT)) 165 { 166 aTRScale.setY(1.0); 167 } 168 else 169 { 170 if( aTRScale.getY() > 0.0 ) 171 aTRScale.setY(aTRScale.getY() - 1.0); 172 else if( aTRScale.getY() < 0.0 ) 173 aTRScale.setY(aTRScale.getY() + 1.0); 174 } 175 176 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(aTRScale.getY())); 177 aStr = sStringBuffer.makeStringAndClear(); 178 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_HEIGHT, aStr); 179 180 // decide if transformation is neccessary 181 sal_Bool bTransformationIsNeccessary(fTRShear != 0.0 || fTRRotate != 0.0); 182 183 if(bTransformationIsNeccessary) 184 { 185 // write transformation, but WITHOUT scale which is exported as size above 186 SdXMLImExTransform2D aTransform; 187 188 aTransform.AddSkewX(atan(fTRShear)); 189 190 // #i78696# 191 // fTRRotate is mathematically correct, but due to the error 192 // we export/import it mirrored. Since the API implementation is fixed and 193 // uses the correctly oriented angle, it is necessary for compatibility to 194 // mirror the angle here to stay at the old behaviour. There is a follow-up 195 // task (#i78698#) to fix this in the next ODF FileFormat version 196 aTransform.AddRotate(-fTRRotate); 197 198 aTransform.AddTranslate(rTRTranslate); 199 200 // does transformation need to be exported? 201 if(aTransform.NeedsAction()) 202 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TRANSFORM, aTransform.GetExportString(mrExport.GetMM100UnitConverter())); 203 } 204 else 205 { 206 // no shear, no rotate; just add object position to export and we are done 207 if(nFeatures & SEF_EXPORT_X) 208 { 209 // svg: x 210 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(rTRTranslate.getX())); 211 aStr = sStringBuffer.makeStringAndClear(); 212 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X, aStr); 213 } 214 215 if(nFeatures & SEF_EXPORT_Y) 216 { 217 // svg: y 218 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, FRound(rTRTranslate.getY())); 219 aStr = sStringBuffer.makeStringAndClear(); 220 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y, aStr); 221 } 222 } 223 } 224 225 ////////////////////////////////////////////////////////////////////////////// 226 227 sal_Bool XMLShapeExport::ImpExportPresentationAttributes( const uno::Reference< beans::XPropertySet >& xPropSet, const rtl::OUString& rClass ) 228 { 229 sal_Bool bIsEmpty = sal_False; 230 231 OUStringBuffer sStringBuffer; 232 233 // write presentation class entry 234 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_CLASS, rClass); 235 236 if( xPropSet.is() ) 237 { 238 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 239 240 sal_Bool bTemp = false; 241 242 // is empty pes shape? 243 if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject")))) 244 { 245 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject"))) >>= bIsEmpty; 246 if( bIsEmpty ) 247 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_PLACEHOLDER, XML_TRUE); 248 } 249 250 // is user-transformed? 251 if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent")))) 252 { 253 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent"))) >>= bTemp; 254 if(!bTemp) 255 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_USER_TRANSFORMED, XML_TRUE); 256 } 257 } 258 259 return bIsEmpty; 260 } 261 262 ////////////////////////////////////////////////////////////////////////////// 263 264 void XMLShapeExport::ImpExportText( const uno::Reference< drawing::XShape >& xShape ) 265 { 266 uno::Reference< text::XText > xText( xShape, uno::UNO_QUERY ); 267 if( xText.is() ) 268 { 269 uno::Reference< container::XEnumerationAccess > xEnumAccess( xShape, uno::UNO_QUERY ); 270 if( xEnumAccess.is() && xEnumAccess->hasElements() ) 271 mrExport.GetTextParagraphExport()->exportText( xText ); 272 } 273 } 274 275 ////////////////////////////////////////////////////////////////////////////// 276 #include <com/sun/star/presentation/ClickAction.hpp> 277 #include <com/sun/star/presentation/AnimationSpeed.hpp> 278 279 namespace { 280 281 const sal_Int32 FOUND_CLICKACTION = 0x00000001; 282 const sal_Int32 FOUND_BOOKMARK = 0x00000002; 283 const sal_Int32 FOUND_EFFECT = 0x00000004; 284 const sal_Int32 FOUND_PLAYFULL = 0x00000008; 285 const sal_Int32 FOUND_VERB = 0x00000010; 286 const sal_Int32 FOUND_SOUNDURL = 0x00000020; 287 const sal_Int32 FOUND_SPEED = 0x00000040; 288 const sal_Int32 FOUND_CLICKEVENTTYPE = 0x00000080; 289 const sal_Int32 FOUND_MACRO = 0x00000100; 290 const sal_Int32 FOUND_LIBRARY = 0x00000200; 291 const sal_Int32 FOUND_ACTIONEVENTTYPE = 0x00000400; 292 #ifdef ISSUE66550_HLINK_FOR_SHAPES 293 const sal_Int32 FOUND_URL = 0x00000800; 294 #endif 295 296 } // namespace 297 298 void XMLShapeExport::ImpExportEvents( const uno::Reference< drawing::XShape >& xShape ) 299 { 300 uno::Reference< document::XEventsSupplier > xEventsSupplier( xShape, uno::UNO_QUERY ); 301 if( !xEventsSupplier.is() ) 302 return; 303 304 uno::Reference< container::XNameAccess > xEvents( xEventsSupplier->getEvents(), uno::UNO_QUERY ); 305 DBG_ASSERT( xEvents.is(), "XEventsSupplier::getEvents() returned NULL" ); 306 if( !xEvents.is() ) 307 return; 308 309 sal_Int32 nFound = 0; 310 311 // extract properties from "OnClick" event -------------------------------- 312 313 OUString aClickEventType; 314 presentation::ClickAction eClickAction = presentation::ClickAction_NONE; 315 presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE; 316 presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_SLOW; 317 OUString aStrSoundURL; 318 sal_Bool bPlayFull = false; 319 sal_Int32 nVerb = 0; 320 OUString aStrMacro; 321 OUString aStrLibrary; 322 OUString aStrBookmark; 323 324 uno::Sequence< beans::PropertyValue > aClickProperties; 325 if( xEvents->hasByName( msOnClick ) && (xEvents->getByName( msOnClick ) >>= aClickProperties) ) 326 { 327 const beans::PropertyValue* pProperty = aClickProperties.getConstArray(); 328 const beans::PropertyValue* pPropertyEnd = pProperty + aClickProperties.getLength(); 329 for( ; pProperty != pPropertyEnd; ++pProperty ) 330 { 331 if( ( ( nFound & FOUND_CLICKEVENTTYPE ) == 0 ) && pProperty->Name == msEventType ) 332 { 333 if( pProperty->Value >>= aClickEventType ) 334 nFound |= FOUND_CLICKEVENTTYPE; 335 } 336 else if( ( ( nFound & FOUND_CLICKACTION ) == 0 ) && pProperty->Name == msClickAction ) 337 { 338 if( pProperty->Value >>= eClickAction ) 339 nFound |= FOUND_CLICKACTION; 340 } 341 else if( ( ( nFound & FOUND_MACRO ) == 0 ) && ( pProperty->Name == msMacroName || pProperty->Name == msScript ) ) 342 { 343 if( pProperty->Value >>= aStrMacro ) 344 nFound |= FOUND_MACRO; 345 } 346 else if( ( ( nFound & FOUND_LIBRARY ) == 0 ) && pProperty->Name == msLibrary ) 347 { 348 if( pProperty->Value >>= aStrLibrary ) 349 nFound |= FOUND_LIBRARY; 350 } 351 else if( ( ( nFound & FOUND_EFFECT ) == 0 ) && pProperty->Name == msEffect ) 352 { 353 if( pProperty->Value >>= eEffect ) 354 nFound |= FOUND_EFFECT; 355 } 356 else if( ( ( nFound & FOUND_BOOKMARK ) == 0 ) && pProperty->Name == msBookmark ) 357 { 358 if( pProperty->Value >>= aStrBookmark ) 359 nFound |= FOUND_BOOKMARK; 360 } 361 else if( ( ( nFound & FOUND_SPEED ) == 0 ) && pProperty->Name == msSpeed ) 362 { 363 if( pProperty->Value >>= eSpeed ) 364 nFound |= FOUND_SPEED; 365 } 366 else if( ( ( nFound & FOUND_SOUNDURL ) == 0 ) && pProperty->Name == msSoundURL ) 367 { 368 if( pProperty->Value >>= aStrSoundURL ) 369 nFound |= FOUND_SOUNDURL; 370 } 371 else if( ( ( nFound & FOUND_PLAYFULL ) == 0 ) && pProperty->Name == msPlayFull ) 372 { 373 if( pProperty->Value >>= bPlayFull ) 374 nFound |= FOUND_PLAYFULL; 375 } 376 else if( ( ( nFound & FOUND_VERB ) == 0 ) && pProperty->Name == msVerb ) 377 { 378 if( pProperty->Value >>= nVerb ) 379 nFound |= FOUND_VERB; 380 } 381 } 382 } 383 384 #ifdef ISSUE66550_HLINK_FOR_SHAPES 385 // extract properties from "OnAction" event ------------------------------- 386 387 OUString aActionEventType; 388 OUString aHyperURL; 389 390 uno::Sequence< beans::PropertyValue > aActionProperties; 391 if( xEvents->hasByName( msOnAction ) && (xEvents->getByName( msOnAction ) >>= aActionProperties) ) 392 { 393 const beans::PropertyValue* pProperty = aActionProperties.getConstArray(); 394 const beans::PropertyValue* pPropertyEnd = pProperty + aActionProperties.getLength(); 395 for( ; pProperty != pPropertyEnd; ++pProperty ) 396 { 397 if( ( ( nFound & FOUND_ACTIONEVENTTYPE ) == 0 ) && pProperty->Name == msEventType ) 398 { 399 if( pProperty->Value >>= aActionEventType ) 400 nFound |= FOUND_ACTIONEVENTTYPE; 401 } 402 else if( ( ( nFound & FOUND_URL ) == 0 ) && ( pProperty->Name == msURL ) ) 403 { 404 if( pProperty->Value >>= aHyperURL ) 405 nFound |= FOUND_URL; 406 } 407 } 408 } 409 #endif 410 411 // create the XML elements 412 413 if( aClickEventType == msPresentation ) 414 { 415 if( ((nFound & FOUND_CLICKACTION) == 0) || (eClickAction == presentation::ClickAction_NONE) ) 416 return; 417 418 SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True); 419 420 enum XMLTokenEnum eStrAction; 421 422 switch( eClickAction ) 423 { 424 case presentation::ClickAction_PREVPAGE: eStrAction = XML_PREVIOUS_PAGE; break; 425 case presentation::ClickAction_NEXTPAGE: eStrAction = XML_NEXT_PAGE; break; 426 case presentation::ClickAction_FIRSTPAGE: eStrAction = XML_FIRST_PAGE; break; 427 case presentation::ClickAction_LASTPAGE: eStrAction = XML_LAST_PAGE; break; 428 case presentation::ClickAction_INVISIBLE: eStrAction = XML_HIDE; break; 429 case presentation::ClickAction_STOPPRESENTATION:eStrAction = XML_STOP; break; 430 case presentation::ClickAction_PROGRAM: eStrAction = XML_EXECUTE; break; 431 case presentation::ClickAction_BOOKMARK: eStrAction = XML_SHOW; break; 432 case presentation::ClickAction_DOCUMENT: eStrAction = XML_SHOW; break; 433 case presentation::ClickAction_MACRO: eStrAction = XML_EXECUTE_MACRO; break; 434 case presentation::ClickAction_VERB: eStrAction = XML_VERB; break; 435 case presentation::ClickAction_VANISH: eStrAction = XML_FADE_OUT; break; 436 case presentation::ClickAction_SOUND: eStrAction = XML_SOUND; break; 437 default: 438 DBG_ERROR( "unknown presentation::ClickAction found!" ); 439 eStrAction = XML_UNKNOWN; 440 } 441 442 OUString aEventQName( 443 mrExport.GetNamespaceMap().GetQNameByKey( 444 XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) ); 445 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName ); 446 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_ACTION, eStrAction ); 447 448 if( eClickAction == presentation::ClickAction_VANISH ) 449 { 450 if( nFound & FOUND_EFFECT ) 451 { 452 XMLEffect eKind; 453 XMLEffectDirection eDirection; 454 sal_Int16 nStartScale; 455 sal_Bool bIn; 456 457 SdXMLImplSetEffect( eEffect, eKind, eDirection, nStartScale, bIn ); 458 459 if( eKind != EK_none ) 460 { 461 SvXMLUnitConverter::convertEnum( msBuffer, eKind, aXML_AnimationEffect_EnumMap ); 462 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_EFFECT, msBuffer.makeStringAndClear() ); 463 } 464 465 if( eDirection != ED_none ) 466 { 467 SvXMLUnitConverter::convertEnum( msBuffer, eDirection, aXML_AnimationDirection_EnumMap ); 468 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_DIRECTION, msBuffer.makeStringAndClear() ); 469 } 470 471 if( nStartScale != -1 ) 472 { 473 SvXMLUnitConverter::convertPercent( msBuffer, nStartScale ); 474 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_START_SCALE, msBuffer.makeStringAndClear() ); 475 } 476 } 477 478 if( nFound & FOUND_SPEED && eEffect != presentation::AnimationEffect_NONE ) 479 { 480 if( eSpeed != presentation::AnimationSpeed_MEDIUM ) 481 { 482 SvXMLUnitConverter::convertEnum( msBuffer, eSpeed, aXML_AnimationSpeed_EnumMap ); 483 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_SPEED, msBuffer.makeStringAndClear() ); 484 } 485 } 486 } 487 488 if( eClickAction == presentation::ClickAction_PROGRAM || 489 eClickAction == presentation::ClickAction_BOOKMARK || 490 eClickAction == presentation::ClickAction_DOCUMENT ) 491 { 492 if( eClickAction == presentation::ClickAction_BOOKMARK ) 493 msBuffer.append( sal_Unicode('#') ); 494 495 msBuffer.append( aStrBookmark ); 496 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(msBuffer.makeStringAndClear()) ); 497 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 498 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 499 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST ); 500 } 501 502 if( ( nFound & FOUND_VERB ) && eClickAction == presentation::ClickAction_VERB ) 503 { 504 msBuffer.append( nVerb ); 505 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_VERB, msBuffer.makeStringAndClear()); 506 } 507 508 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_PRESENTATION, XML_EVENT_LISTENER, sal_True, sal_True); 509 510 if( eClickAction == presentation::ClickAction_VANISH || eClickAction == presentation::ClickAction_SOUND ) 511 { 512 if( ( nFound & FOUND_SOUNDURL ) && aStrSoundURL.getLength() != 0 ) 513 { 514 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStrSoundURL) ); 515 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 516 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_NEW ); 517 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST ); 518 if( nFound & FOUND_PLAYFULL && bPlayFull ) 519 mrExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_PLAY_FULL, XML_TRUE ); 520 521 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_PRESENTATION, XML_SOUND, sal_True, sal_True ); 522 } 523 } 524 } 525 else if( aClickEventType == msStarBasic ) 526 { 527 if( nFound & FOUND_MACRO ) 528 { 529 SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True); 530 531 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_LANGUAGE, 532 mrExport.GetNamespaceMap().GetQNameByKey( 533 XML_NAMESPACE_OOO, 534 OUString( RTL_CONSTASCII_USTRINGPARAM( 535 "starbasic" ) ) ) ); 536 OUString aEventQName( 537 mrExport.GetNamespaceMap().GetQNameByKey( 538 XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) ); 539 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName ); 540 541 if( nFound & FOUND_LIBRARY ) 542 { 543 OUString sLocation( GetXMLToken( 544 (aStrLibrary.equalsIgnoreAsciiCaseAscii("StarOffice") || 545 aStrLibrary.equalsIgnoreAsciiCaseAscii("application") ) ? XML_APPLICATION 546 : XML_DOCUMENT ) ); 547 OUStringBuffer sTmp( sLocation.getLength() + aStrMacro.getLength() + 1 ); 548 sTmp = sLocation; 549 sTmp.append( sal_Unicode( ':' ) ); 550 sTmp.append( aStrMacro ); 551 mrExport.AddAttribute(XML_NAMESPACE_SCRIPT, XML_MACRO_NAME, 552 sTmp.makeStringAndClear()); 553 } 554 else 555 { 556 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_MACRO_NAME, aStrMacro ); 557 } 558 559 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SCRIPT, XML_EVENT_LISTENER, sal_True, sal_True); 560 } 561 } 562 #ifdef ISSUE66550_HLINK_FOR_SHAPES 563 else if( aClickEventType == msScript || aActionEventType == msAction ) 564 { 565 if( nFound & ( FOUND_MACRO | FOUND_URL ) ) 566 #else 567 else if( aClickEventType == msScript ) 568 { 569 if( nFound & FOUND_MACRO ) 570 #endif 571 { 572 SvXMLElementExport aEventsElemt(mrExport, XML_NAMESPACE_OFFICE, XML_EVENT_LISTENERS, sal_True, sal_True); 573 if ( nFound & FOUND_MACRO ) 574 { 575 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_LANGUAGE, mrExport.GetNamespaceMap().GetQNameByKey( 576 XML_NAMESPACE_OOO, GetXMLToken(XML_SCRIPT) ) ); 577 OUString aEventQName( 578 mrExport.GetNamespaceMap().GetQNameByKey( 579 XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "click" ) ) ) ); 580 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName ); 581 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStrMacro ); 582 583 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SCRIPT, XML_EVENT_LISTENER, sal_True, sal_True); 584 } 585 #ifdef ISSUE66550_HLINK_FOR_SHAPES 586 if ( nFound & FOUND_URL ) 587 { 588 OUString aEventQName( 589 mrExport.GetNamespaceMap().GetQNameByKey( 590 XML_NAMESPACE_DOM, OUString( RTL_CONSTASCII_USTRINGPARAM( "action" ) ) ) ); 591 mrExport.AddAttribute( XML_NAMESPACE_SCRIPT, XML_EVENT_NAME, aEventQName ); 592 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aHyperURL ); 593 594 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_PRESENTATION, XML_EVENT_LISTENER, sal_True, sal_True); 595 } 596 #endif 597 } 598 } 599 } 600 601 ////////////////////////////////////////////////////////////////////////////// 602 603 /** #i68101# export shape Title and Description */ 604 void XMLShapeExport::ImpExportDescription( const uno::Reference< drawing::XShape >& xShape ) 605 { 606 try 607 { 608 OUString aTitle; 609 OUString aDescription; 610 611 uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY_THROW ); 612 xProps->getPropertyValue( OUString::createFromAscii( "Title" ) ) >>= aTitle; 613 xProps->getPropertyValue( OUString::createFromAscii( "Description" ) ) >>= aDescription; 614 615 if(aTitle.getLength()) 616 { 617 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SVG, XML_TITLE, sal_True, sal_False); 618 mrExport.Characters( aTitle ); 619 } 620 621 if(aDescription.getLength()) 622 { 623 SvXMLElementExport aEventElemt(mrExport, XML_NAMESPACE_SVG, XML_DESC, sal_True, sal_False ); 624 mrExport.Characters( aDescription ); 625 } 626 } 627 catch( uno::Exception& ) 628 { 629 DBG_ERROR( "could not export Title and/or Description for shape!" ); 630 } 631 } 632 633 ////////////////////////////////////////////////////////////////////////////// 634 635 void XMLShapeExport::ImpExportGroupShape( const uno::Reference< drawing::XShape >& xShape, XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 636 { 637 uno::Reference< drawing::XShapes > xShapes(xShape, uno::UNO_QUERY); 638 if(xShapes.is() && xShapes->getCount()) 639 { 640 // write group shape 641 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 642 SvXMLElementExport aPGR(mrExport, XML_NAMESPACE_DRAW, XML_G, bCreateNewline, sal_True); 643 644 ImpExportDescription( xShape ); // #i68101# 645 ImpExportEvents( xShape ); 646 ImpExportGluePoints( xShape ); 647 648 // #89764# if export of position is supressed for group shape, 649 // positions of contained objects should be written relative to 650 // the upper left edge of the group. 651 awt::Point aUpperLeft; 652 653 if(!(nFeatures & SEF_EXPORT_POSITION)) 654 { 655 nFeatures |= SEF_EXPORT_POSITION; 656 aUpperLeft = xShape->getPosition(); 657 pRefPoint = &aUpperLeft; 658 } 659 660 // write members 661 exportShapes( xShapes, nFeatures, pRefPoint ); 662 } 663 } 664 665 ////////////////////////////////////////////////////////////////////////////// 666 667 void XMLShapeExport::ImpExportTextBoxShape( 668 const uno::Reference< drawing::XShape >& xShape, 669 XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 670 { 671 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 672 if(xPropSet.is()) 673 { 674 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 675 676 // presentation attribute (if presentation) 677 sal_Bool bIsPresShape(sal_False); 678 sal_Bool bIsEmptyPresObj(sal_False); 679 OUString aStr; 680 681 switch(eShapeType) 682 { 683 case XmlShapeTypePresSubtitleShape: 684 { 685 aStr = GetXMLToken(XML_PRESENTATION_SUBTITLE); 686 bIsPresShape = sal_True; 687 break; 688 } 689 case XmlShapeTypePresTitleTextShape: 690 { 691 aStr = GetXMLToken(XML_PRESENTATION_TITLE); 692 bIsPresShape = sal_True; 693 break; 694 } 695 case XmlShapeTypePresOutlinerShape: 696 { 697 aStr = GetXMLToken(XML_PRESENTATION_OUTLINE); 698 bIsPresShape = sal_True; 699 break; 700 } 701 case XmlShapeTypePresNotesShape: 702 { 703 aStr = GetXMLToken(XML_PRESENTATION_NOTES); 704 bIsPresShape = sal_True; 705 break; 706 } 707 case XmlShapeTypePresHeaderShape: 708 { 709 aStr = GetXMLToken(XML_HEADER); 710 bIsPresShape = sal_True; 711 break; 712 } 713 case XmlShapeTypePresFooterShape: 714 { 715 aStr = GetXMLToken(XML_FOOTER); 716 bIsPresShape = sal_True; 717 break; 718 } 719 case XmlShapeTypePresSlideNumberShape: 720 { 721 aStr = GetXMLToken(XML_PAGE_NUMBER); 722 bIsPresShape = sal_True; 723 break; 724 } 725 case XmlShapeTypePresDateTimeShape: 726 { 727 aStr = GetXMLToken(XML_DATE_TIME); 728 bIsPresShape = sal_True; 729 break; 730 } 731 default: 732 break; 733 } 734 735 // Transformation 736 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 737 738 if(bIsPresShape) 739 bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, aStr ); 740 741 742 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 743 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, 744 XML_FRAME, bCreateNewline, sal_True ); 745 746 // evtl. corner radius? 747 sal_Int32 nCornerRadius(0L); 748 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius; 749 if(nCornerRadius) 750 { 751 OUStringBuffer sStringBuffer; 752 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius); 753 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear()); 754 } 755 756 { 757 // write text-box 758 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_TEXT_BOX, sal_True, sal_True); 759 if(!bIsEmptyPresObj) 760 ImpExportText( xShape ); 761 } 762 763 ImpExportDescription( xShape ); // #i68101# 764 ImpExportEvents( xShape ); 765 ImpExportGluePoints( xShape ); 766 } 767 } 768 769 ////////////////////////////////////////////////////////////////////////////// 770 771 void XMLShapeExport::ImpExportRectangleShape( 772 const uno::Reference< drawing::XShape >& xShape, 773 XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint) 774 { 775 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 776 if(xPropSet.is()) 777 { 778 // Transformation 779 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 780 781 // evtl. corner radius? 782 sal_Int32 nCornerRadius(0L); 783 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius; 784 if(nCornerRadius) 785 { 786 OUStringBuffer sStringBuffer; 787 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius); 788 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear()); 789 } 790 791 // write rectangle 792 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 793 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_RECT, bCreateNewline, sal_True); 794 795 ImpExportDescription( xShape ); // #i68101# 796 ImpExportEvents( xShape ); 797 ImpExportGluePoints( xShape ); 798 ImpExportText( xShape ); 799 } 800 } 801 802 ////////////////////////////////////////////////////////////////////////////// 803 804 void XMLShapeExport::ImpExportLineShape( 805 const uno::Reference< drawing::XShape >& xShape, 806 XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 807 { 808 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 809 if(xPropSet.is()) 810 { 811 OUString aStr; 812 OUStringBuffer sStringBuffer; 813 awt::Point aStart(0,0); 814 awt::Point aEnd(1,1); 815 816 // #85920# use 'Geometry' to get the points of the line 817 // since this slot take anchor pos into account. 818 819 // get matrix 820 ::basegfx::B2DHomMatrix aMatrix; 821 ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet); 822 823 // decompose and correct about pRefPoint 824 ::basegfx::B2DTuple aTRScale; 825 double fTRShear(0.0); 826 double fTRRotate(0.0); 827 ::basegfx::B2DTuple aTRTranslate; 828 ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint); 829 830 // create base position 831 awt::Point aBasePosition(FRound(aTRTranslate.getX()), FRound(aTRTranslate.getY())); 832 833 // get the two points 834 uno::Any aAny(xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")))); 835 drawing::PointSequenceSequence* pSourcePolyPolygon = (drawing::PointSequenceSequence*)aAny.getValue(); 836 837 if(pSourcePolyPolygon) 838 { 839 drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->getArray(); 840 if(pOuterSequence) 841 { 842 drawing::PointSequence* pInnerSequence = pOuterSequence++; 843 if(pInnerSequence) 844 { 845 awt::Point* pArray = pInnerSequence->getArray(); 846 if(pArray) 847 { 848 if(pInnerSequence->getLength() > 0) 849 { 850 aStart = awt::Point( 851 pArray->X + aBasePosition.X, 852 pArray->Y + aBasePosition.Y); 853 pArray++; 854 } 855 856 if(pInnerSequence->getLength() > 1) 857 { 858 aEnd = awt::Point( 859 pArray->X + aBasePosition.X, 860 pArray->Y + aBasePosition.Y); 861 } 862 } 863 } 864 } 865 } 866 867 if( nFeatures & SEF_EXPORT_X ) 868 { 869 // svg: x1 870 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X); 871 aStr = sStringBuffer.makeStringAndClear(); 872 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr); 873 } 874 else 875 { 876 aEnd.X -= aStart.X; 877 } 878 879 if( nFeatures & SEF_EXPORT_Y ) 880 { 881 // svg: y1 882 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y); 883 aStr = sStringBuffer.makeStringAndClear(); 884 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr); 885 } 886 else 887 { 888 aEnd.Y -= aStart.Y; 889 } 890 891 // svg: x2 892 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X); 893 aStr = sStringBuffer.makeStringAndClear(); 894 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr); 895 896 // svg: y2 897 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y); 898 aStr = sStringBuffer.makeStringAndClear(); 899 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr); 900 901 // write line 902 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 903 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_LINE, bCreateNewline, sal_True); 904 905 ImpExportDescription( xShape ); // #i68101# 906 ImpExportEvents( xShape ); 907 ImpExportGluePoints( xShape ); 908 ImpExportText( xShape ); 909 } 910 } 911 912 ////////////////////////////////////////////////////////////////////////////// 913 914 void XMLShapeExport::ImpExportEllipseShape( 915 const uno::Reference< drawing::XShape >& xShape, 916 XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 917 { 918 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 919 if(xPropSet.is()) 920 { 921 // get size to decide between Circle and Ellipse 922 awt::Size aSize = xShape->getSize(); 923 sal_Int32 nRx((aSize.Width + 1) / 2); 924 sal_Int32 nRy((aSize.Height + 1) / 2); 925 sal_Bool bCircle(nRx == nRy); 926 927 // Transformation 928 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 929 930 drawing::CircleKind eKind = drawing::CircleKind_FULL; 931 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")) ) >>= eKind; 932 if( eKind != drawing::CircleKind_FULL ) 933 { 934 OUStringBuffer sStringBuffer; 935 sal_Int32 nStartAngle = 0; 936 sal_Int32 nEndAngle = 0; 937 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")) ) >>= nStartAngle; 938 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")) ) >>= nEndAngle; 939 940 const double dStartAngle = nStartAngle / 100.0; 941 const double dEndAngle = nEndAngle / 100.0; 942 943 // export circle kind 944 SvXMLUnitConverter::convertEnum( sStringBuffer, (sal_uInt16)eKind, aXML_CircleKind_EnumMap ); 945 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_KIND, sStringBuffer.makeStringAndClear() ); 946 947 // export start angle 948 SvXMLUnitConverter::convertDouble( sStringBuffer, dStartAngle ); 949 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_ANGLE, sStringBuffer.makeStringAndClear() ); 950 951 // export end angle 952 SvXMLUnitConverter::convertDouble( sStringBuffer, dEndAngle ); 953 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_ANGLE, sStringBuffer.makeStringAndClear() ); 954 } 955 956 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 957 958 if(bCircle) 959 { 960 // write circle 961 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_CIRCLE, bCreateNewline, sal_True); 962 963 ImpExportDescription( xShape ); // #i68101# 964 ImpExportEvents( xShape ); 965 ImpExportGluePoints( xShape ); 966 ImpExportText( xShape ); 967 } 968 else 969 { 970 // write ellipse 971 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_ELLIPSE, bCreateNewline, sal_True); 972 973 ImpExportDescription( xShape ); // #i68101# 974 ImpExportEvents( xShape ); 975 ImpExportGluePoints( xShape ); 976 ImpExportText( xShape ); 977 } 978 } 979 } 980 981 ////////////////////////////////////////////////////////////////////////////// 982 983 void XMLShapeExport::ImpExportPolygonShape( 984 const uno::Reference< drawing::XShape >& xShape, 985 XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 986 { 987 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 988 if(xPropSet.is()) 989 { 990 sal_Bool bClosed(eShapeType == XmlShapeTypeDrawPolyPolygonShape 991 || eShapeType == XmlShapeTypeDrawClosedBezierShape); 992 sal_Bool bBezier(eShapeType == XmlShapeTypeDrawClosedBezierShape 993 || eShapeType == XmlShapeTypeDrawOpenBezierShape); 994 995 // get matrix 996 ::basegfx::B2DHomMatrix aMatrix; 997 ImpExportNewTrans_GetB2DHomMatrix(aMatrix, xPropSet); 998 999 // decompose and correct abour pRefPoint 1000 ::basegfx::B2DTuple aTRScale; 1001 double fTRShear(0.0); 1002 double fTRRotate(0.0); 1003 ::basegfx::B2DTuple aTRTranslate; 1004 ImpExportNewTrans_DecomposeAndRefPoint(aMatrix, aTRScale, fTRShear, fTRRotate, aTRTranslate, pRefPoint); 1005 1006 // use features and write 1007 ImpExportNewTrans_FeaturesAndWrite(aTRScale, fTRShear, fTRRotate, aTRTranslate, nFeatures); 1008 1009 // create and export ViewBox 1010 awt::Point aPoint(0, 0); 1011 awt::Size aSize(FRound(aTRScale.getX()), FRound(aTRScale.getY())); 1012 SdXMLImExViewBox aViewBox(0, 0, aSize.Width, aSize.Height); 1013 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_VIEWBOX, aViewBox.GetExportString()); 1014 1015 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1016 1017 if(bBezier) 1018 { 1019 // get PolygonBezier 1020 uno::Any aAny( xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry"))) ); 1021 drawing::PolyPolygonBezierCoords* pSourcePolyPolygon = 1022 (drawing::PolyPolygonBezierCoords*)aAny.getValue(); 1023 1024 if(pSourcePolyPolygon && pSourcePolyPolygon->Coordinates.getLength()) 1025 { 1026 sal_Int32 nOuterCnt(pSourcePolyPolygon->Coordinates.getLength()); 1027 drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->Coordinates.getArray(); 1028 drawing::FlagSequence* pOuterFlags = pSourcePolyPolygon->Flags.getArray(); 1029 1030 if(pOuterSequence && pOuterFlags) 1031 { 1032 // prepare svx:d element export 1033 SdXMLImExSvgDElement aSvgDElement(aViewBox); 1034 1035 for(sal_Int32 a(0L); a < nOuterCnt; a++) 1036 { 1037 drawing::PointSequence* pSequence = pOuterSequence++; 1038 drawing::FlagSequence* pFlags = pOuterFlags++; 1039 1040 if(pSequence && pFlags) 1041 { 1042 aSvgDElement.AddPolygon(pSequence, pFlags, 1043 aPoint, aSize, bClosed); 1044 } 1045 } 1046 1047 // write point array 1048 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aSvgDElement.GetExportString()); 1049 } 1050 1051 // write object now 1052 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PATH, bCreateNewline, sal_True); 1053 1054 ImpExportDescription( xShape ); // #i68101# 1055 ImpExportEvents( xShape ); 1056 ImpExportGluePoints( xShape ); 1057 ImpExportText( xShape ); 1058 } 1059 } 1060 else 1061 { 1062 // get non-bezier polygon 1063 uno::Any aAny( xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry"))) ); 1064 drawing::PointSequenceSequence* pSourcePolyPolygon = (drawing::PointSequenceSequence*)aAny.getValue(); 1065 1066 if(pSourcePolyPolygon && pSourcePolyPolygon->getLength()) 1067 { 1068 sal_Int32 nOuterCnt(pSourcePolyPolygon->getLength()); 1069 1070 if(1L == nOuterCnt && !bBezier) 1071 { 1072 // simple polygon shape, can be written as svg:points sequence 1073 drawing::PointSequence* pSequence = pSourcePolyPolygon->getArray(); 1074 if(pSequence) 1075 { 1076 SdXMLImExPointsElement aPoints(pSequence, aViewBox, aPoint, aSize, 1077 // #96328# 1078 bClosed); 1079 1080 // write point array 1081 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_POINTS, aPoints.GetExportString()); 1082 } 1083 1084 // write object now 1085 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, 1086 bClosed ? XML_POLYGON : XML_POLYLINE , bCreateNewline, sal_True); 1087 1088 ImpExportDescription( xShape ); // #i68101# 1089 ImpExportEvents( xShape ); 1090 ImpExportGluePoints( xShape ); 1091 ImpExportText( xShape ); 1092 } 1093 else 1094 { 1095 // polypolygon or bezier, needs to be written as a svg:path sequence 1096 drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->getArray(); 1097 if(pOuterSequence) 1098 { 1099 // prepare svx:d element export 1100 SdXMLImExSvgDElement aSvgDElement(aViewBox); 1101 1102 for(sal_Int32 a(0L); a < nOuterCnt; a++) 1103 { 1104 drawing::PointSequence* pSequence = pOuterSequence++; 1105 if(pSequence) 1106 { 1107 aSvgDElement.AddPolygon(pSequence, 0L, aPoint, 1108 aSize, bClosed); 1109 } 1110 } 1111 1112 // write point array 1113 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aSvgDElement.GetExportString()); 1114 } 1115 1116 // write object now 1117 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PATH, bCreateNewline, sal_True); 1118 1119 ImpExportDescription( xShape ); // #i68101# 1120 ImpExportEvents( xShape ); 1121 ImpExportGluePoints( xShape ); 1122 ImpExportText( xShape ); 1123 } 1124 } 1125 } 1126 } 1127 } 1128 1129 ////////////////////////////////////////////////////////////////////////////// 1130 1131 void XMLShapeExport::ImpExportGraphicObjectShape( 1132 const uno::Reference< drawing::XShape >& xShape, 1133 XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 1134 { 1135 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1136 if(xPropSet.is()) 1137 { 1138 sal_Bool bIsEmptyPresObj = sal_False; 1139 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 1140 1141 // Transformation 1142 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1143 1144 OUString sImageURL; 1145 1146 if(eShapeType == XmlShapeTypePresGraphicObjectShape) 1147 bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_GRAPHIC) ); 1148 1149 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1150 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, 1151 XML_FRAME, bCreateNewline, sal_True ); 1152 1153 const bool bSaveBackwardsCompatible = ( mrExport.getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE ); 1154 1155 if( !bIsEmptyPresObj || bSaveBackwardsCompatible ) 1156 { 1157 if( !bIsEmptyPresObj ) 1158 { 1159 OUString aReplacementUrl; 1160 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("ReplacementGraphicURL"))) >>= aReplacementUrl; 1161 1162 // If there is no url, then then graphic is empty 1163 if(aReplacementUrl.getLength()) 1164 { 1165 const OUString aStr = mrExport.AddEmbeddedGraphicObject(aReplacementUrl); 1166 1167 if(aStr.getLength()) 1168 { 1169 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStr); 1170 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1171 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1172 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1173 1174 // xlink:href for replacement, only written for Svg content 1175 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_IMAGE, sal_True, sal_True); 1176 1177 // optional office:binary-data 1178 mrExport.AddEmbeddedGraphicObjectAsBase64(aReplacementUrl); 1179 } 1180 } 1181 1182 OUString aStreamURL; 1183 OUString aStr; 1184 1185 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL"))) >>= aStreamURL; 1186 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))) >>= sImageURL; 1187 1188 OUString aResolveURL( sImageURL ); 1189 const rtl::OUString sPackageURL( RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.Package:") ); 1190 1191 // sj: trying to preserve the filename 1192 if ( aStreamURL.match( sPackageURL, 0 ) ) 1193 { 1194 rtl::OUString sRequestedName( aStreamURL.copy( sPackageURL.getLength(), aStreamURL.getLength() - sPackageURL.getLength() ) ); 1195 sal_Int32 nLastIndex = sRequestedName.lastIndexOf( '/' ) + 1; 1196 if ( ( nLastIndex > 0 ) && ( nLastIndex < sRequestedName.getLength() ) ) 1197 sRequestedName = sRequestedName.copy( nLastIndex, sRequestedName.getLength() - nLastIndex ); 1198 nLastIndex = sRequestedName.lastIndexOf( '.' ); 1199 if ( nLastIndex >= 0 ) 1200 sRequestedName = sRequestedName.copy( 0, nLastIndex ); 1201 if ( sRequestedName.getLength() ) 1202 { 1203 aResolveURL = aResolveURL.concat( OUString(RTL_CONSTASCII_USTRINGPARAM("?requestedName="))); 1204 aResolveURL = aResolveURL.concat( sRequestedName ); 1205 } 1206 } 1207 1208 aStr = mrExport.AddEmbeddedGraphicObject( aResolveURL ); 1209 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStr ); 1210 1211 if( aStr.getLength() ) 1212 { 1213 if( aStr[ 0 ] == '#' ) 1214 { 1215 aStreamURL = sPackageURL; 1216 aStreamURL = aStreamURL.concat( aStr.copy( 1, aStr.getLength() - 1 ) ); 1217 } 1218 1219 // update stream URL for load on demand 1220 uno::Any aAny; 1221 aAny <<= aStreamURL; 1222 xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL")), aAny ); 1223 1224 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1225 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1226 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1227 } 1228 } 1229 else 1230 { 1231 OUString aStr; 1232 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStr ); 1233 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1234 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1235 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1236 } 1237 1238 { 1239 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_IMAGE, sal_True, sal_True); 1240 1241 if( sImageURL.getLength() ) 1242 { 1243 // optional office:binary-data 1244 mrExport.AddEmbeddedGraphicObjectAsBase64( sImageURL ); 1245 } 1246 if( !bIsEmptyPresObj ) 1247 ImpExportText( xShape ); 1248 } 1249 } 1250 1251 ImpExportEvents( xShape ); 1252 ImpExportGluePoints( xShape ); 1253 1254 // image map 1255 GetExport().GetImageMapExport().Export( xPropSet ); 1256 ImpExportDescription( xShape ); // #i68101# 1257 } 1258 } 1259 1260 ////////////////////////////////////////////////////////////////////////////// 1261 1262 void XMLShapeExport::ImpExportChartShape( 1263 const uno::Reference< drawing::XShape >& xShape, 1264 XmlShapeType eShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint, 1265 SvXMLAttributeList* pAttrList ) 1266 { 1267 ImpExportOLE2Shape( xShape, eShapeType, nFeatures, pRefPoint, pAttrList ); 1268 } 1269 1270 ////////////////////////////////////////////////////////////////////////////// 1271 1272 void XMLShapeExport::ImpExportControlShape( 1273 const uno::Reference< drawing::XShape >& xShape, 1274 XmlShapeType, sal_Int32 nFeatures, awt::Point* pRefPoint) 1275 { 1276 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1277 if(xPropSet.is()) 1278 { 1279 // Transformation 1280 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1281 } 1282 1283 uno::Reference< drawing::XControlShape > xControl( xShape, uno::UNO_QUERY ); 1284 DBG_ASSERT( xControl.is(), "Control shape is not supporting XControlShape" ); 1285 if( xControl.is() ) 1286 { 1287 uno::Reference< beans::XPropertySet > xControlModel( xControl->getControl(), uno::UNO_QUERY ); 1288 DBG_ASSERT( xControlModel.is(), "Control shape has not XControlModel" ); 1289 if( xControlModel.is() ) 1290 { 1291 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CONTROL, mrExport.GetFormExport()->getControlId( xControlModel ) ); 1292 } 1293 } 1294 1295 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1296 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_CONTROL, bCreateNewline, sal_True); 1297 1298 ImpExportDescription( xShape ); // #i68101# 1299 } 1300 1301 ////////////////////////////////////////////////////////////////////////////// 1302 1303 void XMLShapeExport::ImpExportConnectorShape( 1304 const uno::Reference< drawing::XShape >& xShape, 1305 XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */) 1306 { 1307 uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); 1308 1309 OUString aStr; 1310 OUStringBuffer sStringBuffer; 1311 1312 // export connection kind 1313 drawing::ConnectorType eType = drawing::ConnectorType_STANDARD; 1314 uno::Any aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind"))); 1315 aAny >>= eType; 1316 1317 if( eType != drawing::ConnectorType_STANDARD ) 1318 { 1319 SvXMLUnitConverter::convertEnum( sStringBuffer, (sal_uInt16)eType, aXML_ConnectionKind_EnumMap ); 1320 aStr = sStringBuffer.makeStringAndClear(); 1321 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_TYPE, aStr); 1322 } 1323 1324 // export line skew 1325 sal_Int32 nDelta1 = 0, nDelta2 = 0, nDelta3 = 0; 1326 1327 aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta"))); 1328 aAny >>= nDelta1; 1329 aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta"))); 1330 aAny >>= nDelta2; 1331 aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta"))); 1332 aAny >>= nDelta3; 1333 1334 if( nDelta1 != 0 || nDelta2 != 0 || nDelta3 != 0 ) 1335 { 1336 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta1); 1337 if( nDelta2 != 0 || nDelta3 != 0 ) 1338 { 1339 const char aSpace = ' '; 1340 sStringBuffer.appendAscii( &aSpace, 1 ); 1341 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta2); 1342 if( nDelta3 != 0 ) 1343 { 1344 sStringBuffer.appendAscii( &aSpace, 1 ); 1345 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nDelta3); 1346 } 1347 } 1348 1349 aStr = sStringBuffer.makeStringAndClear(); 1350 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_LINE_SKEW, aStr); 1351 } 1352 1353 // export start and end point 1354 awt::Point aStart(0,0); 1355 awt::Point aEnd(1,1); 1356 1357 // --> OD 2004-08-09 #i36248# - Get <StartPositionInHoriL2R> and 1358 // <EndPositionInHoriL2R>, if they exist and if the document is exported 1359 // into the OpenOffice.org file format. 1360 // These properties only exist at service com::sun::star::text::Shape - the 1361 // Writer UNO service for shapes. 1362 // This code is needed, because the positioning attributes in the 1363 // OpenOffice.org file format are given in horizontal left-to-right layout 1364 // regardless the layout direction the shape is in. In the OASIS Open Office 1365 // file format the positioning attributes are correctly given in the layout 1366 // direction the shape is in. Thus, this code provides the conversion from 1367 // the OASIS Open Office file format to the OpenOffice.org file format. 1368 if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 && 1369 xProps->getPropertySetInfo()->hasPropertyByName( 1370 OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) && 1371 xProps->getPropertySetInfo()->hasPropertyByName( 1372 OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) ) 1373 { 1374 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) >>= aStart; 1375 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) >>= aEnd; 1376 } 1377 else 1378 { 1379 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition"))) >>= aStart; 1380 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition"))) >>= aEnd; 1381 } 1382 // <-- 1383 1384 if( pRefPoint ) 1385 { 1386 aStart.X -= pRefPoint->X; 1387 aStart.Y -= pRefPoint->Y; 1388 aEnd.X -= pRefPoint->X; 1389 aEnd.Y -= pRefPoint->Y; 1390 } 1391 1392 if( nFeatures & SEF_EXPORT_X ) 1393 { 1394 // svg: x1 1395 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X); 1396 aStr = sStringBuffer.makeStringAndClear(); 1397 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr); 1398 } 1399 else 1400 { 1401 aEnd.X -= aStart.X; 1402 } 1403 1404 if( nFeatures & SEF_EXPORT_Y ) 1405 { 1406 // svg: y1 1407 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y); 1408 aStr = sStringBuffer.makeStringAndClear(); 1409 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr); 1410 } 1411 else 1412 { 1413 aEnd.Y -= aStart.Y; 1414 } 1415 1416 // svg: x2 1417 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X); 1418 aStr = sStringBuffer.makeStringAndClear(); 1419 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr); 1420 1421 // svg: y2 1422 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y); 1423 aStr = sStringBuffer.makeStringAndClear(); 1424 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr); 1425 1426 // #i39320# 1427 uno::Reference< uno::XInterface > xRefS; 1428 uno::Reference< uno::XInterface > xRefE; 1429 1430 // export start connection 1431 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartShape") ) ) >>= xRefS; 1432 if( xRefS.is() ) 1433 { 1434 const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRefS ); 1435 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_SHAPE, rShapeId); 1436 1437 aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartGluePointIndex")) ); 1438 sal_Int32 nGluePointId = 0; 1439 if( aAny >>= nGluePointId ) 1440 { 1441 if( nGluePointId != -1 ) 1442 { 1443 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_START_GLUE_POINT, OUString::valueOf( nGluePointId )); 1444 } 1445 } 1446 } 1447 1448 // export end connection 1449 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndShape")) ) >>= xRefE; 1450 if( xRefE.is() ) 1451 { 1452 const OUString& rShapeId = mrExport.getInterfaceToIdentifierMapper().getIdentifier( xRefE ); 1453 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_SHAPE, rShapeId); 1454 1455 aAny = xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndGluePointIndex")) ); 1456 sal_Int32 nGluePointId = 0; 1457 if( aAny >>= nGluePointId ) 1458 { 1459 if( nGluePointId != -1 ) 1460 { 1461 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_END_GLUE_POINT, OUString::valueOf( nGluePointId )); 1462 } 1463 } 1464 } 1465 1466 if( xProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ) ) >>= aAny ) 1467 { 1468 // get PolygonBezier 1469 drawing::PolyPolygonBezierCoords* pSourcePolyPolygon = 1470 (drawing::PolyPolygonBezierCoords*)aAny.getValue(); 1471 1472 if(pSourcePolyPolygon && pSourcePolyPolygon->Coordinates.getLength()) 1473 { 1474 sal_Int32 nOuterCnt(pSourcePolyPolygon->Coordinates.getLength()); 1475 drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->Coordinates.getArray(); 1476 drawing::FlagSequence* pOuterFlags = pSourcePolyPolygon->Flags.getArray(); 1477 1478 if(pOuterSequence && pOuterFlags) 1479 { 1480 // prepare svx:d element export 1481 awt::Point aPoint( 0, 0 ); 1482 awt::Size aSize( 1, 1 ); 1483 SdXMLImExViewBox aViewBox( 0, 0, 1, 1 ); 1484 SdXMLImExSvgDElement aSvgDElement(aViewBox); 1485 1486 for(sal_Int32 a(0L); a < nOuterCnt; a++) 1487 { 1488 drawing::PointSequence* pSequence = pOuterSequence++; 1489 drawing::FlagSequence* pFlags = pOuterFlags++; 1490 1491 if(pSequence && pFlags) 1492 { 1493 aSvgDElement.AddPolygon(pSequence, pFlags, 1494 aPoint, aSize, sal_False ); 1495 } 1496 } 1497 1498 // write point array 1499 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_D, aSvgDElement.GetExportString()); 1500 } 1501 } 1502 } 1503 1504 // write connector shape. Add Export later. 1505 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1506 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_CONNECTOR, bCreateNewline, sal_True); 1507 1508 ImpExportDescription( xShape ); // #i68101# 1509 ImpExportEvents( xShape ); 1510 ImpExportGluePoints( xShape ); 1511 ImpExportText( xShape ); 1512 } 1513 1514 ////////////////////////////////////////////////////////////////////////////// 1515 1516 void XMLShapeExport::ImpExportMeasureShape( 1517 const uno::Reference< drawing::XShape >& xShape, 1518 XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */) 1519 { 1520 uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); 1521 1522 OUString aStr; 1523 OUStringBuffer sStringBuffer; 1524 1525 // export start and end point 1526 awt::Point aStart(0,0); 1527 awt::Point aEnd(1,1); 1528 1529 // --> OD 2004-08-09 #i36248# - Get <StartPositionInHoriL2R> and 1530 // <EndPositionInHoriL2R>, if they exist and if the document is exported 1531 // into the OpenOffice.org file format. 1532 // These properties only exist at service com::sun::star::text::Shape - the 1533 // Writer UNO service for shapes. 1534 // This code is needed, because the positioning attributes in the 1535 // OpenOffice.org file format are given in horizontal left-to-right layout 1536 // regardless the layout direction the shape is in. In the OASIS Open Office 1537 // file format the positioning attributes are correctly given in the layout 1538 // direction the shape is in. Thus, this code provides the conversion from 1539 // the OASIS Open Office file format to the OpenOffice.org file format. 1540 if ( ( GetExport().getExportFlags() & EXPORT_OASIS ) == 0 && 1541 xProps->getPropertySetInfo()->hasPropertyByName( 1542 OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) && 1543 xProps->getPropertySetInfo()->hasPropertyByName( 1544 OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) ) 1545 { 1546 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPositionInHoriL2R"))) >>= aStart; 1547 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPositionInHoriL2R"))) >>= aEnd; 1548 } 1549 else 1550 { 1551 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition"))) >>= aStart; 1552 xProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition"))) >>= aEnd; 1553 } 1554 // <-- 1555 1556 if( pRefPoint ) 1557 { 1558 aStart.X -= pRefPoint->X; 1559 aStart.Y -= pRefPoint->Y; 1560 aEnd.X -= pRefPoint->X; 1561 aEnd.Y -= pRefPoint->Y; 1562 } 1563 1564 if( nFeatures & SEF_EXPORT_X ) 1565 { 1566 // svg: x1 1567 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.X); 1568 aStr = sStringBuffer.makeStringAndClear(); 1569 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X1, aStr); 1570 } 1571 else 1572 { 1573 aEnd.X -= aStart.X; 1574 } 1575 1576 if( nFeatures & SEF_EXPORT_Y ) 1577 { 1578 // svg: y1 1579 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aStart.Y); 1580 aStr = sStringBuffer.makeStringAndClear(); 1581 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y1, aStr); 1582 } 1583 else 1584 { 1585 aEnd.Y -= aStart.Y; 1586 } 1587 1588 // svg: x2 1589 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.X); 1590 aStr = sStringBuffer.makeStringAndClear(); 1591 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_X2, aStr); 1592 1593 // svg: y2 1594 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, aEnd.Y); 1595 aStr = sStringBuffer.makeStringAndClear(); 1596 mrExport.AddAttribute(XML_NAMESPACE_SVG, XML_Y2, aStr); 1597 1598 // write measure shape 1599 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1600 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_MEASURE, bCreateNewline, sal_True); 1601 1602 ImpExportDescription( xShape ); // #i68101# 1603 ImpExportEvents( xShape ); 1604 ImpExportGluePoints( xShape ); 1605 1606 uno::Reference< text::XText > xText( xShape, uno::UNO_QUERY ); 1607 if( xText.is() ) 1608 mrExport.GetTextParagraphExport()->exportText( xText ); 1609 } 1610 1611 ////////////////////////////////////////////////////////////////////////////// 1612 1613 void XMLShapeExport::ImpExportOLE2Shape( 1614 const uno::Reference< drawing::XShape >& xShape, 1615 XmlShapeType eShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */, 1616 SvXMLAttributeList* pAttrList /* = NULL */ ) 1617 { 1618 uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1619 uno::Reference< container::XNamed > xNamed(xShape, uno::UNO_QUERY); 1620 1621 DBG_ASSERT( xPropSet.is() && xNamed.is(), "ole shape is not implementing needed interfaces"); 1622 if(xPropSet.is() && xNamed.is()) 1623 { 1624 // Transformation 1625 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1626 1627 sal_Bool bIsEmptyPresObj = sal_False; 1628 1629 // presentation settings 1630 if(eShapeType == XmlShapeTypePresOLE2Shape) 1631 bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_OBJECT) ); 1632 else if(eShapeType == XmlShapeTypePresChartShape) 1633 bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_CHART) ); 1634 else if(eShapeType == XmlShapeTypePresSheetShape) 1635 bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_TABLE) ); 1636 1637 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1638 sal_Bool bExportEmbedded(0 != (mrExport.getExportFlags() & EXPORT_EMBEDDED)); 1639 OUString sPersistName; 1640 SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW, 1641 XML_FRAME, bCreateNewline, sal_True ); 1642 1643 const bool bSaveBackwardsCompatible = ( mrExport.getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE ); 1644 1645 if( !bIsEmptyPresObj || bSaveBackwardsCompatible ) 1646 { 1647 if (pAttrList) 1648 { 1649 mrExport.AddAttributeList(pAttrList); 1650 } 1651 1652 OUString sClassId; 1653 OUString sURL; 1654 sal_Bool bInternal = false; 1655 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("IsInternal"))) >>= bInternal; 1656 1657 if( !bIsEmptyPresObj ) 1658 { 1659 1660 if ( bInternal ) 1661 { 1662 // OOo internal links have no storage persistance, URL is stored in the XML file 1663 // the result LinkURL is empty in case the object is not a link 1664 xPropSet->getPropertyValue( OUString::createFromAscii( "LinkURL" ) ) >>= sURL; 1665 } 1666 1667 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ) ) >>= sPersistName; 1668 if ( !sURL.getLength() ) 1669 { 1670 if( sPersistName.getLength() ) 1671 { 1672 sURL = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ) ); 1673 sURL += sPersistName; 1674 } 1675 } 1676 1677 if( !bInternal ) 1678 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID"))) >>= sClassId; 1679 1680 if( sClassId.getLength() ) 1681 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CLASS_ID, sClassId ); 1682 if(!bExportEmbedded) 1683 { 1684 // xlink:href 1685 if( sURL.getLength() ) 1686 { 1687 // #96717# in theorie, if we don't have a url we shouldn't even 1688 // export this ole shape. But practical its to risky right now 1689 // to change this so we better dispose this on load 1690 sURL = mrExport.AddEmbeddedObject( sURL ); 1691 1692 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL ); 1693 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1694 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1695 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1696 } 1697 } 1698 } 1699 else 1700 { 1701 // export empty href for empty placeholders to be valid odf 1702 OUString sEmptyURL; 1703 1704 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sEmptyURL ); 1705 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1706 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1707 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1708 } 1709 1710 enum XMLTokenEnum eElem = sClassId.getLength() ? XML_OBJECT_OLE : XML_OBJECT; 1711 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, eElem, sal_True, sal_True ); 1712 1713 // #i118485# Add text export, the draw OLE shape allows text now 1714 ImpExportText( xShape ); 1715 1716 if(bExportEmbedded && !bIsEmptyPresObj) 1717 { 1718 // #100592# 1719 if(bInternal) 1720 { 1721 // embedded XML 1722 uno::Reference< lang::XComponent > xComp; 1723 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp; 1724 DBG_ASSERT( xComp.is(), "no xModel for own OLE format" ); 1725 mrExport.ExportEmbeddedOwnObject( xComp ); 1726 } 1727 else 1728 { 1729 // embed as Base64 1730 // this is an alien object ( currently MSOLE is the only supported type of such objects ) 1731 // in case it is not an OASIS format the object should be asked to store replacement image if possible 1732 1733 ::rtl::OUString sURLRequest( sURL ); 1734 if ( ( mrExport.getExportFlags() & EXPORT_OASIS ) == 0 ) 1735 sURLRequest += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "?oasis=false" ) ); 1736 mrExport.AddEmbeddedObjectAsBase64( sURLRequest ); 1737 } 1738 } 1739 } 1740 if( !bIsEmptyPresObj ) 1741 { 1742 OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) ); 1743 sURL += sPersistName; 1744 if( !bExportEmbedded ) 1745 { 1746 sURL = GetExport().AddEmbeddedObject( sURL ); 1747 mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL ); 1748 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1749 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1750 mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1751 } 1752 1753 SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW, 1754 XML_IMAGE, sal_False, sal_True ); 1755 1756 if( bExportEmbedded ) 1757 GetExport().AddEmbeddedObjectAsBase64( sURL ); 1758 } 1759 1760 ImpExportEvents( xShape ); 1761 ImpExportGluePoints( xShape ); 1762 ImpExportDescription( xShape ); // #i68101# 1763 } 1764 } 1765 1766 ////////////////////////////////////////////////////////////////////////////// 1767 1768 void XMLShapeExport::ImpExportPageShape( 1769 const uno::Reference< drawing::XShape >& xShape, 1770 XmlShapeType eShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */) 1771 { 1772 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1773 if(xPropSet.is()) 1774 { 1775 // #86163# Transformation 1776 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1777 1778 // export page number used for this page 1779 uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() ); 1780 const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber")); 1781 if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr)) 1782 { 1783 sal_Int32 nPageNumber = 0; 1784 xPropSet->getPropertyValue(aPageNumberStr) >>= nPageNumber; 1785 if( nPageNumber ) 1786 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_PAGE_NUMBER, OUString::valueOf(nPageNumber)); 1787 } 1788 1789 // a presentation page shape, normally used on notes pages only. If 1790 // it is used not as presentation shape, it may have been created with 1791 // copy-paste exchange between draw and impress (this IS possible...) 1792 if(eShapeType == XmlShapeTypePresPageShape) 1793 { 1794 mrExport.AddAttribute(XML_NAMESPACE_PRESENTATION, XML_CLASS, 1795 XML_PRESENTATION_PAGE); 1796 } 1797 1798 // write Page shape 1799 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1800 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PAGE_THUMBNAIL, bCreateNewline, sal_True); 1801 } 1802 } 1803 1804 ////////////////////////////////////////////////////////////////////////////// 1805 1806 void XMLShapeExport::ImpExportCaptionShape( 1807 const uno::Reference< drawing::XShape >& xShape, 1808 XmlShapeType, sal_Int32 nFeatures /* = SEF_DEFAULT */, awt::Point* pRefPoint /* = NULL */) 1809 { 1810 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1811 if(xPropSet.is()) 1812 { 1813 // Transformation 1814 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1815 1816 // evtl. corner radius? 1817 sal_Int32 nCornerRadius(0L); 1818 xPropSet->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius"))) >>= nCornerRadius; 1819 if(nCornerRadius) 1820 { 1821 OUStringBuffer sStringBuffer; 1822 mrExport.GetMM100UnitConverter().convertMeasure(sStringBuffer, nCornerRadius); 1823 mrExport.AddAttribute(XML_NAMESPACE_DRAW, XML_CORNER_RADIUS, sStringBuffer.makeStringAndClear()); 1824 } 1825 1826 awt::Point aCaptionPoint; 1827 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" ) ) ) >>= aCaptionPoint; 1828 1829 mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aCaptionPoint.X); 1830 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CAPTION_POINT_X, msBuffer.makeStringAndClear() ); 1831 mrExport.GetMM100UnitConverter().convertMeasure(msBuffer, aCaptionPoint.Y); 1832 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CAPTION_POINT_Y, msBuffer.makeStringAndClear() ); 1833 1834 // write Caption shape. Add export later. 1835 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1836 sal_Bool bAnnotation( (nFeatures & SEF_EXPORT_ANNOTATION) == SEF_EXPORT_ANNOTATION ); 1837 1838 SvXMLElementExport aObj( mrExport, 1839 (bAnnotation ? XML_NAMESPACE_OFFICE 1840 : XML_NAMESPACE_DRAW), 1841 (bAnnotation ? XML_ANNOTATION : XML_CAPTION), 1842 bCreateNewline, sal_True ); 1843 1844 ImpExportDescription( xShape ); // #i68101# 1845 ImpExportEvents( xShape ); 1846 ImpExportGluePoints( xShape ); 1847 if( bAnnotation ) 1848 mrExport.exportAnnotationMeta( xShape ); 1849 ImpExportText( xShape ); 1850 } 1851 } 1852 1853 ////////////////////////////////////////////////////////////////////////////// 1854 1855 void XMLShapeExport::ImpExportFrameShape( 1856 const uno::Reference< drawing::XShape >& xShape, 1857 XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint) 1858 { 1859 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1860 if(xPropSet.is()) 1861 { 1862 // Transformation 1863 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1864 1865 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1866 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, 1867 XML_FRAME, bCreateNewline, sal_True ); 1868 1869 // export frame url 1870 OUString aStr; 1871 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ) ) >>= aStr; 1872 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) ); 1873 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1874 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1875 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1876 1877 // export name 1878 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ) ) >>= aStr; 1879 if( aStr.getLength() ) 1880 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_FRAME_NAME, aStr ); 1881 1882 // write floating frame 1883 { 1884 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_FLOATING_FRAME, sal_True, sal_True); 1885 } 1886 } 1887 } 1888 1889 ////////////////////////////////////////////////////////////////////////////// 1890 1891 void XMLShapeExport::ImpExportAppletShape( 1892 const uno::Reference< drawing::XShape >& xShape, 1893 XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint) 1894 { 1895 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1896 if(xPropSet.is()) 1897 { 1898 // Transformation 1899 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1900 1901 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1902 SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW, 1903 XML_FRAME, bCreateNewline, sal_True ); 1904 1905 // export frame url 1906 OUString aStr; 1907 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ) ) >>= aStr; 1908 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) ); 1909 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1910 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1911 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1912 1913 // export draw:applet-name 1914 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ) ) >>= aStr; 1915 if( aStr.getLength() ) 1916 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_APPLET_NAME, aStr ); 1917 1918 // export draw:code 1919 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ) ) >>= aStr; 1920 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CODE, aStr ); 1921 1922 // export draw:may-script 1923 sal_Bool bIsScript = false; 1924 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ) ) >>= bIsScript; 1925 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MAY_SCRIPT, bIsScript ? XML_TRUE : XML_FALSE ); 1926 1927 { 1928 // write applet 1929 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_APPLET, sal_True, sal_True); 1930 1931 // export parameters 1932 uno::Sequence< beans::PropertyValue > aCommands; 1933 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ) ) >>= aCommands; 1934 const sal_Int32 nCount = aCommands.getLength(); 1935 for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) 1936 { 1937 aCommands[nIndex].Value >>= aStr; 1938 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aCommands[nIndex].Name ); 1939 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr ); 1940 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ); 1941 } 1942 } 1943 } 1944 } 1945 1946 ////////////////////////////////////////////////////////////////////////////// 1947 1948 void XMLShapeExport::ImpExportPluginShape( 1949 const uno::Reference< drawing::XShape >& xShape, 1950 XmlShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint) 1951 { 1952 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 1953 if(xPropSet.is()) 1954 { 1955 // Transformation 1956 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 1957 1958 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 1959 SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW, 1960 XML_FRAME, bCreateNewline, sal_True ); 1961 1962 // export plugin url 1963 OUString aStr; 1964 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ) ) >>= aStr; 1965 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference(aStr) ); 1966 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 1967 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 1968 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 1969 1970 1971 // export mime-type 1972 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ) ) >>= aStr; 1973 if(aStr.getLength()) 1974 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIME_TYPE, aStr ); 1975 1976 { 1977 // write plugin 1978 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PLUGIN, sal_True, sal_True); 1979 1980 // export parameters 1981 uno::Sequence< beans::PropertyValue > aCommands; 1982 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ) ) >>= aCommands; 1983 const sal_Int32 nCount = aCommands.getLength(); 1984 for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) 1985 { 1986 aCommands[nIndex].Value >>= aStr; 1987 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aCommands[nIndex].Name ); 1988 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr ); 1989 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ); 1990 } 1991 } 1992 } 1993 } 1994 1995 ////////////////////////////////////////////////////////////////////////////// 1996 1997 void XMLShapeExport::ImpExportMediaShape( 1998 const uno::Reference< drawing::XShape >& xShape, 1999 XmlShapeType eShapeType, sal_Int32 nFeatures, com::sun::star::awt::Point* pRefPoint) 2000 { 2001 const uno::Reference< beans::XPropertySet > xPropSet(xShape, uno::UNO_QUERY); 2002 if(xPropSet.is()) 2003 { 2004 // Transformation 2005 ImpExportNewTrans(xPropSet, nFeatures, pRefPoint); 2006 2007 if(eShapeType == XmlShapeTypePresMediaShape) 2008 ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_OBJECT) ); 2009 2010 sal_Bool bCreateNewline( (nFeatures & SEF_EXPORT_NO_WS) == 0 ); // #86116#/#92210# 2011 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, 2012 XML_FRAME, bCreateNewline, sal_True ); 2013 2014 // export media url 2015 OUString aMediaURL; 2016 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ) ) >>= aMediaURL; 2017 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, GetExport().GetRelativeReference( aMediaURL ) ); 2018 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 2019 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); 2020 mrExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD ); 2021 2022 // export mime-type 2023 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIME_TYPE, OUString( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.media" ) ) ); 2024 2025 // write plugin 2026 SvXMLElementExport aOBJ(mrExport, XML_NAMESPACE_DRAW, XML_PLUGIN, !( nFeatures & SEF_EXPORT_NO_WS ), sal_True); 2027 2028 // export parameters 2029 const OUString aFalseStr( RTL_CONSTASCII_USTRINGPARAM( "false" ) ), aTrueStr( RTL_CONSTASCII_USTRINGPARAM( "true" ) ); 2030 2031 sal_Bool bLoop = false; 2032 const OUString aLoopStr( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) ); 2033 xPropSet->getPropertyValue( aLoopStr ) >>= bLoop; 2034 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aLoopStr ); 2035 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, bLoop ? aTrueStr : aFalseStr ); 2036 delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) ); 2037 2038 sal_Bool bMute = false; 2039 const OUString aMuteStr( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) ); 2040 xPropSet->getPropertyValue( aMuteStr ) >>= bMute; 2041 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aMuteStr ); 2042 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, bMute ? aTrueStr : aFalseStr ); 2043 delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) ); 2044 2045 sal_Int16 nVolumeDB = 0; 2046 const OUString aVolumeDBStr( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ); 2047 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ) ) >>= nVolumeDB; 2048 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aVolumeDBStr ); 2049 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, OUString::valueOf( static_cast< sal_Int32 >( nVolumeDB ) ) ); 2050 delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) ); 2051 2052 media::ZoomLevel eZoom; 2053 const OUString aZoomStr( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ); 2054 OUString aZoomValue; 2055 xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ) ) >>= eZoom; 2056 switch( eZoom ) 2057 { 2058 case( media::ZoomLevel_ZOOM_1_TO_4 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "25%" ) ); break; 2059 case( media::ZoomLevel_ZOOM_1_TO_2 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "50%" ) ); break; 2060 case( media::ZoomLevel_ORIGINAL ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "100%" ) ); break; 2061 case( media::ZoomLevel_ZOOM_2_TO_1 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "200%" ) ); break; 2062 case( media::ZoomLevel_ZOOM_4_TO_1 ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "400%" ) ); break; 2063 case( media::ZoomLevel_FIT_TO_WINDOW ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fit" ) ); break; 2064 case( media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fixedfit" ) ); break; 2065 case( media::ZoomLevel_FULLSCREEN ): aZoomValue = OUString( RTL_CONSTASCII_USTRINGPARAM( "fullscreen" ) ); break; 2066 2067 default: 2068 break; 2069 } 2070 2071 if( aZoomValue.getLength() ) 2072 { 2073 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aZoomStr ); 2074 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aZoomValue ); 2075 delete( new SvXMLElementExport( mrExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True ) ); 2076 } 2077 } 2078 } 2079