Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
31 : : #include <com/sun/star/lang/XServiceInfo.hpp>
32 : : #include <com/sun/star/lang/XInitialization.hpp>
33 : : #include <com/sun/star/animations/AnimationTransformType.hpp>
34 : : #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
35 : : #include <com/sun/star/presentation/AnimationEffect.hpp>
36 : : #include <com/sun/star/presentation/AnimationSpeed.hpp>
37 : : #include <com/sun/star/animations/AnimationNodeType.hpp>
38 : : #include <com/sun/star/animations/XIterateContainer.hpp>
39 : : #include <com/sun/star/animations/XAnimateMotion.hpp>
40 : : #include <com/sun/star/animations/XAnimateColor.hpp>
41 : : #include <com/sun/star/animations/XAnimateTransform.hpp>
42 : : #include <com/sun/star/animations/XTransitionFilter.hpp>
43 : : #include <com/sun/star/animations/XCommand.hpp>
44 : : #include <com/sun/star/animations/XAudio.hpp>
45 : : #include <com/sun/star/animations/ValuePair.hpp>
46 : : #include <com/sun/star/animations/AnimationColorSpace.hpp>
47 : : #include <com/sun/star/presentation/EffectPresetClass.hpp>
48 : : #include <com/sun/star/animations/Timing.hpp>
49 : : #include <com/sun/star/animations/Event.hpp>
50 : : #include <com/sun/star/beans/XPropertySet.hpp>
51 : : #include <com/sun/star/xml/sax/XAttributeList.hpp>
52 : : #include <com/sun/star/text/XTextCursor.hpp>
53 : : #include <com/sun/star/text/XTextRangeCompare.hpp>
54 : : #include <com/sun/star/presentation/ParagraphTarget.hpp>
55 : : #include <com/sun/star/container/XEnumerationAccess.hpp>
56 : : #include <com/sun/star/animations/EventTrigger.hpp>
57 : : #include <com/sun/star/presentation/EffectCommands.hpp>
58 : : #include <com/sun/star/util/Duration.hpp>
59 : : #include <comphelper/processfactory.hxx>
60 : : #include <cppuhelper/implbase1.hxx>
61 : :
62 : : #include <sax/tools/converter.hxx>
63 : :
64 : : #include <list>
65 : : #include <xmloff/xmltypes.hxx>
66 : : #include "sdpropls.hxx"
67 : : #include <xmloff/xmltoken.hxx>
68 : : #include <xmloff/xmlimp.hxx>
69 : : #include "xmloff/xmlnmspe.hxx"
70 : : #include <xmloff/xmluconv.hxx>
71 : : #include <osl/mutex.hxx>
72 : : #include <xmloff/nmspmap.hxx>
73 : : #include "anim.hxx"
74 : :
75 : : #include "animations.hxx"
76 : : #include "animationimport.hxx"
77 : :
78 : : using ::rtl::OUString;
79 : : using ::rtl::OUStringBuffer;
80 : :
81 : : using namespace ::std;
82 : : using namespace ::cppu;
83 : : using namespace ::com::sun::star::beans;
84 : : using namespace ::com::sun::star::animations;
85 : : using namespace ::com::sun::star::presentation;
86 : : using namespace ::com::sun::star::drawing;
87 : : using namespace ::xmloff::token;
88 : :
89 : : using ::com::sun::star::xml::sax::XAttributeList;
90 : : using ::com::sun::star::uno::Any;
91 : : using ::com::sun::star::uno::makeAny;
92 : : using ::com::sun::star::uno::UNO_QUERY;
93 : : using ::com::sun::star::uno::UNO_QUERY_THROW;
94 : : using ::com::sun::star::uno::Reference;
95 : : using ::com::sun::star::uno::Sequence;
96 : : using ::com::sun::star::uno::RuntimeException;
97 : : using ::com::sun::star::uno::Exception;
98 : : using ::com::sun::star::uno::XInterface;
99 : : using ::com::sun::star::uno::Type;
100 : : using ::com::sun::star::beans::NamedValue;
101 : : using ::com::sun::star::text::XTextRange;
102 : : using ::com::sun::star::text::XTextCursor;
103 : : using ::com::sun::star::text::XTextRangeCompare;
104 : : using ::com::sun::star::container::XEnumerationAccess;
105 : : using ::com::sun::star::container::XEnumeration;
106 : : using ::com::sun::star::lang::XMultiServiceFactory;
107 : : using ::com::sun::star::lang::XInitialization;
108 : :
109 : : namespace xmloff
110 : : {
111 : :
112 : : ///////////////////////////////////////////////////////////////////////
113 : :
114 : :
115 : :
116 : : ///////////////////////////////////////////////////////////////////////
117 : :
118 : :
119 : : ///////////////////////////////////////////////////////////////////////
120 : :
121 : : class AnimationsImportHelperImpl
122 : : {
123 : : private:
124 : : SvXMLImport& mrImport;
125 : :
126 : : SvXMLTokenMap* mpAnimationNodeTokenMap;
127 : : SvXMLTokenMap* mpAnimationNodeAttributeTokenMap;
128 : :
129 : : public:
130 : : AnimationsImportHelperImpl( SvXMLImport& rImport );
131 : : ~AnimationsImportHelperImpl();
132 : :
133 : : const SvXMLTokenMap& getAnimationNodeTokenMap();
134 : : const SvXMLTokenMap& getAnimationNodeAttributeTokenMap();
135 : :
136 : : Any convertValue( XMLTokenEnum eAttributeName, const OUString& rValue );
137 : : Sequence< Any > convertValueSequence( XMLTokenEnum eAttributeName, const OUString& rValue );
138 : :
139 : : Any convertTarget( const OUString& rValue );
140 : : Any convertPath( const OUString& rValue );
141 : : Any convertTiming( const OUString& rValue );
142 : : Sequence< double > convertKeyTimes( const OUString& rValue );
143 : : Sequence< TimeFilterPair > convertTimeFilter( const OUString& rValue );
144 : :
145 : : bool convertAnimationValue( XMLTokenEnum eAttributeName, Any& rValue );
146 : : const OUString mastrHSL;
147 : : };
148 : :
149 : 4 : AnimationsImportHelperImpl::AnimationsImportHelperImpl( SvXMLImport& rImport )
150 : : : mrImport( rImport ),
151 : : mpAnimationNodeTokenMap( NULL ),
152 : : mpAnimationNodeAttributeTokenMap( NULL ),
153 : 4 : mastrHSL( RTL_CONSTASCII_USTRINGPARAM( "hsl" ) )
154 : : {
155 : 4 : }
156 : :
157 : 4 : AnimationsImportHelperImpl::~AnimationsImportHelperImpl()
158 : : {
159 [ + - ][ + - ]: 4 : delete mpAnimationNodeTokenMap;
160 [ + - ][ + - ]: 4 : delete mpAnimationNodeAttributeTokenMap;
161 : 4 : }
162 : :
163 : 324 : const SvXMLTokenMap& AnimationsImportHelperImpl::getAnimationNodeTokenMap()
164 : : {
165 [ + + ]: 324 : if( mpAnimationNodeTokenMap == NULL )
166 : : {
167 : : static SvXMLTokenMapEntry aAnimationNodeTokenMap[] =
168 : : {
169 : : { XML_NAMESPACE_ANIMATION, XML_PAR, (sal_uInt16)AnimationNodeType::PAR },
170 : : { XML_NAMESPACE_ANIMATION, XML_SEQ, (sal_uInt16)AnimationNodeType::SEQ },
171 : : { XML_NAMESPACE_ANIMATION, XML_ITERATE, (sal_uInt16)AnimationNodeType::ITERATE },
172 : : { XML_NAMESPACE_ANIMATION, XML_ANIMATE, (sal_uInt16)AnimationNodeType::ANIMATE },
173 : : { XML_NAMESPACE_ANIMATION, XML_SET, (sal_uInt16)AnimationNodeType::SET },
174 : : { XML_NAMESPACE_ANIMATION, XML_ANIMATEMOTION, (sal_uInt16)AnimationNodeType::ANIMATEMOTION },
175 : : { XML_NAMESPACE_ANIMATION, XML_ANIMATECOLOR, (sal_uInt16)AnimationNodeType::ANIMATECOLOR },
176 : : { XML_NAMESPACE_ANIMATION, XML_ANIMATETRANSFORM, (sal_uInt16)AnimationNodeType::ANIMATETRANSFORM },
177 : : { XML_NAMESPACE_ANIMATION, XML_TRANSITIONFILTER, (sal_uInt16)AnimationNodeType::TRANSITIONFILTER },
178 : : { XML_NAMESPACE_ANIMATION, XML_AUDIO, (sal_uInt16)AnimationNodeType::AUDIO },
179 : : { XML_NAMESPACE_ANIMATION, XML_COMMAND, (sal_uInt16)AnimationNodeType::COMMAND },
180 : : XML_TOKEN_MAP_END
181 : : };
182 : :
183 [ + - ]: 4 : mpAnimationNodeTokenMap = new SvXMLTokenMap( aAnimationNodeTokenMap );
184 : : }
185 : :
186 : 324 : return *mpAnimationNodeTokenMap;
187 : : }
188 : :
189 : : enum AnimationNodeAttributes
190 : : {
191 : : ANA_Begin,
192 : : ANA_Dur,
193 : : ANA_End,
194 : : ANA_Fill,
195 : : ANA_FillDefault,
196 : : ANA_Restart,
197 : : ANA_RestartDefault,
198 : : ANA_Accelerate,
199 : : ANA_Decelerate,
200 : : ANA_AutoReverse,
201 : : ANA_RepeatCount,
202 : : ANA_RepeatDur,
203 : : ANA_EndSync,
204 : : ANA_Node_Type,
205 : : ANA_Preset_ID,
206 : : ANA_Preset_Sub_Type,
207 : : ANA_Preset_Class,
208 : : ANA_After_Effect,
209 : : ANA_Target,
210 : : ANA_XLink,
211 : : ANA_MasterElement,
212 : : ANA_SubItem,
213 : : ANA_AttributeName,
214 : : ANA_Values,
215 : : ANA_From,
216 : : ANA_By,
217 : : ANA_To,
218 : : ANA_KeyTimes,
219 : : ANA_CalcMode,
220 : : ANA_Accumulate,
221 : : ANA_AdditiveMode,
222 : : ANA_KeySplines,
223 : : ANA_Path,
224 : : ANA_ColorSpace,
225 : : ANA_ColorDirection,
226 : : ANA_TransformType,
227 : : ANA_TransitionType,
228 : : ANA_TransitionSubType,
229 : : ANA_Mode,
230 : : ANA_Direction,
231 : : ANA_FadeColor,
232 : : ANA_IterateType,
233 : : ANA_IterateInterval,
234 : : ANA_Formula,
235 : : ANA_ANIMID,
236 : : ANA_XMLID,
237 : : ANA_Group_Id,
238 : : ANA_Command,
239 : : ANA_Volume
240 : : };
241 : :
242 : 528 : const SvXMLTokenMap& AnimationsImportHelperImpl::getAnimationNodeAttributeTokenMap()
243 : : {
244 [ + + ]: 528 : if( mpAnimationNodeAttributeTokenMap == NULL )
245 : : {
246 : : static SvXMLTokenMapEntry aAnimationNodeAttributeTokenMap[] =
247 : : {
248 : : { XML_NAMESPACE_SMIL, XML_BEGIN, (sal_uInt16)ANA_Begin },
249 : : { XML_NAMESPACE_SMIL, XML_DUR, (sal_uInt16)ANA_Dur },
250 : : { XML_NAMESPACE_SMIL, XML_END, (sal_uInt16)ANA_End },
251 : : { XML_NAMESPACE_SMIL, XML_FILL, (sal_uInt16)ANA_Fill },
252 : : { XML_NAMESPACE_SMIL, XML_FILLDEFAULT, (sal_uInt16)ANA_FillDefault },
253 : : { XML_NAMESPACE_SMIL, XML_RESTART, (sal_uInt16)ANA_Restart },
254 : : { XML_NAMESPACE_SMIL, XML_RESTARTDEFAULT, (sal_uInt16)ANA_RestartDefault },
255 : : { XML_NAMESPACE_SMIL, XML_ACCELERATE, (sal_uInt16)ANA_Accelerate },
256 : : { XML_NAMESPACE_SMIL, XML_DECELERATE, (sal_uInt16)ANA_Decelerate },
257 : : { XML_NAMESPACE_SMIL, XML_AUTOREVERSE, (sal_uInt16)ANA_AutoReverse },
258 : : { XML_NAMESPACE_SMIL, XML_REPEATCOUNT, (sal_uInt16)ANA_RepeatCount },
259 : : { XML_NAMESPACE_SMIL, XML_REPEATDUR, (sal_uInt16)ANA_RepeatDur },
260 : : { XML_NAMESPACE_SMIL, XML_ENDSYNC, (sal_uInt16)ANA_EndSync },
261 : : { XML_NAMESPACE_PRESENTATION, XML_NODE_TYPE, (sal_uInt16)ANA_Node_Type },
262 : : { XML_NAMESPACE_PRESENTATION, XML_PRESET_ID, (sal_uInt16)ANA_Preset_ID },
263 : : { XML_NAMESPACE_PRESENTATION, XML_PRESET_SUB_TYPE, (sal_uInt16)ANA_Preset_Sub_Type },
264 : : { XML_NAMESPACE_PRESENTATION, XML_PRESET_CLASS, (sal_uInt16)ANA_Preset_Class },
265 : : { XML_NAMESPACE_PRESENTATION, XML_AFTER_EFFECT, (sal_uInt16)ANA_After_Effect },
266 : : { XML_NAMESPACE_SMIL, XML_TARGETELEMENT, (sal_uInt16)ANA_Target },
267 : : { XML_NAMESPACE_XLINK, XML_HREF, (sal_uInt16)ANA_XLink },
268 : : { XML_NAMESPACE_PRESENTATION, XML_MASTER_ELEMENT, (sal_uInt16)ANA_MasterElement },
269 : : { XML_NAMESPACE_ANIMATION, XML_SUB_ITEM, (sal_uInt16)ANA_SubItem },
270 : : { XML_NAMESPACE_SMIL, XML_ATTRIBUTENAME, (sal_uInt16)ANA_AttributeName },
271 : : { XML_NAMESPACE_SMIL, XML_VALUES, (sal_uInt16)ANA_Values },
272 : : { XML_NAMESPACE_SMIL, XML_FROM, (sal_uInt16)ANA_From },
273 : : { XML_NAMESPACE_SMIL, XML_BY, (sal_uInt16)ANA_By },
274 : : { XML_NAMESPACE_SMIL, XML_TO, (sal_uInt16)ANA_To },
275 : : { XML_NAMESPACE_SMIL, XML_KEYTIMES, (sal_uInt16)ANA_KeyTimes },
276 : : { XML_NAMESPACE_SMIL, XML_CALCMODE, (sal_uInt16)ANA_CalcMode },
277 : : { XML_NAMESPACE_SMIL, XML_ACCUMULATE, (sal_uInt16)ANA_Accumulate },
278 : : { XML_NAMESPACE_PRESENTATION, XML_ADDITIVE, (sal_uInt16)ANA_AdditiveMode },
279 : : { XML_NAMESPACE_SMIL, XML_ADDITIVE, (sal_uInt16)ANA_AdditiveMode },
280 : : { XML_NAMESPACE_SMIL, XML_KEYSPLINES, (sal_uInt16)ANA_KeySplines },
281 : : { XML_NAMESPACE_SVG, XML_PATH, (sal_uInt16)ANA_Path },
282 : : { XML_NAMESPACE_ANIMATION, XML_COLOR_INTERPOLATION, (sal_uInt16)ANA_ColorSpace },
283 : : { XML_NAMESPACE_ANIMATION, XML_COLOR_INTERPOLATION_DIRECTION, (sal_uInt16)ANA_ColorDirection },
284 : : { XML_NAMESPACE_SVG, XML_TYPE, (sal_uInt16)ANA_TransformType },
285 : : { XML_NAMESPACE_SMIL, XML_TYPE, (sal_uInt16)ANA_TransitionType },
286 : : { XML_NAMESPACE_SMIL, XML_SUBTYPE, (sal_uInt16)ANA_TransitionSubType },
287 : : { XML_NAMESPACE_SMIL, XML_MODE, (sal_uInt16)ANA_Mode },
288 : : { XML_NAMESPACE_SMIL, XML_DIRECTION, (sal_uInt16)ANA_Direction },
289 : : { XML_NAMESPACE_SMIL, XML_FADECOLOR, (sal_uInt16)ANA_FadeColor },
290 : : { XML_NAMESPACE_ANIMATION, XML_ITERATE_TYPE, (sal_uInt16)ANA_IterateType },
291 : : { XML_NAMESPACE_ANIMATION, XML_ITERATE_INTERVAL, (sal_uInt16)ANA_IterateInterval },
292 : : { XML_NAMESPACE_ANIMATION, XML_FORMULA, (sal_uInt16)ANA_Formula },
293 : : { XML_NAMESPACE_ANIMATION, XML_ID, (sal_uInt16)ANA_ANIMID },
294 : : { XML_NAMESPACE_XML, XML_ID, (sal_uInt16)ANA_XMLID },
295 : : { XML_NAMESPACE_PRESENTATION, XML_GROUP_ID, (sal_uInt16)ANA_Group_Id },
296 : : { XML_NAMESPACE_ANIMATION, XML_AUDIO_LEVEL, (sal_uInt16)ANA_Volume },
297 : : { XML_NAMESPACE_ANIMATION, XML_COMMAND, (sal_uInt16)ANA_Command },
298 : :
299 : : XML_TOKEN_MAP_END
300 : : };
301 : :
302 [ + - ]: 4 : mpAnimationNodeAttributeTokenMap = new SvXMLTokenMap( aAnimationNodeAttributeTokenMap );
303 : : }
304 : :
305 : 528 : return *mpAnimationNodeAttributeTokenMap;
306 : : }
307 : :
308 : 0 : static bool isDouble( const OUString& rValue )
309 : : {
310 : 0 : sal_Int32 nLength = rValue.getLength();
311 : 0 : const sal_Unicode * pStr = rValue.getStr();
312 [ # # ]: 0 : while( nLength )
313 : : {
314 [ # # ][ # # ]: 0 : if( (*pStr >= '0' && *pStr <= '9') || *pStr == '-' || *pStr == '.' || *pStr == '+' || *pStr == 'e' || *pStr == 'E' )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
315 : : {
316 : 0 : pStr++;
317 : 0 : nLength--;
318 : : }
319 : : else
320 : : {
321 : 0 : return false;
322 : : }
323 : : }
324 : :
325 : 0 : return true;
326 : : }
327 : :
328 : 0 : static bool isTime( const OUString& rValue )
329 : : {
330 : 0 : sal_Int32 nLength = rValue.getLength();
331 : : const sal_Unicode * pStr;
332 [ # # ]: 0 : for( pStr = rValue.getStr(); nLength; pStr++, nLength-- )
333 : : {
334 [ # # ][ # # ]: 0 : if( !( (*pStr >= '0' && *pStr <= '9') || *pStr == '-' || *pStr == '.' || *pStr == '+' || *pStr == 'e' || *pStr == 'E' ) )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
335 : 0 : break;
336 : : }
337 : :
338 : : // return true if this is a double (if someone forgot the 's' we silently ignore it)
339 : : // or if its a double that ends with a 's' or 'S'
340 [ # # ][ # # ]: 0 : return (nLength == 0) || ((*pStr == 's' || *pStr == 'S') && (nLength == 1));
[ # # ][ # # ]
341 : : }
342 : :
343 : 0 : static sal_Int32 count_codes( const OUString& rString, sal_Unicode nCode )
344 : : {
345 : 0 : sal_Int32 nCount = 0;
346 : 0 : sal_Int32 fromIndex = 0;
347 : :
348 : 0 : while(true)
349 : : {
350 : 0 : fromIndex = rString.indexOf( nCode, fromIndex );
351 [ # # ]: 0 : if( fromIndex == -1 )
352 : 0 : break;
353 : :
354 : 0 : fromIndex++;
355 : 0 : nCount++;
356 : : }
357 : :
358 : 0 : return nCount;
359 : : }
360 : :
361 : 0 : Any AnimationsImportHelperImpl::convertTarget( const OUString& rValue )
362 : : {
363 : : try
364 : : {
365 [ # # ][ # # ]: 0 : Reference< XInterface > xRef( mrImport.getInterfaceToIdentifierMapper().getReference( rValue ) );
366 : :
367 [ # # ]: 0 : Reference< XShape > _xShape( xRef, UNO_QUERY );
368 [ # # ]: 0 : if( _xShape.is() )
369 [ # # ]: 0 : return makeAny( _xShape );
370 : :
371 [ # # ]: 0 : Reference< XTextCursor > xTextCursor( xRef, UNO_QUERY );
372 [ # # ]: 0 : if( xTextCursor.is() )
373 : : {
374 [ # # ][ # # ]: 0 : Reference< XTextRange > xStart( xTextCursor->getStart() ), xRange;
375 [ # # ][ # # ]: 0 : Reference< XShape > xShape( xTextCursor->getText(), UNO_QUERY_THROW );
[ # # ]
376 [ # # ]: 0 : Reference< XTextRangeCompare > xTextRangeCompare( xShape, UNO_QUERY_THROW );
377 : :
378 [ # # ]: 0 : Reference< XEnumerationAccess > xParaEnumAccess( xShape, UNO_QUERY_THROW );
379 [ # # ][ # # ]: 0 : Reference< XEnumeration > xEnumeration( xParaEnumAccess->createEnumeration(), UNO_QUERY_THROW );
[ # # ]
380 : 0 : sal_Int16 nParagraph = 0;
381 : :
382 [ # # ][ # # ]: 0 : while( xEnumeration->hasMoreElements() )
[ # # ]
383 : : {
384 [ # # ][ # # ]: 0 : xEnumeration->nextElement() >>= xRange;
[ # # ]
385 : :
386 : : // break if start of selection is prior to end of current paragraph
387 [ # # ][ # # ]: 0 : if( xRange.is() && (xTextRangeCompare->compareRegionEnds( xStart, xRange ) >= 0 ) )
[ # # ][ # # ]
[ # # ]
388 : : {
389 [ # # ][ # # ]: 0 : return makeAny( ParagraphTarget( xShape, nParagraph ) );
[ # # ]
390 : : }
391 : :
392 : 0 : nParagraph++;
393 [ # # ][ # # ]: 0 : }
[ # # ][ # # ]
[ # # ][ # # ]
394 [ # # ][ # # ]: 0 : }
[ # # ][ # # ]
395 : : }
396 [ # # ]: 0 : catch (const RuntimeException&)
397 : : {
398 : : OSL_FAIL( "xmloff::AnimationsImportImpl::convertTarget(), RuntimeException caught!" );
399 : : }
400 : :
401 : 0 : Any aAny;
402 : 0 : return aAny;
403 : : }
404 : :
405 : 0 : Any AnimationsImportHelperImpl::convertValue( XMLTokenEnum eAttributeName, const OUString& rValue )
406 : : {
407 : 0 : sal_Int32 nCommaPos = -1, nPos;
408 : 0 : sal_Int32 nOpenBrakets = 0;
409 [ # # ][ # # ]: 0 : for( nPos = 0; (nPos < rValue.getLength()) && (nCommaPos == -1); nPos++ )
[ # # ]
410 : : {
411 [ # # # # ]: 0 : switch( rValue[nPos] )
412 : : {
413 : : case ',':
414 [ # # ]: 0 : if( nOpenBrakets == 0 )
415 : 0 : nCommaPos = nPos;
416 : 0 : break;
417 : : case '(':
418 : : case '[':
419 : : case '{':
420 : 0 : nOpenBrakets++;
421 : 0 : break;
422 : : case ')':
423 : : case ']':
424 : : case '}':
425 : 0 : nOpenBrakets--;
426 : 0 : break;
427 : : }
428 : : }
429 : :
430 [ # # ]: 0 : if( nCommaPos >= 0 )
431 : : {
432 : 0 : ValuePair aPair;
433 [ # # ]: 0 : aPair.First = convertValue( eAttributeName, rValue.copy( 0, nCommaPos ) );
434 [ # # ]: 0 : aPair.Second = convertValue( eAttributeName, rValue.copy( nCommaPos+1, rValue.getLength() - nCommaPos - 1 ) );
435 [ # # ]: 0 : return makeAny( aPair );
436 : : }
437 : : else
438 : : {
439 : 0 : Any aAny;
440 : 0 : sal_Int32 nType = XML_TYPE_STRING;
441 : :
442 [ # # # # : 0 : if( rValue.getLength() ) switch( eAttributeName )
# # # # #
# # # ]
[ # # ]
443 : : {
444 : : case XML_X:
445 : : case XML_Y:
446 : : case XML_WIDTH:
447 : : case XML_HEIGHT:
448 : : case XML_TRANSLATE:
449 : : {
450 [ # # ]: 0 : return makeAny( rValue );
451 : : }
452 : :
453 : : case XML_SCALE:
454 : : case XML_SKEWY:
455 : : case XML_SKEWX:
456 : : case XML_OPACITY:
457 : 0 : case XML_ROTATE: nType = XML_TYPE_DOUBLE; break;
458 : 0 : case XML_TEXT_ROTATION_ANGLE:nType = XML_TYPE_TEXT_ROTATION_ANGLE; break;
459 : : case XML_FILL_COLOR:
460 : : case XML_STROKE_COLOR:
461 : : case XML_DIM:
462 : 0 : case XML_COLOR: nType = XML_TYPE_COLOR; break;
463 : 0 : case XML_FILL: nType = XML_SD_TYPE_FILLSTYLE; break;
464 : 0 : case XML_STROKE: nType = XML_SD_TYPE_STROKE; break;
465 : 0 : case XML_FONT_WEIGHT: nType = XML_TYPE_TEXT_WEIGHT; break;
466 : 0 : case XML_FONT_STYLE: nType = XML_TYPE_TEXT_POSTURE; break;
467 : 0 : case XML_TEXT_UNDERLINE: nType = XML_TYPE_TEXT_UNDERLINE_STYLE; break;
468 : 0 : case XML_FONT_SIZE: nType = XML_TYPE_DOUBLE_PERCENT; break;
469 : 0 : case XML_VISIBILITY: nType = XML_SD_TYPE_PRESPAGE_VISIBILITY; break;
470 : :
471 : : default:
472 [ # # ]: 0 : if( !rValue.isEmpty() )
473 [ # # ]: 0 : aAny <<= rValue;
474 : 0 : return aAny;
475 : : }
476 : :
477 [ # # ][ # # ]: 0 : const XMLPropertyHandler* pHandler = mrImport.GetShapeImport()->GetSdPropHdlFactory()->GetPropertyHandler( nType );
[ # # ][ # # ]
478 [ # # ]: 0 : if( pHandler )
479 [ # # ]: 0 : pHandler->importXML( rValue, aAny, mrImport.GetMM100UnitConverter() );
480 : :
481 : 0 : return aAny;
482 : : }
483 : : }
484 : :
485 : 0 : Sequence< Any > AnimationsImportHelperImpl::convertValueSequence( XMLTokenEnum eAttributeName, const OUString& rValue )
486 : : {
487 : 0 : Sequence< Any > aValues;
488 : :
489 : : // do we have any value at all?
490 [ # # ]: 0 : if( !rValue.isEmpty() )
491 : : {
492 : 0 : sal_Int32 nElements = count_codes( rValue, (sal_Unicode)';') + 1; // a non empty string has at least one value
493 : :
494 : : // prepare the sequence
495 [ # # ]: 0 : aValues.realloc( nElements );
496 : :
497 : : // fill the sequence
498 [ # # ]: 0 : Any* pValues = aValues.getArray();
499 : : sal_Int32 nIndex;
500 [ # # ][ # # ]: 0 : for( nIndex = 0; nElements && (nIndex >= 0); nElements-- )
[ # # ]
501 : : {
502 [ # # ]: 0 : *pValues++ = convertValue( eAttributeName, rValue.getToken( 0, ';', nIndex ) );
503 : : }
504 : : }
505 : :
506 : 0 : return aValues;
507 : : }
508 : :
509 : 0 : Any AnimationsImportHelperImpl::convertTiming( const OUString& rValue )
510 : : {
511 : 0 : Any aAny;
512 : :
513 : : // do we have any value at all?
514 [ # # ]: 0 : if( !rValue.isEmpty() )
515 : : {
516 : : // count the values
517 : 0 : sal_Int32 nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
518 : :
519 [ # # ]: 0 : if( nElements == 1 )
520 : : {
521 [ # # ][ # # ]: 0 : if( IsXMLToken( rValue, XML_MEDIA ) )
522 : : {
523 [ # # ]: 0 : aAny <<= Timing_MEDIA;
524 : : }
525 [ # # ][ # # ]: 0 : else if( IsXMLToken( rValue, XML_INDEFINITE ) )
526 : : {
527 [ # # ]: 0 : aAny <<= Timing_INDEFINITE;
528 : : }
529 [ # # ]: 0 : else if( isTime( rValue ) )
530 : : {
531 [ # # ]: 0 : aAny <<= rValue.toDouble();
532 : : }
533 : : else
534 : : {
535 : 0 : Event aEvent;
536 : 0 : aEvent.Repeat = 0;
537 : 0 : aEvent.Trigger = 0;
538 : :
539 : 0 : OUString aEventTrigger;
540 : :
541 : 0 : sal_Int32 nPos = rValue.indexOf( (sal_Unicode)'+' );
542 [ # # ]: 0 : if( nPos == -1 )
543 : : {
544 : 0 : aEventTrigger = rValue;
545 : : }
546 : : else
547 : : {
548 : 0 : aEventTrigger = rValue.copy( 0, nPos );
549 : :
550 : : // convert offset
551 [ # # ][ # # ]: 0 : aEvent.Offset <<= convertTiming( rValue.copy( nPos + 1 ) );
552 : : }
553 : :
554 : 0 : nPos = aEventTrigger.indexOf( (sal_Unicode)'.' );
555 [ # # ]: 0 : if( nPos != -1 )
556 : : {
557 [ # # ][ # # ]: 0 : aEvent.Source <<= mrImport.getInterfaceToIdentifierMapper().getReference( aEventTrigger.copy( 0, nPos ) );
[ # # ]
558 : 0 : aEventTrigger = aEventTrigger.copy( nPos + 1 );
559 : : }
560 : :
561 : : sal_uInt16 nEnum;
562 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, aEventTrigger, getAnimationsEnumMap(Animations_EnumMap_EventTrigger) ) )
[ # # ]
563 : : {
564 : 0 : aEvent.Trigger = (sal_Int16)nEnum;
565 : : }
566 : : else
567 : : {
568 : : OSL_FAIL("AnimationsImportHelperImpl::convertTiming(), unknown event trigger!");
569 : : }
570 : :
571 [ # # ]: 0 : aAny <<= aEvent;
572 : : }
573 : : }
574 : : else
575 : : {
576 : : // fill the sequence
577 [ # # ]: 0 : Sequence< Any > aValues( nElements );
578 [ # # ]: 0 : Any* pValues = aValues.getArray();
579 : 0 : sal_Int32 nIndex = 0;
580 [ # # ][ # # ]: 0 : while( (nElements--) && (nIndex >= 0) )
[ # # ]
581 [ # # ]: 0 : *pValues++ = convertTiming( rValue.getToken( 0, ';', nIndex ) );
582 : :
583 [ # # ][ # # ]: 0 : aAny <<= aValues;
584 : : }
585 : : }
586 : 0 : return aAny;
587 : : }
588 : :
589 : 0 : Sequence< double > AnimationsImportHelperImpl::convertKeyTimes( const OUString& rValue )
590 : : {
591 : 0 : sal_Int32 nElements = 0;
592 : :
593 [ # # ]: 0 : if( !rValue.isEmpty() )
594 : 0 : nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
595 : :
596 : 0 : Sequence< double > aKeyTimes( nElements );
597 : :
598 [ # # ]: 0 : if( nElements )
599 : : {
600 [ # # ]: 0 : double* pValues = aKeyTimes.getArray();
601 : 0 : sal_Int32 nIndex = 0;
602 [ # # ][ # # ]: 0 : while( (nElements--) && (nIndex >= 0) )
[ # # ]
603 : 0 : *pValues++ = rValue.getToken( 0, ';', nIndex ).toDouble();
604 : : }
605 : :
606 : 0 : return aKeyTimes;
607 : : }
608 : :
609 : 0 : Sequence< TimeFilterPair > AnimationsImportHelperImpl::convertTimeFilter( const OUString& rValue )
610 : : {
611 : 0 : sal_Int32 nElements = 0;
612 : :
613 [ # # ]: 0 : if( !rValue.isEmpty() )
614 : 0 : nElements = count_codes( rValue, (sal_Unicode)';' ) + 1; // a non empty string has at least one value
615 : :
616 : 0 : Sequence< TimeFilterPair > aTimeFilter( nElements );
617 : :
618 [ # # ]: 0 : if( nElements )
619 : : {
620 [ # # ]: 0 : TimeFilterPair* pValues = aTimeFilter.getArray();
621 : 0 : sal_Int32 nIndex = 0;
622 [ # # ][ # # ]: 0 : while( (nElements--) && (nIndex >= 0) )
[ # # ]
623 : : {
624 : 0 : const OUString aToken( rValue.getToken( 0, ';', nIndex ) );
625 : :
626 : 0 : sal_Int32 nPos = aToken.indexOf( ',' );
627 [ # # ]: 0 : if( nPos >= 0 )
628 : : {
629 : 0 : pValues->Time = aToken.copy( 0, nPos ).toDouble();
630 : 0 : pValues->Progress = aToken.copy( nPos+1, aToken.getLength() - nPos - 1 ).toDouble();
631 : : }
632 : 0 : pValues++;
633 : 0 : }
634 : : }
635 : :
636 : 0 : return aTimeFilter;
637 : : }
638 : :
639 : 0 : Any AnimationsImportHelperImpl::convertPath( const OUString& rValue )
640 : : {
641 : 0 : return makeAny( rValue );
642 : : }
643 : :
644 : : ///////////////////////////////////////////////////////////////////////
645 : :
646 [ # # ][ # # ]: 0 : TYPEINIT1( AnimationNodeContext, SvXMLImportContext );
647 : :
648 : 328 : AnimationNodeContext::AnimationNodeContext(
649 : : const Reference< XAnimationNode >& xParentNode,
650 : : SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName,
651 : : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
652 : : AnimationsImportHelperImpl* pHelper /* = NULL */ )
653 : : : SvXMLImportContext(rImport, nPrfx, rLocalName),
654 : : mpHelper( pHelper ),
655 : 328 : mbRootContext( pHelper == NULL )
656 : : {
657 : : try
658 : : {
659 [ + + ]: 328 : if( mbRootContext )
660 : : {
661 [ + - ][ + - ]: 4 : mpHelper = new AnimationsImportHelperImpl( rImport );
662 [ + - ]: 4 : mxNode = xParentNode;
663 : : }
664 : : else
665 : : {
666 [ + - ]: 324 : Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
667 : :
668 : 324 : sal_Int16 nPresetClass = EffectPresetClass::CUSTOM;
669 : :
670 : 324 : const sal_Char* pServiceName = 0;
671 : :
672 [ + - ][ + - ]: 324 : sal_Int16 nNodeType = (sal_Int16)mpHelper->getAnimationNodeTokenMap().Get( nPrfx, rLocalName );
673 [ - - - - : 324 : switch( nNodeType )
- - - + -
- + - ]
674 : : {
675 : 0 : case AnimationNodeType::SEQ: pServiceName = "com.sun.star.animations.SequenceTimeContainer"; break;
676 : 0 : case AnimationNodeType::ITERATE: pServiceName = "com.sun.star.animations.IterateContainer"; break;
677 : 0 : case AnimationNodeType::ANIMATE: pServiceName = "com.sun.star.animations.Animate"; break;
678 : 0 : case AnimationNodeType::SET: pServiceName = "com.sun.star.animations.AnimateSet"; break;
679 : 0 : case AnimationNodeType::ANIMATEMOTION: pServiceName = "com.sun.star.animations.AnimateMotion"; break;
680 : 0 : case AnimationNodeType::ANIMATECOLOR: pServiceName = "com.sun.star.animations.AnimateColor"; break;
681 : 0 : case AnimationNodeType::ANIMATETRANSFORM: pServiceName = "com.sun.star.animations.AnimateTransform"; break;
682 : 162 : case AnimationNodeType::TRANSITIONFILTER: pServiceName = "com.sun.star.animations.TransitionFilter"; break;
683 : 0 : case AnimationNodeType::AUDIO: pServiceName = "com.sun.star.animations.Audio"; break;
684 : 0 : case AnimationNodeType::COMMAND: pServiceName = "com.sun.star.animations.Command"; break;
685 : : case AnimationNodeType::PAR:
686 : : {
687 [ + - ][ + - ]: 162 : const sal_Int16 nCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ + - ]
688 : : sal_Int16 nAttribute;
689 [ + + ]: 324 : for( nAttribute = 0; nAttribute < nCount; nAttribute++ )
690 : : {
691 : 162 : OUString aLocalName;
692 [ + - ][ + - ]: 162 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( nAttribute ), &aLocalName );
[ + - ]
693 [ + - ][ + - ]: 162 : if( (nPrefix == XML_NAMESPACE_PRESENTATION) && IsXMLToken( aLocalName, XML_PRESET_ID ) )
[ + - ][ + - ]
694 : : {
695 [ + - ][ + - ]: 162 : const OUString& rValue = xAttrList->getValueByIndex( nAttribute );
696 [ - + ]: 162 : if ( rValue == "ooo-entrance-random" )
697 : : {
698 : 0 : nPresetClass = EffectPresetClass::ENTRANCE;
699 : : }
700 [ - + ]: 162 : else if ( rValue == "ooo-exit-random" )
701 : : {
702 : 0 : nPresetClass = EffectPresetClass::EXIT;
703 : : }
704 : :
705 [ - + ]: 162 : if( nPresetClass != EffectPresetClass::CUSTOM )
706 : : {
707 : 162 : pServiceName = "com.sun.star.comp.sd.RandomAnimationNode";
708 : : break;
709 [ - + ]: 162 : }
710 : : }
711 [ + - ]: 162 : }
712 [ + - ]: 162 : if( !pServiceName )
713 : 162 : pServiceName = "com.sun.star.animations.ParallelTimeContainer";
714 : : }
715 : 162 : break;
716 : : default:
717 : 0 : pServiceName = 0;
718 : : }
719 : :
720 [ + - ][ + - ]: 324 : if( pServiceName && xFactory.is() )
[ + - ]
721 : : {
722 [ + - ]: 324 : mxNode = Reference< XAnimationNode >( xFactory->createInstance(
723 [ + - ][ + - ]: 324 : OUString::createFromAscii(pServiceName) ), UNO_QUERY_THROW );
[ + - ]
724 : :
725 [ - + ]: 324 : if( nPresetClass != EffectPresetClass::CUSTOM )
726 : : {
727 [ # # ]: 0 : Reference< XInitialization > xInit( mxNode, UNO_QUERY_THROW );
728 [ # # ]: 0 : const Any aAny( makeAny( nPresetClass ) );
729 [ # # ]: 0 : Sequence< Any > aArgs( &aAny, 1 ) ;
730 [ # # ][ # # ]: 0 : xInit->initialize( aArgs );
[ # # ]
731 : : }
732 : :
733 [ + - ]: 324 : init_node( xAttrList );
734 : :
735 [ + - ]: 324 : Reference< XTimeContainer > xParentContainer( xParentNode, UNO_QUERY_THROW );
736 [ + - ][ + - ]: 324 : xParentContainer->appendChild( mxNode );
737 [ # # ]: 324 : }
738 : : }
739 : : }
740 [ # # ]: 0 : catch (const RuntimeException&)
741 : : {
742 : : OSL_FAIL( "xmloff::AnimationsImportImpl::AnimationsImportImpl(), RuntimeException caught!" );
743 : : }
744 : 328 : }
745 : :
746 : 328 : AnimationNodeContext::~AnimationNodeContext()
747 : : {
748 [ + + ]: 328 : if( mbRootContext )
749 [ + - ][ + - ]: 4 : delete mpHelper;
750 [ - + ]: 656 : }
751 : :
752 : 328 : void AnimationNodeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
753 : : {
754 : : // code of StartElement is moved to init_node that is now called
755 : : // in c'tor before appending this node to its parent.
756 : : // This is needed for random nodes that need the correct target
757 : : // set when child nodes are appended.
758 : 328 : }
759 : :
760 : 324 : void AnimationNodeContext::init_node( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
761 : : {
762 [ + - ]: 324 : if( mxNode.is() ) try
763 : : {
764 [ + - ][ + - ]: 324 : const sal_Int16 nNodeType = mxNode->getType();
765 : :
766 : : // query for optional interfaces that are often used later
767 [ + - ]: 324 : Reference< XAnimate > xAnimate( mxNode, UNO_QUERY );
768 [ + - ]: 324 : Reference< XCommand > xCommand( mxNode, UNO_QUERY );
769 [ + - ]: 324 : Reference< XTransitionFilter > xTransitionFilter( mxNode, UNO_QUERY );
770 [ + - ]: 324 : Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
771 : :
772 [ + - ]: 324 : std::list< NamedValue > aUserData;
773 : 324 : XMLTokenEnum meAttributeName = XML_TOKEN_INVALID;
774 : 324 : OUString aFrom, aBy, aTo, aValues;
775 : 324 : bool bHaveXmlId( false );
776 : 324 : OUString sXmlId;
777 : :
778 [ + - ][ + - ]: 324 : const sal_Int16 nCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ + - ]
779 : : sal_uInt16 nEnum;
780 : : sal_Int16 nAttribute;
781 [ + + ]: 852 : for( nAttribute = 0; nAttribute < nCount; nAttribute++ )
782 : : {
783 [ + - ][ + - ]: 528 : const OUString& rAttrName = xAttrList->getNameByIndex( nAttribute );
784 [ + - ][ + - ]: 528 : const OUString& rValue = xAttrList->getValueByIndex( nAttribute );
785 : :
786 : 528 : OUString aLocalName;
787 [ + - ]: 528 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
788 [ + - ][ + - ]: 528 : switch( mpHelper->getAnimationNodeAttributeTokenMap().Get( nPrefix, aLocalName ) )
[ - - - -
- - - - -
- - - - -
+ - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- + + - +
+ - - - -
- ]
789 : : {
790 : : case ANA_Begin:
791 : : {
792 [ # # ][ # # ]: 0 : mxNode->setBegin( mpHelper->convertTiming( rValue ) );
[ # # ]
793 : : }
794 : 0 : break;
795 : : case ANA_Dur:
796 : : {
797 [ # # ][ # # ]: 0 : mxNode->setDuration( mpHelper->convertTiming( rValue ) );
[ # # ]
798 : : }
799 : 0 : break;
800 : : case ANA_End:
801 : : {
802 [ # # ][ # # ]: 0 : mxNode->setEnd( mpHelper->convertTiming( rValue ) );
[ # # ]
803 : : }
804 : 0 : break;
805 : : case ANA_Fill:
806 : : {
807 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Fill) ) )
[ # # ]
808 [ # # ][ # # ]: 0 : mxNode->setFill( (sal_Int16)nEnum );
809 : : }
810 : 0 : break;
811 : : case ANA_FillDefault:
812 : : {
813 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_FillDefault) ) )
[ # # ]
814 [ # # ][ # # ]: 0 : mxNode->setFillDefault( (sal_Int16)nEnum );
815 : : }
816 : 0 : break;
817 : : case ANA_Restart:
818 : : {
819 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Restart) ) )
[ # # ]
820 [ # # ][ # # ]: 0 : mxNode->setRestart( (sal_Int16)nEnum );
821 : : }
822 : 0 : break;
823 : : case ANA_RestartDefault:
824 : : {
825 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_RestartDefault) ) )
[ # # ]
826 [ # # ][ # # ]: 0 : mxNode->setRestartDefault( (sal_Int16)nEnum );
827 : : }
828 : 0 : break;
829 : : case ANA_Accelerate:
830 : : {
831 [ # # ]: 0 : if( isDouble( rValue ) )
832 [ # # ][ # # ]: 0 : mxNode->setAcceleration( rValue.toDouble() );
833 : : }
834 : 0 : break;
835 : : case ANA_Decelerate:
836 : : {
837 [ # # ]: 0 : if( isDouble( rValue ) )
838 [ # # ][ # # ]: 0 : mxNode->setDecelerate( rValue.toDouble() );
839 : : }
840 : 0 : break;
841 : : case ANA_AutoReverse:
842 : : {
843 : : bool bTemp;
844 [ # # ][ # # ]: 0 : if (::sax::Converter::convertBool( bTemp, rValue ))
845 [ # # ][ # # ]: 0 : mxNode->setAutoReverse( bTemp );
846 : : }
847 : 0 : break;
848 : : case ANA_RepeatCount:
849 : : {
850 [ # # ][ # # ]: 0 : mxNode->setRepeatCount( mpHelper->convertTiming( rValue ) );
[ # # ]
851 : : }
852 : 0 : break;
853 : : case ANA_RepeatDur:
854 : : {
855 [ # # ][ # # ]: 0 : mxNode->setRepeatDuration( mpHelper->convertTiming( rValue ) );
[ # # ]
856 : : }
857 : 0 : break;
858 : : case ANA_EndSync:
859 : : {
860 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Endsync) ) )
[ # # ]
861 [ # # ][ # # ]: 0 : mxNode->setEndSync( makeAny( (sal_Int16)nEnum ) );
[ # # ]
862 : : }
863 : 0 : break;
864 : : case ANA_Node_Type:
865 : : {
866 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_EffectNodeType) ) )
[ # # ]
867 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( GetXMLToken( XML_NODE_TYPE ), makeAny( (sal_Int16)nEnum ) ) );
[ # # ]
868 : : }
869 : 0 : break;
870 : : case ANA_Preset_ID:
871 : : {
872 [ + - ][ + - ]: 162 : aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_ID ), makeAny( rValue ) ) );
[ + - ]
873 : : }
874 : 162 : break;
875 : : case ANA_Preset_Sub_Type:
876 : : {
877 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_SUB_TYPE ), makeAny( rValue ) ) );
[ # # ]
878 : : }
879 : 0 : break;
880 : : case ANA_Preset_Class:
881 : : {
882 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_EffectPresetClass) ) )
[ # # ]
883 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( GetXMLToken( XML_PRESET_CLASS ), makeAny( (sal_Int16)nEnum ) ) );
[ # # ]
884 : : }
885 : 0 : break;
886 : : case ANA_After_Effect:
887 : : {
888 : : bool bTemp;
889 [ # # ][ # # ]: 0 : if (::sax::Converter::convertBool( bTemp, rValue ))
890 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( GetXMLToken( XML_AFTER_EFFECT ), makeAny( bTemp ) ) );
[ # # ]
891 : : }
892 : 0 : break;
893 : : case ANA_XLink:
894 : : {
895 [ # # ]: 0 : if( nNodeType == AnimationNodeType::AUDIO )
896 : : {
897 [ # # ]: 0 : Reference< XAudio > xAudio( mxNode, UNO_QUERY_THROW );
898 [ # # ][ # # ]: 0 : xAudio->setSource( makeAny( GetImport().GetAbsoluteReference( rValue ) ) );
[ # # ][ # # ]
899 : 0 : break;
900 : : }
901 : :
902 : : }
903 : : // fall through intented!
904 : : case ANA_Target:
905 : : {
906 : : {
907 [ # # ]: 0 : Any aTarget( mpHelper->convertTarget( rValue ) );
908 : :
909 [ # # ]: 0 : if( xAnimate.is() )
910 : : {
911 [ # # ][ # # ]: 0 : xAnimate->setTarget( aTarget );
912 : : }
913 [ # # ]: 0 : else if( xIter.is() )
914 : : {
915 [ # # ][ # # ]: 0 : xIter->setTarget( aTarget );
916 : : }
917 [ # # ]: 0 : else if( xCommand.is() )
918 : : {
919 [ # # ][ # # ]: 0 : xCommand->setTarget( aTarget );
920 : 0 : }
921 : : }
922 : : }
923 : 0 : break;
924 : :
925 : : case ANA_Volume:
926 : : {
927 [ # # ]: 0 : if( nNodeType == AnimationNodeType::AUDIO )
928 : : {
929 [ # # ]: 0 : if( isDouble( rValue ) )
930 : : {
931 [ # # ]: 0 : Reference< XAudio > xAudio( mxNode, UNO_QUERY_THROW );
932 [ # # ][ # # ]: 0 : xAudio->setVolume( rValue.toDouble() );
933 : : }
934 : : }
935 : : }
936 : 0 : break;
937 : :
938 : : case ANA_MasterElement:
939 : : {
940 [ # # ][ # # ]: 0 : Reference< XAnimationNode > xMaster( GetImport().getInterfaceToIdentifierMapper().getReference( rValue ), UNO_QUERY );
[ # # ]
941 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( GetXMLToken( XML_MASTER_ELEMENT ), makeAny( xMaster ) ) );
[ # # ]
942 : : }
943 : 0 : break;
944 : :
945 : : case ANA_SubItem:
946 : : {
947 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_SubItem) ) )
[ # # ]
948 : : {
949 [ # # ]: 0 : if( xAnimate.is() )
950 : : {
951 [ # # ][ # # ]: 0 : xAnimate->setSubItem( (sal_Int16)nEnum );
952 : : }
953 [ # # ]: 0 : else if( xIter.is() )
954 : : {
955 [ # # ][ # # ]: 0 : xIter->setSubItem( (sal_Int16)nEnum );
956 : : }
957 : : }
958 : : }
959 : 0 : break;
960 : :
961 : : case ANA_AttributeName:
962 : : {
963 [ # # ]: 0 : if( xAnimate.is() )
964 : : {
965 : 0 : OUString aName( rValue );
966 : :
967 [ # # ]: 0 : ImplAttributeNameConversion* p = getAnimationAttributeNamesConversionList();
968 [ # # ]: 0 : while( p->mpAPIName )
969 : : {
970 [ # # ][ # # ]: 0 : if( IsXMLToken( aName, p->meXMLToken ) )
971 : : {
972 : 0 : aName = OUString::createFromAscii( p->mpAPIName );
973 : 0 : meAttributeName = p->meXMLToken;
974 : 0 : break;
975 : : }
976 : :
977 : 0 : p++;
978 : : }
979 : :
980 [ # # ][ # # ]: 0 : xAnimate->setAttributeName( aName );
981 : : }
982 : : }
983 : 0 : break;
984 : :
985 : : case ANA_Values:
986 : : {
987 : 0 : aValues = rValue;
988 : : }
989 : 0 : break;
990 : :
991 : : case ANA_From:
992 : : {
993 : 0 : aFrom = rValue;
994 : : }
995 : 0 : break;
996 : :
997 : : case ANA_By:
998 : : {
999 : 0 : aBy = rValue;
1000 : : }
1001 : 0 : break;
1002 : :
1003 : : case ANA_To:
1004 : : {
1005 : 0 : aTo = rValue;
1006 : : }
1007 : 0 : break;
1008 : :
1009 : : case ANA_KeyTimes:
1010 : : {
1011 [ # # ]: 0 : if( xAnimate.is() )
1012 [ # # ][ # # ]: 0 : xAnimate->setKeyTimes( mpHelper->convertKeyTimes( rValue ) );
[ # # ][ # # ]
1013 : : }
1014 : 0 : break;
1015 : :
1016 : : case ANA_Formula:
1017 : : {
1018 [ # # ]: 0 : if( xAnimate.is() )
1019 [ # # ][ # # ]: 0 : xAnimate->setFormula( rValue );
1020 : : }
1021 : 0 : break;
1022 : :
1023 : : case ANA_ANIMID:
1024 : : {
1025 [ # # ]: 0 : if (!bHaveXmlId) { sXmlId = rValue; }
1026 : : }
1027 : 0 : break;
1028 : : case ANA_XMLID:
1029 : : {
1030 : 0 : sXmlId = rValue;
1031 : 0 : bHaveXmlId = true;
1032 : : }
1033 : 0 : break;
1034 : :
1035 : : case ANA_CalcMode:
1036 : : {
1037 [ # # ]: 0 : if( xAnimate.is() )
1038 : : {
1039 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_CalcMode) ) )
[ # # ]
1040 [ # # ][ # # ]: 0 : xAnimate->setCalcMode( (sal_Int16)nEnum );
1041 : : }
1042 : : }
1043 : 0 : break;
1044 : :
1045 : : case ANA_Accumulate:
1046 : : {
1047 [ # # ]: 0 : if( xAnimate.is() )
1048 [ # # ][ # # ]: 0 : xAnimate->setAccumulate( IsXMLToken( rValue, XML_SUM ) );
[ # # ]
1049 : : }
1050 : 0 : break;
1051 : :
1052 : : case ANA_AdditiveMode:
1053 : : {
1054 [ # # ]: 0 : if( xAnimate.is() )
1055 : : {
1056 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_AdditiveMode) ) )
[ # # ]
1057 [ # # ][ # # ]: 0 : xAnimate->setAdditive( (sal_Int16)nEnum );
1058 : : }
1059 : : }
1060 : 0 : break;
1061 : :
1062 : : case ANA_KeySplines:
1063 : : {
1064 [ # # ]: 0 : if( xAnimate.is() )
1065 [ # # ][ # # ]: 0 : xAnimate->setTimeFilter( mpHelper->convertTimeFilter( rValue ) );
[ # # ][ # # ]
1066 : : }
1067 : 0 : break;
1068 : :
1069 : : case ANA_Path:
1070 : : {
1071 [ # # ]: 0 : Reference< XAnimateMotion > xAnimateMotion( mxNode, UNO_QUERY );
1072 [ # # ]: 0 : if( xAnimateMotion.is() )
1073 [ # # ][ # # ]: 0 : xAnimateMotion->setPath( mpHelper->convertPath( rValue ) );
[ # # ]
1074 : : }
1075 : 0 : break;
1076 : :
1077 : : case ANA_ColorSpace:
1078 : : {
1079 [ # # ]: 0 : Reference< XAnimateColor > xAnimateColor( mxNode, UNO_QUERY );
1080 [ # # ]: 0 : if( xAnimateColor.is() )
1081 [ # # ][ # # ]: 0 : xAnimateColor->setColorInterpolation( IsXMLToken( rValue, XML_HSL ) ? AnimationColorSpace::HSL : AnimationColorSpace::RGB );
[ # # ][ # # ]
1082 : : }
1083 : 0 : break;
1084 : :
1085 : : case ANA_ColorDirection:
1086 : : {
1087 [ # # ]: 0 : Reference< XAnimateColor > xAnimateColor( mxNode, UNO_QUERY );
1088 [ # # ]: 0 : if( xAnimateColor.is() )
1089 [ # # ][ # # ]: 0 : xAnimateColor->setDirection( IsXMLToken( rValue, XML_CLOCKWISE ) );
[ # # ]
1090 : : }
1091 : 0 : break;
1092 : :
1093 : : case ANA_TransformType:
1094 : : {
1095 [ # # ]: 0 : Reference< XAnimateTransform > xTransform( mxNode, UNO_QUERY );
1096 [ # # ]: 0 : if( xTransform.is() )
1097 : : {
1098 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransformType) ) )
[ # # ]
1099 : : {
1100 [ # # ][ # # ]: 0 : xTransform->setTransformType( (sal_Int16)nEnum );
1101 [ # # # # : 0 : switch( nEnum )
# ]
1102 : : {
1103 : 0 : case AnimationTransformType::SCALE: meAttributeName = XML_SCALE; break;
1104 : 0 : case AnimationTransformType::ROTATE: meAttributeName = XML_ROTATE; break;
1105 : 0 : case AnimationTransformType::SKEWX: meAttributeName = XML_SKEWX; break;
1106 : 0 : case AnimationTransformType::SKEWY: meAttributeName = XML_SKEWY; break;
1107 : : //case AnimationTransformType::TRANSLATE:
1108 : : default:
1109 : 0 : meAttributeName = XML_TRANSLATE; break;
1110 : : }
1111 : : }
1112 : 0 : }
1113 : : }
1114 : 0 : break;
1115 : :
1116 : : case ANA_TransitionType:
1117 : : {
1118 [ + - ]: 162 : if( xTransitionFilter.is() )
1119 : : {
1120 [ + - ][ + - ]: 162 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransitionType) ) )
[ + - ]
1121 [ + - ][ + - ]: 162 : xTransitionFilter->setTransition( (sal_Int16)nEnum );
1122 : : }
1123 : : }
1124 : 162 : break;
1125 : :
1126 : : case ANA_TransitionSubType:
1127 : : {
1128 [ + - ]: 160 : if( xTransitionFilter.is() )
1129 : : {
1130 [ + - ][ + - ]: 160 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_TransitionSubType) ) )
[ + - ]
1131 [ + - ][ + - ]: 160 : xTransitionFilter->setSubtype( (sal_Int16)nEnum );
1132 : : }
1133 : : }
1134 : 160 : break;
1135 : :
1136 : : case ANA_Mode:
1137 : : {
1138 [ # # ]: 0 : if( xTransitionFilter.is() )
1139 [ # # ][ # # ]: 0 : xTransitionFilter->setMode( IsXMLToken( rValue, XML_IN ) );
[ # # ]
1140 : : }
1141 : 0 : break;
1142 : :
1143 : : case ANA_Direction:
1144 : : {
1145 [ + - ]: 40 : if( xTransitionFilter.is() )
1146 [ + - ][ + - ]: 40 : xTransitionFilter->setDirection( IsXMLToken( rValue, XML_FORWARD ) );
[ + - ]
1147 : : }
1148 : 40 : break;
1149 : :
1150 : : case ANA_FadeColor:
1151 : : {
1152 [ + - ]: 4 : if( xTransitionFilter.is() )
1153 : : {
1154 : 4 : sal_Int32 nColor(0);
1155 [ + - ]: 4 : ::sax::Converter::convertColor(nColor, rValue);
1156 [ + - ][ + - ]: 4 : xTransitionFilter->setFadeColor(nColor);
1157 : : }
1158 : : }
1159 : 4 : break;
1160 : :
1161 : : case ANA_IterateType:
1162 : : {
1163 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_IterateType) ) )
[ # # ]
1164 : : {
1165 [ # # ]: 0 : if( xIter.is() )
1166 [ # # ][ # # ]: 0 : xIter->setIterateType( (sal_Int16)nEnum );
1167 : : }
1168 : : }
1169 : 0 : break;
1170 : :
1171 : : case ANA_IterateInterval:
1172 : : {
1173 [ # # ]: 0 : if( xIter.is() )
1174 : : {
1175 : 0 : double fInterval = 0.0;
1176 [ # # ]: 0 : if( rValue.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("P")) )
1177 : : {
1178 : 0 : ::com::sun::star::util::Duration aDuration;
1179 [ # # ][ # # ]: 0 : if (::sax::Converter::convertDuration(aDuration, rValue))
1180 : : {
1181 : : fInterval = ((((aDuration.Hours * 60)
1182 : : + aDuration.Minutes) * 60) + aDuration.Seconds)
1183 : 0 : + (aDuration.MilliSeconds / 1000.0);
1184 : : }
1185 : : }
1186 : : else
1187 : : {
1188 : 0 : fInterval = rValue.toDouble();
1189 : : }
1190 : :
1191 [ # # ][ # # ]: 0 : xIter->setIterateInterval( fInterval );
1192 : : }
1193 : : }
1194 : 0 : break;
1195 : :
1196 : : case ANA_Group_Id:
1197 : : {
1198 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( aLocalName, makeAny( rValue.toInt32() ) ) );
1199 : : }
1200 : 0 : break;
1201 : :
1202 : : case ANA_Command:
1203 : : {
1204 [ # # ][ # # ]: 0 : if( xCommand.is() && nNodeType == AnimationNodeType::COMMAND )
[ # # ]
1205 : : {
1206 [ # # ][ # # ]: 0 : if( SvXMLUnitConverter::convertEnum( nEnum, rValue, getAnimationsEnumMap(Animations_EnumMap_Command) ) )
[ # # ]
1207 : : {
1208 [ # # ][ # # ]: 0 : xCommand->setCommand( (sal_Int16)nEnum );
1209 : : }
1210 : : }
1211 : : }
1212 : 0 : break;
1213 : :
1214 : : default:
1215 : : // push all unknown attributes within the presentation namespace as user data
1216 [ # # ]: 0 : if( nPrefix == XML_NAMESPACE_PRESENTATION )
1217 : : {
1218 [ # # ][ # # ]: 0 : aUserData.push_back( NamedValue( aLocalName, makeAny( rValue ) ) );
1219 : : }
1220 : : }
1221 : 528 : }
1222 : :
1223 [ - + ]: 324 : if (!sXmlId.isEmpty())
1224 : : {
1225 [ # # ]: 0 : Reference< XInterface > const xRef( mxNode, UNO_QUERY );
1226 [ # # ]: 0 : GetImport().getInterfaceToIdentifierMapper().registerReference(
1227 [ # # ]: 0 : sXmlId, xRef );
1228 : : }
1229 : :
1230 : 324 : sal_Int32 nUserDataCount = aUserData.size();
1231 [ + + ]: 324 : if( nUserDataCount )
1232 : : {
1233 [ + - ]: 162 : Sequence< NamedValue > aUnoUserData( nUserDataCount );
1234 [ + - ]: 162 : NamedValue* pData = aUnoUserData.getArray();
1235 : 162 : std::list< NamedValue >::iterator aIter( aUserData.begin() );
1236 : 162 : const std::list< NamedValue >::iterator aEnd( aUserData.end() );
1237 [ + + ]: 324 : while( aIter != aEnd )
1238 : 162 : *pData++ = (*aIter++);
1239 : :
1240 [ + - ][ + - ]: 162 : mxNode->setUserData( aUnoUserData );
[ + - ]
1241 : : }
1242 : :
1243 : : // convert values
1244 [ + + ]: 324 : if( xAnimate.is() )
1245 : : {
1246 [ - + ]: 162 : if( !aFrom.isEmpty() )
1247 [ # # ][ # # ]: 0 : xAnimate->setFrom( mpHelper->convertValue( meAttributeName, aFrom ) );
[ # # ]
1248 : :
1249 [ - + ]: 162 : if( !aBy.isEmpty() )
1250 [ # # ][ # # ]: 0 : xAnimate->setBy( mpHelper->convertValue( meAttributeName, aBy ) );
[ # # ]
1251 : :
1252 [ - + ]: 162 : if( !aTo.isEmpty() )
1253 [ # # ][ # # ]: 0 : xAnimate->setTo( mpHelper->convertValue( meAttributeName, aTo ) );
[ # # ]
1254 : :
1255 [ - + ]: 162 : if( !aValues.isEmpty() )
1256 [ # # ][ # # ]: 0 : xAnimate->setValues( mpHelper->convertValueSequence( meAttributeName, aValues ) );
[ # # ][ # # ]
1257 [ # # ]: 324 : }
1258 : : }
1259 : 0 : catch (const RuntimeException&)
1260 : : {
1261 : : OSL_FAIL( "xmloff::AnimationNodeContext::StartElement(), RuntimeException caught!" );
1262 : : }
1263 : 324 : }
1264 : :
1265 : 324 : SvXMLImportContext * AnimationNodeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
1266 : : const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
1267 : : {
1268 [ + - ]: 324 : if( mxNode.is())
1269 [ + - ]: 324 : return new AnimationNodeContext( mxNode, GetImport(), nPrefix, rLocalName, xAttrList, mpHelper );
1270 : : else
1271 [ # # ]: 324 : return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1272 : : }
1273 : :
1274 : : // --------------------------------------------------------------------
1275 : :
1276 : : class AnimationsImport: public SvXMLImport, public XAnimationNodeSupplier
1277 : : {
1278 : : public:
1279 : : AnimationsImport( const Reference< XMultiServiceFactory > & rSMgr );
1280 : : ~AnimationsImport() throw ();
1281 : :
1282 : : SvXMLImportContext* CreateContext(sal_uInt16 nPrefix, const OUString& rLocalName, const Reference<XAttributeList>& xAttrList);
1283 : :
1284 : : // XInterface
1285 : : virtual Any SAL_CALL queryInterface( const Type& aType ) throw (RuntimeException);
1286 : : virtual void SAL_CALL acquire() throw ();
1287 : : virtual void SAL_CALL release() throw ();
1288 : :
1289 : : // XAnimationNodeSupplier
1290 : : Reference< XAnimationNode > SAL_CALL getAnimationNode() throw (RuntimeException);
1291 : :
1292 : : // XServiceInfo
1293 : : virtual OUString SAL_CALL getImplementationName() throw(RuntimeException);
1294 : : virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException);
1295 : : virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(RuntimeException);
1296 : :
1297 : : private:
1298 : : Reference< XAnimationNode > mxRootNode;
1299 : : };
1300 : :
1301 : 4 : AnimationsImport::AnimationsImport( const Reference< XMultiServiceFactory > & rSMgr )
1302 : 4 : : SvXMLImport( rSMgr, true )
1303 : : {
1304 : : // add namespaces
1305 : 4 : GetNamespaceMap().Add(
1306 [ + - ]: 4 : GetXMLToken(XML_NP_PRESENTATION),
1307 [ + - ]: 4 : GetXMLToken(XML_N_PRESENTATION),
1308 [ + - ]: 4 : XML_NAMESPACE_PRESENTATION);
1309 : :
1310 : 4 : GetNamespaceMap().Add(
1311 [ + - ]: 4 : GetXMLToken(XML_NP_SMIL),
1312 [ + - ]: 4 : GetXMLToken(XML_N_SMIL),
1313 [ + - ]: 4 : XML_NAMESPACE_SMIL);
1314 : :
1315 : 4 : GetNamespaceMap().Add(
1316 [ + - ]: 4 : GetXMLToken(XML_NP_ANIMATION),
1317 [ + - ]: 4 : GetXMLToken(XML_N_ANIMATION),
1318 [ + - ]: 4 : XML_NAMESPACE_ANIMATION);
1319 : :
1320 [ + - ]: 4 : mxRootNode = Reference< XAnimationNode >::query(rSMgr->createInstance(
1321 [ + - ][ + - ]: 4 : OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.animations.SequenceTimeContainer"))));
[ + - ][ + - ]
1322 : 4 : }
1323 : :
1324 : 4 : AnimationsImport::~AnimationsImport() throw ()
1325 : : {
1326 [ - + ]: 8 : }
1327 : :
1328 : : // XInterface
1329 : 12 : Any SAL_CALL AnimationsImport::queryInterface( const Type& aType ) throw (RuntimeException)
1330 : : {
1331 [ + + ]: 12 : if ( aType == ::getCppuType((Reference<XAnimationNodeSupplier> *)0) )
1332 : : {
1333 [ + - ]: 4 : return makeAny( Reference<XAnimationNodeSupplier>( this ) );
1334 : : }
1335 : : else
1336 : : {
1337 : 12 : return SvXMLImport::queryInterface( aType );
1338 : : }
1339 : : }
1340 : :
1341 : 28 : void SAL_CALL AnimationsImport::acquire() throw ()
1342 : : {
1343 : 28 : SvXMLImport::acquire();
1344 : 28 : }
1345 : :
1346 : 28 : void SAL_CALL AnimationsImport::release() throw ()
1347 : : {
1348 : 28 : SvXMLImport::release();
1349 : 28 : }
1350 : :
1351 : 4 : SvXMLImportContext *AnimationsImport::CreateContext(sal_uInt16 nPrefix, const OUString& rLocalName, const Reference<XAttributeList>& xAttrList)
1352 : : {
1353 : 4 : SvXMLImportContext* pContext = 0;
1354 : :
1355 [ + - ][ + - ]: 4 : if( (XML_NAMESPACE_ANIMATION == nPrefix) && IsXMLToken( rLocalName, XML_SEQ ) )
[ + - ]
1356 : : {
1357 [ + - ]: 4 : pContext = new AnimationNodeContext( mxRootNode, *this, nPrefix, rLocalName, xAttrList );
1358 : : }
1359 : : else
1360 : : {
1361 : 0 : pContext = SvXMLImport::CreateContext(nPrefix, rLocalName, xAttrList);
1362 : : }
1363 : :
1364 : 4 : return pContext;
1365 : : }
1366 : :
1367 : : // XAnimationNodeSupplier
1368 : 4 : Reference< XAnimationNode > SAL_CALL AnimationsImport::getAnimationNode() throw (RuntimeException)
1369 : : {
1370 : 4 : return mxRootNode;
1371 : : }
1372 : :
1373 : 0 : void AnimationNodeContext::postProcessRootNode( SvXMLImport& /*rImport*/, const Reference< XAnimationNode >& xRootNode, Reference< XPropertySet >& xPageProps )
1374 : : {
1375 [ # # ][ # # ]: 0 : if( xRootNode.is() && xPageProps.is() ) try
[ # # ]
1376 : : {
1377 [ # # ]: 0 : Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
1378 [ # # ][ # # ]: 0 : Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
[ # # ]
1379 [ # # ][ # # ]: 0 : if( xEnumeration->hasMoreElements() )
[ # # ]
1380 : : {
1381 [ # # ][ # # ]: 0 : Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
[ # # ]
1382 [ # # ][ # # ]: 0 : if( xNode->getType() == AnimationNodeType::PAR )
[ # # ]
1383 : : {
1384 : 0 : Event aEvent;
1385 [ # # ][ # # ]: 0 : if( (xNode->getBegin() >>= aEvent) && (aEvent.Trigger == EventTrigger::BEGIN_EVENT) )
[ # # ][ # # ]
[ # # ]
[ # # # # ]
[ # # ]
1386 : : {
1387 : : // found transition node
1388 [ # # ]: 0 : Reference< XEnumerationAccess > xChildEnumerationAccess( xNode, UNO_QUERY_THROW );
1389 [ # # ][ # # ]: 0 : Reference< XEnumeration > xChildEnumeration( xChildEnumerationAccess->createEnumeration(), UNO_QUERY_THROW );
[ # # ]
1390 [ # # ][ # # ]: 0 : while( xChildEnumeration->hasMoreElements() )
[ # # ]
1391 : : {
1392 [ # # ][ # # ]: 0 : Reference< XAnimationNode > xChildNode( xChildEnumeration->nextElement(), UNO_QUERY_THROW );
[ # # ]
1393 [ # # ]: 0 : switch( xChildNode->getType() )
[ # # # # ]
[ # # ]
1394 : : {
1395 : : case AnimationNodeType::TRANSITIONFILTER:
1396 : : {
1397 [ # # ]: 0 : Reference< XTransitionFilter > xTransFilter( xChildNode, UNO_QUERY_THROW );
1398 : :
1399 : :
1400 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionType" ) ), Any( xTransFilter->getTransition() ) );
[ # # ][ # # ]
[ # # ][ # # ]
1401 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionSubtype" ) ), Any( xTransFilter->getSubtype() ) );
[ # # ][ # # ]
[ # # ][ # # ]
1402 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionDirection" ) ), Any( xTransFilter->getDirection() ) );
[ # # ][ # # ]
[ # # ][ # # ]
1403 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionFadeColor" ) ), Any( xTransFilter->getFadeColor() ) );
[ # # ][ # # ]
[ # # ][ # # ]
1404 : :
1405 : : double fDuration;
1406 [ # # ][ # # ]: 0 : if( xTransFilter->getDuration() >>= fDuration )
[ # # ]
1407 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TransitionDuration" ) ), Any( fDuration ) );
[ # # ][ # # ]
1408 : :
1409 : : }
1410 : 0 : break;
1411 : :
1412 : : case AnimationNodeType::COMMAND:
1413 : : {
1414 [ # # ]: 0 : Reference< XCommand > xCommand( xChildNode, UNO_QUERY_THROW );
1415 [ # # ][ # # ]: 0 : if( xCommand->getCommand() == EffectCommands::STOPAUDIO )
[ # # ]
1416 : : {
1417 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ), Any(sal_True) );
[ # # ][ # # ]
1418 : 0 : }
1419 : : }
1420 : 0 : break;
1421 : :
1422 : : case AnimationNodeType::AUDIO:
1423 : : {
1424 [ # # ]: 0 : Reference< XAudio > xAudio( xChildNode, UNO_QUERY_THROW );
1425 : 0 : OUString sSoundURL;
1426 [ # # ][ # # ]: 0 : if( (xAudio->getSource() >>= sSoundURL) && !sSoundURL.isEmpty() )
[ # # ][ # # ]
[ # # # # ]
[ # # ]
1427 : : {
1428 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ), Any(sSoundURL) );
[ # # ][ # # ]
1429 : :
1430 : : Timing eTiming;
1431 [ # # ][ # # ]: 0 : if( (xAudio->getRepeatCount() >>= eTiming) && (eTiming == Timing_INDEFINITE) )
[ # # ][ # # ]
[ # # ]
[ # # # # ]
[ # # ]
1432 [ # # ][ # # ]: 0 : xPageProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LoopSound" ) ), Any( sal_True ) );
[ # # ][ # # ]
1433 : 0 : }
1434 : : }
1435 : 0 : break;
1436 : :
1437 : : }
1438 : 0 : }
1439 : :
1440 [ # # ]: 0 : Reference< XTimeContainer > xRootContainer( xRootNode, UNO_QUERY_THROW );
1441 [ # # ][ # # ]: 0 : xRootContainer->removeChild( xNode );
1442 : 0 : }
1443 : 0 : }
1444 [ # # ]: 0 : }
1445 : : }
1446 : 0 : catch (const Exception&)
1447 : : {
1448 : : OSL_FAIL("xmloff::AnimationsImport::postProcessRootNode(), exception caught!");
1449 : : }
1450 : 0 : }
1451 : :
1452 : : } // namespace xmloff
1453 : :
1454 : 2 : Sequence< OUString > SAL_CALL AnimationsImport_getSupportedServiceNames() throw()
1455 : : {
1456 [ + - ]: 2 : const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Xmloff.AnimationsImport" ) );
1457 [ + - ]: 2 : const Sequence< OUString > aSeq( &aServiceName, 1 );
1458 : 2 : return aSeq;
1459 : : }
1460 : :
1461 : 93 : OUString SAL_CALL AnimationsImport_getImplementationName() throw()
1462 : : {
1463 : 93 : return OUString( RTL_CONSTASCII_USTRINGPARAM( "xmloff::AnimationsImport" ) );
1464 : : }
1465 : :
1466 : 4 : Reference< XInterface > SAL_CALL AnimationsImport_createInstance(const Reference< XMultiServiceFactory > & rSMgr) throw( Exception )
1467 : : {
1468 [ + - ]: 4 : return (cppu::OWeakObject*)new xmloff::AnimationsImport( rSMgr );
1469 : :
1470 : : }
1471 : :
1472 : : namespace xmloff
1473 : : {
1474 : :
1475 : 0 : OUString SAL_CALL AnimationsImport::getImplementationName() throw(RuntimeException)
1476 : : {
1477 : 0 : return AnimationsImport_getImplementationName();
1478 : : }
1479 : :
1480 : 0 : sal_Bool SAL_CALL AnimationsImport::supportsService( const OUString& ServiceName ) throw(RuntimeException)
1481 : : {
1482 : 0 : return ServiceName == "com.sun.star.comp.Xmloff.AnimationsImport";
1483 : : }
1484 : :
1485 : 0 : Sequence< OUString > SAL_CALL AnimationsImport::getSupportedServiceNames() throw(RuntimeException)
1486 : : {
1487 : 0 : return AnimationsImport_getSupportedServiceNames();
1488 : : }
1489 : :
1490 : : } // namespace xmloff
1491 : :
1492 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|