xref: /trunk/main/oox/source/ppt/slidetransition.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include "oox/ppt/slidetransition.hxx"
29 
30 #include <com/sun/star/uno/Any.hxx>
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <com/sun/star/presentation/AnimationSpeed.hpp>
33 #include <com/sun/star/animations/TransitionType.hpp>
34 #include <com/sun/star/animations/TransitionSubType.hpp>
35 
36 #include "oox/helper/helper.hxx"
37 #include "oox/helper/propertymap.hxx"
38 #include "oox/token/namespaces.hxx"
39 #include "oox/token/tokens.hxx"
40 #include "pptfilterhelpers.hxx"
41 
42 using rtl::OUString;
43 using namespace ::com::sun::star::uno;
44 using namespace ::com::sun::star::beans;
45 using namespace ::com::sun::star::animations;
46 using namespace ::com::sun::star::presentation;
47 
48 namespace oox { namespace ppt {
49 
50 
51     SlideTransition::SlideTransition()
52         : mnTransitionType( 0 )
53         , mnTransitionSubType( 0 )
54         , mbTransitionDirectionNormal( true )
55         , mnAnimationSpeed( AnimationSpeed_FAST )
56         , mnFadeColor( 0 )
57         , mbMode( true )
58     {
59 
60     }
61 
62 
63     SlideTransition::SlideTransition(const OUString & sFilterName)
64         : mnTransitionType( 0 )
65         , mnTransitionSubType( 0 )
66         , mbTransitionDirectionNormal( true )
67         , mnAnimationSpeed( AnimationSpeed_FAST )
68         , mnFadeColor( 0 )
69         , mbMode( true )
70     {
71         const transition *p = transition::find( sFilterName );
72         if( p )
73         {
74             mnTransitionType = p->mnType;
75             mnTransitionSubType = p->mnSubType;
76             mbTransitionDirectionNormal = p->mbDirection;
77         }
78     }
79 
80 
81     void SlideTransition::setSlideProperties( PropertyMap & aProps )
82     {
83         try
84         {
85             aProps[ PROP_TransitionType ] <<= mnTransitionType;
86             aProps[ PROP_TransitionSubtype ] <<= mnTransitionSubType;
87             aProps[ PROP_TransitionDirection ] <<= mbTransitionDirectionNormal;
88             aProps[ PROP_Speed ] <<= mnAnimationSpeed;
89             aProps[ PROP_TransitionFadeColor ] <<= mnFadeColor;
90         }
91         catch( Exception& )
92         {
93             // should not happen
94             OSL_ENSURE( false, "exception raised" );
95         }
96     }
97 
98     void SlideTransition::setTransitionFilterProperties( const Reference< XTransitionFilter > & xFilter )
99     {
100         try
101         {
102             xFilter->setTransition( mnTransitionType );
103             xFilter->setSubtype( mnTransitionSubType );
104             xFilter->setDirection( mbTransitionDirectionNormal );
105             xFilter->setFadeColor( mnFadeColor );
106             xFilter->setMode( mbMode );
107         }
108         catch( Exception& )
109         {
110             // should not happen
111             OSL_ENSURE( false, "exception raised" );
112         }
113     }
114 
115 
116     void SlideTransition::setOoxTransitionSpeed( sal_Int32 nToken)
117     {
118         switch( nToken  )
119         {
120             /* In case you want to use time values in second,
121              * the speed values are located in the PPT97 importer
122              * sd/source/filter/ppt/ppt97animations.cxx:664
123              * (void Ppt97Animation::UpdateCacheData() const)
124              */
125         case XML_fast:
126             mnAnimationSpeed = AnimationSpeed_FAST;
127             break;
128         case XML_med:
129             mnAnimationSpeed = AnimationSpeed_MEDIUM;
130             break;
131         case XML_slow:
132             mnAnimationSpeed = AnimationSpeed_SLOW;
133             break;
134         default:
135             // should not happen. just ignore
136             break;
137         }
138     }
139 
140 
141 
142     sal_Int16 SlideTransition::ooxToOdpEightDirections( ::sal_Int32 nOoxType )
143     {
144     sal_Int16 nOdpDirection;
145         nOdpDirection = ooxToOdpBorderDirections( nOoxType );
146         if( nOdpDirection == 0 )
147         {
148             nOdpDirection = ooxToOdpCornerDirections( nOoxType );
149         }
150         return nOdpDirection;
151     }
152 
153 
154     sal_Int16 SlideTransition::ooxToOdpBorderDirections( ::sal_Int32 nOoxType )
155     {
156     sal_Int16 nOdpDirection;
157         switch( nOoxType )
158         {
159         case XML_d:
160             nOdpDirection = TransitionSubType::FROMTOP;
161             break;
162         case XML_l:
163             nOdpDirection = TransitionSubType::FROMLEFT;
164             break;
165         case XML_r:
166             nOdpDirection = TransitionSubType::FROMRIGHT;
167             break;
168         case XML_u:
169             nOdpDirection = TransitionSubType::FROMBOTTOM;
170             break;
171         default:
172             nOdpDirection= 0;
173             break;
174         }
175         return nOdpDirection;
176     }
177 
178     sal_Int16 SlideTransition::ooxToOdpSideDirections( ::sal_Int32 nOoxType )
179     {
180     sal_Int16 nOdpDirection;
181         switch( nOoxType )
182         {
183         case XML_d:
184         case XML_u:
185             nOdpDirection = TransitionSubType::TOPTOBOTTOM;
186             break;
187         case XML_l:
188         case XML_r:
189             nOdpDirection = TransitionSubType::LEFTTORIGHT;
190             break;
191         default:
192             nOdpDirection= 0;
193             break;
194         }
195         return nOdpDirection;
196     }
197 
198     sal_Bool SlideTransition::ooxToOdpSideDirectionsDirectionNormal( ::sal_Int32 nOoxType )
199     {
200     sal_Bool nOdpDirection = true;
201         switch( nOoxType )
202         {
203         case XML_u:
204         case XML_l:
205             nOdpDirection = false;
206             break;
207         }
208         return nOdpDirection;
209     }
210 
211     sal_Int16 SlideTransition::ooxToOdpCornerDirections( ::sal_Int32 nOoxType )
212     {
213     sal_Int16 nOdpDirection;
214         switch( nOoxType )
215         {
216         case XML_lu:
217             nOdpDirection = TransitionSubType::FROMBOTTOMRIGHT;
218             break;
219         case XML_ru:
220             nOdpDirection = TransitionSubType::FROMBOTTOMLEFT;
221             break;
222         case XML_ld:
223             nOdpDirection = TransitionSubType::FROMTOPRIGHT;
224             break;
225         case XML_rd:
226             nOdpDirection = TransitionSubType::FROMTOPLEFT;
227             break;
228         default:
229             nOdpDirection = 0;
230             break;
231         }
232         return nOdpDirection;
233     }
234 
235 
236     sal_Int16 SlideTransition::ooxToOdpDirection( ::sal_Int32 nOoxType )
237     {
238     sal_Int16 nOdpDir;
239         switch( nOoxType )
240         {
241         case XML_vert:
242             nOdpDir = TransitionSubType::VERTICAL;
243             break;
244         case XML_horz:
245             nOdpDir = TransitionSubType::HORIZONTAL;
246             break;
247         default:
248             nOdpDir = 0;
249             break;
250         }
251         return nOdpDir;
252     }
253 
254     void SlideTransition::setOoxTransitionType( ::sal_Int32 OoxType, ::sal_Int32 param1, ::sal_Int32 param2 )
255     {
256         switch( OoxType )
257         {
258         case PPT_TOKEN( blinds ):
259             mnTransitionType = TransitionType::BLINDSWIPE;
260             mnTransitionSubType = ooxToOdpDirection( param1 );
261             break;
262         case PPT_TOKEN( checker ):
263             mnTransitionType = TransitionType::CHECKERBOARDWIPE;
264             switch ( param1 )
265             {
266             case XML_vert:
267                 mnTransitionSubType = TransitionSubType::DOWN;
268                 break;
269             case XML_horz:
270                 mnTransitionSubType = TransitionSubType::ACROSS;
271                 break;
272             default:
273                 break;
274             }
275             break;
276         case PPT_TOKEN( comb ):
277             mnTransitionType = TransitionType::PUSHWIPE;
278             switch( param1 )
279             {
280             case XML_vert:
281                 mnTransitionSubType = TransitionSubType::COMBVERTICAL;
282                 break;
283             case XML_horz:
284                 mnTransitionSubType = TransitionSubType::COMBHORIZONTAL;
285                 break;
286             default:
287                 break;
288             }
289             break;
290         case PPT_TOKEN( cover ):
291             mnTransitionType = TransitionType::SLIDEWIPE;
292             mnTransitionSubType = ooxToOdpEightDirections( param1 );
293             break;
294         case PPT_TOKEN( pull ): // uncover
295             mnTransitionType = TransitionType::SLIDEWIPE;
296             mnTransitionSubType = ooxToOdpEightDirections( param1 );
297             mbTransitionDirectionNormal = false;
298             break;
299         case PPT_TOKEN( cut ):
300             // The binfilter seems to ignore this transition.
301             // Fade to black instead if thrBlk is true.
302             if( param1 )
303             {
304                 mnTransitionType = TransitionType::FADE;
305                 mnTransitionSubType = TransitionSubType::FADEOVERCOLOR;
306             }
307             OSL_TRACE( "OOX: cut transition fallback." );
308             break;
309         case PPT_TOKEN( fade ):
310             mnTransitionType = TransitionType::FADE;
311             if( param1 )
312             {
313                 mnTransitionSubType = TransitionSubType::FADEOVERCOLOR;
314             }
315             else
316             {
317                 mnTransitionSubType = TransitionSubType::CROSSFADE;
318             }
319             break;
320         case PPT_TOKEN( push ):
321             mnTransitionType = TransitionType::PUSHWIPE;
322             mnTransitionSubType = ooxToOdpBorderDirections( param1 );
323             break;
324         case PPT_TOKEN( wipe ):
325             mnTransitionType = TransitionType::BARWIPE;
326             mnTransitionSubType = ooxToOdpSideDirections( param1 );
327             mbTransitionDirectionNormal = ooxToOdpSideDirectionsDirectionNormal( param1 );
328             break;
329         case PPT_TOKEN( split ):
330             mnTransitionType = TransitionType::BARNDOORWIPE;
331             mnTransitionSubType = ooxToOdpDirection( param1 );
332             if( param2 == XML_in )
333             {
334                 // reverse
335                 mbTransitionDirectionNormal = false;
336             }
337             break;
338         case PPT_TOKEN( wheel ):
339             mnTransitionType = TransitionType::PINWHEELWIPE;
340             switch( param1 )
341             {
342             case 1:
343                 mnTransitionSubType = TransitionSubType::ONEBLADE;
344                 break;
345             case 2:
346                 mnTransitionSubType = TransitionSubType::TWOBLADEVERTICAL;
347                 break;
348             case 3:
349                 mnTransitionSubType = TransitionSubType::THREEBLADE;
350                 break;
351             case 4:
352                 mnTransitionSubType = TransitionSubType::FOURBLADE;
353                 break;
354             case 8:
355                 mnTransitionSubType = TransitionSubType::EIGHTBLADE;
356                 break;
357             default:
358                 OSL_TRACE( "OOX: strange number of blades for thw wheel-wipe %d", param1 );
359                 if( param1 > 8 )
360                 {
361                     mnTransitionSubType = TransitionSubType::EIGHTBLADE;
362                 }
363                 else if( param1 > 4 )
364                 {
365                     mnTransitionSubType = TransitionSubType::FOURBLADE;
366                 }
367                 else if( param1 == 0)
368                 {
369                     mnTransitionSubType = TransitionSubType::ONEBLADE;
370                 }
371                 break;
372             }
373             break;
374         case PPT_TOKEN( randomBar ):
375             mnTransitionType = TransitionType::RANDOMBARWIPE;
376             mnTransitionSubType = ooxToOdpDirection( param1 );
377             break;
378         case PPT_TOKEN( circle ):
379             mnTransitionType = TransitionType::ELLIPSEWIPE;
380             mnTransitionSubType = TransitionSubType::CIRCLE;
381             break;
382         case PPT_TOKEN( diamond ):
383             mnTransitionType = TransitionType::IRISWIPE;
384             mnTransitionSubType = TransitionSubType::DIAMOND;
385             break;
386         case PPT_TOKEN( dissolve ):
387             mnTransitionType = TransitionType::DISSOLVE;
388             mnTransitionSubType = TransitionSubType::DEFAULT;
389             break;
390         case PPT_TOKEN( newsflash ):
391             // this is what the PPT binary filter does.... not sure I agree.
392             mnTransitionType = TransitionType::FOURBOXWIPE;
393             mnTransitionSubType = TransitionSubType::CORNERSOUT;
394             break;
395         case PPT_TOKEN( plus ):
396             mnTransitionType = TransitionType::FOURBOXWIPE;
397             mnTransitionSubType = TransitionSubType::CORNERSOUT;
398             break;
399         case PPT_TOKEN( random ):
400             mnTransitionType = TransitionType::RANDOM;
401             mnTransitionSubType = TransitionSubType::DEFAULT;
402             break;
403         case PPT_TOKEN( wedge ):
404             mnTransitionType = TransitionType::FANWIPE;
405             mnTransitionSubType = TransitionSubType::CENTERTOP;
406             break;
407         case PPT_TOKEN( zoom ):
408             mnTransitionType = TransitionType::ZOOM;
409             mnTransitionSubType = TransitionSubType::DEFAULT;
410             break;
411         default:
412             mnTransitionType = 0;
413             break;
414         }
415     }
416 
417 
418 } }
419