Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
22 : #include <com/sun/star/lang/XServiceInfo.hpp>
23 : #include <com/sun/star/presentation/AnimationEffect.hpp>
24 : #include <com/sun/star/presentation/AnimationSpeed.hpp>
25 : #include <com/sun/star/beans/XPropertySet.hpp>
26 : #include <com/sun/star/xml/sax/XAttributeList.hpp>
27 :
28 : #include <sax/tools/converter.hxx>
29 :
30 : #include <list>
31 : #include <comphelper/extract.hxx>
32 : #include <xmloff/xmltoken.hxx>
33 : #include <xmloff/xmlimp.hxx>
34 : #include "xmloff/xmlnmspe.hxx"
35 : #include <xmloff/xmluconv.hxx>
36 : #include <xmloff/nmspmap.hxx>
37 : #include "anim.hxx"
38 : #include "animimp.hxx"
39 :
40 :
41 : using namespace ::std;
42 : using namespace ::cppu;
43 : using namespace ::com::sun::star;
44 : using namespace ::com::sun::star::xml;
45 : using namespace ::com::sun::star::xml::sax;
46 : using namespace ::com::sun::star::uno;
47 : using namespace ::com::sun::star::drawing;
48 : using namespace ::com::sun::star::beans;
49 : using namespace ::com::sun::star::lang;
50 : using namespace ::com::sun::star::presentation;
51 : using namespace ::xmloff::token;
52 :
53 : SvXMLEnumMapEntry aXML_AnimationEffect_EnumMap[] =
54 : {
55 : { XML_NONE, EK_none },
56 : { XML_FADE, EK_fade },
57 : { XML_MOVE, EK_move },
58 : { XML_STRIPES, EK_stripes },
59 : { XML_OPEN, EK_open },
60 : { XML_CLOSE, EK_close },
61 : { XML_DISSOLVE, EK_dissolve },
62 : { XML_WAVYLINE, EK_wavyline },
63 : { XML_RANDOM, EK_random },
64 : { XML_LINES, EK_lines },
65 : { XML_LASER, EK_laser },
66 : { XML_APPEAR, EK_appear },
67 : { XML_HIDE, EK_hide },
68 : { XML_MOVE_SHORT, EK_move_short },
69 : { XML_CHECKERBOARD, EK_checkerboard },
70 : { XML_ROTATE, EK_rotate },
71 : { XML_STRETCH, EK_stretch },
72 : { XML_TOKEN_INVALID, 0 }
73 : };
74 :
75 : SvXMLEnumMapEntry aXML_AnimationDirection_EnumMap[] =
76 : {
77 : { XML_NONE, ED_none },
78 : { XML_FROM_LEFT, ED_from_left },
79 : { XML_FROM_TOP, ED_from_top },
80 : { XML_FROM_RIGHT, ED_from_right },
81 : { XML_FROM_BOTTOM, ED_from_bottom },
82 : { XML_FROM_CENTER, ED_from_center },
83 : { XML_FROM_UPPER_LEFT, ED_from_upperleft },
84 : { XML_FROM_UPPER_RIGHT, ED_from_upperright },
85 : { XML_FROM_LOWER_LEFT, ED_from_lowerleft },
86 : { XML_FROM_LOWER_RIGHT, ED_from_lowerright },
87 : { XML_TO_LEFT, ED_to_left },
88 : { XML_TO_TOP, ED_to_top },
89 : { XML_TO_RIGHT, ED_to_right },
90 : { XML_TO_BOTTOM, ED_to_bottom },
91 : { XML_TO_UPPER_LEFT, ED_to_upperleft },
92 : { XML_TO_UPPER_RIGHT, ED_to_upperright },
93 : { XML_TO_LOWER_RIGHT, ED_to_lowerright },
94 : { XML_TO_LOWER_LEFT, ED_to_lowerleft },
95 : { XML_PATH, ED_path },
96 : { XML_SPIRAL_INWARD_LEFT, ED_spiral_inward_left },
97 : { XML_SPIRAL_INWARD_RIGHT,ED_spiral_inward_right },
98 : { XML_SPIRAL_OUTWARD_LEFT, ED_spiral_outward_left },
99 : { XML_SPIRAL_OUTWARD_RIGHT, ED_spiral_outward_right },
100 : { XML_VERTICAL, ED_vertical },
101 : { XML_HORIZONTAL, ED_horizontal },
102 : { XML_TO_CENTER, ED_to_center },
103 : { XML_CLOCKWISE, ED_clockwise },
104 : { XML_COUNTER_CLOCKWISE,ED_cclockwise },
105 : { XML_TOKEN_INVALID, 0 }
106 : };
107 :
108 : SvXMLEnumMapEntry aXML_AnimationSpeed_EnumMap[] =
109 : {
110 : { XML_SLOW, AnimationSpeed_SLOW },
111 : { XML_MEDIUM, AnimationSpeed_MEDIUM },
112 : { XML_FAST, AnimationSpeed_FAST },
113 : { XML_TOKEN_INVALID, 0 }
114 : };
115 :
116 0 : AnimationEffect ImplSdXMLgetEffect( XMLEffect eKind, XMLEffectDirection eDirection, sal_Int16 nStartScale, sal_Bool /*bIn*/ )
117 : {
118 0 : switch( eKind )
119 : {
120 : case EK_fade:
121 0 : switch( eDirection )
122 : {
123 0 : case ED_from_left: return AnimationEffect_FADE_FROM_LEFT;
124 0 : case ED_from_top: return AnimationEffect_FADE_FROM_TOP;
125 0 : case ED_from_right: return AnimationEffect_FADE_FROM_RIGHT;
126 0 : case ED_from_bottom: return AnimationEffect_FADE_FROM_BOTTOM;
127 0 : case ED_from_center: return AnimationEffect_FADE_FROM_CENTER;
128 0 : case ED_from_upperleft: return AnimationEffect_FADE_FROM_UPPERLEFT;
129 0 : case ED_from_upperright: return AnimationEffect_FADE_FROM_UPPERRIGHT;
130 0 : case ED_from_lowerleft: return AnimationEffect_FADE_FROM_LOWERLEFT;
131 0 : case ED_from_lowerright: return AnimationEffect_FADE_FROM_LOWERRIGHT;
132 0 : case ED_to_center: return AnimationEffect_FADE_TO_CENTER;
133 0 : case ED_clockwise: return AnimationEffect_CLOCKWISE;
134 0 : case ED_cclockwise: return AnimationEffect_COUNTERCLOCKWISE;
135 0 : case ED_spiral_inward_left: return AnimationEffect_SPIRALIN_LEFT;
136 0 : case ED_spiral_inward_right:return AnimationEffect_SPIRALIN_RIGHT;
137 0 : case ED_spiral_outward_left:return AnimationEffect_SPIRALOUT_LEFT;
138 0 : case ED_spiral_outward_right:return AnimationEffect_SPIRALOUT_RIGHT;
139 0 : default: return AnimationEffect_FADE_FROM_LEFT;
140 : }
141 : case EK_move:
142 0 : if( nStartScale == 200 )
143 : {
144 0 : return AnimationEffect_ZOOM_OUT_SMALL;
145 : }
146 0 : else if( nStartScale == 50 )
147 : {
148 0 : return AnimationEffect_ZOOM_IN_SMALL;
149 : }
150 0 : else if( nStartScale < 100 )
151 : {
152 0 : switch( eDirection )
153 : {
154 0 : case ED_from_left: return AnimationEffect_ZOOM_IN_FROM_LEFT;
155 0 : case ED_from_top: return AnimationEffect_ZOOM_IN_FROM_TOP;
156 0 : case ED_from_right: return AnimationEffect_ZOOM_IN_FROM_RIGHT;
157 0 : case ED_from_bottom: return AnimationEffect_ZOOM_IN_FROM_BOTTOM;
158 0 : case ED_from_upperleft: return AnimationEffect_ZOOM_IN_FROM_UPPERLEFT;
159 0 : case ED_from_upperright: return AnimationEffect_ZOOM_IN_FROM_UPPERRIGHT;
160 0 : case ED_from_lowerleft: return AnimationEffect_ZOOM_IN_FROM_LOWERLEFT;
161 0 : case ED_from_lowerright: return AnimationEffect_ZOOM_IN_FROM_LOWERRIGHT;
162 0 : case ED_from_center: return AnimationEffect_ZOOM_IN_FROM_CENTER;
163 0 : case ED_spiral_inward_left: return AnimationEffect_ZOOM_IN_SPIRAL;
164 0 : case ED_to_left: return AnimationEffect_MOVE_TO_LEFT;
165 0 : case ED_to_top: return AnimationEffect_MOVE_TO_TOP;
166 0 : case ED_to_right: return AnimationEffect_MOVE_TO_RIGHT;
167 0 : case ED_to_bottom: return AnimationEffect_MOVE_TO_BOTTOM;
168 0 : case ED_to_upperleft: return AnimationEffect_MOVE_TO_UPPERLEFT;
169 0 : case ED_to_upperright: return AnimationEffect_MOVE_TO_UPPERRIGHT;
170 0 : case ED_to_lowerright: return AnimationEffect_MOVE_TO_LOWERRIGHT;
171 0 : case ED_to_lowerleft: return AnimationEffect_MOVE_TO_LOWERLEFT;
172 0 : default: return AnimationEffect_ZOOM_IN;
173 : }
174 : }
175 0 : else if( nStartScale > 100 )
176 : {
177 0 : switch( eDirection )
178 : {
179 0 : case ED_from_left: return AnimationEffect_ZOOM_OUT_FROM_LEFT;
180 0 : case ED_from_top: return AnimationEffect_ZOOM_OUT_FROM_TOP;
181 0 : case ED_from_right: return AnimationEffect_ZOOM_OUT_FROM_RIGHT;
182 0 : case ED_from_bottom: return AnimationEffect_ZOOM_OUT_FROM_BOTTOM;
183 0 : case ED_from_upperleft: return AnimationEffect_ZOOM_OUT_FROM_UPPERLEFT;
184 0 : case ED_from_upperright: return AnimationEffect_ZOOM_OUT_FROM_UPPERRIGHT;
185 0 : case ED_from_lowerleft: return AnimationEffect_ZOOM_OUT_FROM_LOWERLEFT;
186 0 : case ED_from_lowerright: return AnimationEffect_ZOOM_OUT_FROM_LOWERRIGHT;
187 0 : case ED_from_center: return AnimationEffect_ZOOM_OUT_FROM_CENTER;
188 0 : case ED_spiral_inward_left: return AnimationEffect_ZOOM_OUT_SPIRAL;
189 0 : default: return AnimationEffect_ZOOM_OUT;
190 : }
191 : }
192 : else
193 : {
194 0 : switch( eDirection )
195 : {
196 0 : case ED_from_left: return AnimationEffect_MOVE_FROM_LEFT;
197 0 : case ED_from_top: return AnimationEffect_MOVE_FROM_TOP;
198 0 : case ED_from_right: return AnimationEffect_MOVE_FROM_RIGHT;
199 0 : case ED_from_bottom: return AnimationEffect_MOVE_FROM_BOTTOM;
200 0 : case ED_from_upperleft: return AnimationEffect_MOVE_FROM_UPPERLEFT;
201 0 : case ED_from_upperright: return AnimationEffect_MOVE_FROM_UPPERRIGHT;
202 0 : case ED_from_lowerleft: return AnimationEffect_MOVE_FROM_LOWERLEFT;
203 0 : case ED_from_lowerright: return AnimationEffect_MOVE_FROM_LOWERRIGHT;
204 0 : case ED_path: return AnimationEffect_PATH;
205 0 : case ED_to_top: return AnimationEffect_MOVE_TO_TOP;
206 0 : case ED_to_right: return AnimationEffect_MOVE_TO_RIGHT;
207 0 : case ED_to_bottom: return AnimationEffect_MOVE_TO_BOTTOM;
208 0 : case ED_to_upperleft: return AnimationEffect_MOVE_TO_UPPERLEFT;
209 0 : case ED_to_upperright: return AnimationEffect_MOVE_TO_UPPERRIGHT;
210 0 : case ED_to_lowerright: return AnimationEffect_MOVE_TO_LOWERRIGHT;
211 0 : case ED_to_lowerleft: return AnimationEffect_MOVE_TO_LOWERLEFT;
212 : default:
213 0 : break;
214 : }
215 : }
216 0 : return AnimationEffect_MOVE_FROM_LEFT;
217 : case EK_stripes:
218 0 : if( eDirection == ED_vertical )
219 0 : return AnimationEffect_VERTICAL_STRIPES;
220 : else
221 0 : return AnimationEffect_HORIZONTAL_STRIPES;
222 : case EK_open:
223 0 : if( eDirection == ED_vertical )
224 0 : return AnimationEffect_OPEN_VERTICAL;
225 : else
226 0 : return AnimationEffect_OPEN_HORIZONTAL;
227 : case EK_close:
228 0 : if( eDirection == ED_vertical )
229 0 : return AnimationEffect_CLOSE_VERTICAL;
230 : else
231 0 : return AnimationEffect_CLOSE_HORIZONTAL;
232 : case EK_dissolve:
233 0 : return AnimationEffect_DISSOLVE;
234 : case EK_wavyline:
235 0 : switch( eDirection )
236 : {
237 0 : case ED_from_left: return AnimationEffect_WAVYLINE_FROM_LEFT;
238 0 : case ED_from_top: return AnimationEffect_WAVYLINE_FROM_TOP;
239 0 : case ED_from_right: return AnimationEffect_WAVYLINE_FROM_RIGHT;
240 0 : case ED_from_bottom: return AnimationEffect_WAVYLINE_FROM_BOTTOM;
241 0 : default: return AnimationEffect_WAVYLINE_FROM_LEFT;
242 : }
243 : case EK_random:
244 0 : return AnimationEffect_RANDOM;
245 : case EK_lines:
246 0 : if( eDirection == ED_vertical )
247 0 : return AnimationEffect_VERTICAL_LINES;
248 : else
249 0 : return AnimationEffect_HORIZONTAL_LINES;
250 : case EK_laser:
251 0 : switch( eDirection )
252 : {
253 0 : case ED_from_left: return AnimationEffect_LASER_FROM_LEFT;
254 0 : case ED_from_top: return AnimationEffect_LASER_FROM_TOP;
255 0 : case ED_from_right: return AnimationEffect_LASER_FROM_RIGHT;
256 0 : case ED_from_bottom: return AnimationEffect_LASER_FROM_BOTTOM;
257 0 : case ED_from_upperleft: return AnimationEffect_LASER_FROM_UPPERLEFT;
258 0 : case ED_from_upperright: return AnimationEffect_LASER_FROM_UPPERRIGHT;
259 0 : case ED_from_lowerleft: return AnimationEffect_LASER_FROM_LOWERLEFT;
260 0 : case ED_from_lowerright: return AnimationEffect_LASER_FROM_LOWERRIGHT;
261 0 : default: return AnimationEffect_LASER_FROM_LEFT;
262 : }
263 : case EK_appear:
264 0 : return AnimationEffect_APPEAR;
265 : case EK_hide:
266 0 : return AnimationEffect_HIDE;
267 : case EK_move_short:
268 0 : switch( eDirection )
269 : {
270 0 : case ED_from_left: return AnimationEffect_MOVE_SHORT_FROM_LEFT;
271 0 : case ED_from_top: return AnimationEffect_MOVE_SHORT_FROM_TOP;
272 0 : case ED_from_right: return AnimationEffect_MOVE_SHORT_FROM_RIGHT;
273 0 : case ED_from_bottom: return AnimationEffect_MOVE_SHORT_FROM_BOTTOM;
274 0 : case ED_from_upperleft: return AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT;
275 0 : case ED_from_upperright: return AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT;
276 0 : case ED_from_lowerleft: return AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT;
277 0 : case ED_from_lowerright: return AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT;
278 0 : case ED_to_left: return AnimationEffect_MOVE_SHORT_TO_LEFT;
279 0 : case ED_to_upperleft: return AnimationEffect_MOVE_SHORT_TO_UPPERLEFT;
280 0 : case ED_to_top: return AnimationEffect_MOVE_SHORT_TO_TOP;
281 0 : case ED_to_upperright: return AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT;
282 0 : case ED_to_right: return AnimationEffect_MOVE_SHORT_TO_RIGHT;
283 0 : case ED_to_lowerright: return AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT;
284 0 : case ED_to_bottom: return AnimationEffect_MOVE_SHORT_TO_BOTTOM;
285 0 : case ED_to_lowerleft: return AnimationEffect_MOVE_SHORT_TO_LOWERLEFT;
286 0 : default: return AnimationEffect_MOVE_SHORT_FROM_LEFT;
287 : }
288 : case EK_checkerboard:
289 0 : if( eDirection == ED_vertical )
290 0 : return AnimationEffect_VERTICAL_CHECKERBOARD;
291 : else
292 0 : return AnimationEffect_HORIZONTAL_CHECKERBOARD;
293 : case EK_rotate:
294 0 : if( eDirection == ED_vertical )
295 0 : return AnimationEffect_VERTICAL_ROTATE;
296 : else
297 0 : return AnimationEffect_HORIZONTAL_ROTATE;
298 : case EK_stretch:
299 0 : switch( eDirection )
300 : {
301 0 : case ED_from_left: return AnimationEffect_STRETCH_FROM_LEFT;
302 0 : case ED_from_top: return AnimationEffect_STRETCH_FROM_TOP;
303 0 : case ED_from_right: return AnimationEffect_STRETCH_FROM_RIGHT;
304 0 : case ED_from_bottom: return AnimationEffect_STRETCH_FROM_BOTTOM;
305 0 : case ED_from_upperleft: return AnimationEffect_STRETCH_FROM_UPPERLEFT;
306 0 : case ED_from_upperright: return AnimationEffect_STRETCH_FROM_UPPERRIGHT;
307 0 : case ED_from_lowerleft: return AnimationEffect_STRETCH_FROM_LOWERLEFT;
308 0 : case ED_from_lowerright: return AnimationEffect_STRETCH_FROM_LOWERRIGHT;
309 0 : case ED_vertical: return AnimationEffect_VERTICAL_STRETCH;
310 0 : case ED_horizontal: return AnimationEffect_HORIZONTAL_STRETCH;
311 : default:
312 0 : break;
313 : }
314 0 : return AnimationEffect_STRETCH_FROM_LEFT;
315 : default:
316 0 : return AnimationEffect_NONE;
317 : }
318 : }
319 :
320 : ///////////////////////////////////////////////////////////////////////
321 :
322 0 : class AnimImpImpl
323 : {
324 : public:
325 : Reference< XPropertySet > mxLastShape;
326 : OUString maLastShapeId;
327 :
328 : OUString msDimColor;
329 : OUString msDimHide;
330 : OUString msDimPrev;
331 : OUString msEffect;
332 : OUString msPlayFull;
333 : OUString msPresOrder;
334 : OUString msSound;
335 : OUString msSoundOn;
336 : OUString msSpeed;
337 : OUString msTextEffect;
338 : OUString msPresShapeService;
339 : OUString msAnimPath;
340 : OUString msIsAnimation;
341 :
342 0 : AnimImpImpl()
343 : : msDimColor( "DimColor" ),
344 : msDimHide( "DimHide" ),
345 : msDimPrev( "DimPrevious" ),
346 : msEffect( "Effect" ),
347 : msPlayFull( "PlayFull" ),
348 : msPresOrder( "PresentationOrder" ),
349 : msSound( "Sound" ),
350 : msSoundOn( "SoundOn" ),
351 : msSpeed( "Speed" ),
352 : msTextEffect( "TextEffect" ),
353 : msPresShapeService( "com.sun.star.presentation.Shape" ),
354 : msAnimPath( "AnimationPath" ),
355 0 : msIsAnimation( "IsAnimation" )
356 0 : {}
357 : };
358 :
359 : ///////////////////////////////////////////////////////////////////////
360 :
361 : enum XMLActionKind
362 : {
363 : XMLE_SHOW,
364 : XMLE_HIDE,
365 : XMLE_DIM,
366 : XMLE_PLAY
367 : };
368 :
369 : class XMLAnimationsEffectContext : public SvXMLImportContext
370 : {
371 : public:
372 : AnimImpImpl* mpImpl;
373 :
374 : XMLActionKind meKind;
375 : sal_Bool mbTextEffect;
376 : OUString maShapeId;
377 :
378 : XMLEffect meEffect;
379 : XMLEffectDirection meDirection;
380 : sal_Int16 mnStartScale;
381 :
382 : AnimationSpeed meSpeed;
383 : sal_Int32 maDimColor;
384 : OUString maSoundURL;
385 : sal_Bool mbPlayFull;
386 : OUString maPathShapeId;
387 :
388 : public:
389 : TYPEINFO();
390 :
391 : XMLAnimationsEffectContext( SvXMLImport& rImport,
392 : sal_uInt16 nPrfx,
393 : const OUString& rLocalName,
394 : const Reference< XAttributeList >& xAttrList,
395 : AnimImpImpl* pImpl);
396 : virtual ~XMLAnimationsEffectContext();
397 :
398 : virtual void EndElement();
399 :
400 : virtual SvXMLImportContext * CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
401 : const Reference< XAttributeList >& xAttrList );
402 : };
403 :
404 : class XMLAnimationsSoundContext : public SvXMLImportContext
405 : {
406 : XMLAnimationsEffectContext* mpParent;
407 :
408 : public:
409 : TYPEINFO();
410 :
411 : XMLAnimationsSoundContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent );
412 : virtual ~XMLAnimationsSoundContext();
413 : };
414 :
415 0 : TYPEINIT1( XMLAnimationsSoundContext, SvXMLImportContext );
416 :
417 0 : XMLAnimationsSoundContext::XMLAnimationsSoundContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, XMLAnimationsEffectContext* pParent )
418 0 : : SvXMLImportContext( rImport, nPrfx, rLocalName ), mpParent( pParent )
419 : {
420 0 : if( mpParent && nPrfx == XML_NAMESPACE_PRESENTATION && IsXMLToken( rLocalName, XML_SOUND ) )
421 : {
422 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
423 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
424 : {
425 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
426 0 : OUString aLocalName;
427 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
428 0 : OUString sValue = xAttrList->getValueByIndex( i );
429 :
430 0 : switch( nPrefix )
431 : {
432 : case XML_NAMESPACE_XLINK:
433 0 : if( IsXMLToken( aLocalName, XML_HREF ) )
434 : {
435 0 : mpParent->maSoundURL = rImport.GetAbsoluteReference(sValue);
436 : }
437 0 : break;
438 : case XML_NAMESPACE_PRESENTATION:
439 0 : if( IsXMLToken( aLocalName, XML_PLAY_FULL ) )
440 : {
441 0 : mpParent->mbPlayFull = IsXMLToken( sValue, XML_TRUE );
442 : }
443 : }
444 0 : }
445 : }
446 0 : }
447 :
448 0 : XMLAnimationsSoundContext::~XMLAnimationsSoundContext()
449 : {
450 0 : }
451 :
452 :
453 0 : TYPEINIT1( XMLAnimationsEffectContext, SvXMLImportContext );
454 :
455 0 : XMLAnimationsEffectContext::XMLAnimationsEffectContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const Reference< XAttributeList >& xAttrList, AnimImpImpl* pImpl )
456 : : SvXMLImportContext(rImport, nPrfx, rLocalName),
457 : mpImpl( pImpl ),
458 : meKind( XMLE_SHOW ), mbTextEffect( sal_False ),
459 : meEffect( EK_none ), meDirection( ED_none ), mnStartScale( 100 ),
460 0 : meSpeed( AnimationSpeed_MEDIUM ), maDimColor(0), mbPlayFull( sal_False )
461 : {
462 0 : if( IsXMLToken( rLocalName, XML_SHOW_SHAPE ) )
463 : {
464 0 : meKind = XMLE_SHOW;
465 : }
466 0 : else if( IsXMLToken( rLocalName, XML_SHOW_TEXT ) )
467 : {
468 0 : meKind = XMLE_SHOW;
469 0 : mbTextEffect = sal_True;
470 : }
471 0 : else if( IsXMLToken( rLocalName, XML_HIDE_SHAPE ) )
472 : {
473 0 : meKind = XMLE_HIDE;
474 : }
475 0 : else if( IsXMLToken( rLocalName, XML_HIDE_TEXT ) )
476 : {
477 0 : meKind = XMLE_HIDE;
478 0 : mbTextEffect = sal_True;
479 : }
480 0 : else if( IsXMLToken( rLocalName, XML_DIM ) )
481 : {
482 0 : meKind = XMLE_DIM;
483 : }
484 0 : else if( IsXMLToken( rLocalName, XML_PLAY ) )
485 : {
486 0 : meKind = XMLE_PLAY;
487 : }
488 : else
489 : {
490 : // unknown action, overread
491 0 : return;
492 : }
493 :
494 : // read attributes
495 0 : const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
496 0 : for(sal_Int16 i=0; i < nAttrCount; i++)
497 : {
498 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
499 0 : OUString aLocalName;
500 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
501 0 : OUString sValue = xAttrList->getValueByIndex( i );
502 :
503 0 : switch( nPrefix )
504 : {
505 : case XML_NAMESPACE_DRAW:
506 0 : if( IsXMLToken( aLocalName, XML_SHAPE_ID ) )
507 : {
508 0 : maShapeId = sValue;
509 : }
510 0 : else if( IsXMLToken( aLocalName, XML_COLOR ) )
511 : {
512 0 : ::sax::Converter::convertColor(maDimColor, sValue);
513 : }
514 0 : break;
515 :
516 : case XML_NAMESPACE_PRESENTATION:
517 0 : if( IsXMLToken( aLocalName, XML_EFFECT ) )
518 : {
519 : sal_uInt16 eEnum;
520 0 : if( SvXMLUnitConverter::convertEnum( eEnum, sValue, aXML_AnimationEffect_EnumMap ) )
521 0 : meEffect = (XMLEffect)eEnum;
522 : }
523 0 : else if( IsXMLToken(aLocalName, XML_DIRECTION ) )
524 : {
525 : sal_uInt16 eEnum;
526 0 : if( SvXMLUnitConverter::convertEnum( eEnum, sValue, aXML_AnimationDirection_EnumMap ) )
527 0 : meDirection = (XMLEffectDirection)eEnum;
528 : }
529 0 : else if( IsXMLToken( aLocalName, XML_START_SCALE ) )
530 : {
531 : sal_Int32 nScale;
532 0 : if (::sax::Converter::convertPercent( nScale, sValue ))
533 0 : mnStartScale = (sal_Int16)nScale;
534 : }
535 0 : else if( IsXMLToken( aLocalName, XML_SPEED ) )
536 : {
537 : sal_uInt16 eEnum;
538 0 : if( SvXMLUnitConverter::convertEnum( eEnum, sValue, aXML_AnimationSpeed_EnumMap ) )
539 0 : meSpeed = (AnimationSpeed)eEnum;
540 : }
541 0 : else if( IsXMLToken( aLocalName, XML_PATH_ID ) )
542 : {
543 0 : maPathShapeId = sValue;
544 : }
545 0 : break;
546 : }
547 0 : }
548 : }
549 :
550 0 : XMLAnimationsEffectContext::~XMLAnimationsEffectContext()
551 : {
552 0 : }
553 :
554 0 : SvXMLImportContext * XMLAnimationsEffectContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< XAttributeList>& xAttrList )
555 : {
556 0 : return new XMLAnimationsSoundContext( GetImport(), nPrefix, rLocalName, xAttrList, this );
557 : }
558 :
559 0 : void XMLAnimationsEffectContext::EndElement()
560 : {
561 : // set effect on shape
562 :
563 : try
564 : {
565 0 : UniReference< XMLShapeImportHelper > xShapeImport( GetImport().GetShapeImport() );
566 0 : Any aAny;
567 :
568 0 : if( !maShapeId.isEmpty() )
569 : {
570 0 : Reference< XPropertySet > xSet;
571 0 : if( mpImpl->maLastShapeId != maShapeId )
572 : {
573 0 : xSet = Reference< XPropertySet >::query( GetImport().getInterfaceToIdentifierMapper().getReference( maShapeId ) );
574 0 : if( xSet.is() )
575 : {
576 : // check for presentation shape service
577 : {
578 0 : Reference< XServiceInfo > xServiceInfo( xSet, UNO_QUERY );
579 0 : if( !xServiceInfo.is() || !xServiceInfo->supportsService( mpImpl->msPresShapeService ) )
580 0 : return;
581 : }
582 :
583 0 : mpImpl->maLastShapeId = maShapeId;
584 0 : mpImpl->mxLastShape = xSet;
585 : }
586 : }
587 : else
588 : {
589 0 : xSet = mpImpl->mxLastShape;
590 : }
591 :
592 0 : if( xSet.is() )
593 : {
594 0 : if( meKind == XMLE_DIM )
595 : {
596 0 : aAny <<= (sal_Bool)sal_True;
597 0 : xSet->setPropertyValue( mpImpl->msDimPrev, aAny );
598 :
599 0 : aAny <<= maDimColor;
600 0 : xSet->setPropertyValue( mpImpl->msDimColor, aAny );
601 : }
602 0 : else if( meKind == XMLE_PLAY )
603 : {
604 0 : aAny <<= (sal_Bool)sal_True;
605 0 : xSet->setPropertyValue( mpImpl->msIsAnimation, aAny );
606 :
607 0 : aAny <<= meSpeed;
608 0 : xSet->setPropertyValue( mpImpl->msSpeed, aAny );
609 : }
610 : else
611 : {
612 0 : if( meKind == XMLE_HIDE && !mbTextEffect && meEffect == EK_none )
613 : {
614 0 : aAny = bool2any( sal_True );
615 0 : xSet->setPropertyValue( mpImpl->msDimHide, aAny );
616 : }
617 : else
618 : {
619 0 : const AnimationEffect eEffect = ImplSdXMLgetEffect( meEffect, meDirection, mnStartScale, meKind == XMLE_SHOW );
620 :
621 0 : xSet->setPropertyValue( mbTextEffect ? mpImpl->msTextEffect : mpImpl->msEffect, makeAny( eEffect ) );
622 0 : xSet->setPropertyValue( mpImpl->msSpeed, makeAny( meSpeed ) );
623 :
624 0 : if( eEffect == AnimationEffect_PATH && !maPathShapeId.isEmpty() )
625 : {
626 0 : Reference< XShape > xPath( GetImport().getInterfaceToIdentifierMapper().getReference( maPathShapeId ), UNO_QUERY );
627 0 : if( xPath.is() )
628 0 : xSet->setPropertyValue( mpImpl->msAnimPath, makeAny( xPath ) );
629 : }
630 : }
631 : }
632 : }
633 0 : if( !maSoundURL.isEmpty() )
634 : {
635 0 : if( xSet.is() )
636 : {
637 0 : aAny <<= maSoundURL;
638 0 : xSet->setPropertyValue( mpImpl->msSound, aAny );
639 :
640 0 : aAny <<= bool2any( mbPlayFull );
641 0 : xSet->setPropertyValue( mpImpl->msPlayFull, aAny );
642 :
643 0 : aAny <<= bool2any( sal_True );
644 0 : xSet->setPropertyValue( mpImpl->msSoundOn, aAny );
645 : }
646 : else
647 : {
648 : OSL_FAIL("XMLAnimationsEffectContext::EndElement - Sound URL without a XPropertySet!");
649 : }
650 0 : }
651 0 : }
652 : }
653 0 : catch (const Exception&)
654 : {
655 : OSL_FAIL( "exception caught while importing animation information!" );
656 : }
657 : }
658 :
659 : ///////////////////////////////////////////////////////////////////////
660 :
661 0 : TYPEINIT1( XMLAnimationsContext, SvXMLImportContext );
662 :
663 0 : XMLAnimationsContext::XMLAnimationsContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName,
664 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& )
665 0 : : SvXMLImportContext(rImport, nPrfx, rLocalName)
666 : {
667 0 : mpImpl = new AnimImpImpl();
668 0 : }
669 :
670 0 : XMLAnimationsContext::~XMLAnimationsContext()
671 : {
672 0 : delete mpImpl;
673 0 : }
674 :
675 0 : SvXMLImportContext * XMLAnimationsContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName,
676 : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
677 : {
678 0 : return new XMLAnimationsEffectContext( GetImport(), nPrefix, rLocalName, xAttrList, mpImpl );
679 : }
680 :
681 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|