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 27 #include <tools/debug.hxx> 28 #include <com/sun/star/lang/XServiceInfo.hpp> 29 #include <com/sun/star/presentation/AnimationSpeed.hpp> 30 #include "unointerfacetouniqueidentifiermapper.hxx" 31 32 #include <list> 33 #include <comphelper/extract.hxx> 34 #include <tools/color.hxx> 35 #include <xmloff/xmltoken.hxx> 36 #include "xmloff/xmlnmspe.hxx" 37 #include <xmloff/xmluconv.hxx> 38 #include <xmloff/xmlexp.hxx> 39 #include <xmloff/xmlement.hxx> 40 #include <xmloff/nmspmap.hxx> 41 #include <xmloff/shapeexport.hxx> 42 #include "anim.hxx" 43 44 using ::rtl::OUString; 45 using ::rtl::OUStringBuffer; 46 47 using namespace ::std; 48 using namespace ::cppu; 49 using namespace ::com::sun::star; 50 using namespace ::com::sun::star::uno; 51 using namespace ::com::sun::star::drawing; 52 using namespace ::com::sun::star::beans; 53 using namespace ::com::sun::star::lang; 54 using namespace ::com::sun::star::presentation; 55 using namespace ::xmloff::token; 56 57 58 const struct Effect 59 { 60 XMLEffect meKind; 61 XMLEffectDirection meDirection; 62 sal_Int16 mnStartScale; 63 sal_Bool mbIn; 64 } 65 AnimationEffectMap[] = 66 { 67 { EK_none, ED_none, -1, sal_True }, // AnimationEffect_NONE 68 { EK_fade, ED_from_left, -1, sal_True }, // AnimationEffect_FADE_FROM_LEFT 69 { EK_fade, ED_from_top, -1, sal_True }, // AnimationEffect_FADE_FROM_TOP 70 { EK_fade, ED_from_right, -1, sal_True }, // AnimationEffect_FADE_FROM_RIGHT 71 { EK_fade, ED_from_bottom, -1, sal_True }, // AnimationEffect_FADE_FROM_BOTTOM 72 { EK_fade, ED_to_center, -1, sal_True }, // AnimationEffect_FADE_TO_CENTER 73 { EK_fade, ED_from_center, -1, sal_True }, // AnimationEffect_FADE_FROM_CENTER 74 { EK_move, ED_from_left, -1, sal_True }, // AnimationEffect_MOVE_FROM_LEFT 75 { EK_move, ED_from_top, -1, sal_True }, // AnimationEffect_MOVE_FROM_TOP 76 { EK_move, ED_from_right, -1, sal_True }, // AnimationEffect_MOVE_FROM_RIGHT 77 { EK_move, ED_from_bottom, -1, sal_True }, // AnimationEffect_MOVE_FROM_BOTTOM 78 { EK_stripes, ED_vertical, -1, sal_True }, // AnimationEffect_VERTICAL_STRIPES 79 { EK_stripes, ED_horizontal, -1, sal_True }, // AnimationEffect_HORIZONTAL_STRIPES 80 { EK_fade, ED_clockwise, -1, sal_True }, // AnimationEffect_CLOCKWISE 81 { EK_fade, ED_cclockwise, -1, sal_True }, // AnimationEffect_COUNTERCLOCKWISE 82 { EK_fade, ED_from_upperleft, -1, sal_True }, // AnimationEffect_FADE_FROM_UPPERLEFT 83 { EK_fade, ED_from_upperright, -1, sal_True }, // AnimationEffect_FADE_FROM_UPPERRIGHT 84 { EK_fade, ED_from_lowerleft, -1, sal_True }, // AnimationEffect_FADE_FROM_LOWERLEFT 85 { EK_fade, ED_from_lowerright, -1, sal_True }, // AnimationEffect_FADE_FROM_LOWERRIGHT 86 { EK_close,ED_vertical, -1, sal_True }, // AnimationEffect_CLOSE_VERTICAL 87 { EK_close,ED_horizontal, -1, sal_True }, // AnimationEffect_CLOSE_HORIZONTAL 88 { EK_open, ED_vertical, -1, sal_True }, // AnimationEffect_OPEN_VERTICAL 89 { EK_open, ED_horizontal, -1, sal_True }, // AnimationEffect_OPEN_HORIZONTAL 90 { EK_move, ED_path, -1, sal_True }, // AnimationEffect_PATH 91 { EK_move, ED_to_left, -1, sal_False },// AnimationEffect_MOVE_TO_LEFT 92 { EK_move, ED_to_top, -1, sal_False },// AnimationEffect_MOVE_TO_TOP 93 { EK_move, ED_to_right, -1, sal_False },// AnimationEffect_MOVE_TO_RIGHT 94 { EK_move, ED_to_bottom, -1, sal_False },// AnimationEffect_MOVE_TO_BOTTOM 95 { EK_fade, ED_spiral_inward_left, -1, sal_True }, // AnimationEffect_SPIRALIN_LEFT 96 { EK_fade, ED_spiral_inward_right, -1, sal_True }, // AnimationEffect_SPIRALIN_RIGHT 97 { EK_fade, ED_spiral_outward_left, -1, sal_True }, // AnimationEffect_SPIRALOUT_LEFT 98 { EK_fade, ED_spiral_outward_right, -1, sal_True }, // AnimationEffect_SPIRALOUT_RIGHT 99 { EK_dissolve, ED_none, -1, sal_True }, // AnimationEffect_DISSOLVE 100 { EK_wavyline, ED_from_left, -1, sal_True }, // AnimationEffect_WAVYLINE_FROM_LEFT 101 { EK_wavyline, ED_from_top, -1, sal_True }, // AnimationEffect_WAVYLINE_FROM_TOP 102 { EK_wavyline, ED_from_right, -1, sal_True }, // AnimationEffect_WAVYLINE_FROM_RIGHT 103 { EK_wavyline, ED_from_bottom, -1, sal_True }, // AnimationEffect_WAVYLINE_FROM_BOTTOM 104 { EK_random, ED_none, -1, sal_True }, // AnimationEffect_RANDOM 105 { EK_lines, ED_vertical, -1, sal_True }, // AnimationEffect_VERTICAL_LINES 106 { EK_lines, ED_horizontal, -1, sal_True }, // AnimationEffect_HORIZONTAL_LINES 107 { EK_laser, ED_from_left, -1, sal_True }, // AnimationEffect_LASER_FROM_LEFT 108 { EK_laser, ED_from_top, -1, sal_True }, // AnimationEffect_LASER_FROM_TOP 109 { EK_laser, ED_from_right, -1, sal_True }, // AnimationEffect_LASER_FROM_RIGHT 110 { EK_laser, ED_from_bottom, -1, sal_True }, // AnimationEffect_LASER_FROM_BOTTOM 111 { EK_laser, ED_from_upperleft, -1, sal_True }, // AnimationEffect_LASER_FROM_UPPERLEFT 112 { EK_laser, ED_from_upperright, -1, sal_True }, // AnimationEffect_LASER_FROM_UPPERRIGHT 113 { EK_laser, ED_from_lowerleft, -1, sal_True }, // AnimationEffect_LASER_FROM_LOWERLEFT 114 { EK_laser, ED_from_lowerright, -1, sal_True }, // AnimationEffect_LASER_FROM_LOWERRIGHT 115 { EK_appear,ED_none, -1, sal_True }, // AnimationEffect_APPEAR 116 { EK_hide, ED_none, -1, sal_False },// AnimationEffect_HIDE 117 { EK_move, ED_from_upperleft, -1, sal_True }, // AnimationEffect_MOVE_FROM_UPPERLEFT 118 { EK_move, ED_from_upperright, -1, sal_True }, // AnimationEffect_MOVE_FROM_UPPERRIGHT 119 { EK_move, ED_from_lowerright, -1, sal_True }, // AnimationEffect_MOVE_FROM_LOWERRIGHT 120 { EK_move, ED_from_lowerleft, -1, sal_True }, // AnimationEffect_MOVE_FROM_LOWERLEFT 121 { EK_move, ED_to_upperleft, -1, sal_False },// AnimationEffect_MOVE_TO_UPPERLEFT 122 { EK_move, ED_to_upperright, -1, sal_False },// AnimationEffect_MOVE_TO_UPPERRIGHT 123 { EK_move, ED_to_lowerright, -1, sal_False },// AnimationEffect_MOVE_TO_LOWERRIGHT 124 { EK_move, ED_to_lowerleft, -1, sal_False },// AnimationEffect_MOVE_TO_LOWERLEFT 125 { EK_move_short, ED_from_left, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_LEFT 126 { EK_move_short, ED_from_upperleft, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT 127 { EK_move_short, ED_from_top, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_TOP 128 { EK_move_short, ED_from_upperright,-1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT 129 { EK_move_short, ED_from_right, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_RIGHT 130 { EK_move_short, ED_from_lowerright,-1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT 131 { EK_move_short, ED_from_bottom, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_BOTTOM 132 { EK_move_short, ED_from_lowerleft, -1, sal_True }, // AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT 133 { EK_move_short, ED_to_left, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_LEFT 134 { EK_move_short, ED_to_upperleft, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_UPPERLEFT 135 { EK_move_short, ED_to_top, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_TOP 136 { EK_move_short, ED_to_upperright, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT 137 { EK_move_short, ED_to_right, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_RIGHT 138 { EK_move_short, ED_to_lowerright, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT 139 { EK_move_short, ED_to_bottom, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_BOTTOM 140 { EK_move_short, ED_to_lowerleft, -1, sal_False },// AnimationEffect_MOVE_SHORT_TO_LOWERLEFT 141 { EK_checkerboard, ED_vertical, -1, sal_True }, // AnimationEffect_VERTICAL_CHECKERBOARD 142 { EK_checkerboard, ED_horizontal, -1, sal_True }, // AnimationEffect_HORIZONTAL_CHECKERBOARD 143 { EK_rotate, ED_horizontal, -1, sal_True }, // AnimationEffect_HORIZONTAL_ROTATE 144 { EK_rotate, ED_vertical, -1, sal_True }, // AnimationEffect_VERTICAL_ROTATE 145 { EK_stretch,ED_horizontal, -1, sal_True }, // AnimationEffect_HORIZONTAL_STRETCH 146 { EK_stretch,ED_vertical, -1, sal_True }, // AnimationEffect_VERTICAL_STRETCH 147 { EK_stretch,ED_from_left, -1, sal_True }, // AnimationEffect_STRETCH_FROM_LEFT 148 { EK_stretch,ED_from_upperleft, -1, sal_True }, // AnimationEffect_STRETCH_FROM_UPPERLEFT 149 { EK_stretch,ED_from_top, -1, sal_True }, // AnimationEffect_STRETCH_FROM_TOP 150 { EK_stretch,ED_from_upperright,-1, sal_True }, // AnimationEffect_STRETCH_FROM_UPPERRIGHT 151 { EK_stretch,ED_from_right, -1, sal_True }, // AnimationEffect_STRETCH_FROM_RIGHT 152 { EK_stretch,ED_from_lowerright,-1, sal_True }, // AnimationEffect_STRETCH_FROM_LOWERRIGHT 153 { EK_stretch,ED_from_bottom, -1, sal_True }, // AnimationEffect_STRETCH_FROM_BOTTOM 154 { EK_stretch,ED_from_lowerleft, -1, sal_True }, // AnimationEffect_STRETCH_FROM_LOWERLEFT 155 { EK_move, ED_none, 0, sal_True }, // AnimationEffect_ZOOM_IN 156 { EK_move, ED_none, 50, sal_True }, // AnimationEffect_ZOOM_IN_SMALL 157 { EK_move, ED_spiral_inward_left, 0, sal_True }, // AnimationEffect_ZOOM_IN_SPIRAL 158 { EK_move, ED_none, 400, sal_True }, // AnimationEffect_ZOOM_OUT 159 { EK_move, ED_none, 200, sal_True }, // AnimationEffect_ZOOM_OUT_SMALL 160 { EK_move, ED_spiral_inward_left, 400, sal_True }, // AnimationEffect_ZOOM_OUT_SPIRAL 161 { EK_move, ED_from_left, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_LEFT 162 { EK_move, ED_from_upperleft, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_UPPERLEFT 163 { EK_move, ED_from_top, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_TOP 164 { EK_move, ED_from_upperright, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_UPPERRIGHT 165 { EK_move, ED_from_right, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_RIGHT 166 { EK_move, ED_from_lowerright, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_LOWERRIGHT 167 { EK_move, ED_from_bottom, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_BOTTOM 168 { EK_move, ED_from_lowerleft, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_LOWERLEFT 169 { EK_move, ED_from_center, 0, sal_True }, // AnimationEffect_ZOOM_IN_FROM_CENTER 170 { EK_move, ED_from_left, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_LEFT 171 { EK_move, ED_from_upperleft, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_UPPERLEFT 172 { EK_move, ED_from_top, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_TOP 173 { EK_move, ED_from_upperright,400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_UPPERRIGHT 174 { EK_move, ED_from_right, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_RIGHT 175 { EK_move, ED_from_lowerright,400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_LOWERRIGHT 176 { EK_move, ED_from_bottom, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_BOTTOM 177 { EK_move, ED_from_lowerleft, 400, sal_True }, // AnimationEffect_ZOOM_OUT_FROM_LOWERLEFT 178 { EK_move, ED_from_center, 400, sal_True } // AnimationEffect_ZOOM_OUT_FROM_CENTER 179 }; 180 181 void SdXMLImplSetEffect( AnimationEffect eEffect, XMLEffect& eKind, XMLEffectDirection& eDirection, sal_Int16& nStartScale, sal_Bool& bIn ) 182 { 183 if( eEffect < AnimationEffect_NONE || eEffect > AnimationEffect_ZOOM_OUT_FROM_CENTER ) 184 { 185 DBG_ERROR( "unknown animation effect!" ); 186 eEffect = AnimationEffect_NONE; 187 } 188 189 const Effect& rEffect = AnimationEffectMap[eEffect]; 190 eKind = rEffect.meKind; 191 eDirection = rEffect.meDirection; 192 nStartScale = rEffect.mnStartScale; 193 bIn = rEffect.mbIn; 194 } 195 196 enum XMLActionKind 197 { 198 XMLE_SHOW, 199 XMLE_HIDE, 200 XMLE_DIM, 201 XMLE_PLAY 202 }; 203 204 struct XMLEffectHint 205 { 206 XMLActionKind meKind; 207 sal_Bool mbTextEffect; 208 Reference<XShape> mxShape; 209 210 XMLEffect meEffect; 211 XMLEffectDirection meDirection; 212 sal_Int16 mnStartScale; 213 214 AnimationSpeed meSpeed; 215 Color maDimColor; 216 OUString maSoundURL; 217 sal_Bool mbPlayFull; 218 sal_Int32 mnPresId; 219 sal_Int32 mnPathShapeId; 220 221 int operator<(const XMLEffectHint& rComp) const { return mnPresId < rComp.mnPresId; } 222 223 XMLEffectHint() 224 : meKind( XMLE_SHOW ), mbTextEffect( sal_False ), 225 meEffect( EK_none ), meDirection( ED_none ), mnStartScale( -1 ), 226 meSpeed( AnimationSpeed_SLOW ), maDimColor(0), mbPlayFull( sal_False ), 227 mnPresId( 0 ), mnPathShapeId( -1 ) 228 {} 229 }; 230 231 class AnimExpImpl 232 { 233 public: 234 list<XMLEffectHint> maEffects; 235 UniReference< XMLShapeExport > mxShapeExp; 236 237 OUString msDimColor; 238 OUString msDimHide; 239 OUString msDimPrev; 240 OUString msEffect; 241 OUString msPlayFull; 242 OUString msPresOrder; 243 OUString msSound; 244 OUString msSoundOn; 245 OUString msSpeed; 246 OUString msTextEffect; 247 OUString msIsAnimation; 248 OUString msAnimPath; 249 250 AnimExpImpl() 251 : msDimColor( RTL_CONSTASCII_USTRINGPARAM( "DimColor" ) ), 252 msDimHide( RTL_CONSTASCII_USTRINGPARAM( "DimHide" ) ), 253 msDimPrev( RTL_CONSTASCII_USTRINGPARAM( "DimPrevious" ) ), 254 msEffect( RTL_CONSTASCII_USTRINGPARAM( "Effect" ) ), 255 msPlayFull( RTL_CONSTASCII_USTRINGPARAM( "PlayFull" ) ), 256 msPresOrder( RTL_CONSTASCII_USTRINGPARAM( "PresentationOrder" ) ), 257 msSound( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ), 258 msSoundOn( RTL_CONSTASCII_USTRINGPARAM( "SoundOn" ) ), 259 msSpeed( RTL_CONSTASCII_USTRINGPARAM( "Speed" ) ), 260 msTextEffect( RTL_CONSTASCII_USTRINGPARAM( "TextEffect" ) ), 261 msIsAnimation( RTL_CONSTASCII_USTRINGPARAM( "IsAnimation" ) ), 262 msAnimPath( RTL_CONSTASCII_USTRINGPARAM( "AnimationPath" ) ) 263 {} 264 }; 265 266 XMLAnimationsExporter::XMLAnimationsExporter( XMLShapeExport* pShapeExp ) 267 { 268 mpImpl = new AnimExpImpl; 269 mpImpl->mxShapeExp = pShapeExp; 270 } 271 272 XMLAnimationsExporter::~XMLAnimationsExporter() 273 { 274 delete mpImpl; 275 mpImpl = NULL; 276 } 277 278 void XMLAnimationsExporter::prepare( Reference< XShape > xShape, SvXMLExport& ) 279 { 280 try 281 { 282 // check for presentation shape service 283 { 284 Reference< XServiceInfo > xServiceInfo( xShape, UNO_QUERY ); 285 if( !xServiceInfo.is() || !xServiceInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.Shape" ) ) ) ) 286 return; 287 } 288 289 Reference< XPropertySet > xProps( xShape, UNO_QUERY ); 290 if( xProps.is() ) 291 { 292 AnimationEffect eEffect; 293 xProps->getPropertyValue( mpImpl->msEffect ) >>= eEffect; 294 if( eEffect == AnimationEffect_PATH ) 295 { 296 Reference< XShape > xPath; 297 xProps->getPropertyValue( mpImpl->msAnimPath ) >>= xPath; 298 // strip if( xPath.is() ) 299 // strip mrExport.getInterfaceToIdentifierMapper()->registerReference( xShape ); 300 // strip mpImpl->mxShapeExp->createShapeId( xPath ); 301 } 302 } 303 } 304 catch( Exception e ) 305 { 306 DBG_ERROR("exception catched while collection animation information!"); 307 } 308 } 309 310 void XMLAnimationsExporter::collect( Reference< XShape > xShape, SvXMLExport& rExport ) 311 { 312 try 313 { 314 // check for presentation shape service 315 { 316 Reference< XServiceInfo > xServiceInfo( xShape, UNO_QUERY ); 317 if( !xServiceInfo.is() || !xServiceInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.Shape" ) ) ) ) 318 return; 319 } 320 321 Reference< XPropertySet > xProps( xShape, UNO_QUERY ); 322 if( xProps.is() ) 323 { 324 const OUString aEmptyStr; 325 326 Reference< XPropertySetInfo > xInfo( xProps->getPropertySetInfo() ); 327 AnimationEffect eEffect; 328 XMLEffectHint aEffect; 329 330 if( any2bool( xProps->getPropertyValue( mpImpl->msSoundOn ) ) ) 331 { 332 xProps->getPropertyValue( mpImpl->msSound ) >>= aEffect.maSoundURL; 333 xProps->getPropertyValue( mpImpl->msPlayFull ) >>= aEffect.mbPlayFull; 334 } 335 336 xProps->getPropertyValue( mpImpl->msPresOrder ) >>= aEffect.mnPresId; 337 xProps->getPropertyValue( mpImpl->msSpeed ) >>= aEffect.meSpeed; 338 339 340 sal_Bool bIsAnimation = false; 341 xProps->getPropertyValue( mpImpl->msIsAnimation ) >>= bIsAnimation; 342 if( bIsAnimation ) 343 { 344 aEffect.meKind = XMLE_PLAY; 345 346 if( !aEffect.mxShape.is() ) 347 { 348 rExport.getInterfaceToIdentifierMapper().registerReference( xShape ); 349 aEffect.mxShape = xShape; 350 } 351 352 mpImpl->maEffects.push_back( aEffect ); 353 } 354 355 { 356 357 xProps->getPropertyValue( mpImpl->msEffect ) >>= eEffect; 358 if( eEffect != AnimationEffect_NONE ) 359 { 360 sal_Bool bIn = sal_True; 361 SdXMLImplSetEffect( eEffect, aEffect.meEffect, aEffect.meDirection, aEffect.mnStartScale, bIn ); 362 363 aEffect.meKind = bIn ? XMLE_SHOW : XMLE_HIDE; 364 365 if( !aEffect.mxShape.is() ) 366 { 367 rExport.getInterfaceToIdentifierMapper().registerReference( xShape ); 368 aEffect.mxShape = xShape; 369 } 370 371 if( eEffect == AnimationEffect_PATH ) 372 { 373 Reference< XShape > xPath; 374 xProps->getPropertyValue( mpImpl->msAnimPath ) >>= xPath; 375 if( xPath.is() ) 376 { 377 // strip mpImpl->mxShapeExp->createShapeId( xPath ); 378 // strip aEffect.mnPathShapeId = mpImpl->mxShapeExp->getShapeId( xPath ); 379 } 380 } 381 mpImpl->maEffects.push_back( aEffect ); 382 383 aEffect.mnPathShapeId = -1; 384 aEffect.maSoundURL = aEmptyStr; 385 } 386 387 xProps->getPropertyValue( mpImpl->msTextEffect ) >>= eEffect; 388 if( eEffect != AnimationEffect_NONE ) 389 { 390 sal_Bool bIn = sal_True; 391 SdXMLImplSetEffect( eEffect, aEffect.meEffect, aEffect.meDirection, aEffect.mnStartScale, bIn ); 392 aEffect.meKind = bIn ? XMLE_SHOW : XMLE_HIDE; 393 aEffect.mbTextEffect = sal_True; 394 395 if( !aEffect.mxShape.is() ) 396 { 397 rExport.getInterfaceToIdentifierMapper().registerReference( xShape ); 398 aEffect.mxShape = xShape; 399 } 400 401 mpImpl->maEffects.push_back( aEffect ); 402 aEffect.mbTextEffect = sal_False; 403 aEffect.maSoundURL = aEmptyStr; 404 } 405 406 sal_Bool bDimPrev = false; 407 sal_Bool bDimHide = false; 408 xProps->getPropertyValue( mpImpl->msDimPrev ) >>= bDimPrev; 409 xProps->getPropertyValue( mpImpl->msDimHide ) >>= bDimHide; 410 if( bDimPrev || bDimHide ) 411 { 412 aEffect.meKind = bDimPrev ? XMLE_DIM : XMLE_HIDE; 413 aEffect.meEffect = EK_none; 414 aEffect.meDirection = ED_none; 415 aEffect.meSpeed = AnimationSpeed_MEDIUM; 416 if( bDimPrev ) 417 { 418 sal_Int32 nColor = 0; 419 xProps->getPropertyValue( mpImpl->msDimColor ) >>= nColor; 420 aEffect.maDimColor.SetColor( nColor ); 421 } 422 423 if( !aEffect.mxShape.is() ) 424 { 425 rExport.getInterfaceToIdentifierMapper().registerReference( xShape ); 426 aEffect.mxShape = xShape; 427 } 428 429 mpImpl->maEffects.push_back( aEffect ); 430 aEffect.maSoundURL = aEmptyStr; 431 } 432 } 433 } 434 } 435 catch( Exception e ) 436 { 437 DBG_ERROR("exception catched while collection animation information!"); 438 } 439 } 440 441 void XMLAnimationsExporter::exportAnimations( SvXMLExport& rExport ) 442 { 443 mpImpl->maEffects.sort(); 444 445 list<XMLEffectHint>::iterator aIter = mpImpl->maEffects.begin(); 446 const list<XMLEffectHint>::iterator aEnd = mpImpl->maEffects.end(); 447 448 OUStringBuffer sTmp; 449 450 if( aIter != aEnd ) 451 { 452 SvXMLElementExport aElement( rExport, XML_NAMESPACE_PRESENTATION, XML_ANIMATIONS, sal_True, sal_True ); 453 454 do 455 { 456 XMLEffectHint& rEffect = *aIter; 457 458 DBG_ASSERT( rEffect.mxShape.is(), "shape id creation failed for animation effect?" ); 459 460 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_SHAPE_ID, rExport.getInterfaceToIdentifierMapper().getIdentifier( rEffect.mxShape ) ); 461 462 if( rEffect.meKind == XMLE_DIM ) 463 { 464 // export a dim action; 465 466 SvXMLUnitConverter::convertColor( sTmp, rEffect.maDimColor ); 467 rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_COLOR, sTmp.makeStringAndClear() ); 468 469 SvXMLElementExport aElem( rExport, XML_NAMESPACE_PRESENTATION, XML_DIM, sal_True, sal_True ); 470 } 471 else if( rEffect.meKind == XMLE_PLAY ) 472 { 473 if( rEffect.meSpeed != AnimationSpeed_MEDIUM ) 474 { 475 SvXMLUnitConverter::convertEnum( sTmp, rEffect.meSpeed, aXML_AnimationSpeed_EnumMap ); 476 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_SPEED, sTmp.makeStringAndClear() ); 477 } 478 479 SvXMLElementExport aElem( rExport, XML_NAMESPACE_PRESENTATION, XML_PLAY, sal_True, sal_True ); 480 } 481 else 482 { 483 484 if( rEffect.meEffect != EK_none ) 485 { 486 SvXMLUnitConverter::convertEnum( sTmp, rEffect.meEffect, aXML_AnimationEffect_EnumMap ); 487 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_EFFECT, sTmp.makeStringAndClear() ); 488 } 489 490 if( rEffect.meDirection != ED_none ) 491 { 492 SvXMLUnitConverter::convertEnum( sTmp, rEffect.meDirection, aXML_AnimationDirection_EnumMap ); 493 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_DIRECTION, sTmp.makeStringAndClear() ); 494 } 495 496 if( rEffect.mnStartScale != -1 ) 497 { 498 SvXMLUnitConverter::convertPercent( sTmp, rEffect.mnStartScale ); 499 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_START_SCALE, sTmp.makeStringAndClear() ); 500 } 501 502 if( rEffect.meSpeed != AnimationSpeed_MEDIUM ) 503 { 504 SvXMLUnitConverter::convertEnum( sTmp, rEffect.meSpeed, aXML_AnimationSpeed_EnumMap ); 505 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_SPEED, sTmp.makeStringAndClear() ); 506 } 507 508 if( rEffect.mnPathShapeId != -1 ) 509 { 510 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_PATH_ID, OUString::valueOf( rEffect.mnPathShapeId ) ); 511 } 512 513 enum XMLTokenEnum eLocalName; 514 if( rEffect.meKind == XMLE_SHOW ) 515 { 516 if( rEffect.mbTextEffect ) 517 eLocalName = XML_SHOW_TEXT; 518 else 519 eLocalName = XML_SHOW_SHAPE; 520 } 521 else 522 { 523 if( rEffect.mbTextEffect ) 524 eLocalName = XML_HIDE_TEXT; 525 else 526 eLocalName = XML_HIDE_SHAPE; 527 } 528 529 SvXMLElementExport aEle( rExport, XML_NAMESPACE_PRESENTATION, eLocalName, sal_True, sal_True ); 530 if( rEffect.maSoundURL.getLength() != 0 ) 531 { 532 rExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, rExport.GetRelativeReference(rEffect.maSoundURL) ); 533 rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); 534 rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_NEW ); 535 rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONREQUEST ); 536 if( rEffect.mbPlayFull ) 537 rExport.AddAttribute( XML_NAMESPACE_PRESENTATION, XML_PLAY_FULL, XML_TRUE ); 538 539 SvXMLElementExport aElem( rExport, XML_NAMESPACE_PRESENTATION, XML_SOUND, sal_True, sal_True ); 540 } 541 } 542 543 aIter++; 544 } 545 while( aIter != aEnd ); 546 } 547 548 mpImpl->maEffects.clear(); 549 } 550