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