xref: /trunk/main/oox/source/ppt/animationspersist.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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/animationspersist.hxx"
29 
30 #include <rtl/ustring.hxx>
31 #include <com/sun/star/uno/Any.hxx>
32 #include <com/sun/star/drawing/XShape.hpp>
33 #include <com/sun/star/text/XText.hpp>
34 #include <com/sun/star/presentation/ParagraphTarget.hpp>
35 #include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
36 
37 #include "oox/drawingml/shape.hxx"
38 
39 using rtl::OUString;
40 using namespace ::com::sun::star::uno;
41 using namespace ::com::sun::star::presentation;
42 using namespace ::com::sun::star::drawing;
43 using namespace ::com::sun::star::text;
44 
45 namespace oox { namespace ppt {
46 
47     void ShapeTargetElement::convert( ::com::sun::star::uno::Any & rTarget, sal_Int16 & rSubType ) const
48     {
49         switch(mnType)
50         {
51         case XML_subSp:
52             rSubType = ShapeAnimationSubType::AS_WHOLE;
53             break;
54         case XML_bg:
55             rSubType = ShapeAnimationSubType::ONLY_BACKGROUND;
56             break;
57         case XML_txEl:
58         {
59             ParagraphTarget aParaTarget;
60             Reference< XShape > xShape;
61             rTarget >>= xShape;
62             aParaTarget.Shape = xShape;
63             rSubType = ShapeAnimationSubType::ONLY_TEXT;
64 
65             Reference< XText > xText( xShape, UNO_QUERY );
66             if( xText.is() )
67             {
68                 switch(mnRangeType)
69                 {
70                 case XML_charRg:
71                     // TODO calculate the corresponding paragraph for the text range....
72                     OSL_TRACE( "OOX: TODO calculate the corresponding paragraph for the text range..." );
73                     break;
74                 case XML_pRg:
75                     aParaTarget.Paragraph = static_cast< sal_Int16 >( maRange.start );
76                     // TODO what to do with more than one.
77                     OSL_TRACE( "OOX: TODO what to do with more than one" );
78                     break;
79                 }
80                 rTarget = makeAny( aParaTarget );
81             }
82             break;
83         }
84         default:
85             break;
86         }
87     }
88 
89 
90     Any AnimTargetElement::convert(const SlidePersistPtr & pSlide, sal_Int16 & nSubType) const
91     {
92         Any aTarget;
93         // see sd/source/files/ppt/pptinanimations.cxx:3191 (in importTargetElementContainer())
94         switch(mnType)
95         {
96         case XML_inkTgt:
97             // TODO
98             OSL_TRACE( "OOX: TODO inkTgt" );
99             break;
100         case XML_sldTgt:
101             // TODO
102             OSL_TRACE( "OOX: TODO sldTgt" );
103             break;
104         case XML_sndTgt:
105             aTarget = makeAny(msValue);
106             break;
107         case XML_spTgt:
108         {
109             Any rTarget;
110             ::oox::drawingml::ShapePtr pShape = pSlide->getShape(msValue);
111             OSL_ENSURE( pShape, "failed to locate Shape");
112             if( pShape )
113             {
114                 Reference< XShape > xShape( pShape->getXShape() );
115                 OSL_ENSURE( xShape.is(), "fail to get XShape from shape" );
116                 if( xShape.is() )
117                 {
118                     rTarget <<= xShape;
119                     maShapeTarget.convert(rTarget, nSubType);
120                     aTarget = rTarget;
121                 }
122             }
123             break;
124         }
125         default:
126             break;
127         }
128         return aTarget;
129     }
130 
131 
132 // BEGIN CUT&PASTE from sd/source/filter/ppt/pptinanimations.cxx
133 /** this adds an any to another any.
134     if rNewValue is empty, rOldValue is returned.
135     if rOldValue is empty, rNewValue is returned.
136     if rOldValue contains a value, a sequence with rOldValue and rNewValue is returned.
137     if rOldValue contains a sequence, a new sequence with the old sequence and rNewValue is returned.
138 */
139     static Any addToSequence( const Any& rOldValue, const Any& rNewValue )
140     {
141         if( !rNewValue.hasValue() )
142         {
143             return rOldValue;
144         }
145         else if( !rOldValue.hasValue() )
146         {
147             return rNewValue;
148         }
149         else
150         {
151             Sequence< Any > aNewSeq;
152             if( rOldValue >>= aNewSeq )
153             {
154                 sal_Int32 nSize = aNewSeq.getLength();
155                 aNewSeq.realloc(nSize+1);
156                 aNewSeq[nSize] = rNewValue;
157             }
158             else
159             {
160                 aNewSeq.realloc(2);
161                 aNewSeq[0] = rOldValue;
162                 aNewSeq[1] = rNewValue;
163             }
164             return makeAny( aNewSeq );
165         }
166     }
167 // END
168 
169     Any AnimationCondition::convert(const SlidePersistPtr & pSlide) const
170     {
171         Any aAny;
172         if( mpTarget )
173         {
174             sal_Int16 nSubType;
175             aAny = mpTarget->convert( pSlide, nSubType );
176         }
177         else
178         {
179             aAny = maValue;
180         }
181         return aAny;
182     }
183 
184 
185     Any AnimationCondition::convertList(const SlidePersistPtr & pSlide, const AnimationConditionList & l)
186     {
187         Any aAny;
188         for( AnimationConditionList::const_iterator iter = l.begin();
189              iter != l.end(); iter++)
190         {
191             aAny = addToSequence( aAny, iter->convert(pSlide) );
192         }
193         return aAny;
194     }
195 
196 } }
197 
198 
199