1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationFill.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationRestart.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/Timing.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/Event.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationEndSync.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/EventTrigger.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/EffectNodeType.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/EffectPresetClass.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationNodeType.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationTransformType.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationCalcMode.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationValueType.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationAdditiveMode.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XIterateContainer.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimateSet.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAudio.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XCommand.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XTransitionFilter.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimateColor.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimateMotion.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/XAnimateTransform.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/ValuePair.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/AnimationColorSpace.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/EffectCommands.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/NamedValue.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/FillStyle.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/LineStyle.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontWeight.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontUnderline.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontSlant.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumerationAccess.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/ParagraphTarget.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/TextAnimationType.hpp>
61*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
62*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
63*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski #include <vcl/vclenum.hxx>
66*b1cdbd2cSJim Jagielski #include <svx/svdotext.hxx>
67*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
68*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
69*b1cdbd2cSJim Jagielski #include <pptinanimations.hxx>
70*b1cdbd2cSJim Jagielski #include <pptatom.hxx>
71*b1cdbd2cSJim Jagielski #include "pptin.hxx"
72*b1cdbd2cSJim Jagielski #include <algorithm>
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski using ::std::map;
75*b1cdbd2cSJim Jagielski using ::rtl::OUString;
76*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
77*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
78*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
79*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY;
80*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW;
81*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
82*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::makeAny;
83*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception;
84*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface;
85*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::NamedValue;
86*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XEnumerationAccess;
87*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XEnumeration;
88*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XMultiServiceFactory;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::drawing;
91*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::animations;
92*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::presentation;
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski namespace sd
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski extern Reference< XInterface > RandomAnimationNode_createInstance( sal_Int16 nPresetClass );
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski namespace ppt
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski 
find(const OUString & rName)102*b1cdbd2cSJim Jagielski const transition* transition::find( const OUString& rName )
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	const transition* p = gTransitions;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	while( p->mpName )
107*b1cdbd2cSJim Jagielski 	{
108*b1cdbd2cSJim Jagielski 		if( rName.compareToAscii( p->mpName ) == 0 )
109*b1cdbd2cSJim Jagielski 			return p;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 		p++;
112*b1cdbd2cSJim Jagielski 	}
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	return NULL;
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski // ====================================================================
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski // ====================================================================
122*b1cdbd2cSJim Jagielski 
operator >>(SvStream & rIn,AnimationNode & rNode)123*b1cdbd2cSJim Jagielski SvStream& operator>>(SvStream& rIn, AnimationNode& rNode )
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnU1;
126*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnRestart;
127*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnGroupType;
128*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnFill;
129*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnU3;
130*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnU4;
131*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnDuration;
132*b1cdbd2cSJim Jagielski 	rIn >> rNode.mnNodeType;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	return rIn;
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski // ====================================================================
138*b1cdbd2cSJim Jagielski 
convertMeasure(OUString & rString)139*b1cdbd2cSJim Jagielski static bool convertMeasure( OUString& rString )
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski 	bool bRet = false;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	const sal_Char* pSource[] = { "ppt_x", "ppt_y", "ppt_w", "ppt_h", NULL };
144*b1cdbd2cSJim Jagielski 	const sal_Char* pDest[] = { "x", "y", "width", "height", NULL };
145*b1cdbd2cSJim Jagielski 	sal_Int32 nIndex = 0;
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 	const sal_Char** ps = pSource;
148*b1cdbd2cSJim Jagielski 	const sal_Char** pd = pDest;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	while( *ps )
151*b1cdbd2cSJim Jagielski 	{
152*b1cdbd2cSJim Jagielski 		const OUString aSearch( OUString::createFromAscii( *ps ) );
153*b1cdbd2cSJim Jagielski 		while( (nIndex = rString.indexOf( aSearch, nIndex )) != -1  )
154*b1cdbd2cSJim Jagielski 		{
155*b1cdbd2cSJim Jagielski 			sal_Int32 nLength = aSearch.getLength();
156*b1cdbd2cSJim Jagielski 			if( nIndex && (rString.getStr()[nIndex-1] == '#' ) )
157*b1cdbd2cSJim Jagielski 			{
158*b1cdbd2cSJim Jagielski 				nIndex--;
159*b1cdbd2cSJim Jagielski 				nLength++;
160*b1cdbd2cSJim Jagielski 			}
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 			const OUString aNew( OUString::createFromAscii( *pd ) );
163*b1cdbd2cSJim Jagielski 			rString = rString.replaceAt( nIndex, nLength, aNew );
164*b1cdbd2cSJim Jagielski 			nIndex += aNew.getLength();
165*b1cdbd2cSJim Jagielski 			bRet = true;
166*b1cdbd2cSJim Jagielski 		}
167*b1cdbd2cSJim Jagielski 		ps++;
168*b1cdbd2cSJim Jagielski 		pd++;
169*b1cdbd2cSJim Jagielski 	}
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 	return bRet;
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski // ====================================================================
176*b1cdbd2cSJim Jagielski 
hasProperty(sal_Int32 nProperty) const177*b1cdbd2cSJim Jagielski bool PropertySet::hasProperty( sal_Int32 nProperty ) const
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski 	return maProperties.find( nProperty ) != maProperties.end();
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
183*b1cdbd2cSJim Jagielski 
getProperty(sal_Int32 nProperty) const184*b1cdbd2cSJim Jagielski Any PropertySet::getProperty( sal_Int32 nProperty ) const
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	PropertySetMap_t::const_iterator aIter( maProperties.find( nProperty ) );
187*b1cdbd2cSJim Jagielski 	if( aIter != maProperties.end() )
188*b1cdbd2cSJim Jagielski 		return (*aIter).second;
189*b1cdbd2cSJim Jagielski 	else
190*b1cdbd2cSJim Jagielski 		return Any();
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski // ====================================================================
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski /** this adds an any to another any.
196*b1cdbd2cSJim Jagielski 	if rNewValue is empty, rOldValue is returned.
197*b1cdbd2cSJim Jagielski 	if rOldValue is empty, rNewValue is returned.
198*b1cdbd2cSJim Jagielski 	if rOldValue contains a value, a sequence with rOldValue and rNewValue is returned.
199*b1cdbd2cSJim Jagielski 	if rOldValue contains a sequence, a new sequence with the old sequence and rNewValue is returned.
200*b1cdbd2cSJim Jagielski */
addToSequence(const Any & rOldValue,const Any & rNewValue)201*b1cdbd2cSJim Jagielski static Any addToSequence( const Any& rOldValue, const Any& rNewValue )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski 	if( !rNewValue.hasValue() )
204*b1cdbd2cSJim Jagielski 	{
205*b1cdbd2cSJim Jagielski 		return rOldValue;
206*b1cdbd2cSJim Jagielski 	}
207*b1cdbd2cSJim Jagielski 	else if( !rOldValue.hasValue() )
208*b1cdbd2cSJim Jagielski 	{
209*b1cdbd2cSJim Jagielski 		return rNewValue;
210*b1cdbd2cSJim Jagielski 	}
211*b1cdbd2cSJim Jagielski 	else
212*b1cdbd2cSJim Jagielski 	{
213*b1cdbd2cSJim Jagielski 		Sequence< Any > aNewSeq;
214*b1cdbd2cSJim Jagielski 		if( rOldValue >>= aNewSeq )
215*b1cdbd2cSJim Jagielski 		{
216*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aNewSeq.getLength();
217*b1cdbd2cSJim Jagielski 			aNewSeq.realloc(nSize+1);
218*b1cdbd2cSJim Jagielski 			aNewSeq[nSize] = rNewValue;
219*b1cdbd2cSJim Jagielski 		}
220*b1cdbd2cSJim Jagielski 		else
221*b1cdbd2cSJim Jagielski 		{
222*b1cdbd2cSJim Jagielski 			aNewSeq.realloc(2);
223*b1cdbd2cSJim Jagielski 			aNewSeq[0] = rOldValue;
224*b1cdbd2cSJim Jagielski 			aNewSeq[1] = rNewValue;
225*b1cdbd2cSJim Jagielski 		}
226*b1cdbd2cSJim Jagielski 		return makeAny( aNewSeq );
227*b1cdbd2cSJim Jagielski 	}
228*b1cdbd2cSJim Jagielski }
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski // ====================================================================
231*b1cdbd2cSJim Jagielski 
AnimationImporter(ImplSdPPTImport * pPPTImport,SvStream & rStCtrl)232*b1cdbd2cSJim Jagielski AnimationImporter::AnimationImporter( ImplSdPPTImport* pPPTImport, SvStream& rStCtrl )
233*b1cdbd2cSJim Jagielski : mpPPTImport( pPPTImport ), mrStCtrl( rStCtrl )
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
238*b1cdbd2cSJim Jagielski 
import(const Reference<XDrawPage> & xPage,const DffRecordHeader & rProgTagContentHd)239*b1cdbd2cSJim Jagielski void AnimationImporter::import( const Reference< XDrawPage >& xPage, const DffRecordHeader& rProgTagContentHd )
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
242*b1cdbd2cSJim Jagielski 	mpFile = fopen( "c:\\output.xml", "w+" );
243*b1cdbd2cSJim Jagielski 	//mpFile = stdout;
244*b1cdbd2cSJim Jagielski #endif
245*b1cdbd2cSJim Jagielski 	dump("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	Reference< XAnimationNodeSupplier > xNodeSupplier( xPage, UNO_QUERY );
248*b1cdbd2cSJim Jagielski 	if( xNodeSupplier.is() )
249*b1cdbd2cSJim Jagielski 	{
250*b1cdbd2cSJim Jagielski 		mxRootNode = xNodeSupplier->getAnimationNode();
251*b1cdbd2cSJim Jagielski 		if( mxRootNode.is() )
252*b1cdbd2cSJim Jagielski 		{
253*b1cdbd2cSJim Jagielski 			Reference< XAnimationNode > xParent;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 			const Atom* pAtom = Atom::import( rProgTagContentHd, mrStCtrl );
256*b1cdbd2cSJim Jagielski 			if( pAtom )
257*b1cdbd2cSJim Jagielski 			{
258*b1cdbd2cSJim Jagielski 				importAnimationContainer( pAtom, xParent );
259*b1cdbd2cSJim Jagielski 			}
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 			processAfterEffectNodes();
262*b1cdbd2cSJim Jagielski 		}
263*b1cdbd2cSJim Jagielski 	}
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
266*b1cdbd2cSJim Jagielski 	fclose( mpFile );
267*b1cdbd2cSJim Jagielski #endif
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
271*b1cdbd2cSJim Jagielski 
processAfterEffectNodes()272*b1cdbd2cSJim Jagielski void AnimationImporter::processAfterEffectNodes()
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski 	std::for_each( maAfterEffectNodes.begin(), maAfterEffectNodes.end(), sd::stl_process_after_effect_node_func );
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
278*b1cdbd2cSJim Jagielski 
createNode(const Atom * pAtom,const AnimationNode & rNode)279*b1cdbd2cSJim Jagielski Reference< XAnimationNode > AnimationImporter::createNode( const Atom* pAtom, const AnimationNode& rNode )
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski 	const char* pServiceName = NULL;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	switch( rNode.mnGroupType )
284*b1cdbd2cSJim Jagielski 	{
285*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_PAR:
286*b1cdbd2cSJim Jagielski 		if( pAtom->hasChildAtom( DFF_msofbtAnimIteration ) )
287*b1cdbd2cSJim Jagielski 			pServiceName = "com.sun.star.animations.IterateContainer";
288*b1cdbd2cSJim Jagielski 		else
289*b1cdbd2cSJim Jagielski 			pServiceName = "com.sun.star.animations.ParallelTimeContainer";
290*b1cdbd2cSJim Jagielski 		break;
291*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_SEQ:
292*b1cdbd2cSJim Jagielski 		pServiceName = "com.sun.star.animations.SequenceTimeContainer";
293*b1cdbd2cSJim Jagielski 		break;
294*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_NODE:
295*b1cdbd2cSJim Jagielski 	{
296*b1cdbd2cSJim Jagielski 		switch( rNode.mnNodeType )
297*b1cdbd2cSJim Jagielski 		{
298*b1cdbd2cSJim Jagielski 		case mso_Anim_Behaviour_FILTER:
299*b1cdbd2cSJim Jagielski /*
300*b1cdbd2cSJim Jagielski 			pServiceName = "com.sun.star.animations.TransitionFilter";
301*b1cdbd2cSJim Jagielski 			break;
302*b1cdbd2cSJim Jagielski */
303*b1cdbd2cSJim Jagielski 		case mso_Anim_Behaviour_ANIMATION:
304*b1cdbd2cSJim Jagielski 			if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
305*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.AnimateSet";
306*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
307*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.AnimateColor";
308*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
309*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.AnimateTransform";
310*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
311*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.AnimateTransform";
312*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
313*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.AnimateMotion";
314*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateFilter ) )
315*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.TransitionFilter";
316*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
317*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.Command";
318*b1cdbd2cSJim Jagielski 			else
319*b1cdbd2cSJim Jagielski 				pServiceName = "com.sun.star.animations.Animate";
320*b1cdbd2cSJim Jagielski 			break;
321*b1cdbd2cSJim Jagielski 		}
322*b1cdbd2cSJim Jagielski 		break;
323*b1cdbd2cSJim Jagielski 	}
324*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_MEDIA:
325*b1cdbd2cSJim Jagielski 		pServiceName = "com.sun.star.animations.Audio";
326*b1cdbd2cSJim Jagielski 		break;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	default:
329*b1cdbd2cSJim Jagielski 		pServiceName = "com.sun.star.animations.Animate";
330*b1cdbd2cSJim Jagielski 		break;
331*b1cdbd2cSJim Jagielski 	}
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	Reference< XAnimationNode > xNode;
334*b1cdbd2cSJim Jagielski 	if( pServiceName )
335*b1cdbd2cSJim Jagielski 	{
336*b1cdbd2cSJim Jagielski 		const OUString aServiceName( OUString::createFromAscii(pServiceName) );
337*b1cdbd2cSJim Jagielski 		Reference< XInterface > xFac( ::comphelper::getProcessServiceFactory()->createInstance(aServiceName) );
338*b1cdbd2cSJim Jagielski 		xNode.set(xFac , UNO_QUERY );
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xNode.is(), "sd::AnimationImporter::createNode(), node creation failed!" );
342*b1cdbd2cSJim Jagielski 	return xNode;
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
346*b1cdbd2cSJim Jagielski 
is_random(const AnimationNode & rNode,const PropertySet & rSet,sal_Int32 & rPresetClass)347*b1cdbd2cSJim Jagielski static bool is_random( const AnimationNode& rNode, const PropertySet& rSet, sal_Int32& rPresetClass )
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	if( rNode.mnGroupType != mso_Anim_GroupType_PAR )
350*b1cdbd2cSJim Jagielski 		return false;
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	if( !rSet.hasProperty( DFF_ANIM_PRESET_ID ) || !rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) )
353*b1cdbd2cSJim Jagielski 		return false;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 	sal_Int32 nPresetId = 0;
356*b1cdbd2cSJim Jagielski 	if( !(rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId) || (nPresetId != 24) )
357*b1cdbd2cSJim Jagielski 		return false;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	sal_Int32 nPresetClass = 0;
360*b1cdbd2cSJim Jagielski 	if( !(rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass) )
361*b1cdbd2cSJim Jagielski 		return false;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	switch( nPresetClass )
364*b1cdbd2cSJim Jagielski 	{
365*b1cdbd2cSJim Jagielski 	case DFF_ANIM_PRESS_CLASS_ENTRANCE:	rPresetClass = EffectPresetClass::ENTRANCE; return true;
366*b1cdbd2cSJim Jagielski 	case DFF_ANIM_PRESS_CLASS_EXIT: rPresetClass = EffectPresetClass::EXIT; return true;
367*b1cdbd2cSJim Jagielski 	}
368*b1cdbd2cSJim Jagielski 	return false;
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 
importAnimationContainer(const Atom * pAtom,const Reference<XAnimationNode> & xParent)372*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xParent )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski 	if( pAtom->seekToContent() )
375*b1cdbd2cSJim Jagielski 	{
376*b1cdbd2cSJim Jagielski 		AnimationNode aNode;
377*b1cdbd2cSJim Jagielski 		const Atom* pAnimationNodeAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimNode );
378*b1cdbd2cSJim Jagielski 		if( pAnimationNodeAtom && pAnimationNodeAtom->seekToContent() )
379*b1cdbd2cSJim Jagielski 			mrStCtrl >> aNode;
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 		PropertySet aSet;
382*b1cdbd2cSJim Jagielski 		const Atom* pAnimationPropertySetAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimPropertySet );
383*b1cdbd2cSJim Jagielski 		if( pAnimationPropertySetAtom )
384*b1cdbd2cSJim Jagielski 			importPropertySetContainer( pAnimationPropertySetAtom, aSet );
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 		Reference< XAnimationNode > xNode;
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 		if( xParent.is() )
389*b1cdbd2cSJim Jagielski 		{
390*b1cdbd2cSJim Jagielski 			sal_Int32 nPresetClass;
391*b1cdbd2cSJim Jagielski 			if( is_random( aNode, aSet, nPresetClass ) )
392*b1cdbd2cSJim Jagielski 			{
393*b1cdbd2cSJim Jagielski 				// create a random animation node with the given preset class
394*b1cdbd2cSJim Jagielski 				xNode.set( sd::RandomAnimationNode_createInstance( (sal_Int16)nPresetClass ), UNO_QUERY );
395*b1cdbd2cSJim Jagielski 			}
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 			if( !xNode.is() )
398*b1cdbd2cSJim Jagielski 			{
399*b1cdbd2cSJim Jagielski 				// create a node for the given atom
400*b1cdbd2cSJim Jagielski 				xNode = createNode( pAtom, aNode );
401*b1cdbd2cSJim Jagielski 			}
402*b1cdbd2cSJim Jagielski 		}
403*b1cdbd2cSJim Jagielski 		else
404*b1cdbd2cSJim Jagielski 		{
405*b1cdbd2cSJim Jagielski 			// if we have no parent we fill the root node
406*b1cdbd2cSJim Jagielski 			xNode = mxRootNode;
407*b1cdbd2cSJim Jagielski 		}
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 		// import if we have a node and its not random
410*b1cdbd2cSJim Jagielski 		if( xNode.is() )
411*b1cdbd2cSJim Jagielski 		{
412*b1cdbd2cSJim Jagielski 			fillNode( xNode, aNode, aSet );
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 			switch( aNode.mnGroupType )
415*b1cdbd2cSJim Jagielski 			{
416*b1cdbd2cSJim Jagielski 			case mso_Anim_GroupType_PAR:
417*b1cdbd2cSJim Jagielski 			{
418*b1cdbd2cSJim Jagielski 				dump( "<par" );
419*b1cdbd2cSJim Jagielski 				dump( aNode );
420*b1cdbd2cSJim Jagielski 				dump( aSet );
421*b1cdbd2cSJim Jagielski 				importTimeContainer( pAtom, xNode );
422*b1cdbd2cSJim Jagielski 				dump( "</par>\n" );
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 				// for iteration containers, map target from childs to iteration
425*b1cdbd2cSJim Jagielski 				Reference< XIterateContainer > xIter( xNode, UNO_QUERY );
426*b1cdbd2cSJim Jagielski 				if( xIter.is() )
427*b1cdbd2cSJim Jagielski 				{
428*b1cdbd2cSJim Jagielski 					double fDuration = 0.0;
429*b1cdbd2cSJim Jagielski 					Any aTarget, aEmpty;
430*b1cdbd2cSJim Jagielski 					Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
431*b1cdbd2cSJim Jagielski 					if( xEnumerationAccess.is() )
432*b1cdbd2cSJim Jagielski 					{
433*b1cdbd2cSJim Jagielski 						Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_QUERY );
434*b1cdbd2cSJim Jagielski 						if( xEnumeration.is() )
435*b1cdbd2cSJim Jagielski 						{
436*b1cdbd2cSJim Jagielski 							while( xEnumeration->hasMoreElements() )
437*b1cdbd2cSJim Jagielski 							{
438*b1cdbd2cSJim Jagielski 								Reference< XAnimate > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
439*b1cdbd2cSJim Jagielski 								if( xChildNode.is() )
440*b1cdbd2cSJim Jagielski 								{
441*b1cdbd2cSJim Jagielski 									double fChildBegin = 0.0;
442*b1cdbd2cSJim Jagielski 									double fChildDuration = 0.0;
443*b1cdbd2cSJim Jagielski 									xChildNode->getBegin() >>= fChildBegin;
444*b1cdbd2cSJim Jagielski 									xChildNode->getDuration() >>= fChildDuration;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 									fChildDuration += fChildBegin;
447*b1cdbd2cSJim Jagielski 									if( fChildDuration > fDuration )
448*b1cdbd2cSJim Jagielski 										fDuration = fChildDuration;
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 									if( !aTarget.hasValue() )
451*b1cdbd2cSJim Jagielski 										aTarget = xChildNode->getTarget();
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 									xChildNode->setTarget( aEmpty );
454*b1cdbd2cSJim Jagielski 								}
455*b1cdbd2cSJim Jagielski 							}
456*b1cdbd2cSJim Jagielski 						}
457*b1cdbd2cSJim Jagielski 					}
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 					xIter->setTarget( aTarget );
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski 					double fIterateInterval = xIter->getIterateInterval() * fDuration / 100;
462*b1cdbd2cSJim Jagielski 					xIter->setIterateInterval( fIterateInterval );
463*b1cdbd2cSJim Jagielski 				}
464*b1cdbd2cSJim Jagielski 			}
465*b1cdbd2cSJim Jagielski 			break;
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 			case mso_Anim_GroupType_SEQ:
468*b1cdbd2cSJim Jagielski 			{
469*b1cdbd2cSJim Jagielski 				dump( "<seq" );
470*b1cdbd2cSJim Jagielski 				dump( aNode );
471*b1cdbd2cSJim Jagielski 				dump( aSet );
472*b1cdbd2cSJim Jagielski 				importTimeContainer( pAtom, xNode );
473*b1cdbd2cSJim Jagielski 				dump( "</seq>\n" );
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 				if( aSet.hasProperty( DFF_ANIM_NODE_TYPE ) )
476*b1cdbd2cSJim Jagielski 				{
477*b1cdbd2cSJim Jagielski 					sal_Int32 nPPTNodeType = 0;
478*b1cdbd2cSJim Jagielski 					if( aSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType )
479*b1cdbd2cSJim Jagielski 					{
480*b1cdbd2cSJim Jagielski 						switch(nPPTNodeType)
481*b1cdbd2cSJim Jagielski 						{
482*b1cdbd2cSJim Jagielski 						case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE:
483*b1cdbd2cSJim Jagielski 							fixMainSequenceTiming( xNode );
484*b1cdbd2cSJim Jagielski 							break;
485*b1cdbd2cSJim Jagielski 						case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:
486*b1cdbd2cSJim Jagielski 							fixInteractiveSequenceTiming( xNode );
487*b1cdbd2cSJim Jagielski 							break;
488*b1cdbd2cSJim Jagielski 						}
489*b1cdbd2cSJim Jagielski 					}
490*b1cdbd2cSJim Jagielski 				}
491*b1cdbd2cSJim Jagielski 			}
492*b1cdbd2cSJim Jagielski 			break;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 			case mso_Anim_GroupType_NODE:
495*b1cdbd2cSJim Jagielski 			{
496*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
497*b1cdbd2cSJim Jagielski 				if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
498*b1cdbd2cSJim Jagielski 				{
499*b1cdbd2cSJim Jagielski 					dump( "<set" );
500*b1cdbd2cSJim Jagielski 				}
501*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
502*b1cdbd2cSJim Jagielski 				{
503*b1cdbd2cSJim Jagielski 					dump( "<animateColor" );
504*b1cdbd2cSJim Jagielski 				}
505*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
506*b1cdbd2cSJim Jagielski 				{
507*b1cdbd2cSJim Jagielski 					dump( "<animateScale" );
508*b1cdbd2cSJim Jagielski 				}
509*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
510*b1cdbd2cSJim Jagielski 				{
511*b1cdbd2cSJim Jagielski 					dump( "<animateRotation" );
512*b1cdbd2cSJim Jagielski 				}
513*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
514*b1cdbd2cSJim Jagielski 				{
515*b1cdbd2cSJim Jagielski 					dump( "<animateMotion" );
516*b1cdbd2cSJim Jagielski 				}
517*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimate ) )
518*b1cdbd2cSJim Jagielski 				{
519*b1cdbd2cSJim Jagielski 					dump( "<animate" );
520*b1cdbd2cSJim Jagielski 				}
521*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimateFilter ) )
522*b1cdbd2cSJim Jagielski 				{
523*b1cdbd2cSJim Jagielski 					dump( "<animateFilter" );
524*b1cdbd2cSJim Jagielski 				}
525*b1cdbd2cSJim Jagielski 				else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
526*b1cdbd2cSJim Jagielski 				{
527*b1cdbd2cSJim Jagielski 					dump( "<command" );
528*b1cdbd2cSJim Jagielski 				}
529*b1cdbd2cSJim Jagielski 				else
530*b1cdbd2cSJim Jagielski 				{
531*b1cdbd2cSJim Jagielski 					DBG_ERROR( "unknown node atom!" );
532*b1cdbd2cSJim Jagielski 					dump_atom_header( pAtom, true, false );
533*b1cdbd2cSJim Jagielski 					dump_atom( pAtom );
534*b1cdbd2cSJim Jagielski 					dump_atom_header( pAtom, false, false );
535*b1cdbd2cSJim Jagielski 					break;
536*b1cdbd2cSJim Jagielski 				}
537*b1cdbd2cSJim Jagielski 				dump( aNode );
538*b1cdbd2cSJim Jagielski 				dump( aSet );
539*b1cdbd2cSJim Jagielski #endif
540*b1cdbd2cSJim Jagielski 				importAnimationNodeContainer( pAtom, xNode );
541*b1cdbd2cSJim Jagielski 				if( !convertAnimationNode( xNode, xParent ) )
542*b1cdbd2cSJim Jagielski 					xNode = 0;
543*b1cdbd2cSJim Jagielski 				dump( "/>\n");
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 			}
546*b1cdbd2cSJim Jagielski 			break;
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski 			case mso_Anim_GroupType_MEDIA:
549*b1cdbd2cSJim Jagielski 			{
550*b1cdbd2cSJim Jagielski 				dump( "<audio" );
551*b1cdbd2cSJim Jagielski 				dump( aNode );
552*b1cdbd2cSJim Jagielski 				dump( aSet );
553*b1cdbd2cSJim Jagielski 				importAudioContainer( pAtom, xNode );
554*b1cdbd2cSJim Jagielski 				dump( "</audio>\n" );
555*b1cdbd2cSJim Jagielski 			}
556*b1cdbd2cSJim Jagielski 			break;
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 			default:
559*b1cdbd2cSJim Jagielski 				DBG_ERROR( "unknown group atom!" );
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 				dump_atom_header( pAtom, true, false );
562*b1cdbd2cSJim Jagielski 				dump_atom( pAtom );
563*b1cdbd2cSJim Jagielski 				dump_atom_header( pAtom, false, false );
564*b1cdbd2cSJim Jagielski 				break;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 			}
567*b1cdbd2cSJim Jagielski 		}
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski 		if( xParent.is() && xNode.is() )
570*b1cdbd2cSJim Jagielski 		{
571*b1cdbd2cSJim Jagielski 			Reference< XTimeContainer > xParentContainer( xParent, UNO_QUERY );
572*b1cdbd2cSJim Jagielski 			DBG_ASSERT( xParentContainer.is(), "parent is no container, then why do I have a child here?" );
573*b1cdbd2cSJim Jagielski 			if( xParentContainer.is() )
574*b1cdbd2cSJim Jagielski 			{
575*b1cdbd2cSJim Jagielski 				xParentContainer->appendChild( xNode );
576*b1cdbd2cSJim Jagielski 			}
577*b1cdbd2cSJim Jagielski 		}
578*b1cdbd2cSJim Jagielski 	}
579*b1cdbd2cSJim Jagielski }
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
fixMainSequenceTiming(const::com::sun::star::uno::Reference<::com::sun::star::animations::XAnimationNode> & xNode)582*b1cdbd2cSJim Jagielski void AnimationImporter::fixMainSequenceTiming( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode )
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski 	try
585*b1cdbd2cSJim Jagielski 	{
586*b1cdbd2cSJim Jagielski 		bool bFirst = true;
587*b1cdbd2cSJim Jagielski 		Reference< XEnumerationAccess > xEA( xNode, UNO_QUERY_THROW );
588*b1cdbd2cSJim Jagielski 		Reference< XEnumeration > xE( xEA->createEnumeration(), UNO_QUERY_THROW );
589*b1cdbd2cSJim Jagielski 		while( xE->hasMoreElements() )
590*b1cdbd2cSJim Jagielski 		{
591*b1cdbd2cSJim Jagielski 			// click node
592*b1cdbd2cSJim Jagielski 			Reference< XAnimationNode > xClickNode( xE->nextElement(), UNO_QUERY );
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 			Event aEvent;
595*b1cdbd2cSJim Jagielski 			aEvent.Trigger = EventTrigger::ON_NEXT;
596*b1cdbd2cSJim Jagielski 			aEvent.Repeat = 0;
597*b1cdbd2cSJim Jagielski 			xClickNode->setBegin( makeAny( aEvent ) );
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 			if( bFirst )
600*b1cdbd2cSJim Jagielski 			{
601*b1cdbd2cSJim Jagielski 				bFirst = false;
602*b1cdbd2cSJim Jagielski 				Reference< XEnumerationAccess > xEA2( xClickNode, UNO_QUERY_THROW );
603*b1cdbd2cSJim Jagielski 				Reference< XEnumeration > xE2( xEA2->createEnumeration(), UNO_QUERY_THROW );
604*b1cdbd2cSJim Jagielski 				if( xE2->hasMoreElements() )
605*b1cdbd2cSJim Jagielski 				{
606*b1cdbd2cSJim Jagielski 					// with node
607*b1cdbd2cSJim Jagielski 					xE2->nextElement() >>= xEA2;
608*b1cdbd2cSJim Jagielski 					if( xEA2.is() )
609*b1cdbd2cSJim Jagielski 						xE2.query( xEA2->createEnumeration() );
610*b1cdbd2cSJim Jagielski 					else
611*b1cdbd2cSJim Jagielski 						xE2.clear();
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 					if( xE2.is() && xE2->hasMoreElements() )
614*b1cdbd2cSJim Jagielski 					{
615*b1cdbd2cSJim Jagielski 						Reference< XAnimationNode > xEffectNode( xE2->nextElement(), UNO_QUERY_THROW );
616*b1cdbd2cSJim Jagielski 						const Sequence< NamedValue > aUserData( xEffectNode->getUserData() );
617*b1cdbd2cSJim Jagielski 						const NamedValue* p = aUserData.getConstArray();
618*b1cdbd2cSJim Jagielski 						sal_Int32 nLength = aUserData.getLength();
619*b1cdbd2cSJim Jagielski 						while( nLength-- )
620*b1cdbd2cSJim Jagielski 						{
621*b1cdbd2cSJim Jagielski 							if( p->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "node-type" ) ) )
622*b1cdbd2cSJim Jagielski 							{
623*b1cdbd2cSJim Jagielski 								sal_Int16 nNodeType = 0;
624*b1cdbd2cSJim Jagielski 								p->Value >>= nNodeType;
625*b1cdbd2cSJim Jagielski 								if( nNodeType != ::com::sun::star::presentation::EffectNodeType::ON_CLICK )
626*b1cdbd2cSJim Jagielski 								{
627*b1cdbd2cSJim Jagielski 									// first effect does not start on click, so correct
628*b1cdbd2cSJim Jagielski 									// first click nodes begin to 0s
629*b1cdbd2cSJim Jagielski 									xClickNode->setBegin( makeAny( (double)0.0 ) );
630*b1cdbd2cSJim Jagielski 									break;
631*b1cdbd2cSJim Jagielski 								}
632*b1cdbd2cSJim Jagielski 							}
633*b1cdbd2cSJim Jagielski 							p++;
634*b1cdbd2cSJim Jagielski 						}
635*b1cdbd2cSJim Jagielski 					}
636*b1cdbd2cSJim Jagielski 				}
637*b1cdbd2cSJim Jagielski 			}
638*b1cdbd2cSJim Jagielski 		}
639*b1cdbd2cSJim Jagielski 	}
640*b1cdbd2cSJim Jagielski 	catch( Exception& e )
641*b1cdbd2cSJim Jagielski 	{
642*b1cdbd2cSJim Jagielski 		(void)e;
643*b1cdbd2cSJim Jagielski 		DBG_ERROR("sd::AnimationImporter::fixMainSequenceTiming(), exception caught!" );
644*b1cdbd2cSJim Jagielski 	}
645*b1cdbd2cSJim Jagielski }
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
648*b1cdbd2cSJim Jagielski 
fixInteractiveSequenceTiming(const::com::sun::star::uno::Reference<::com::sun::star::animations::XAnimationNode> & xNode)649*b1cdbd2cSJim Jagielski void AnimationImporter::fixInteractiveSequenceTiming( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode )
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski 	try
652*b1cdbd2cSJim Jagielski 	{
653*b1cdbd2cSJim Jagielski 		Any aBegin( xNode->getBegin() );
654*b1cdbd2cSJim Jagielski 		Any aEmpty;
655*b1cdbd2cSJim Jagielski 		xNode->setBegin( aEmpty );
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 		Reference< XEnumerationAccess > xEA( xNode, UNO_QUERY_THROW );
658*b1cdbd2cSJim Jagielski 		Reference< XEnumeration > xE( xEA->createEnumeration(), UNO_QUERY_THROW );
659*b1cdbd2cSJim Jagielski 		while( xE->hasMoreElements() )
660*b1cdbd2cSJim Jagielski 		{
661*b1cdbd2cSJim Jagielski 			// click node
662*b1cdbd2cSJim Jagielski 			Reference< XAnimationNode > xClickNode( xE->nextElement(), UNO_QUERY );
663*b1cdbd2cSJim Jagielski 			xClickNode->setBegin( aBegin );
664*b1cdbd2cSJim Jagielski 		}
665*b1cdbd2cSJim Jagielski 	}
666*b1cdbd2cSJim Jagielski 	catch( Exception& e )
667*b1cdbd2cSJim Jagielski 	{
668*b1cdbd2cSJim Jagielski 		(void)e;
669*b1cdbd2cSJim Jagielski 		DBG_ERROR("sd::AnimationImporter::fixInteractiveSequenceTiming(), exception caught!" );
670*b1cdbd2cSJim Jagielski 	}
671*b1cdbd2cSJim Jagielski }
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
674*b1cdbd2cSJim Jagielski 
convertAnimationNode(const Reference<XAnimationNode> & xNode,const Reference<XAnimationNode> & xParent)675*b1cdbd2cSJim Jagielski bool AnimationImporter::convertAnimationNode( const Reference< XAnimationNode >& xNode, const Reference< XAnimationNode >& xParent )
676*b1cdbd2cSJim Jagielski {
677*b1cdbd2cSJim Jagielski 	Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
678*b1cdbd2cSJim Jagielski 	if( !xAnimate.is() )
679*b1cdbd2cSJim Jagielski 		return true;
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski 	if( !xAnimate->getTarget().hasValue() )
682*b1cdbd2cSJim Jagielski 		return false;
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	const sal_Int16 nNodeType = xNode->getType();
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 	if( nNodeType == AnimationNodeType::TRANSITIONFILTER )
687*b1cdbd2cSJim Jagielski 		return true;
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 	OUString aAttributeName( xAnimate->getAttributeName() );
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski 	if( (nNodeType == AnimationNodeType::SET) && aAttributeName.equalsAscii( "fill.on" ) )
692*b1cdbd2cSJim Jagielski 		return false;
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	const ImplAttributeNameConversion* p = gImplConversionList;
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 	MS_AttributeNames eAttribute = MS_UNKNOWN;
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski 	if( (nNodeType == AnimationNodeType::ANIMATEMOTION) ||
699*b1cdbd2cSJim Jagielski 		(nNodeType == AnimationNodeType::ANIMATETRANSFORM) )
700*b1cdbd2cSJim Jagielski 	{
701*b1cdbd2cSJim Jagielski 		OUString aEmpty;
702*b1cdbd2cSJim Jagielski 		aAttributeName = aEmpty;
703*b1cdbd2cSJim Jagielski 	}
704*b1cdbd2cSJim Jagielski 	else
705*b1cdbd2cSJim Jagielski 	{
706*b1cdbd2cSJim Jagielski 		while( p->mpMSName )
707*b1cdbd2cSJim Jagielski 		{
708*b1cdbd2cSJim Jagielski 			if( aAttributeName.compareToAscii( p->mpMSName ) == 0 )
709*b1cdbd2cSJim Jagielski 				break;
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 			p++;
712*b1cdbd2cSJim Jagielski 		}
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski 		DBG_ASSERT( p->mpMSName || (aAttributeName.getLength() == 0), "sd::AnimationImporter::convertAnimationNode(), unknown attribute!" );
715*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
716*b1cdbd2cSJim Jagielski 		if( p->mpMSName == 0 ) dump( "<error text=\"sd::AnimationImporter::convertAnimationNode(), unknown attribute!\"/>\n" );
717*b1cdbd2cSJim Jagielski #endif
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 		eAttribute = p->meAttribute;
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 		if( p->mpAPIName )
722*b1cdbd2cSJim Jagielski 			aAttributeName = OUString::createFromAscii( p->mpAPIName );
723*b1cdbd2cSJim Jagielski 	}
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 	xAnimate->setAttributeName( aAttributeName );
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski 	if( eAttribute != MS_UNKNOWN )
728*b1cdbd2cSJim Jagielski 	{
729*b1cdbd2cSJim Jagielski 		Any aAny( xAnimate->getFrom() );
730*b1cdbd2cSJim Jagielski 		if( aAny.hasValue() )
731*b1cdbd2cSJim Jagielski 		{
732*b1cdbd2cSJim Jagielski 			if( convertAnimationValue( eAttribute, aAny ) )
733*b1cdbd2cSJim Jagielski 				xAnimate->setFrom( aAny );
734*b1cdbd2cSJim Jagielski 		}
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 		aAny = xAnimate->getBy();
737*b1cdbd2cSJim Jagielski 		if( aAny.hasValue() )
738*b1cdbd2cSJim Jagielski 		{
739*b1cdbd2cSJim Jagielski 			if( convertAnimationValue( eAttribute, aAny ) )
740*b1cdbd2cSJim Jagielski 				xAnimate->setBy( aAny );
741*b1cdbd2cSJim Jagielski 		}
742*b1cdbd2cSJim Jagielski 
743*b1cdbd2cSJim Jagielski 		aAny = xAnimate->getTo();
744*b1cdbd2cSJim Jagielski 		if( aAny.hasValue() )
745*b1cdbd2cSJim Jagielski 		{
746*b1cdbd2cSJim Jagielski 			if( convertAnimationValue( eAttribute, aAny ) )
747*b1cdbd2cSJim Jagielski 				xAnimate->setTo( aAny );
748*b1cdbd2cSJim Jagielski 		}
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 		Sequence< Any > aValues( xAnimate->getValues() );
751*b1cdbd2cSJim Jagielski 		sal_Int32 nValues = aValues.getLength();
752*b1cdbd2cSJim Jagielski 		if( nValues )
753*b1cdbd2cSJim Jagielski 		{
754*b1cdbd2cSJim Jagielski 			Any* p2 = aValues.getArray();
755*b1cdbd2cSJim Jagielski 			while( nValues-- )
756*b1cdbd2cSJim Jagielski 				convertAnimationValue( eAttribute, *p2++ );
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 			xAnimate->setValues( aValues );
759*b1cdbd2cSJim Jagielski 		}
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 		OUString aFormula( xAnimate->getFormula() );
762*b1cdbd2cSJim Jagielski 		if( aFormula.getLength() )
763*b1cdbd2cSJim Jagielski 		{
764*b1cdbd2cSJim Jagielski 			if( convertMeasure( aFormula ) )
765*b1cdbd2cSJim Jagielski 				xAnimate->setFormula( aFormula );
766*b1cdbd2cSJim Jagielski 		}
767*b1cdbd2cSJim Jagielski 	}
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski 	// check for after-affect
770*b1cdbd2cSJim Jagielski 	Sequence< NamedValue > aUserData( xNode->getUserData() );
771*b1cdbd2cSJim Jagielski 	NamedValue* pValue = aUserData.getArray();
772*b1cdbd2cSJim Jagielski 	NamedValue* pLastValue = pValue;
773*b1cdbd2cSJim Jagielski 	sal_Int32 nLength = aUserData.getLength(), nRemoved = 0;
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	sal_Bool bAfterEffect = false;
776*b1cdbd2cSJim Jagielski 	sal_Int32 nMasterRel = 0;
777*b1cdbd2cSJim Jagielski 	for( ; nLength--; pValue++ )
778*b1cdbd2cSJim Jagielski 	{
779*b1cdbd2cSJim Jagielski 		if( pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("after-effect") ) )
780*b1cdbd2cSJim Jagielski 		{
781*b1cdbd2cSJim Jagielski 			pValue->Value >>= bAfterEffect;
782*b1cdbd2cSJim Jagielski 			nRemoved++;
783*b1cdbd2cSJim Jagielski 		}
784*b1cdbd2cSJim Jagielski 		else if( pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("master-rel") ) )
785*b1cdbd2cSJim Jagielski 		{
786*b1cdbd2cSJim Jagielski 			pValue->Value >>= nMasterRel;
787*b1cdbd2cSJim Jagielski 			nRemoved++;
788*b1cdbd2cSJim Jagielski 		}
789*b1cdbd2cSJim Jagielski 		else
790*b1cdbd2cSJim Jagielski 		{
791*b1cdbd2cSJim Jagielski 			if( nRemoved )
792*b1cdbd2cSJim Jagielski 				*pLastValue = *pValue;
793*b1cdbd2cSJim Jagielski 			pLastValue++;
794*b1cdbd2cSJim Jagielski 		}
795*b1cdbd2cSJim Jagielski 	}
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski 	if( nRemoved )
798*b1cdbd2cSJim Jagielski 	{
799*b1cdbd2cSJim Jagielski 		aUserData.realloc( aUserData.getLength() - nRemoved );
800*b1cdbd2cSJim Jagielski 		xNode->setUserData( aUserData );
801*b1cdbd2cSJim Jagielski 	}
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 	// if its an after effect node, add it to the list for
804*b1cdbd2cSJim Jagielski 	// later processing
805*b1cdbd2cSJim Jagielski 	// after effect nodes are not inserted at their import
806*b1cdbd2cSJim Jagielski 	// position, so return false in this case
807*b1cdbd2cSJim Jagielski 	if( bAfterEffect )
808*b1cdbd2cSJim Jagielski 	{
809*b1cdbd2cSJim Jagielski 		if( nMasterRel != 2 )
810*b1cdbd2cSJim Jagielski 		{
811*b1cdbd2cSJim Jagielski 			Event aEvent;
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 			aEvent.Source <<= xParent;
814*b1cdbd2cSJim Jagielski 			aEvent.Trigger = EventTrigger::END_EVENT;
815*b1cdbd2cSJim Jagielski 			aEvent.Repeat = 0;
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 			xNode->setBegin( makeAny( aEvent ) );
818*b1cdbd2cSJim Jagielski 		}
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski 		// add to after effect nodes for later processing
821*b1cdbd2cSJim Jagielski 		sd::AfterEffectNode aNode( xNode, xParent, nMasterRel == 2 );
822*b1cdbd2cSJim Jagielski 		maAfterEffectNodes.push_back( aNode );
823*b1cdbd2cSJim Jagielski 		return false;
824*b1cdbd2cSJim Jagielski 	}
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 	return true;
827*b1cdbd2cSJim Jagielski }
828*b1cdbd2cSJim Jagielski 
lcl_gethex(int nChar)829*b1cdbd2cSJim Jagielski static int lcl_gethex( int nChar )
830*b1cdbd2cSJim Jagielski {
831*b1cdbd2cSJim Jagielski     if( nChar >= '0' && nChar <= '9' )
832*b1cdbd2cSJim Jagielski         return nChar - '0';
833*b1cdbd2cSJim Jagielski     else if( nChar >= 'a' && nChar <= 'f' )
834*b1cdbd2cSJim Jagielski         return nChar - 'a' + 10;
835*b1cdbd2cSJim Jagielski     else if( nChar >= 'A' && nChar <= 'F' )
836*b1cdbd2cSJim Jagielski         return nChar - 'A' + 10;
837*b1cdbd2cSJim Jagielski     else
838*b1cdbd2cSJim Jagielski         return 0;
839*b1cdbd2cSJim Jagielski }
840*b1cdbd2cSJim Jagielski 
convertAnimationValue(MS_AttributeNames eAttribute,Any & rValue)841*b1cdbd2cSJim Jagielski bool AnimationImporter::convertAnimationValue( MS_AttributeNames eAttribute, Any& rValue )
842*b1cdbd2cSJim Jagielski {
843*b1cdbd2cSJim Jagielski 	bool bRet = false;
844*b1cdbd2cSJim Jagielski 	switch( eAttribute )
845*b1cdbd2cSJim Jagielski 	{
846*b1cdbd2cSJim Jagielski 	case MS_PPT_X:
847*b1cdbd2cSJim Jagielski 	case MS_PPT_Y:
848*b1cdbd2cSJim Jagielski 	case MS_PPT_W:
849*b1cdbd2cSJim Jagielski 	case MS_PPT_H:
850*b1cdbd2cSJim Jagielski 	{
851*b1cdbd2cSJim Jagielski 		OUString aString;
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski 		if( rValue.getValueType() == ::getCppuType((const ValuePair*)0) )
854*b1cdbd2cSJim Jagielski 		{
855*b1cdbd2cSJim Jagielski 			ValuePair aValuePair;
856*b1cdbd2cSJim Jagielski 			if( rValue >>= aValuePair )
857*b1cdbd2cSJim Jagielski 			{
858*b1cdbd2cSJim Jagielski 				if( aValuePair.First >>= aString )
859*b1cdbd2cSJim Jagielski 				{
860*b1cdbd2cSJim Jagielski 					if( convertMeasure( aString ) )
861*b1cdbd2cSJim Jagielski 					{
862*b1cdbd2cSJim Jagielski 						aValuePair.First <<= aString;
863*b1cdbd2cSJim Jagielski 						bRet = true;
864*b1cdbd2cSJim Jagielski 					}
865*b1cdbd2cSJim Jagielski 				}
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 				if( aValuePair.Second >>= aString )
868*b1cdbd2cSJim Jagielski 				{
869*b1cdbd2cSJim Jagielski 					if( convertMeasure( aString ) )
870*b1cdbd2cSJim Jagielski 					{
871*b1cdbd2cSJim Jagielski 						aValuePair.Second <<= aString;
872*b1cdbd2cSJim Jagielski 						bRet = true;
873*b1cdbd2cSJim Jagielski 					}
874*b1cdbd2cSJim Jagielski 				}
875*b1cdbd2cSJim Jagielski 			}
876*b1cdbd2cSJim Jagielski 		}
877*b1cdbd2cSJim Jagielski 		else if( rValue.getValueType() == ::getCppuType((const OUString*)0) )
878*b1cdbd2cSJim Jagielski 		{
879*b1cdbd2cSJim Jagielski 			if( rValue >>= aString )
880*b1cdbd2cSJim Jagielski 			{
881*b1cdbd2cSJim Jagielski 				bRet = convertMeasure( aString );
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski 				if( bRet )
884*b1cdbd2cSJim Jagielski 					rValue <<= aString;
885*b1cdbd2cSJim Jagielski 			}
886*b1cdbd2cSJim Jagielski 		}
887*b1cdbd2cSJim Jagielski 	}
888*b1cdbd2cSJim Jagielski 	break;
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 	case MS_XSHEAR:
891*b1cdbd2cSJim Jagielski 	case MS_R:
892*b1cdbd2cSJim Jagielski 	{
893*b1cdbd2cSJim Jagielski 		OUString aString;
894*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
895*b1cdbd2cSJim Jagielski 		{
896*b1cdbd2cSJim Jagielski 			rValue <<= aString.toDouble();
897*b1cdbd2cSJim Jagielski 			bRet = true;
898*b1cdbd2cSJim Jagielski 		}
899*b1cdbd2cSJim Jagielski 	}
900*b1cdbd2cSJim Jagielski 	break;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski 	case MS_STYLEROTATION:
903*b1cdbd2cSJim Jagielski 	{
904*b1cdbd2cSJim Jagielski 		if( rValue.getValueType() == ::getCppuType((const OUString*)0) )
905*b1cdbd2cSJim Jagielski 		{
906*b1cdbd2cSJim Jagielski 			OUString aString;
907*b1cdbd2cSJim Jagielski 			rValue >>= aString;
908*b1cdbd2cSJim Jagielski 			rValue <<= (sal_Int16)aString.toDouble();
909*b1cdbd2cSJim Jagielski 			bRet = true;
910*b1cdbd2cSJim Jagielski 		}
911*b1cdbd2cSJim Jagielski 		else if( rValue.getValueType() == ::getCppuType((const double*)0) )
912*b1cdbd2cSJim Jagielski 		{
913*b1cdbd2cSJim Jagielski 			double fValue = 0.0;
914*b1cdbd2cSJim Jagielski 			rValue >>= fValue;
915*b1cdbd2cSJim Jagielski 			rValue <<= (sal_Int16)fValue;
916*b1cdbd2cSJim Jagielski 			bRet = true;
917*b1cdbd2cSJim Jagielski 		}
918*b1cdbd2cSJim Jagielski 	}
919*b1cdbd2cSJim Jagielski 	break;
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 	case MS_FILLCOLOR:
922*b1cdbd2cSJim Jagielski 	case MS_STROKECOLOR:
923*b1cdbd2cSJim Jagielski 	case MS_STYLECOLOR:
924*b1cdbd2cSJim Jagielski 	case MS_PPT_C:
925*b1cdbd2cSJim Jagielski 	{
926*b1cdbd2cSJim Jagielski 		OUString aString;
927*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
928*b1cdbd2cSJim Jagielski 		{
929*b1cdbd2cSJim Jagielski 			if( aString.getLength() >= 7 && aString[0] == '#' )
930*b1cdbd2cSJim Jagielski 			{
931*b1cdbd2cSJim Jagielski 				Color aColor;
932*b1cdbd2cSJim Jagielski 				aColor.SetRed( (sal_uInt8)(lcl_gethex( aString[1] ) * 16 + lcl_gethex( aString[2] )) );
933*b1cdbd2cSJim Jagielski 				aColor.SetGreen( (sal_uInt8)(lcl_gethex( aString[3] ) * 16 + lcl_gethex( aString[4] )) );
934*b1cdbd2cSJim Jagielski 				aColor.SetBlue( (sal_uInt8)(lcl_gethex( aString[5] ) * 16 + lcl_gethex( aString[6] )) );
935*b1cdbd2cSJim Jagielski 				rValue <<= (sal_Int32)aColor.GetColor();
936*b1cdbd2cSJim Jagielski 				bRet = true;
937*b1cdbd2cSJim Jagielski 			}
938*b1cdbd2cSJim Jagielski 			else if( aString.matchAsciiL( "rgb(", 4, 0 ) )
939*b1cdbd2cSJim Jagielski 			{
940*b1cdbd2cSJim Jagielski 				aString = aString.copy( 4, aString.getLength() - 5 );
941*b1cdbd2cSJim Jagielski 				Color aColor;
942*b1cdbd2cSJim Jagielski 				sal_Int32 index = 0;
943*b1cdbd2cSJim Jagielski 				aColor.SetRed( (sal_uInt8)aString.getToken( 0, (sal_Unicode)',', index ).toInt32() );
944*b1cdbd2cSJim Jagielski 				aColor.SetGreen( (sal_uInt8)aString.getToken( 0, (sal_Unicode)',', index ).toInt32() );
945*b1cdbd2cSJim Jagielski 				aColor.SetRed( (sal_uInt8)aString.getToken( 0, (sal_Unicode)',', index ).toInt32() );
946*b1cdbd2cSJim Jagielski 				rValue <<= (sal_Int32)aColor.GetColor();
947*b1cdbd2cSJim Jagielski 				bRet = true;
948*b1cdbd2cSJim Jagielski 			}
949*b1cdbd2cSJim Jagielski 			else if( aString.matchAsciiL( "hsl(", 4, 0 ) )
950*b1cdbd2cSJim Jagielski 			{
951*b1cdbd2cSJim Jagielski 				sal_Int32 index = 0;
952*b1cdbd2cSJim Jagielski 				sal_Int32 nA = aString.getToken( 0, (sal_Unicode)',', index ).toInt32();
953*b1cdbd2cSJim Jagielski 				sal_Int32 nB = aString.getToken( 0, (sal_Unicode)',', index ).toInt32();
954*b1cdbd2cSJim Jagielski 				sal_Int32 nC = aString.getToken( 0, (sal_Unicode)',', index ).toInt32();
955*b1cdbd2cSJim Jagielski 				dump( "hsl(%ld", nA );
956*b1cdbd2cSJim Jagielski 				dump( ",%ld", nB );
957*b1cdbd2cSJim Jagielski 				dump( ",%ld)", nC );
958*b1cdbd2cSJim Jagielski 				Sequence< double > aHSL( 3 );
959*b1cdbd2cSJim Jagielski 				aHSL[0] = nA * 360.0/255.0;
960*b1cdbd2cSJim Jagielski 				aHSL[1] = nB / 255.0;
961*b1cdbd2cSJim Jagielski 				aHSL[2] = nC / 255.0;
962*b1cdbd2cSJim Jagielski 				rValue <<= aHSL;
963*b1cdbd2cSJim Jagielski 				bRet = true;
964*b1cdbd2cSJim Jagielski 			}
965*b1cdbd2cSJim Jagielski 		}
966*b1cdbd2cSJim Jagielski 	}
967*b1cdbd2cSJim Jagielski 	break;
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski 	case MS_FILLTYPE:
970*b1cdbd2cSJim Jagielski 	{
971*b1cdbd2cSJim Jagielski 		OUString aString;
972*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
973*b1cdbd2cSJim Jagielski 		{
974*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "solid" ) ? FillStyle_SOLID : FillStyle_NONE;
975*b1cdbd2cSJim Jagielski 			bRet = true;
976*b1cdbd2cSJim Jagielski 		}
977*b1cdbd2cSJim Jagielski 	}
978*b1cdbd2cSJim Jagielski 	break;
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski 	case MS_STROKEON:
981*b1cdbd2cSJim Jagielski 	{
982*b1cdbd2cSJim Jagielski 		OUString aString;
983*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
984*b1cdbd2cSJim Jagielski 		{
985*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "true" ) ? ::com::sun::star::drawing::LineStyle_SOLID : ::com::sun::star::drawing::LineStyle_NONE;
986*b1cdbd2cSJim Jagielski 			bRet = true;
987*b1cdbd2cSJim Jagielski 		}
988*b1cdbd2cSJim Jagielski 	}
989*b1cdbd2cSJim Jagielski 	break;
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski 	case MS_FONTWEIGHT:
992*b1cdbd2cSJim Jagielski 	{
993*b1cdbd2cSJim Jagielski 		OUString aString;
994*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
995*b1cdbd2cSJim Jagielski 		{
996*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "bold" ) ? com::sun::star::awt::FontWeight::BOLD : com::sun::star::awt::FontWeight::NORMAL;
997*b1cdbd2cSJim Jagielski 			bRet = true;
998*b1cdbd2cSJim Jagielski 		}
999*b1cdbd2cSJim Jagielski 	}
1000*b1cdbd2cSJim Jagielski 	break;
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski 	case MS_STYLEFONTSTYLE:
1003*b1cdbd2cSJim Jagielski 	{
1004*b1cdbd2cSJim Jagielski 		OUString aString;
1005*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
1006*b1cdbd2cSJim Jagielski 		{
1007*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "italic" ) ? com::sun::star::awt::FontSlant_ITALIC : com::sun::star::awt::FontSlant_NONE;
1008*b1cdbd2cSJim Jagielski 			bRet = true;
1009*b1cdbd2cSJim Jagielski 		}
1010*b1cdbd2cSJim Jagielski 	}
1011*b1cdbd2cSJim Jagielski 	break;
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski 	case MS_STYLEUNDERLINE:
1014*b1cdbd2cSJim Jagielski 	{
1015*b1cdbd2cSJim Jagielski 		OUString aString;
1016*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
1017*b1cdbd2cSJim Jagielski 		{
1018*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "true" ) ? com::sun::star::awt::FontUnderline::SINGLE : com::sun::star::awt::FontUnderline::NONE;
1019*b1cdbd2cSJim Jagielski 			bRet = true;
1020*b1cdbd2cSJim Jagielski 		}
1021*b1cdbd2cSJim Jagielski 	}
1022*b1cdbd2cSJim Jagielski 	break;
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski 	case MS_STYLEOPACITY:
1025*b1cdbd2cSJim Jagielski 	case MS_STYLEFONTSIZE:
1026*b1cdbd2cSJim Jagielski 	{
1027*b1cdbd2cSJim Jagielski 		OUString aString;
1028*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
1029*b1cdbd2cSJim Jagielski 		{
1030*b1cdbd2cSJim Jagielski 			rValue <<= (float)aString.toDouble();
1031*b1cdbd2cSJim Jagielski 			bRet = true;
1032*b1cdbd2cSJim Jagielski 		}
1033*b1cdbd2cSJim Jagielski 	}
1034*b1cdbd2cSJim Jagielski 	break;
1035*b1cdbd2cSJim Jagielski 
1036*b1cdbd2cSJim Jagielski 	case MS_STYLEVISIBILITY:
1037*b1cdbd2cSJim Jagielski 	{
1038*b1cdbd2cSJim Jagielski 		OUString aString;
1039*b1cdbd2cSJim Jagielski 		if( rValue >>= aString )
1040*b1cdbd2cSJim Jagielski 		{
1041*b1cdbd2cSJim Jagielski 			rValue <<= aString.equalsAscii( "visible" ) ? sal_True : sal_False;
1042*b1cdbd2cSJim Jagielski 			bRet = true;
1043*b1cdbd2cSJim Jagielski 		}
1044*b1cdbd2cSJim Jagielski 	}
1045*b1cdbd2cSJim Jagielski 	break;
1046*b1cdbd2cSJim Jagielski 	default:
1047*b1cdbd2cSJim Jagielski 		break;
1048*b1cdbd2cSJim Jagielski 	}
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski 	return bRet;
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1054*b1cdbd2cSJim Jagielski 
getConvertedSubType(sal_Int16 nPresetClass,sal_Int32 nPresetId,sal_Int32 nPresetSubType)1055*b1cdbd2cSJim Jagielski static OUString getConvertedSubType( sal_Int16 nPresetClass, sal_Int32 nPresetId, sal_Int32 nPresetSubType )
1056*b1cdbd2cSJim Jagielski {
1057*b1cdbd2cSJim Jagielski 	const sal_Char* pStr = 0;
1058*b1cdbd2cSJim Jagielski 
1059*b1cdbd2cSJim Jagielski 	if( (nPresetClass == EffectPresetClass::ENTRANCE) || (nPresetClass == EffectPresetClass::EXIT) )
1060*b1cdbd2cSJim Jagielski 	{
1061*b1cdbd2cSJim Jagielski 		// skip wheel effect
1062*b1cdbd2cSJim Jagielski 		if( nPresetId != 21 )
1063*b1cdbd2cSJim Jagielski 		{
1064*b1cdbd2cSJim Jagielski 			if( nPresetId == 5 )
1065*b1cdbd2cSJim Jagielski 			{
1066*b1cdbd2cSJim Jagielski 				// checkerboard
1067*b1cdbd2cSJim Jagielski 				switch( nPresetSubType )
1068*b1cdbd2cSJim Jagielski 				{
1069*b1cdbd2cSJim Jagielski 				case  5: pStr = "downward"; break;
1070*b1cdbd2cSJim Jagielski 				case 10: pStr = "across"; break;
1071*b1cdbd2cSJim Jagielski 				}
1072*b1cdbd2cSJim Jagielski 			}
1073*b1cdbd2cSJim Jagielski 			else if( nPresetId == 17 )
1074*b1cdbd2cSJim Jagielski 			{
1075*b1cdbd2cSJim Jagielski 				// stretch
1076*b1cdbd2cSJim Jagielski 				if( nPresetSubType == 10 )
1077*b1cdbd2cSJim Jagielski 					pStr = "across";
1078*b1cdbd2cSJim Jagielski 			}
1079*b1cdbd2cSJim Jagielski 			else if( nPresetId == 18 )
1080*b1cdbd2cSJim Jagielski 			{
1081*b1cdbd2cSJim Jagielski 				// strips
1082*b1cdbd2cSJim Jagielski 				switch( nPresetSubType )
1083*b1cdbd2cSJim Jagielski 				{
1084*b1cdbd2cSJim Jagielski 				case 3:	pStr = "right-to-top"; break;
1085*b1cdbd2cSJim Jagielski 				case 6: pStr = "right-to-bottom"; break;
1086*b1cdbd2cSJim Jagielski 				case 9: pStr = "left-to-top"; break;
1087*b1cdbd2cSJim Jagielski 				case 12: pStr = "left-to-bottom"; break;
1088*b1cdbd2cSJim Jagielski 				}
1089*b1cdbd2cSJim Jagielski 			}
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski 			if( pStr == 0 )
1092*b1cdbd2cSJim Jagielski 			{
1093*b1cdbd2cSJim Jagielski 				const convert_subtype* p = gConvertArray;
1094*b1cdbd2cSJim Jagielski 
1095*b1cdbd2cSJim Jagielski 				while( p->mpStrSubType )
1096*b1cdbd2cSJim Jagielski 				{
1097*b1cdbd2cSJim Jagielski 					if( p->mnID == nPresetSubType )
1098*b1cdbd2cSJim Jagielski 					{
1099*b1cdbd2cSJim Jagielski 						pStr = p->mpStrSubType;
1100*b1cdbd2cSJim Jagielski 						break;
1101*b1cdbd2cSJim Jagielski 					}
1102*b1cdbd2cSJim Jagielski 					p++;
1103*b1cdbd2cSJim Jagielski 				}
1104*b1cdbd2cSJim Jagielski 			}
1105*b1cdbd2cSJim Jagielski 		}
1106*b1cdbd2cSJim Jagielski 	}
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski 	if( pStr )
1109*b1cdbd2cSJim Jagielski 		return OUString::createFromAscii( pStr );
1110*b1cdbd2cSJim Jagielski 	else
1111*b1cdbd2cSJim Jagielski 		return OUString::valueOf( nPresetSubType );
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1115*b1cdbd2cSJim Jagielski 
fillNode(Reference<XAnimationNode> & xNode,const AnimationNode & rNode,const PropertySet & rSet)1116*b1cdbd2cSJim Jagielski void AnimationImporter::fillNode( Reference< XAnimationNode >& xNode, const AnimationNode& rNode, const PropertySet& rSet )
1117*b1cdbd2cSJim Jagielski {
1118*b1cdbd2cSJim Jagielski 	sal_Bool bAfterEffect = false;
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski 	// attribute Restart
1121*b1cdbd2cSJim Jagielski 	if( rNode.mnRestart )
1122*b1cdbd2cSJim Jagielski 	{
1123*b1cdbd2cSJim Jagielski 		sal_Int16 nRestart = AnimationRestart::DEFAULT;
1124*b1cdbd2cSJim Jagielski 		switch( rNode.mnRestart )
1125*b1cdbd2cSJim Jagielski 		{
1126*b1cdbd2cSJim Jagielski 		case 1: nRestart = AnimationRestart::ALWAYS; break;
1127*b1cdbd2cSJim Jagielski 		case 2: nRestart = AnimationRestart::WHEN_NOT_ACTIVE; break;
1128*b1cdbd2cSJim Jagielski 		case 3: nRestart = AnimationRestart::NEVER; break;
1129*b1cdbd2cSJim Jagielski 		}
1130*b1cdbd2cSJim Jagielski 		xNode->setRestart( nRestart );
1131*b1cdbd2cSJim Jagielski 	}
1132*b1cdbd2cSJim Jagielski 
1133*b1cdbd2cSJim Jagielski 	// attribute Fill
1134*b1cdbd2cSJim Jagielski 	if( rNode.mnFill )
1135*b1cdbd2cSJim Jagielski 	{
1136*b1cdbd2cSJim Jagielski 		sal_Int16 nFill = AnimationFill::DEFAULT;
1137*b1cdbd2cSJim Jagielski 		switch( rNode.mnFill )
1138*b1cdbd2cSJim Jagielski 		{
1139*b1cdbd2cSJim Jagielski 		case 1: nFill = AnimationFill::REMOVE; break;
1140*b1cdbd2cSJim Jagielski 		case 2: nFill = AnimationFill::FREEZE; break;
1141*b1cdbd2cSJim Jagielski 		case 3: nFill = AnimationFill::HOLD; break;
1142*b1cdbd2cSJim Jagielski 		case 4: nFill = AnimationFill::TRANSITION; break;
1143*b1cdbd2cSJim Jagielski 		}
1144*b1cdbd2cSJim Jagielski 		xNode->setFill( nFill );
1145*b1cdbd2cSJim Jagielski 	}
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 	// attribute Duration
1148*b1cdbd2cSJim Jagielski 	if( rNode.mnDuration )
1149*b1cdbd2cSJim Jagielski 	{
1150*b1cdbd2cSJim Jagielski 		Any aDuration;
1151*b1cdbd2cSJim Jagielski 		if( rNode.mnDuration > 0 )
1152*b1cdbd2cSJim Jagielski 		{
1153*b1cdbd2cSJim Jagielski 			aDuration <<= (double)(rNode.mnDuration / 1000.0);
1154*b1cdbd2cSJim Jagielski 		}
1155*b1cdbd2cSJim Jagielski 		else if( rNode.mnDuration < 0 )
1156*b1cdbd2cSJim Jagielski 		{
1157*b1cdbd2cSJim Jagielski 			aDuration <<= Timing_INDEFINITE;
1158*b1cdbd2cSJim Jagielski 		}
1159*b1cdbd2cSJim Jagielski 		xNode->setDuration( aDuration );
1160*b1cdbd2cSJim Jagielski 	}
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 	// TODO: DFF_ANIM_PATH_EDIT_MODE
1163*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_PATH_EDIT_MODE ) )
1164*b1cdbd2cSJim Jagielski 	{
1165*b1cdbd2cSJim Jagielski 		sal_Int32 nPathEditMode ;
1166*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_PATH_EDIT_MODE ) >>= nPathEditMode )
1167*b1cdbd2cSJim Jagielski 		{
1168*b1cdbd2cSJim Jagielski 		}
1169*b1cdbd2cSJim Jagielski 	}
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski 	// set user data
1172*b1cdbd2cSJim Jagielski 	Sequence< NamedValue > aUserData;
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 	// attribute Type
1175*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_NODE_TYPE ) )
1176*b1cdbd2cSJim Jagielski 	{
1177*b1cdbd2cSJim Jagielski 		sal_Int32 nPPTNodeType = 0;
1178*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType )
1179*b1cdbd2cSJim Jagielski 		{
1180*b1cdbd2cSJim Jagielski 			sal_Int16 nNodeType = ::com::sun::star::presentation::EffectNodeType::DEFAULT;
1181*b1cdbd2cSJim Jagielski 			switch( nPPTNodeType )
1182*b1cdbd2cSJim Jagielski 			{
1183*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_ON_CLICK:		nNodeType = ::com::sun::star::presentation::EffectNodeType::ON_CLICK;	break;
1184*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS:	nNodeType = ::com::sun::star::presentation::EffectNodeType::WITH_PREVIOUS; break;
1185*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS:	nNodeType = ::com::sun::star::presentation::EffectNodeType::AFTER_PREVIOUS; break;
1186*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE:	nNodeType = ::com::sun::star::presentation::EffectNodeType::MAIN_SEQUENCE; break;
1187*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_TIMING_ROOT:	nNodeType = ::com::sun::star::presentation::EffectNodeType::TIMING_ROOT; break;
1188*b1cdbd2cSJim Jagielski 				case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:nNodeType = ::com::sun::star::presentation::EffectNodeType::INTERACTIVE_SEQUENCE; break;
1189*b1cdbd2cSJim Jagielski 			}
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1192*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1193*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "node-type" ) );
1194*b1cdbd2cSJim Jagielski 			aUserData[nSize].Value <<= nNodeType;
1195*b1cdbd2cSJim Jagielski 		}
1196*b1cdbd2cSJim Jagielski 	}
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_GROUP_ID ) )
1199*b1cdbd2cSJim Jagielski 	{
1200*b1cdbd2cSJim Jagielski 		sal_Int32 nGroupId;
1201*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_GROUP_ID ) >>= nGroupId )
1202*b1cdbd2cSJim Jagielski 		{
1203*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1204*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1205*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "group-id" ) );
1206*b1cdbd2cSJim Jagielski 			aUserData[nSize].Value <<= nGroupId;
1207*b1cdbd2cSJim Jagielski 		}
1208*b1cdbd2cSJim Jagielski 	}
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski 	sal_Int16 nEffectPresetClass = EffectPresetClass::CUSTOM;
1211*b1cdbd2cSJim Jagielski 	sal_Int32 nPresetId = 0;
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) )
1214*b1cdbd2cSJim Jagielski 	{
1215*b1cdbd2cSJim Jagielski 		sal_Int32 nPresetClass = 0;
1216*b1cdbd2cSJim Jagielski 		if ( rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass )
1217*b1cdbd2cSJim Jagielski 		{
1218*b1cdbd2cSJim Jagielski 			switch( nPresetClass )
1219*b1cdbd2cSJim Jagielski 			{
1220*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_ENTRANCE:		nEffectPresetClass = EffectPresetClass::ENTRANCE; break;
1221*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_EXIT:			nEffectPresetClass = EffectPresetClass::EXIT; break;
1222*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_EMPHASIS:		nEffectPresetClass = EffectPresetClass::EMPHASIS; break;
1223*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_MOTIONPATH:	nEffectPresetClass = EffectPresetClass::MOTIONPATH; break;
1224*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_OLE_ACTION:	nEffectPresetClass = EffectPresetClass::OLEACTION; break;
1225*b1cdbd2cSJim Jagielski 			case DFF_ANIM_PRESS_CLASS_MEDIACALL:	nEffectPresetClass = EffectPresetClass::MEDIACALL; break;
1226*b1cdbd2cSJim Jagielski 			}
1227*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1228*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1229*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "preset-class" ) );
1230*b1cdbd2cSJim Jagielski 			aUserData[nSize].Value <<= nEffectPresetClass;
1231*b1cdbd2cSJim Jagielski 		}
1232*b1cdbd2cSJim Jagielski 	}
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_PRESET_ID ) )
1235*b1cdbd2cSJim Jagielski 	{
1236*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId )
1237*b1cdbd2cSJim Jagielski 		{
1238*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1239*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1240*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "preset-id" ) );
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski 			const preset_maping* p = gPresetMaping;
1243*b1cdbd2cSJim Jagielski 			while( p->mpStrPresetId && ((p->mnPresetClass != nEffectPresetClass) || (p->mnPresetId != nPresetId )) )
1244*b1cdbd2cSJim Jagielski 				p++;
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski 			if( p->mpStrPresetId )
1247*b1cdbd2cSJim Jagielski 			{
1248*b1cdbd2cSJim Jagielski 				aUserData[nSize].Value <<= OUString::createFromAscii( p->mpStrPresetId );
1249*b1cdbd2cSJim Jagielski 			}
1250*b1cdbd2cSJim Jagielski 			else
1251*b1cdbd2cSJim Jagielski 			{
1252*b1cdbd2cSJim Jagielski 				OUStringBuffer sBuffer;
1253*b1cdbd2cSJim Jagielski 				sBuffer.appendAscii( "ppt_" );
1254*b1cdbd2cSJim Jagielski 				switch( nEffectPresetClass )
1255*b1cdbd2cSJim Jagielski 				{
1256*b1cdbd2cSJim Jagielski 				case EffectPresetClass::ENTRANCE: sBuffer.appendAscii( "entrance_" ); break;
1257*b1cdbd2cSJim Jagielski 				case EffectPresetClass::EXIT: sBuffer.appendAscii( "exit_" ); break;
1258*b1cdbd2cSJim Jagielski 				case EffectPresetClass::EMPHASIS: sBuffer.appendAscii( "emphasis_" ); break;
1259*b1cdbd2cSJim Jagielski 				case EffectPresetClass::MOTIONPATH: sBuffer.appendAscii( "motionpath_" ); break;
1260*b1cdbd2cSJim Jagielski 				case EffectPresetClass::OLEACTION: sBuffer.appendAscii( "oleaction_" ); break;
1261*b1cdbd2cSJim Jagielski 				case EffectPresetClass::MEDIACALL: sBuffer.appendAscii( "mediacall_" ); break;
1262*b1cdbd2cSJim Jagielski 				}
1263*b1cdbd2cSJim Jagielski 				sBuffer.append( nPresetId );
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski 				aUserData[nSize].Value <<= sBuffer.makeStringAndClear();
1266*b1cdbd2cSJim Jagielski 			}
1267*b1cdbd2cSJim Jagielski 		}
1268*b1cdbd2cSJim Jagielski 	}
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_PRESET_SUB_TYPE ) )
1271*b1cdbd2cSJim Jagielski 	{
1272*b1cdbd2cSJim Jagielski 		sal_Int32 nPresetSubType = 0;
1273*b1cdbd2cSJim Jagielski 		if( (rSet.getProperty( DFF_ANIM_PRESET_SUB_TYPE ) >>= nPresetSubType) )
1274*b1cdbd2cSJim Jagielski 		{
1275*b1cdbd2cSJim Jagielski 			if( nPresetSubType )
1276*b1cdbd2cSJim Jagielski 			{
1277*b1cdbd2cSJim Jagielski 				sal_Int32 nSize = aUserData.getLength();
1278*b1cdbd2cSJim Jagielski 				aUserData.realloc(nSize+1);
1279*b1cdbd2cSJim Jagielski 				aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "preset-sub-type" ) );
1280*b1cdbd2cSJim Jagielski 				aUserData[nSize].Value <<= getConvertedSubType( nEffectPresetClass, nPresetId, nPresetSubType );
1281*b1cdbd2cSJim Jagielski 			}
1282*b1cdbd2cSJim Jagielski 		}
1283*b1cdbd2cSJim Jagielski 	}
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_AFTEREFFECT ) )
1286*b1cdbd2cSJim Jagielski 	{
1287*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_AFTEREFFECT ) >>= bAfterEffect )
1288*b1cdbd2cSJim Jagielski 		{
1289*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1290*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1291*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "after-effect" ) );
1292*b1cdbd2cSJim Jagielski 			aUserData[nSize].Value <<= bAfterEffect;
1293*b1cdbd2cSJim Jagielski 		}
1294*b1cdbd2cSJim Jagielski 	}
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski 	if( bAfterEffect && rSet.hasProperty( DFF_ANIM_MASTERREL ) )
1297*b1cdbd2cSJim Jagielski 	{
1298*b1cdbd2cSJim Jagielski 		sal_Int32 nMasterRel = 2;
1299*b1cdbd2cSJim Jagielski 		if( rSet.getProperty( DFF_ANIM_MASTERREL ) >>= nMasterRel )
1300*b1cdbd2cSJim Jagielski 		{
1301*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = aUserData.getLength();
1302*b1cdbd2cSJim Jagielski 			aUserData.realloc(nSize+1);
1303*b1cdbd2cSJim Jagielski 			aUserData[nSize].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "master-rel" ) );
1304*b1cdbd2cSJim Jagielski 			aUserData[nSize].Value <<= nMasterRel;
1305*b1cdbd2cSJim Jagielski 		}
1306*b1cdbd2cSJim Jagielski 	}
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 	xNode->setUserData( aUserData );
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 	// TODO: DFF_ANIM_ID
1311*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_ID ) )
1312*b1cdbd2cSJim Jagielski 	{
1313*b1cdbd2cSJim Jagielski 		rtl::OUString aString;
1314*b1cdbd2cSJim Jagielski 		rSet.getProperty( DFF_ANIM_ID ) >>= aString;
1315*b1cdbd2cSJim Jagielski 		if( aString.getLength() )
1316*b1cdbd2cSJim Jagielski 		{
1317*b1cdbd2cSJim Jagielski 		}
1318*b1cdbd2cSJim Jagielski 	}
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski 	// TODO: DFF_ANIM_EVENT_FILTER
1321*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_EVENT_FILTER ) )
1322*b1cdbd2cSJim Jagielski 	{
1323*b1cdbd2cSJim Jagielski 		rtl::OUString aString;
1324*b1cdbd2cSJim Jagielski 		rSet.getProperty( DFF_ANIM_EVENT_FILTER ) >>= aString;
1325*b1cdbd2cSJim Jagielski 		if( aString.getLength() )
1326*b1cdbd2cSJim Jagielski 		{
1327*b1cdbd2cSJim Jagielski 		}
1328*b1cdbd2cSJim Jagielski 	}
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski 	// DFF_ANIM_TIMEFILTER
1331*b1cdbd2cSJim Jagielski 	if( rSet.hasProperty( DFF_ANIM_TIMEFILTER ) )
1332*b1cdbd2cSJim Jagielski 	{
1333*b1cdbd2cSJim Jagielski 		Reference< XAnimate > xAnim( xNode, UNO_QUERY );
1334*b1cdbd2cSJim Jagielski 		if( xAnim.is() )
1335*b1cdbd2cSJim Jagielski 		{
1336*b1cdbd2cSJim Jagielski 			rtl::OUString aString;
1337*b1cdbd2cSJim Jagielski 			rSet.getProperty( DFF_ANIM_TIMEFILTER ) >>= aString;
1338*b1cdbd2cSJim Jagielski 			if( aString.getLength() )
1339*b1cdbd2cSJim Jagielski 			{
1340*b1cdbd2cSJim Jagielski 				sal_Int32 nElements = 1; // a non empty string has at least one value
1341*b1cdbd2cSJim Jagielski 
1342*b1cdbd2cSJim Jagielski 				sal_Int32 fromIndex = 0;
1343*b1cdbd2cSJim Jagielski 				while(true)
1344*b1cdbd2cSJim Jagielski 				{
1345*b1cdbd2cSJim Jagielski 					fromIndex = aString.indexOf( (sal_Unicode)';', fromIndex );
1346*b1cdbd2cSJim Jagielski 					if( fromIndex == -1 )
1347*b1cdbd2cSJim Jagielski 						break;
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski 					fromIndex++;
1350*b1cdbd2cSJim Jagielski 					nElements++;
1351*b1cdbd2cSJim Jagielski 				}
1352*b1cdbd2cSJim Jagielski 
1353*b1cdbd2cSJim Jagielski 				Sequence< TimeFilterPair > aTimeFilter( nElements );
1354*b1cdbd2cSJim Jagielski 
1355*b1cdbd2cSJim Jagielski 				TimeFilterPair* pValues = aTimeFilter.getArray();
1356*b1cdbd2cSJim Jagielski 				sal_Int32 nIndex = 0;
1357*b1cdbd2cSJim Jagielski 				while( (nElements--) && (nIndex >= 0) )
1358*b1cdbd2cSJim Jagielski 				{
1359*b1cdbd2cSJim Jagielski 					const OUString aToken( aString.getToken( 0, ';', nIndex ) );
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski 					sal_Int32 nPos = aToken.indexOf( ',' );
1362*b1cdbd2cSJim Jagielski 					if( nPos >= 0 )
1363*b1cdbd2cSJim Jagielski 					{
1364*b1cdbd2cSJim Jagielski 						pValues->Time = aToken.copy( 0, nPos ).toDouble();
1365*b1cdbd2cSJim Jagielski 						pValues->Progress = aToken.copy( nPos+1, aToken.getLength() - nPos - 1 ).toDouble();
1366*b1cdbd2cSJim Jagielski 					}
1367*b1cdbd2cSJim Jagielski 					pValues++;
1368*b1cdbd2cSJim Jagielski 				}
1369*b1cdbd2cSJim Jagielski 
1370*b1cdbd2cSJim Jagielski 				xAnim->setTimeFilter( aTimeFilter );
1371*b1cdbd2cSJim Jagielski 			}
1372*b1cdbd2cSJim Jagielski 		}
1373*b1cdbd2cSJim Jagielski 	}
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski /* todo
1376*b1cdbd2cSJim Jagielski 	Reference< XAudio > xAudio( xNode, UNO_QUERY );
1377*b1cdbd2cSJim Jagielski 	if( xAudio.is() )
1378*b1cdbd2cSJim Jagielski 	{
1379*b1cdbd2cSJim Jagielski 		if( rSet.hasProperty( DFF_ANIM_ENDAFTERSLIDE ) )
1380*b1cdbd2cSJim Jagielski 		{
1381*b1cdbd2cSJim Jagielski 			sal_Int16 nEndAfterSlide = 0;
1382*b1cdbd2cSJim Jagielski 			if( rSet.getProperty( DFF_ANIM_ENDAFTERSLIDE ) >>= nEndAfterSlide )
1383*b1cdbd2cSJim Jagielski 				xAudio->setEndAfterSlide( nEndAfterSlide );
1384*b1cdbd2cSJim Jagielski 		}
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski 		if( rSet.hasProperty( DFF_ANIM_VOLUME ) )
1387*b1cdbd2cSJim Jagielski 		{
1388*b1cdbd2cSJim Jagielski 			double fVolume = 1.0;
1389*b1cdbd2cSJim Jagielski 			rSet.getProperty( DFF_ANIM_VOLUME ) >>= fVolume;
1390*b1cdbd2cSJim Jagielski 			xAudio->setVolume( fVolume );
1391*b1cdbd2cSJim Jagielski 		}
1392*b1cdbd2cSJim Jagielski 	}
1393*b1cdbd2cSJim Jagielski */
1394*b1cdbd2cSJim Jagielski 	Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
1395*b1cdbd2cSJim Jagielski 	if( xColor.is() )
1396*b1cdbd2cSJim Jagielski 	{
1397*b1cdbd2cSJim Jagielski 		if( rSet.hasProperty( DFF_ANIM_DIRECTION ) )
1398*b1cdbd2cSJim Jagielski 		{
1399*b1cdbd2cSJim Jagielski 			sal_Bool bDirection = sal_False;
1400*b1cdbd2cSJim Jagielski 			if( rSet.getProperty( DFF_ANIM_DIRECTION ) >>= bDirection )
1401*b1cdbd2cSJim Jagielski 				xColor->setDirection( (sal_Bool)!bDirection );
1402*b1cdbd2cSJim Jagielski 		}
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski 		if( rSet.hasProperty( DFF_ANIM_COLORSPACE ) )
1405*b1cdbd2cSJim Jagielski 		{
1406*b1cdbd2cSJim Jagielski 			sal_Int32 nColorSpace = 0;
1407*b1cdbd2cSJim Jagielski 			rSet.getProperty( DFF_ANIM_COLORSPACE ) >>= nColorSpace;
1408*b1cdbd2cSJim Jagielski 			xColor->setColorInterpolation( (nColorSpace == 0) ? AnimationColorSpace::RGB : AnimationColorSpace::HSL );
1409*b1cdbd2cSJim Jagielski 		}
1410*b1cdbd2cSJim Jagielski 	}
1411*b1cdbd2cSJim Jagielski }
1412*b1cdbd2cSJim Jagielski 
1413*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1414*b1cdbd2cSJim Jagielski 
importTimeContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1415*b1cdbd2cSJim Jagielski void AnimationImporter::importTimeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1416*b1cdbd2cSJim Jagielski {
1417*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importTimeContainer()!");
1418*b1cdbd2cSJim Jagielski 	if( pAtom && xNode.is() )
1419*b1cdbd2cSJim Jagielski 	{
1420*b1cdbd2cSJim Jagielski 		importAnimationEvents( pAtom, xNode );
1421*b1cdbd2cSJim Jagielski 		importAnimationValues( pAtom, xNode );
1422*b1cdbd2cSJim Jagielski 		importAnimationActions( pAtom, xNode );
1423*b1cdbd2cSJim Jagielski 
1424*b1cdbd2cSJim Jagielski 		dump(">\n");
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 		// import sub containers
1427*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1430*b1cdbd2cSJim Jagielski 		{
1431*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1432*b1cdbd2cSJim Jagielski 			{
1433*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimNode:
1434*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimEvent:
1435*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimValue:
1436*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimAction:
1437*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimPropertySet:
1438*b1cdbd2cSJim Jagielski 					break;
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimSubGoup :
1441*b1cdbd2cSJim Jagielski 				{
1442*b1cdbd2cSJim Jagielski 					if( pChildAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
1443*b1cdbd2cSJim Jagielski 					{
1444*b1cdbd2cSJim Jagielski 						const OUString aServiceName( OUString::createFromAscii("com.sun.star.animations.Command") );
1445*b1cdbd2cSJim Jagielski 						Reference< XAnimationNode > xChildNode( ::comphelper::getProcessServiceFactory()->createInstance(aServiceName), UNO_QUERY );
1446*b1cdbd2cSJim Jagielski 						importAnimationNodeContainer( pChildAtom, xChildNode );
1447*b1cdbd2cSJim Jagielski 						Reference< XTimeContainer > xParentContainer( xNode, UNO_QUERY );
1448*b1cdbd2cSJim Jagielski 						if( xParentContainer.is() && xChildNode.is() )
1449*b1cdbd2cSJim Jagielski 							xParentContainer->appendChild( xChildNode );
1450*b1cdbd2cSJim Jagielski 					}
1451*b1cdbd2cSJim Jagielski 					else
1452*b1cdbd2cSJim Jagielski 					{
1453*b1cdbd2cSJim Jagielski 						importAnimationContainer( pChildAtom, xNode );
1454*b1cdbd2cSJim Jagielski 					}
1455*b1cdbd2cSJim Jagielski 				}
1456*b1cdbd2cSJim Jagielski 				break;
1457*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimGroup :
1458*b1cdbd2cSJim Jagielski 				{
1459*b1cdbd2cSJim Jagielski 					importAnimationContainer( pChildAtom, xNode );
1460*b1cdbd2cSJim Jagielski 				}
1461*b1cdbd2cSJim Jagielski 				break;
1462*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimIteration:
1463*b1cdbd2cSJim Jagielski 				{
1464*b1cdbd2cSJim Jagielski 					if( pChildAtom->seekToContent() )
1465*b1cdbd2cSJim Jagielski 					{
1466*b1cdbd2cSJim Jagielski 						float fInterval;
1467*b1cdbd2cSJim Jagielski 						sal_Int32 nTextUnitEffect, nU1, nU2, nU3;
1468*b1cdbd2cSJim Jagielski 
1469*b1cdbd2cSJim Jagielski 						mrStCtrl >> fInterval >> nTextUnitEffect >> nU1 >> nU2 >> nU3;
1470*b1cdbd2cSJim Jagielski 
1471*b1cdbd2cSJim Jagielski 						Reference< XIterateContainer > xIter( xNode, UNO_QUERY );
1472*b1cdbd2cSJim Jagielski 						if( xIter.is() )
1473*b1cdbd2cSJim Jagielski 						{
1474*b1cdbd2cSJim Jagielski 							sal_Int16 nIterateType = TextAnimationType::BY_PARAGRAPH;
1475*b1cdbd2cSJim Jagielski 							switch( nTextUnitEffect )
1476*b1cdbd2cSJim Jagielski 							{
1477*b1cdbd2cSJim Jagielski 							case 1: nIterateType = TextAnimationType::BY_WORD; break;
1478*b1cdbd2cSJim Jagielski 							case 2:	nIterateType = TextAnimationType::BY_LETTER; break;
1479*b1cdbd2cSJim Jagielski 							}
1480*b1cdbd2cSJim Jagielski 							xIter->setIterateType( nIterateType );
1481*b1cdbd2cSJim Jagielski 							xIter->setIterateInterval( (double)fInterval );
1482*b1cdbd2cSJim Jagielski 						}
1483*b1cdbd2cSJim Jagielski 
1484*b1cdbd2cSJim Jagielski 						dump( "<iterate" );
1485*b1cdbd2cSJim Jagielski 						dump( " iterateType=\"%s\"", (nTextUnitEffect == 0) ? "byElement" : (nTextUnitEffect == 1) ? "byWord" : "byLetter" );
1486*b1cdbd2cSJim Jagielski 						dump( " iterateInterval=\"%g\"", fInterval );
1487*b1cdbd2cSJim Jagielski 						dump( " u1=\"%ld\"", nU1 );
1488*b1cdbd2cSJim Jagielski 						dump( " u2=\"%ld\"", nU2 );
1489*b1cdbd2cSJim Jagielski 						dump( " u3=\"%ld\"/>\n", nU3 );
1490*b1cdbd2cSJim Jagielski 					}
1491*b1cdbd2cSJim Jagielski 				}
1492*b1cdbd2cSJim Jagielski 				break;
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski 				case 0xf136:
1495*b1cdbd2cSJim Jagielski 				{
1496*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
1497*b1cdbd2cSJim Jagielski 					sal_uInt32 nU1, nU2;
1498*b1cdbd2cSJim Jagielski 					mrStCtrl >> nU1 >> nU2;
1499*b1cdbd2cSJim Jagielski 
1500*b1cdbd2cSJim Jagielski 					fprintf( mpFile, "<unknown_0xf136 nU1=\"%ld\" nU2=\"%ld\"/>\n", nU1, nU2 );
1501*b1cdbd2cSJim Jagielski #endif
1502*b1cdbd2cSJim Jagielski 				}
1503*b1cdbd2cSJim Jagielski 				break;
1504*b1cdbd2cSJim Jagielski 
1505*b1cdbd2cSJim Jagielski 				default:
1506*b1cdbd2cSJim Jagielski 				{
1507*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, true, false );
1508*b1cdbd2cSJim Jagielski 					dump_atom( pChildAtom );
1509*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, false, false );
1510*b1cdbd2cSJim Jagielski 				}
1511*b1cdbd2cSJim Jagielski 				break;
1512*b1cdbd2cSJim Jagielski 			}
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
1515*b1cdbd2cSJim Jagielski 		}
1516*b1cdbd2cSJim Jagielski 	}
1517*b1cdbd2cSJim Jagielski }
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1520*b1cdbd2cSJim Jagielski 
importAnimationNodeContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1521*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimationNodeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1522*b1cdbd2cSJim Jagielski {
1523*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationNodeContainer()!");
1524*b1cdbd2cSJim Jagielski 	if( pAtom && xNode.is() )
1525*b1cdbd2cSJim Jagielski 	{
1526*b1cdbd2cSJim Jagielski 		importAnimationEvents( pAtom, xNode );
1527*b1cdbd2cSJim Jagielski 		importAnimationValues( pAtom, xNode );
1528*b1cdbd2cSJim Jagielski 		importAnimationActions( pAtom, xNode );
1529*b1cdbd2cSJim Jagielski 
1530*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1531*b1cdbd2cSJim Jagielski 
1532*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1533*b1cdbd2cSJim Jagielski 		{
1534*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1535*b1cdbd2cSJim Jagielski 			{
1536*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimNode:
1537*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimEvent:
1538*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimValue:
1539*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimAction:
1540*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimPropertySet:
1541*b1cdbd2cSJim Jagielski 					break;
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateFilter:
1544*b1cdbd2cSJim Jagielski 					importAnimateFilterContainer( pChildAtom, xNode );
1545*b1cdbd2cSJim Jagielski 					break;
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateSet:
1548*b1cdbd2cSJim Jagielski 					importAnimateSetContainer( pChildAtom, xNode );
1549*b1cdbd2cSJim Jagielski 					break;
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimate:
1552*b1cdbd2cSJim Jagielski 					importAnimateContainer( pChildAtom, xNode );
1553*b1cdbd2cSJim Jagielski 					break;
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateScale:
1556*b1cdbd2cSJim Jagielski 					importAnimateScaleContainer( pChildAtom, xNode );
1557*b1cdbd2cSJim Jagielski 					break;
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateColor:
1560*b1cdbd2cSJim Jagielski 					importAnimateColorContainer( pChildAtom, xNode );
1561*b1cdbd2cSJim Jagielski 					break;
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateRotation:
1564*b1cdbd2cSJim Jagielski 					importAnimateRotationContainer( pChildAtom, xNode );
1565*b1cdbd2cSJim Jagielski 					break;
1566*b1cdbd2cSJim Jagielski 
1567*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateMotion:
1568*b1cdbd2cSJim Jagielski 					importAnimateMotionContainer( pChildAtom, xNode );
1569*b1cdbd2cSJim Jagielski 					break;
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimCommand:
1572*b1cdbd2cSJim Jagielski 					importCommandContainer( pChildAtom, xNode );
1573*b1cdbd2cSJim Jagielski 					break;
1574*b1cdbd2cSJim Jagielski 
1575*b1cdbd2cSJim Jagielski 				default:
1576*b1cdbd2cSJim Jagielski 				{
1577*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, true, false );
1578*b1cdbd2cSJim Jagielski 					dump_atom( pChildAtom );
1579*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, false, false );
1580*b1cdbd2cSJim Jagielski 				}
1581*b1cdbd2cSJim Jagielski 				break;
1582*b1cdbd2cSJim Jagielski 			}
1583*b1cdbd2cSJim Jagielski 
1584*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
1585*b1cdbd2cSJim Jagielski 		}
1586*b1cdbd2cSJim Jagielski 	}
1587*b1cdbd2cSJim Jagielski }
1588*b1cdbd2cSJim Jagielski 
1589*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1590*b1cdbd2cSJim Jagielski 
importAnimateFilterContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1591*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateFilterContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1592*b1cdbd2cSJim Jagielski {
1593*b1cdbd2cSJim Jagielski 	Reference< XTransitionFilter > xFilter( xNode, UNO_QUERY );
1594*b1cdbd2cSJim Jagielski 
1595*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateFilter && xFilter.is(), "invalid call to ppt::AnimationImporter::importAnimateFilterContainer()!");
1596*b1cdbd2cSJim Jagielski 	if( pAtom && xFilter.is() )
1597*b1cdbd2cSJim Jagielski 	{
1598*b1cdbd2cSJim Jagielski 		sal_uInt32 nBits = 0;
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1601*b1cdbd2cSJim Jagielski 
1602*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1603*b1cdbd2cSJim Jagielski 		{
1604*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
1605*b1cdbd2cSJim Jagielski 			{
1606*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
1607*b1cdbd2cSJim Jagielski 					break;
1608*b1cdbd2cSJim Jagielski 			}
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1611*b1cdbd2cSJim Jagielski 			{
1612*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateFilterData:
1613*b1cdbd2cSJim Jagielski 			{
1614*b1cdbd2cSJim Jagielski 				sal_uInt32 transition;
1615*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits;
1616*b1cdbd2cSJim Jagielski 				mrStCtrl >> transition;
1617*b1cdbd2cSJim Jagielski 
1618*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
1619*b1cdbd2cSJim Jagielski 					xFilter->setMode( transition == 0 );
1620*b1cdbd2cSJim Jagielski 
1621*b1cdbd2cSJim Jagielski 				dump( " transition=\"%s\"", (transition == 0) ? "in" : "out" );
1622*b1cdbd2cSJim Jagielski 			}
1623*b1cdbd2cSJim Jagielski 			break;
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
1626*b1cdbd2cSJim Jagielski 			{
1627*b1cdbd2cSJim Jagielski 				if( (nBits & 2 ) && ( pChildAtom->getInstance() == 1 )  )
1628*b1cdbd2cSJim Jagielski 				{
1629*b1cdbd2cSJim Jagielski 					Any aAny;
1630*b1cdbd2cSJim Jagielski 					if ( importAttributeValue( pChildAtom, aAny ) )
1631*b1cdbd2cSJim Jagielski 					{
1632*b1cdbd2cSJim Jagielski 						rtl::OUString filter;
1633*b1cdbd2cSJim Jagielski 						aAny >>= filter;
1634*b1cdbd2cSJim Jagielski 
1635*b1cdbd2cSJim Jagielski 						dump( " filter=\"%s\"", filter );
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski 						const transition* pTransition = transition::find( filter );
1638*b1cdbd2cSJim Jagielski 						if( pTransition )
1639*b1cdbd2cSJim Jagielski 						{
1640*b1cdbd2cSJim Jagielski 							xFilter->setTransition( pTransition->mnType );
1641*b1cdbd2cSJim Jagielski 							xFilter->setSubtype( pTransition->mnSubType );
1642*b1cdbd2cSJim Jagielski 							xFilter->setDirection( pTransition->mbDirection );
1643*b1cdbd2cSJim Jagielski 						}
1644*b1cdbd2cSJim Jagielski 						else
1645*b1cdbd2cSJim Jagielski 						{
1646*b1cdbd2cSJim Jagielski 							DBG_ERROR( "unknown transition!" );
1647*b1cdbd2cSJim Jagielski 						}
1648*b1cdbd2cSJim Jagielski 					}
1649*b1cdbd2cSJim Jagielski 				}
1650*b1cdbd2cSJim Jagielski 			}
1651*b1cdbd2cSJim Jagielski 			break;
1652*b1cdbd2cSJim Jagielski 
1653*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
1654*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
1655*b1cdbd2cSJim Jagielski 				break;
1656*b1cdbd2cSJim Jagielski 
1657*b1cdbd2cSJim Jagielski 			default:
1658*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
1659*b1cdbd2cSJim Jagielski 				break;
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 			}
1662*b1cdbd2cSJim Jagielski 
1663*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
1664*b1cdbd2cSJim Jagielski 		}
1665*b1cdbd2cSJim Jagielski 	}
1666*b1cdbd2cSJim Jagielski }
1667*b1cdbd2cSJim Jagielski 
1668*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1669*b1cdbd2cSJim Jagielski 
importAnimateAttributeTargetContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1670*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateAttributeTargetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1671*b1cdbd2cSJim Jagielski {
1672*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateTarget, "invalid call to ppt::AnimationImporter::importAnimateAttributeTargetContainer()!");
1673*b1cdbd2cSJim Jagielski 
1674*b1cdbd2cSJim Jagielski 	Any aTarget;
1675*b1cdbd2cSJim Jagielski 
1676*b1cdbd2cSJim Jagielski 	Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski 	bool bWrongContext = false;
1679*b1cdbd2cSJim Jagielski 
1680*b1cdbd2cSJim Jagielski 	if( pAtom )
1681*b1cdbd2cSJim Jagielski 	{
1682*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1685*b1cdbd2cSJim Jagielski 		{
1686*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
1687*b1cdbd2cSJim Jagielski 			{
1688*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
1689*b1cdbd2cSJim Jagielski 					break;
1690*b1cdbd2cSJim Jagielski 			}
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1693*b1cdbd2cSJim Jagielski 			{
1694*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimPropertySet:
1695*b1cdbd2cSJim Jagielski 			{
1696*b1cdbd2cSJim Jagielski 				PropertySet aSet;
1697*b1cdbd2cSJim Jagielski 				importPropertySetContainer( pChildAtom, aSet );
1698*b1cdbd2cSJim Jagielski 				if( aSet.hasProperty( DFF_ANIM_RUNTIMECONTEXT ) )
1699*b1cdbd2cSJim Jagielski 				{
1700*b1cdbd2cSJim Jagielski 					OUString aContext;
1701*b1cdbd2cSJim Jagielski 					if( aSet.getProperty( DFF_ANIM_RUNTIMECONTEXT ) >>= aContext )
1702*b1cdbd2cSJim Jagielski 					{
1703*b1cdbd2cSJim Jagielski 						if( !aContext.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PPT") ) )
1704*b1cdbd2cSJim Jagielski 							bWrongContext = true;
1705*b1cdbd2cSJim Jagielski 					}
1706*b1cdbd2cSJim Jagielski 				}
1707*b1cdbd2cSJim Jagielski 
1708*b1cdbd2cSJim Jagielski 				dump( aSet );
1709*b1cdbd2cSJim Jagielski 			}
1710*b1cdbd2cSJim Jagielski 			break;
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTargetSettings:
1713*b1cdbd2cSJim Jagielski 			{
1714*b1cdbd2cSJim Jagielski 				if( xAnimate.is() )
1715*b1cdbd2cSJim Jagielski 				{
1716*b1cdbd2cSJim Jagielski 					sal_uInt32 nBits;
1717*b1cdbd2cSJim Jagielski 					sal_uInt32 nAdditive;
1718*b1cdbd2cSJim Jagielski 					sal_uInt32 nAccumulate;
1719*b1cdbd2cSJim Jagielski 					sal_uInt32 nTransformType;
1720*b1cdbd2cSJim Jagielski 
1721*b1cdbd2cSJim Jagielski 					mrStCtrl >> nBits >> nAdditive >> nAccumulate >> nTransformType;
1722*b1cdbd2cSJim Jagielski 
1723*b1cdbd2cSJim Jagielski 					// nBits %0001: additive, %0010: accumulate, %0100: attributeName, %1000: transformtype
1724*b1cdbd2cSJim Jagielski 					// nAdditive 0 = base, 1 = sum, 2 = replace, 3 = multiply, 4 = none
1725*b1cdbd2cSJim Jagielski 					// nAccumulate 0 = none, 1 = always
1726*b1cdbd2cSJim Jagielski 					// nTransformType 0: "property" else "image"
1727*b1cdbd2cSJim Jagielski 
1728*b1cdbd2cSJim Jagielski 					if( nBits & 3 )
1729*b1cdbd2cSJim Jagielski 					{
1730*b1cdbd2cSJim Jagielski 						if( xAnimate.is() )
1731*b1cdbd2cSJim Jagielski 						{
1732*b1cdbd2cSJim Jagielski 							if( nBits & 1 )
1733*b1cdbd2cSJim Jagielski 							{
1734*b1cdbd2cSJim Jagielski 								sal_Int16 nTemp = AnimationAdditiveMode::BASE;
1735*b1cdbd2cSJim Jagielski 								switch( nAdditive )
1736*b1cdbd2cSJim Jagielski 								{
1737*b1cdbd2cSJim Jagielski 								case 1:	nTemp = AnimationAdditiveMode::SUM; break;
1738*b1cdbd2cSJim Jagielski 								case 2: nTemp = AnimationAdditiveMode::REPLACE; break;
1739*b1cdbd2cSJim Jagielski 								case 3: nTemp = AnimationAdditiveMode::MULTIPLY; break;
1740*b1cdbd2cSJim Jagielski 								case 4: nTemp = AnimationAdditiveMode::NONE; break;
1741*b1cdbd2cSJim Jagielski 								}
1742*b1cdbd2cSJim Jagielski 								xAnimate->setAdditive( nTemp );
1743*b1cdbd2cSJim Jagielski 							}
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski 							if( nBits & 2 )
1746*b1cdbd2cSJim Jagielski 							{
1747*b1cdbd2cSJim Jagielski 								xAnimate->setAccumulate( (nAccumulate == 0) ? sal_True : sal_False );
1748*b1cdbd2cSJim Jagielski 							}
1749*b1cdbd2cSJim Jagielski 						}
1750*b1cdbd2cSJim Jagielski 					}
1751*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
1752*b1cdbd2cSJim Jagielski 					if( nBits & 1 )
1753*b1cdbd2cSJim Jagielski 						fprintf( mpFile, " additive=\"%s\"", (nAdditive == 0) ? "base" : (nAdditive == 2) ? "replace" : (nAdditive == 1) ? "sum" : (nAdditive == 3 ) ? "multiply" : (nAdditive == 4) ? "none" : "unknown" );
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski 					if( nBits & 2 )
1756*b1cdbd2cSJim Jagielski 						fprintf( mpFile, " accumulate=\"%s\"", (nAccumulate == 0) ? "none" : "always" );
1757*b1cdbd2cSJim Jagielski 
1758*b1cdbd2cSJim Jagielski 					if( nBits & 8 )
1759*b1cdbd2cSJim Jagielski 						fprintf( mpFile, " transformType=\"%s\"", (nTransformType == 0) ? "property" : "image" );
1760*b1cdbd2cSJim Jagielski #endif
1761*b1cdbd2cSJim Jagielski 				}
1762*b1cdbd2cSJim Jagielski 			}
1763*b1cdbd2cSJim Jagielski 			break;
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateAttributeNames:
1766*b1cdbd2cSJim Jagielski 			{
1767*b1cdbd2cSJim Jagielski 				if( xAnimate.is() )
1768*b1cdbd2cSJim Jagielski 				{
1769*b1cdbd2cSJim Jagielski 					OUString aAttributeName;
1770*b1cdbd2cSJim Jagielski 					importAttributeNamesContainer( pChildAtom, aAttributeName );
1771*b1cdbd2cSJim Jagielski 					if( xAnimate.is() )
1772*b1cdbd2cSJim Jagielski 						xAnimate->setAttributeName( aAttributeName );
1773*b1cdbd2cSJim Jagielski 					dump( " attributeName=\"%s\"", aAttributeName );
1774*b1cdbd2cSJim Jagielski 				}
1775*b1cdbd2cSJim Jagielski 			}
1776*b1cdbd2cSJim Jagielski 			break;
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTargetElement:
1779*b1cdbd2cSJim Jagielski 			{
1780*b1cdbd2cSJim Jagielski 				sal_Int16 nSubType;
1781*b1cdbd2cSJim Jagielski 				importTargetElementContainer( pChildAtom, aTarget, nSubType );
1782*b1cdbd2cSJim Jagielski 				if( xAnimate.is() )
1783*b1cdbd2cSJim Jagielski 					xAnimate->setSubItem( nSubType );
1784*b1cdbd2cSJim Jagielski 
1785*b1cdbd2cSJim Jagielski 				dump( " target=\"" );
1786*b1cdbd2cSJim Jagielski 				dump_target( aTarget );
1787*b1cdbd2cSJim Jagielski 				dump( "\"" );
1788*b1cdbd2cSJim Jagielski 			}
1789*b1cdbd2cSJim Jagielski 			break;
1790*b1cdbd2cSJim Jagielski 
1791*b1cdbd2cSJim Jagielski 			default:
1792*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
1793*b1cdbd2cSJim Jagielski 				break;
1794*b1cdbd2cSJim Jagielski 			}
1795*b1cdbd2cSJim Jagielski 
1796*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
1797*b1cdbd2cSJim Jagielski 		}
1798*b1cdbd2cSJim Jagielski 	}
1799*b1cdbd2cSJim Jagielski 
1800*b1cdbd2cSJim Jagielski 	if( bWrongContext )
1801*b1cdbd2cSJim Jagielski 		aTarget.clear();
1802*b1cdbd2cSJim Jagielski 
1803*b1cdbd2cSJim Jagielski 	if( xAnimate.is() )
1804*b1cdbd2cSJim Jagielski 		xAnimate->setTarget( aTarget );
1805*b1cdbd2cSJim Jagielski 	else
1806*b1cdbd2cSJim Jagielski 	{
1807*b1cdbd2cSJim Jagielski 		Reference< XCommand > xCommand( xNode, UNO_QUERY );
1808*b1cdbd2cSJim Jagielski 		if( xCommand.is() )
1809*b1cdbd2cSJim Jagielski 			xCommand->setTarget( aTarget );
1810*b1cdbd2cSJim Jagielski 	}
1811*b1cdbd2cSJim Jagielski }
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1814*b1cdbd2cSJim Jagielski 
implGetColorSpace(sal_Int32 nMode,sal_Int32,sal_Int32,sal_Int32)1815*b1cdbd2cSJim Jagielski sal_Int16 AnimationImporter::implGetColorSpace( sal_Int32 nMode, sal_Int32 /*nA*/, sal_Int32 /*nB*/, sal_Int32 /*nC*/ )
1816*b1cdbd2cSJim Jagielski {
1817*b1cdbd2cSJim Jagielski 	switch( nMode )
1818*b1cdbd2cSJim Jagielski 	{
1819*b1cdbd2cSJim Jagielski 	case 2: // index
1820*b1cdbd2cSJim Jagielski         // FALLTHROUGH intended
1821*b1cdbd2cSJim Jagielski 	default:
1822*b1cdbd2cSJim Jagielski         // FALLTHROUGH intended
1823*b1cdbd2cSJim Jagielski 	case 0: // rgb
1824*b1cdbd2cSJim Jagielski         return AnimationColorSpace::RGB;
1825*b1cdbd2cSJim Jagielski 
1826*b1cdbd2cSJim Jagielski 	case 1: // hsl
1827*b1cdbd2cSJim Jagielski         return AnimationColorSpace::HSL;
1828*b1cdbd2cSJim Jagielski 	}
1829*b1cdbd2cSJim Jagielski }
1830*b1cdbd2cSJim Jagielski 
1831*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1832*b1cdbd2cSJim Jagielski 
implGetColorAny(sal_Int32 nMode,sal_Int32 nA,sal_Int32 nB,sal_Int32 nC)1833*b1cdbd2cSJim Jagielski Any AnimationImporter::implGetColorAny( sal_Int32 nMode, sal_Int32  nA, sal_Int32 nB, sal_Int32 nC )
1834*b1cdbd2cSJim Jagielski {
1835*b1cdbd2cSJim Jagielski 	switch( nMode )
1836*b1cdbd2cSJim Jagielski 	{
1837*b1cdbd2cSJim Jagielski 	case 0: // rgb
1838*b1cdbd2cSJim Jagielski 		{
1839*b1cdbd2cSJim Jagielski 			dump( "rgb(%ld", nA );
1840*b1cdbd2cSJim Jagielski 			dump( ",%ld", nB );
1841*b1cdbd2cSJim Jagielski 			dump( ",%ld)", nC );
1842*b1cdbd2cSJim Jagielski 			Color aColor( (sal_uInt8)nA, (sal_uInt8)nB, (sal_uInt8)nC );
1843*b1cdbd2cSJim Jagielski 			return makeAny( (sal_Int32)aColor.GetRGBColor() );
1844*b1cdbd2cSJim Jagielski 		}
1845*b1cdbd2cSJim Jagielski 	case 1: // hsl
1846*b1cdbd2cSJim Jagielski 		{
1847*b1cdbd2cSJim Jagielski 			dump( "hsl(%ld", nA );
1848*b1cdbd2cSJim Jagielski 			dump( ",%ld", nB );
1849*b1cdbd2cSJim Jagielski 			dump( ",%ld)", nC );
1850*b1cdbd2cSJim Jagielski 			Sequence< double > aHSL( 3 );
1851*b1cdbd2cSJim Jagielski 			aHSL[0] = nA * 360.0/255.0;
1852*b1cdbd2cSJim Jagielski 			aHSL[1] = nB / 255.0;
1853*b1cdbd2cSJim Jagielski 			aHSL[2] = nC / 255.0;
1854*b1cdbd2cSJim Jagielski 			return makeAny( aHSL );
1855*b1cdbd2cSJim Jagielski 		}
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski 	case 2: // index
1858*b1cdbd2cSJim Jagielski 		{
1859*b1cdbd2cSJim Jagielski 			Color aColor;
1860*b1cdbd2cSJim Jagielski 			mpPPTImport->GetColorFromPalette((sal_uInt16)nA, aColor );
1861*b1cdbd2cSJim Jagielski 			dump( "index(%ld", nA );
1862*b1cdbd2cSJim Jagielski 			dump( " [%ld", (sal_Int32)aColor.GetRed() );
1863*b1cdbd2cSJim Jagielski 			dump( ",%ld", (sal_Int32)aColor.GetGreen() );
1864*b1cdbd2cSJim Jagielski 			dump( ",%ld])", (sal_Int32)aColor.GetBlue() );
1865*b1cdbd2cSJim Jagielski 			return makeAny( (sal_Int32)aColor.GetRGBColor() );
1866*b1cdbd2cSJim Jagielski 		}
1867*b1cdbd2cSJim Jagielski 
1868*b1cdbd2cSJim Jagielski 	default:
1869*b1cdbd2cSJim Jagielski 		{
1870*b1cdbd2cSJim Jagielski 			dump( "unknown_%ld(", nMode );
1871*b1cdbd2cSJim Jagielski 			dump( "%ld", nA );
1872*b1cdbd2cSJim Jagielski 			dump( ",%ld", nB );
1873*b1cdbd2cSJim Jagielski 			dump( ",%ld)", nC );
1874*b1cdbd2cSJim Jagielski 			DBG_ERROR( "ppt::implGetColorAny(), unhandled color type" );
1875*b1cdbd2cSJim Jagielski 
1876*b1cdbd2cSJim Jagielski 			Any aAny;
1877*b1cdbd2cSJim Jagielski 			return aAny;
1878*b1cdbd2cSJim Jagielski 		}
1879*b1cdbd2cSJim Jagielski 	}
1880*b1cdbd2cSJim Jagielski }
1881*b1cdbd2cSJim Jagielski 
importAnimateColorContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1882*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateColorContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1883*b1cdbd2cSJim Jagielski {
1884*b1cdbd2cSJim Jagielski 	Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
1885*b1cdbd2cSJim Jagielski 
1886*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateColor && xColor.is(), "invalid call to ppt::AnimationImporter::importAnimateColorContainer()!");
1887*b1cdbd2cSJim Jagielski 	if( pAtom && xColor.is() )
1888*b1cdbd2cSJim Jagielski 	{
1889*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1890*b1cdbd2cSJim Jagielski 
1891*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1892*b1cdbd2cSJim Jagielski 		{
1893*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
1894*b1cdbd2cSJim Jagielski 			{
1895*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
1896*b1cdbd2cSJim Jagielski 					break;
1897*b1cdbd2cSJim Jagielski 			}
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1900*b1cdbd2cSJim Jagielski 			{
1901*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateColorData:
1902*b1cdbd2cSJim Jagielski 			{
1903*b1cdbd2cSJim Jagielski 				sal_uInt32 nBits;
1904*b1cdbd2cSJim Jagielski 				sal_Int32 nByMode, nByA, nByB, nByC;
1905*b1cdbd2cSJim Jagielski 				sal_Int32 nFromMode, nFromA, nFromB, nFromC;
1906*b1cdbd2cSJim Jagielski 				sal_Int32 nToMode, nToA, nToB, nToC;
1907*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits;
1908*b1cdbd2cSJim Jagielski 				mrStCtrl >> nByMode >> nByA >> nByB >> nByC;
1909*b1cdbd2cSJim Jagielski 				mrStCtrl >> nFromMode >> nFromA >> nFromB >> nFromC;
1910*b1cdbd2cSJim Jagielski 				mrStCtrl >> nToMode >> nToA >> nToB >> nToC;
1911*b1cdbd2cSJim Jagielski 
1912*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
1913*b1cdbd2cSJim Jagielski 				{
1914*b1cdbd2cSJim Jagielski 					dump( " by=\"" );
1915*b1cdbd2cSJim Jagielski 					xColor->setBy( implGetColorAny( nByMode, nByA, nByB, nByC ) );
1916*b1cdbd2cSJim Jagielski                     xColor->setColorInterpolation( implGetColorSpace( nByMode, nByA, nByB, nByC ) );
1917*b1cdbd2cSJim Jagielski 					dump( "\"");
1918*b1cdbd2cSJim Jagielski 				}
1919*b1cdbd2cSJim Jagielski 
1920*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
1921*b1cdbd2cSJim Jagielski 				{
1922*b1cdbd2cSJim Jagielski 					dump( " from=\"" );
1923*b1cdbd2cSJim Jagielski 					xColor->setFrom( implGetColorAny( nFromMode, nFromA, nFromB, nFromC ) );
1924*b1cdbd2cSJim Jagielski                     xColor->setColorInterpolation( implGetColorSpace( nFromMode, nFromA, nFromB, nFromC ) );
1925*b1cdbd2cSJim Jagielski 					dump( "\"");
1926*b1cdbd2cSJim Jagielski 				}
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
1929*b1cdbd2cSJim Jagielski 				{
1930*b1cdbd2cSJim Jagielski 					dump( " to=\"" );
1931*b1cdbd2cSJim Jagielski 					xColor->setTo( implGetColorAny( nToMode, nToA, nToB, nToC ) );
1932*b1cdbd2cSJim Jagielski                     xColor->setColorInterpolation( implGetColorSpace( nToMode, nToA, nToB, nToC ) );
1933*b1cdbd2cSJim Jagielski 					dump( "\"");
1934*b1cdbd2cSJim Jagielski 				}
1935*b1cdbd2cSJim Jagielski 			}
1936*b1cdbd2cSJim Jagielski 			break;
1937*b1cdbd2cSJim Jagielski 
1938*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
1939*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
1940*b1cdbd2cSJim Jagielski 				break;
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski 			default:
1943*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
1944*b1cdbd2cSJim Jagielski 				break;
1945*b1cdbd2cSJim Jagielski 			}
1946*b1cdbd2cSJim Jagielski 
1947*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
1948*b1cdbd2cSJim Jagielski 		}
1949*b1cdbd2cSJim Jagielski 	}
1950*b1cdbd2cSJim Jagielski }
1951*b1cdbd2cSJim Jagielski 
1952*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1953*b1cdbd2cSJim Jagielski 
importAnimateSetContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)1954*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateSetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
1955*b1cdbd2cSJim Jagielski {
1956*b1cdbd2cSJim Jagielski 	Reference< XAnimateSet > xSet( xNode, UNO_QUERY );
1957*b1cdbd2cSJim Jagielski 
1958*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateSet && xSet.is(), "invalid call to ppt::AnimationImporter::importAnimateSetContainer()!");
1959*b1cdbd2cSJim Jagielski 	if( pAtom && xSet.is() )
1960*b1cdbd2cSJim Jagielski 	{
1961*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski 		while( pChildAtom )
1964*b1cdbd2cSJim Jagielski 		{
1965*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
1966*b1cdbd2cSJim Jagielski 			{
1967*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
1968*b1cdbd2cSJim Jagielski 					break;
1969*b1cdbd2cSJim Jagielski 			}
1970*b1cdbd2cSJim Jagielski 
1971*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
1972*b1cdbd2cSJim Jagielski 			{
1973*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateSetData:
1974*b1cdbd2cSJim Jagielski 			{
1975*b1cdbd2cSJim Jagielski 				sal_Int32 nU1, nU2;
1976*b1cdbd2cSJim Jagielski 				mrStCtrl >> nU1 >> nU2;
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski 				dump( " set_1=\"%ld\"", nU1 ),
1979*b1cdbd2cSJim Jagielski 				dump( " set_2=\"%ld\"", nU2 );
1980*b1cdbd2cSJim Jagielski 			}
1981*b1cdbd2cSJim Jagielski 			break;
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
1984*b1cdbd2cSJim Jagielski 			{
1985*b1cdbd2cSJim Jagielski 				Any aTo;
1986*b1cdbd2cSJim Jagielski 				if ( importAttributeValue( pChildAtom, aTo ) )
1987*b1cdbd2cSJim Jagielski 				{
1988*b1cdbd2cSJim Jagielski 					xSet->setTo( aTo );
1989*b1cdbd2cSJim Jagielski 
1990*b1cdbd2cSJim Jagielski 					dump( " value=\"" );
1991*b1cdbd2cSJim Jagielski 					dump( aTo );
1992*b1cdbd2cSJim Jagielski 					dump( "\"" );
1993*b1cdbd2cSJim Jagielski 				}
1994*b1cdbd2cSJim Jagielski 			}
1995*b1cdbd2cSJim Jagielski 			break;
1996*b1cdbd2cSJim Jagielski 
1997*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
1998*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
1999*b1cdbd2cSJim Jagielski 				break;
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 			default:
2002*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2003*b1cdbd2cSJim Jagielski 				break;
2004*b1cdbd2cSJim Jagielski 			}
2005*b1cdbd2cSJim Jagielski 
2006*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2007*b1cdbd2cSJim Jagielski 		}
2008*b1cdbd2cSJim Jagielski 	}
2009*b1cdbd2cSJim Jagielski }
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2012*b1cdbd2cSJim Jagielski 
importAnimateContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2013*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2014*b1cdbd2cSJim Jagielski {
2015*b1cdbd2cSJim Jagielski 	Reference< XAnimate > xAnim( xNode, UNO_QUERY );
2016*b1cdbd2cSJim Jagielski 
2017*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimate && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateContainer()!");
2018*b1cdbd2cSJim Jagielski 	if( pAtom && xAnim.is() )
2019*b1cdbd2cSJim Jagielski 	{
2020*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2021*b1cdbd2cSJim Jagielski 
2022*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2023*b1cdbd2cSJim Jagielski 		{
2024*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2025*b1cdbd2cSJim Jagielski 			{
2026*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2027*b1cdbd2cSJim Jagielski 					break;
2028*b1cdbd2cSJim Jagielski 			}
2029*b1cdbd2cSJim Jagielski 
2030*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2031*b1cdbd2cSJim Jagielski 			{
2032*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateData:
2033*b1cdbd2cSJim Jagielski 			{
2034*b1cdbd2cSJim Jagielski 				sal_uInt32 nCalcmode, nBits, nValueType;
2035*b1cdbd2cSJim Jagielski 				mrStCtrl >> nCalcmode >> nBits >> nValueType;
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 				if( nBits & 0x08 )
2038*b1cdbd2cSJim Jagielski 				{
2039*b1cdbd2cSJim Jagielski 					sal_Int16 n = (nCalcmode == 1) ? AnimationCalcMode::LINEAR : /* (nCalcmode == 2) ? AnimationCalcMode::FORMULA : */ AnimationCalcMode::DISCRETE;
2040*b1cdbd2cSJim Jagielski 					xAnim->setCalcMode( n );
2041*b1cdbd2cSJim Jagielski 					dump( " calcmode=\"%s\"", (nCalcmode == 0) ? "discrete" : (nCalcmode == 1) ? "linear" : (nCalcmode == 2) ? "formula" : "unknown" );
2042*b1cdbd2cSJim Jagielski 				}
2043*b1cdbd2cSJim Jagielski 
2044*b1cdbd2cSJim Jagielski 				if( nBits & 0x30 )
2045*b1cdbd2cSJim Jagielski 				{
2046*b1cdbd2cSJim Jagielski 					sal_Int16 n = (nValueType == 1) ? AnimationValueType::NUMBER : (nValueType == 2 ) ? AnimationValueType::COLOR : AnimationValueType::STRING;
2047*b1cdbd2cSJim Jagielski 					xAnim->setValueType( n );
2048*b1cdbd2cSJim Jagielski 					dump( " valueType=\"%s\"", (nValueType == 0) ? "string" : (nValueType == 1) ? "number" : (nValueType == 2) ? "color" : "unknown" );
2049*b1cdbd2cSJim Jagielski 				}
2050*b1cdbd2cSJim Jagielski 			}
2051*b1cdbd2cSJim Jagielski 			break;
2052*b1cdbd2cSJim Jagielski 
2053*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
2054*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
2055*b1cdbd2cSJim Jagielski 				break;
2056*b1cdbd2cSJim Jagielski 
2057*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimKeyPoints:
2058*b1cdbd2cSJim Jagielski 				importAnimateKeyPoints( pChildAtom, xNode );
2059*b1cdbd2cSJim Jagielski 				break;
2060*b1cdbd2cSJim Jagielski 
2061*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
2062*b1cdbd2cSJim Jagielski 				{
2063*b1cdbd2cSJim Jagielski 					Any a;
2064*b1cdbd2cSJim Jagielski 					if ( importAttributeValue( pChildAtom, a ) )
2065*b1cdbd2cSJim Jagielski 					{
2066*b1cdbd2cSJim Jagielski 						switch( pChildAtom->getInstance() )
2067*b1cdbd2cSJim Jagielski 						{
2068*b1cdbd2cSJim Jagielski 						case 1: xAnim->setBy( a ); dump( " by=\"" ); break;
2069*b1cdbd2cSJim Jagielski 						case 2: xAnim->setFrom( a ); dump( " from=\"" ); break;
2070*b1cdbd2cSJim Jagielski 						case 3: xAnim->setTo( a ); dump( " to=\"" ); break;
2071*b1cdbd2cSJim Jagielski 						default:
2072*b1cdbd2cSJim Jagielski 							dump( " unknown_value=\"" );
2073*b1cdbd2cSJim Jagielski 						}
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski 						dump( a );
2076*b1cdbd2cSJim Jagielski 						dump( "\"" );
2077*b1cdbd2cSJim Jagielski 					}
2078*b1cdbd2cSJim Jagielski 				}
2079*b1cdbd2cSJim Jagielski 				break;
2080*b1cdbd2cSJim Jagielski 			default:
2081*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2082*b1cdbd2cSJim Jagielski 				break;
2083*b1cdbd2cSJim Jagielski 			}
2084*b1cdbd2cSJim Jagielski 
2085*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2086*b1cdbd2cSJim Jagielski 		}
2087*b1cdbd2cSJim Jagielski 	}
2088*b1cdbd2cSJim Jagielski }
2089*b1cdbd2cSJim Jagielski 
2090*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2091*b1cdbd2cSJim Jagielski 
importAnimateMotionContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2092*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateMotionContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2093*b1cdbd2cSJim Jagielski {
2094*b1cdbd2cSJim Jagielski 	Reference< XAnimateMotion > xMotion( xNode, UNO_QUERY );
2095*b1cdbd2cSJim Jagielski 
2096*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateMotion && xMotion.is(), "invalid call to ppt::AnimationImporter::importAnimateMotionContainer()!");
2097*b1cdbd2cSJim Jagielski 	if( pAtom && xMotion.is() )
2098*b1cdbd2cSJim Jagielski 	{
2099*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2102*b1cdbd2cSJim Jagielski 		{
2103*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2104*b1cdbd2cSJim Jagielski 			{
2105*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2106*b1cdbd2cSJim Jagielski 					break;
2107*b1cdbd2cSJim Jagielski 			}
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2110*b1cdbd2cSJim Jagielski 			{
2111*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateMotionData:
2112*b1cdbd2cSJim Jagielski 			{
2113*b1cdbd2cSJim Jagielski 				sal_uInt32 nBits, nOrigin;
2114*b1cdbd2cSJim Jagielski 				float fByX, fByY, fFromX, fFromY, fToX, fToY;
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits >> fByX >> fByY >> fFromX >> fFromY >> fToX >> fToY >> nOrigin;
2117*b1cdbd2cSJim Jagielski 
2118*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2119*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2120*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY );
2121*b1cdbd2cSJim Jagielski 
2122*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
2123*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY );
2124*b1cdbd2cSJim Jagielski 
2125*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
2126*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY );
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski 				if( nBits & 8 )
2129*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " origin=\"%s\"", (nOrigin == 1) ? "parent" : (nOrigin == 2) ? "layout" : "unknown" );
2130*b1cdbd2cSJim Jagielski 
2131*b1cdbd2cSJim Jagielski #endif
2132*b1cdbd2cSJim Jagielski 			}
2133*b1cdbd2cSJim Jagielski 			break;
2134*b1cdbd2cSJim Jagielski 
2135*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
2136*b1cdbd2cSJim Jagielski 			{
2137*b1cdbd2cSJim Jagielski 				Any aPath;
2138*b1cdbd2cSJim Jagielski 				if ( importAttributeValue( pChildAtom, aPath ) )
2139*b1cdbd2cSJim Jagielski 				{
2140*b1cdbd2cSJim Jagielski 					rtl::OUString aStr;
2141*b1cdbd2cSJim Jagielski 					if ( aPath >>= aStr )
2142*b1cdbd2cSJim Jagielski 					{
2143*b1cdbd2cSJim Jagielski 						aStr = aStr.replace( 'E', ' ' );
2144*b1cdbd2cSJim Jagielski 						aStr = aStr.trim();
2145*b1cdbd2cSJim Jagielski 						aPath <<= aStr;
2146*b1cdbd2cSJim Jagielski 						xMotion->setPath( aPath );
2147*b1cdbd2cSJim Jagielski 						dump( " path=\"" );
2148*b1cdbd2cSJim Jagielski 						dump( aPath );
2149*b1cdbd2cSJim Jagielski 						dump( "\"" );
2150*b1cdbd2cSJim Jagielski 					}
2151*b1cdbd2cSJim Jagielski 				}
2152*b1cdbd2cSJim Jagielski 			}
2153*b1cdbd2cSJim Jagielski 			break;
2154*b1cdbd2cSJim Jagielski 
2155*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
2156*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
2157*b1cdbd2cSJim Jagielski 				break;
2158*b1cdbd2cSJim Jagielski 
2159*b1cdbd2cSJim Jagielski 			default:
2160*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2161*b1cdbd2cSJim Jagielski 				break;
2162*b1cdbd2cSJim Jagielski 			}
2163*b1cdbd2cSJim Jagielski 
2164*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2165*b1cdbd2cSJim Jagielski 		}
2166*b1cdbd2cSJim Jagielski 	}
2167*b1cdbd2cSJim Jagielski }
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2170*b1cdbd2cSJim Jagielski 
importCommandContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2171*b1cdbd2cSJim Jagielski void AnimationImporter::importCommandContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2172*b1cdbd2cSJim Jagielski {
2173*b1cdbd2cSJim Jagielski 	Reference< XCommand > xCommand( xNode, UNO_QUERY );
2174*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimCommand && xCommand.is(), "invalid call to ppt::AnimationImporter::importCommandContainer()!");
2175*b1cdbd2cSJim Jagielski 	if( pAtom && xCommand.is() )
2176*b1cdbd2cSJim Jagielski 	{
2177*b1cdbd2cSJim Jagielski 		sal_Int32 nBits = 0, nType = 0;
2178*b1cdbd2cSJim Jagielski 		Any aValue;
2179*b1cdbd2cSJim Jagielski 
2180*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2181*b1cdbd2cSJim Jagielski 
2182*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2183*b1cdbd2cSJim Jagielski 		{
2184*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2185*b1cdbd2cSJim Jagielski 			{
2186*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2187*b1cdbd2cSJim Jagielski 					break;
2188*b1cdbd2cSJim Jagielski 			}
2189*b1cdbd2cSJim Jagielski 
2190*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2191*b1cdbd2cSJim Jagielski 			{
2192*b1cdbd2cSJim Jagielski 			case DFF_msofbtCommandData:
2193*b1cdbd2cSJim Jagielski 			{
2194*b1cdbd2cSJim Jagielski 				sal_Int32 nCommandType;
2195*b1cdbd2cSJim Jagielski 				// looks like U1 is a bitset, bit 1 enables the type and bit 2 enables
2196*b1cdbd2cSJim Jagielski 				// a propertyvalue that follows
2197*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits;
2198*b1cdbd2cSJim Jagielski 				mrStCtrl >> nCommandType;
2199*b1cdbd2cSJim Jagielski 
2200*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2201*b1cdbd2cSJim Jagielski 				{
2202*b1cdbd2cSJim Jagielski 					dump( " type=\"%s\"", (nCommandType == 0) ? "event" : ( nCommandType == 1) ? "call" : "verb" );
2203*b1cdbd2cSJim Jagielski 				}
2204*b1cdbd2cSJim Jagielski 			}
2205*b1cdbd2cSJim Jagielski 			break;
2206*b1cdbd2cSJim Jagielski 
2207*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
2208*b1cdbd2cSJim Jagielski 			{
2209*b1cdbd2cSJim Jagielski 				if ( importAttributeValue( pChildAtom, aValue ) )
2210*b1cdbd2cSJim Jagielski 				{
2211*b1cdbd2cSJim Jagielski 					if( nBits & 2 )
2212*b1cdbd2cSJim Jagielski 					{
2213*b1cdbd2cSJim Jagielski 						dump( " cmd=\"" );
2214*b1cdbd2cSJim Jagielski 						dump( aValue );
2215*b1cdbd2cSJim Jagielski 						dump( "\"" );
2216*b1cdbd2cSJim Jagielski 					}
2217*b1cdbd2cSJim Jagielski 				}
2218*b1cdbd2cSJim Jagielski 			}
2219*b1cdbd2cSJim Jagielski 			break;
2220*b1cdbd2cSJim Jagielski 
2221*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
2222*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
2223*b1cdbd2cSJim Jagielski 				break;
2224*b1cdbd2cSJim Jagielski 
2225*b1cdbd2cSJim Jagielski 			default:
2226*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2227*b1cdbd2cSJim Jagielski 				break;
2228*b1cdbd2cSJim Jagielski 			}
2229*b1cdbd2cSJim Jagielski 
2230*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2231*b1cdbd2cSJim Jagielski 		}
2232*b1cdbd2cSJim Jagielski 
2233*b1cdbd2cSJim Jagielski 		if( nBits & 3 )
2234*b1cdbd2cSJim Jagielski 		{
2235*b1cdbd2cSJim Jagielski 			OUString aParam;
2236*b1cdbd2cSJim Jagielski 			aValue >>= aParam;
2237*b1cdbd2cSJim Jagielski 
2238*b1cdbd2cSJim Jagielski 			sal_Int16 nCommand = EffectCommands::CUSTOM;
2239*b1cdbd2cSJim Jagielski 
2240*b1cdbd2cSJim Jagielski 			NamedValue aParamValue;
2241*b1cdbd2cSJim Jagielski 
2242*b1cdbd2cSJim Jagielski 			switch( nType )
2243*b1cdbd2cSJim Jagielski 			{
2244*b1cdbd2cSJim Jagielski 			case 0:	// event
2245*b1cdbd2cSJim Jagielski 			case 1: // call
2246*b1cdbd2cSJim Jagielski 				if( aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "onstopaudio" ) ) )
2247*b1cdbd2cSJim Jagielski 				{
2248*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::STOPAUDIO;
2249*b1cdbd2cSJim Jagielski 				}
2250*b1cdbd2cSJim Jagielski 				else if( aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("play") ) )
2251*b1cdbd2cSJim Jagielski 				{
2252*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::PLAY;
2253*b1cdbd2cSJim Jagielski 				}
2254*b1cdbd2cSJim Jagielski 				else if( aParam.compareToAscii( RTL_CONSTASCII_STRINGPARAM("playFrom") ) == 0 )
2255*b1cdbd2cSJim Jagielski 				{
2256*b1cdbd2cSJim Jagielski 					const OUString aMediaTime( aParam.copy( 9, aParam.getLength() - 10 ) );
2257*b1cdbd2cSJim Jagielski 					rtl_math_ConversionStatus eStatus;
2258*b1cdbd2cSJim Jagielski 					double fMediaTime = ::rtl::math::stringToDouble( aMediaTime, (sal_Unicode)('.'), (sal_Unicode)(','), &eStatus, NULL );
2259*b1cdbd2cSJim Jagielski 					if( eStatus == rtl_math_ConversionStatus_Ok )
2260*b1cdbd2cSJim Jagielski 					{
2261*b1cdbd2cSJim Jagielski 						aParamValue.Name = OUString(RTL_CONSTASCII_USTRINGPARAM("MediaTime"));
2262*b1cdbd2cSJim Jagielski 						aParamValue.Value <<= fMediaTime;
2263*b1cdbd2cSJim Jagielski 					}
2264*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::PLAY;
2265*b1cdbd2cSJim Jagielski 				}
2266*b1cdbd2cSJim Jagielski 				else if( aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("togglePause") ) )
2267*b1cdbd2cSJim Jagielski 				{
2268*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::TOGGLEPAUSE;
2269*b1cdbd2cSJim Jagielski 				}
2270*b1cdbd2cSJim Jagielski 				else if( aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("stop") ) )
2271*b1cdbd2cSJim Jagielski 				{
2272*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::STOP;
2273*b1cdbd2cSJim Jagielski 				}
2274*b1cdbd2cSJim Jagielski 				break;
2275*b1cdbd2cSJim Jagielski 			case 2: // verb
2276*b1cdbd2cSJim Jagielski 				{
2277*b1cdbd2cSJim Jagielski 					aParamValue.Name = OUString(RTL_CONSTASCII_USTRINGPARAM("Verb"));
2278*b1cdbd2cSJim Jagielski 					aParamValue.Value <<= aParam.toInt32();
2279*b1cdbd2cSJim Jagielski 
2280*b1cdbd2cSJim Jagielski 					nCommand = EffectCommands::VERB;
2281*b1cdbd2cSJim Jagielski 				}
2282*b1cdbd2cSJim Jagielski 				break;
2283*b1cdbd2cSJim Jagielski 			}
2284*b1cdbd2cSJim Jagielski 
2285*b1cdbd2cSJim Jagielski 			xCommand->setCommand( nCommand );
2286*b1cdbd2cSJim Jagielski 			if( nCommand == EffectCommands::CUSTOM )
2287*b1cdbd2cSJim Jagielski 			{
2288*b1cdbd2cSJim Jagielski 				DBG_ERROR("sd::AnimationImporter::importCommandContainer(), unknown command!");
2289*b1cdbd2cSJim Jagielski 				aParamValue.Name = OUString(RTL_CONSTASCII_USTRINGPARAM("UserDefined"));
2290*b1cdbd2cSJim Jagielski 				aParamValue.Value <<= aParam;
2291*b1cdbd2cSJim Jagielski 			}
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski 			if( aParamValue.Value.hasValue() )
2294*b1cdbd2cSJim Jagielski 			{
2295*b1cdbd2cSJim Jagielski 				Sequence< NamedValue > aParamSeq( &aParamValue, 1 );
2296*b1cdbd2cSJim Jagielski 				xCommand->setParameter( makeAny( aParamSeq ) );
2297*b1cdbd2cSJim Jagielski 			}
2298*b1cdbd2cSJim Jagielski 		}
2299*b1cdbd2cSJim Jagielski 	}
2300*b1cdbd2cSJim Jagielski }
2301*b1cdbd2cSJim Jagielski 
2302*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2303*b1cdbd2cSJim Jagielski 
importAudioContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2304*b1cdbd2cSJim Jagielski void AnimationImporter::importAudioContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2305*b1cdbd2cSJim Jagielski {
2306*b1cdbd2cSJim Jagielski 	Reference< XAudio > xAudio( xNode, UNO_QUERY );
2307*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && xAudio.is() &&
2308*b1cdbd2cSJim Jagielski 				 ( (pAtom->getType() == DFF_msofbtAnimGroup) ||
2309*b1cdbd2cSJim Jagielski 				   (pAtom->getType() == DFF_msofbtAnimSubGoup) ), "invalid call to ppt::AnimationImporter::importAudioContainer()!");
2310*b1cdbd2cSJim Jagielski 	if( pAtom && xAudio.is() )
2311*b1cdbd2cSJim Jagielski 	{
2312*b1cdbd2cSJim Jagielski 		importAnimationEvents( pAtom, xNode );
2313*b1cdbd2cSJim Jagielski 		importAnimationValues( pAtom, xNode );
2314*b1cdbd2cSJim Jagielski 		importAnimationActions( pAtom, xNode );
2315*b1cdbd2cSJim Jagielski 
2316*b1cdbd2cSJim Jagielski 		dump(">\n");
2317*b1cdbd2cSJim Jagielski 
2318*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2319*b1cdbd2cSJim Jagielski 
2320*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2321*b1cdbd2cSJim Jagielski 		{
2322*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2323*b1cdbd2cSJim Jagielski 			{
2324*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2325*b1cdbd2cSJim Jagielski 					break;
2326*b1cdbd2cSJim Jagielski 			}
2327*b1cdbd2cSJim Jagielski 
2328*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2329*b1cdbd2cSJim Jagielski 			{
2330*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimNode:
2331*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimEvent:
2332*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimValue:
2333*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAction:
2334*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimPropertySet:
2335*b1cdbd2cSJim Jagielski 				break;
2336*b1cdbd2cSJim Jagielski 
2337*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimAttributeValue:
2338*b1cdbd2cSJim Jagielski 			{
2339*b1cdbd2cSJim Jagielski 				Any aValue;
2340*b1cdbd2cSJim Jagielski 				if ( importAttributeValue( pChildAtom, aValue ) )
2341*b1cdbd2cSJim Jagielski 				{
2342*b1cdbd2cSJim Jagielski 					dump( " value=\"" );
2343*b1cdbd2cSJim Jagielski 					dump( aValue );
2344*b1cdbd2cSJim Jagielski 					dump( "\"" );
2345*b1cdbd2cSJim Jagielski 				}
2346*b1cdbd2cSJim Jagielski 			}
2347*b1cdbd2cSJim Jagielski 			break;
2348*b1cdbd2cSJim Jagielski 
2349*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTargetElement:
2350*b1cdbd2cSJim Jagielski 			{
2351*b1cdbd2cSJim Jagielski 				sal_Int16 nSubType;
2352*b1cdbd2cSJim Jagielski 				Any aSource;
2353*b1cdbd2cSJim Jagielski 				importTargetElementContainer( pChildAtom, aSource, nSubType );
2354*b1cdbd2cSJim Jagielski 				if( xAudio.is() )
2355*b1cdbd2cSJim Jagielski 					xAudio->setSource( aSource );
2356*b1cdbd2cSJim Jagielski 			}
2357*b1cdbd2cSJim Jagielski 			break;
2358*b1cdbd2cSJim Jagielski 
2359*b1cdbd2cSJim Jagielski 			default:
2360*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2361*b1cdbd2cSJim Jagielski 				break;
2362*b1cdbd2cSJim Jagielski 			}
2363*b1cdbd2cSJim Jagielski 
2364*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2365*b1cdbd2cSJim Jagielski 		}
2366*b1cdbd2cSJim Jagielski 
2367*b1cdbd2cSJim Jagielski 		// TODO: What to do with them?
2368*b1cdbd2cSJim Jagielski 		Any aEmpty;
2369*b1cdbd2cSJim Jagielski 		xAudio->setBegin( aEmpty );
2370*b1cdbd2cSJim Jagielski 		xAudio->setEnd( aEmpty );
2371*b1cdbd2cSJim Jagielski 	}
2372*b1cdbd2cSJim Jagielski }
2373*b1cdbd2cSJim Jagielski 
2374*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2375*b1cdbd2cSJim Jagielski 
importAnimateScaleContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2376*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateScaleContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2377*b1cdbd2cSJim Jagielski {
2378*b1cdbd2cSJim Jagielski 	Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
2379*b1cdbd2cSJim Jagielski 
2380*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateScale && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateScaleContainer()!");
2381*b1cdbd2cSJim Jagielski 	if( pAtom && xTransform.is() )
2382*b1cdbd2cSJim Jagielski 	{
2383*b1cdbd2cSJim Jagielski 		xTransform->setTransformType( AnimationTransformType::SCALE );
2384*b1cdbd2cSJim Jagielski 
2385*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2386*b1cdbd2cSJim Jagielski 
2387*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2388*b1cdbd2cSJim Jagielski 		{
2389*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2390*b1cdbd2cSJim Jagielski 			{
2391*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2392*b1cdbd2cSJim Jagielski 					break;
2393*b1cdbd2cSJim Jagielski 			}
2394*b1cdbd2cSJim Jagielski 
2395*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2396*b1cdbd2cSJim Jagielski 			{
2397*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateScaleData:
2398*b1cdbd2cSJim Jagielski 			{
2399*b1cdbd2cSJim Jagielski 				sal_uInt32 nBits, nZoomContents;
2400*b1cdbd2cSJim Jagielski 				float fByX, fByY, fFromX, fFromY, fToX, fToY;
2401*b1cdbd2cSJim Jagielski 
2402*b1cdbd2cSJim Jagielski 				// nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool)
2403*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits >> fByX >> fByY >> fFromX >> fFromY >> fToX >> fToY >> nZoomContents;
2404*b1cdbd2cSJim Jagielski 
2405*b1cdbd2cSJim Jagielski 				ValuePair aPair;
2406*b1cdbd2cSJim Jagielski                 // 'from' value
2407*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
2408*b1cdbd2cSJim Jagielski 				{
2409*b1cdbd2cSJim Jagielski 					aPair.First <<= (double)fFromX / 100.0;
2410*b1cdbd2cSJim Jagielski 					aPair.Second <<= (double)fFromY / 100.0;
2411*b1cdbd2cSJim Jagielski 					xTransform->setFrom( makeAny( aPair ) );
2412*b1cdbd2cSJim Jagielski 				}
2413*b1cdbd2cSJim Jagielski 
2414*b1cdbd2cSJim Jagielski                 // 'to' value
2415*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
2416*b1cdbd2cSJim Jagielski 				{
2417*b1cdbd2cSJim Jagielski 					aPair.First <<= (double)fToX / 100.0;
2418*b1cdbd2cSJim Jagielski 					aPair.Second <<= (double)fToY / 100.0;
2419*b1cdbd2cSJim Jagielski 					xTransform->setTo( makeAny( aPair ) );
2420*b1cdbd2cSJim Jagielski 				}
2421*b1cdbd2cSJim Jagielski 
2422*b1cdbd2cSJim Jagielski                 // 'by' value
2423*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2424*b1cdbd2cSJim Jagielski                 {
2425*b1cdbd2cSJim Jagielski                     aPair.First <<= (double)fByX / 100.0;
2426*b1cdbd2cSJim Jagielski                     aPair.Second <<= (double)fByY / 100.0;
2427*b1cdbd2cSJim Jagielski 
2428*b1cdbd2cSJim Jagielski                     if( nBits & 2 )
2429*b1cdbd2cSJim Jagielski                     {
2430*b1cdbd2cSJim Jagielski                         // 'from' value given, import normally
2431*b1cdbd2cSJim Jagielski                         xTransform->setBy( makeAny( aPair ) );
2432*b1cdbd2cSJim Jagielski                     }
2433*b1cdbd2cSJim Jagielski                     else
2434*b1cdbd2cSJim Jagielski                     {
2435*b1cdbd2cSJim Jagielski                         // mapping 'by' to 'to', if no 'from' is
2436*b1cdbd2cSJim Jagielski                         // given. This is due to a non-conformity in
2437*b1cdbd2cSJim Jagielski                         // PPT, which exports animateScale effects
2438*b1cdbd2cSJim Jagielski                         // with a sole 'by' value, but with the
2439*b1cdbd2cSJim Jagielski                         // semantics of a sole 'to' animation
2440*b1cdbd2cSJim Jagielski                         xTransform->setTo( makeAny( aPair ) );
2441*b1cdbd2cSJim Jagielski                     }
2442*b1cdbd2cSJim Jagielski                 }
2443*b1cdbd2cSJim Jagielski 
2444*b1cdbd2cSJim Jagielski 
2445*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2446*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2447*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY );
2448*b1cdbd2cSJim Jagielski 
2449*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
2450*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY );
2451*b1cdbd2cSJim Jagielski 
2452*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
2453*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY );
2454*b1cdbd2cSJim Jagielski 
2455*b1cdbd2cSJim Jagielski 				if( nBits & 8 )
2456*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " zoomContents=\"%s\"", nZoomContents ? "true" : "false" );
2457*b1cdbd2cSJim Jagielski #endif
2458*b1cdbd2cSJim Jagielski 			}
2459*b1cdbd2cSJim Jagielski 			break;
2460*b1cdbd2cSJim Jagielski 
2461*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
2462*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
2463*b1cdbd2cSJim Jagielski 				break;
2464*b1cdbd2cSJim Jagielski 
2465*b1cdbd2cSJim Jagielski 			default:
2466*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2467*b1cdbd2cSJim Jagielski 				break;
2468*b1cdbd2cSJim Jagielski 			}
2469*b1cdbd2cSJim Jagielski 
2470*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2471*b1cdbd2cSJim Jagielski 		}
2472*b1cdbd2cSJim Jagielski 	}
2473*b1cdbd2cSJim Jagielski }
2474*b1cdbd2cSJim Jagielski 
2475*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2476*b1cdbd2cSJim Jagielski 
importAnimateRotationContainer(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2477*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateRotationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2478*b1cdbd2cSJim Jagielski {
2479*b1cdbd2cSJim Jagielski 	Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
2480*b1cdbd2cSJim Jagielski 
2481*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateRotation && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateRotationContainer()!");
2482*b1cdbd2cSJim Jagielski 	if( pAtom && xTransform.is() )
2483*b1cdbd2cSJim Jagielski 	{
2484*b1cdbd2cSJim Jagielski 		xTransform->setTransformType( AnimationTransformType::ROTATE );
2485*b1cdbd2cSJim Jagielski 
2486*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski 		while( pChildAtom )
2489*b1cdbd2cSJim Jagielski 		{
2490*b1cdbd2cSJim Jagielski 			if( !pChildAtom->isContainer() )
2491*b1cdbd2cSJim Jagielski 			{
2492*b1cdbd2cSJim Jagielski 				if( !pChildAtom->seekToContent() )
2493*b1cdbd2cSJim Jagielski 					break;
2494*b1cdbd2cSJim Jagielski 			}
2495*b1cdbd2cSJim Jagielski 
2496*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
2497*b1cdbd2cSJim Jagielski 			{
2498*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateRotationData:
2499*b1cdbd2cSJim Jagielski 			{
2500*b1cdbd2cSJim Jagielski 				sal_uInt32 nBits, nU1;
2501*b1cdbd2cSJim Jagielski 				float fBy, fFrom, fTo;
2502*b1cdbd2cSJim Jagielski 
2503*b1cdbd2cSJim Jagielski 				// nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool)
2504*b1cdbd2cSJim Jagielski 				mrStCtrl >> nBits >> fBy >> fFrom >> fTo >> nU1;
2505*b1cdbd2cSJim Jagielski 
2506*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2507*b1cdbd2cSJim Jagielski 					xTransform->setBy( makeAny( (double) fBy ) );
2508*b1cdbd2cSJim Jagielski 
2509*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
2510*b1cdbd2cSJim Jagielski 					xTransform->setFrom( makeAny( (double) fFrom ) );
2511*b1cdbd2cSJim Jagielski 
2512*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
2513*b1cdbd2cSJim Jagielski 					xTransform->setTo( makeAny( (double) fTo ) );
2514*b1cdbd2cSJim Jagielski 
2515*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2516*b1cdbd2cSJim Jagielski 				if( nBits & 1 )
2517*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " by=\"%g\"", (double)fBy );
2518*b1cdbd2cSJim Jagielski 
2519*b1cdbd2cSJim Jagielski 				if( nBits & 2 )
2520*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " from=\"%g\"", (double)fFrom );
2521*b1cdbd2cSJim Jagielski 
2522*b1cdbd2cSJim Jagielski 				if( nBits & 4 )
2523*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " to=\"%g\"", (double)fTo );
2524*b1cdbd2cSJim Jagielski 
2525*b1cdbd2cSJim Jagielski 				if( nU1 )
2526*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " rotation_1=\"%ld\"", nU1 );
2527*b1cdbd2cSJim Jagielski #endif
2528*b1cdbd2cSJim Jagielski 			}
2529*b1cdbd2cSJim Jagielski 			break;
2530*b1cdbd2cSJim Jagielski 
2531*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimateTarget:
2532*b1cdbd2cSJim Jagielski 				importAnimateAttributeTargetContainer( pChildAtom, xNode );
2533*b1cdbd2cSJim Jagielski 				break;
2534*b1cdbd2cSJim Jagielski 
2535*b1cdbd2cSJim Jagielski 			default:
2536*b1cdbd2cSJim Jagielski 				dump( " unknown_atom=\"%ld\"", (sal_Int32)pChildAtom->getType() );
2537*b1cdbd2cSJim Jagielski 				break;
2538*b1cdbd2cSJim Jagielski 			}
2539*b1cdbd2cSJim Jagielski 
2540*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
2541*b1cdbd2cSJim Jagielski 		}
2542*b1cdbd2cSJim Jagielski 	}
2543*b1cdbd2cSJim Jagielski }
2544*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2545*b1cdbd2cSJim Jagielski 
importAttributeNamesContainer(const Atom * pAtom,OUString & rAttributeNames)2546*b1cdbd2cSJim Jagielski bool AnimationImporter::importAttributeNamesContainer( const Atom* pAtom, OUString& rAttributeNames )
2547*b1cdbd2cSJim Jagielski {
2548*b1cdbd2cSJim Jagielski 	OUStringBuffer aNames;
2549*b1cdbd2cSJim Jagielski 
2550*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateAttributeNames), "invalid call to ppt::AnimationImporter::importAttributeName()!" );
2551*b1cdbd2cSJim Jagielski 	if( pAtom )
2552*b1cdbd2cSJim Jagielski 	{
2553*b1cdbd2cSJim Jagielski 		const Atom* pAttributeValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAttributeValue );
2554*b1cdbd2cSJim Jagielski 
2555*b1cdbd2cSJim Jagielski 		while( pAttributeValueAtom )
2556*b1cdbd2cSJim Jagielski 		{
2557*b1cdbd2cSJim Jagielski 			Any aAny;
2558*b1cdbd2cSJim Jagielski 			if ( importAttributeValue( pAttributeValueAtom, aAny ) )
2559*b1cdbd2cSJim Jagielski 			{
2560*b1cdbd2cSJim Jagielski 				OUString aName;
2561*b1cdbd2cSJim Jagielski 				if( aAny >>= aName )
2562*b1cdbd2cSJim Jagielski 				{
2563*b1cdbd2cSJim Jagielski 					if( aNames.getLength() )
2564*b1cdbd2cSJim Jagielski 						aNames.append( (sal_Unicode)';' );
2565*b1cdbd2cSJim Jagielski 
2566*b1cdbd2cSJim Jagielski 					aNames.append( aName );
2567*b1cdbd2cSJim Jagielski 				}
2568*b1cdbd2cSJim Jagielski 			}
2569*b1cdbd2cSJim Jagielski 			else
2570*b1cdbd2cSJim Jagielski 			{
2571*b1cdbd2cSJim Jagielski 				DBG_ERROR( "error during ppt::AnimationImporter::importAttributeName()!" );
2572*b1cdbd2cSJim Jagielski 			}
2573*b1cdbd2cSJim Jagielski 
2574*b1cdbd2cSJim Jagielski 			pAttributeValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimAttributeValue, pAttributeValueAtom );
2575*b1cdbd2cSJim Jagielski 		}
2576*b1cdbd2cSJim Jagielski 	}
2577*b1cdbd2cSJim Jagielski 
2578*b1cdbd2cSJim Jagielski 	rAttributeNames = aNames.makeStringAndClear();
2579*b1cdbd2cSJim Jagielski 	return true;
2580*b1cdbd2cSJim Jagielski }
2581*b1cdbd2cSJim Jagielski 
2582*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2583*b1cdbd2cSJim Jagielski 
importAnimationValues(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2584*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimationValues( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2585*b1cdbd2cSJim Jagielski {
2586*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom, "invalid call to ppt::AnimationImporter::importAnimationValues()!" );
2587*b1cdbd2cSJim Jagielski 
2588*b1cdbd2cSJim Jagielski 	if( pAtom )
2589*b1cdbd2cSJim Jagielski 	{
2590*b1cdbd2cSJim Jagielski 		const Atom* pValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimValue );
2591*b1cdbd2cSJim Jagielski 
2592*b1cdbd2cSJim Jagielski 		while( pValueAtom && pValueAtom->seekToContent() )
2593*b1cdbd2cSJim Jagielski 		{
2594*b1cdbd2cSJim Jagielski 			sal_uInt32 nType;
2595*b1cdbd2cSJim Jagielski 			mrStCtrl >> nType;
2596*b1cdbd2cSJim Jagielski 			switch( nType )
2597*b1cdbd2cSJim Jagielski 			{
2598*b1cdbd2cSJim Jagielski 			case 0:
2599*b1cdbd2cSJim Jagielski 			{
2600*b1cdbd2cSJim Jagielski 				float fRepeat;
2601*b1cdbd2cSJim Jagielski 				mrStCtrl >> fRepeat;
2602*b1cdbd2cSJim Jagielski 				xNode->setRepeatCount( (fRepeat < ((float)3.40282346638528860e+38)) ? makeAny( (double)fRepeat ) : makeAny( Timing_INDEFINITE ) );
2603*b1cdbd2cSJim Jagielski 
2604*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2605*b1cdbd2cSJim Jagielski 				if( (fRepeat < ((float)3.40282346638528860e+38)) )
2606*b1cdbd2cSJim Jagielski 				{
2607*b1cdbd2cSJim Jagielski 					dump( " repeat=\"%g\"", (double)fRepeat );
2608*b1cdbd2cSJim Jagielski 				}
2609*b1cdbd2cSJim Jagielski 				else
2610*b1cdbd2cSJim Jagielski 				{
2611*b1cdbd2cSJim Jagielski 					dump( " repeat=\"indefinite\"" );
2612*b1cdbd2cSJim Jagielski 				}
2613*b1cdbd2cSJim Jagielski #endif
2614*b1cdbd2cSJim Jagielski 			}
2615*b1cdbd2cSJim Jagielski 			break;
2616*b1cdbd2cSJim Jagielski 
2617*b1cdbd2cSJim Jagielski 			case 3:
2618*b1cdbd2cSJim Jagielski 			{
2619*b1cdbd2cSJim Jagielski 				float faccelerate;
2620*b1cdbd2cSJim Jagielski 				mrStCtrl >> faccelerate;
2621*b1cdbd2cSJim Jagielski 				xNode->setAcceleration( faccelerate );
2622*b1cdbd2cSJim Jagielski 				dump( " accelerate=\"%g\"", (double)faccelerate );
2623*b1cdbd2cSJim Jagielski 			}
2624*b1cdbd2cSJim Jagielski 			break;
2625*b1cdbd2cSJim Jagielski 
2626*b1cdbd2cSJim Jagielski 			case 4:
2627*b1cdbd2cSJim Jagielski 			{
2628*b1cdbd2cSJim Jagielski 				float fdecelerate;
2629*b1cdbd2cSJim Jagielski 				mrStCtrl >> fdecelerate;
2630*b1cdbd2cSJim Jagielski 				xNode->setDecelerate( fdecelerate );
2631*b1cdbd2cSJim Jagielski 				dump( " decelerate=\"%g\"", (double)fdecelerate );
2632*b1cdbd2cSJim Jagielski 			}
2633*b1cdbd2cSJim Jagielski 			break;
2634*b1cdbd2cSJim Jagielski 
2635*b1cdbd2cSJim Jagielski 			case 5:
2636*b1cdbd2cSJim Jagielski 			{
2637*b1cdbd2cSJim Jagielski 				sal_Int32 nAutoreverse;
2638*b1cdbd2cSJim Jagielski 				mrStCtrl >> nAutoreverse;
2639*b1cdbd2cSJim Jagielski 				xNode->setAutoReverse( nAutoreverse != 0 );
2640*b1cdbd2cSJim Jagielski 				dump( " autoreverse=\"%#lx\"", nAutoreverse );
2641*b1cdbd2cSJim Jagielski 			}
2642*b1cdbd2cSJim Jagielski 			break;
2643*b1cdbd2cSJim Jagielski 
2644*b1cdbd2cSJim Jagielski 			default:
2645*b1cdbd2cSJim Jagielski 			{
2646*b1cdbd2cSJim Jagielski 				sal_uInt32 nUnknown;
2647*b1cdbd2cSJim Jagielski 				mrStCtrl >> nUnknown;
2648*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2649*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " attribute_%d=\"%#lx\"", nType, nUnknown );
2650*b1cdbd2cSJim Jagielski #endif
2651*b1cdbd2cSJim Jagielski 			}
2652*b1cdbd2cSJim Jagielski 			break;
2653*b1cdbd2cSJim Jagielski 			}
2654*b1cdbd2cSJim Jagielski 
2655*b1cdbd2cSJim Jagielski 			pValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimValue, pValueAtom );
2656*b1cdbd2cSJim Jagielski 		}
2657*b1cdbd2cSJim Jagielski 	}
2658*b1cdbd2cSJim Jagielski }
2659*b1cdbd2cSJim Jagielski 
2660*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2661*b1cdbd2cSJim Jagielski 
importAnimateKeyPoints(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2662*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimateKeyPoints( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2663*b1cdbd2cSJim Jagielski {
2664*b1cdbd2cSJim Jagielski 	Reference< XAnimate > xAnim( xNode, UNO_QUERY );
2665*b1cdbd2cSJim Jagielski 
2666*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimKeyPoints && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateKeyPoints()!" );
2667*b1cdbd2cSJim Jagielski 
2668*b1cdbd2cSJim Jagielski 	if( pAtom && xAnim.is() )
2669*b1cdbd2cSJim Jagielski 	{
2670*b1cdbd2cSJim Jagielski 		// first count keytimes
2671*b1cdbd2cSJim Jagielski 		const Atom* pIter = NULL;
2672*b1cdbd2cSJim Jagielski 		int nKeyTimes = 0;
2673*b1cdbd2cSJim Jagielski 
2674*b1cdbd2cSJim Jagielski 		while( (pIter = pAtom->findNextChildAtom( DFF_msofbtAnimKeyTime,  pIter )) != 0 )
2675*b1cdbd2cSJim Jagielski 			nKeyTimes++;
2676*b1cdbd2cSJim Jagielski 
2677*b1cdbd2cSJim Jagielski 		Sequence< double > aKeyTimes( nKeyTimes );
2678*b1cdbd2cSJim Jagielski 		Sequence< Any > aValues( nKeyTimes );
2679*b1cdbd2cSJim Jagielski 		OUString aFormula;
2680*b1cdbd2cSJim Jagielski 
2681*b1cdbd2cSJim Jagielski 		pIter = pAtom->findFirstChildAtom(DFF_msofbtAnimKeyTime);
2682*b1cdbd2cSJim Jagielski 		int nKeyTime;
2683*b1cdbd2cSJim Jagielski 		sal_Int32 nTemp;
2684*b1cdbd2cSJim Jagielski 		for( nKeyTime = 0; (nKeyTime < nKeyTimes) && pIter; nKeyTime++ )
2685*b1cdbd2cSJim Jagielski 		{
2686*b1cdbd2cSJim Jagielski 			if( pIter->seekToContent() )
2687*b1cdbd2cSJim Jagielski 			{
2688*b1cdbd2cSJim Jagielski 				mrStCtrl >> nTemp;
2689*b1cdbd2cSJim Jagielski 				double fTemp = (double)nTemp / 1000.0;
2690*b1cdbd2cSJim Jagielski 				aKeyTimes[nKeyTime] = fTemp;
2691*b1cdbd2cSJim Jagielski 
2692*b1cdbd2cSJim Jagielski 				const Atom* pValue = pAtom->findNextChildAtom(pIter);
2693*b1cdbd2cSJim Jagielski 				if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue )
2694*b1cdbd2cSJim Jagielski 				{
2695*b1cdbd2cSJim Jagielski 					Any aValue1, aValue2;
2696*b1cdbd2cSJim Jagielski 					if( importAttributeValue( pValue, aValue1 ) )
2697*b1cdbd2cSJim Jagielski 					{
2698*b1cdbd2cSJim Jagielski 						pValue = pAtom->findNextChildAtom(pValue);
2699*b1cdbd2cSJim Jagielski 						if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue )
2700*b1cdbd2cSJim Jagielski 							importAttributeValue( pValue, aValue2 );
2701*b1cdbd2cSJim Jagielski 
2702*b1cdbd2cSJim Jagielski 						bool bCouldBeFormula = false;
2703*b1cdbd2cSJim Jagielski 						bool bHasValue = aValue2.hasValue();
2704*b1cdbd2cSJim Jagielski 						if( bHasValue )
2705*b1cdbd2cSJim Jagielski 						{
2706*b1cdbd2cSJim Jagielski 							if( aValue2.getValueType() == ::getCppuType((const OUString*)0) )
2707*b1cdbd2cSJim Jagielski 							{
2708*b1cdbd2cSJim Jagielski 								OUString aTest;
2709*b1cdbd2cSJim Jagielski 								aValue2 >>= aTest;
2710*b1cdbd2cSJim Jagielski 								bHasValue = aTest.getLength() != 0;
2711*b1cdbd2cSJim Jagielski 								bCouldBeFormula = true;
2712*b1cdbd2cSJim Jagielski 							}
2713*b1cdbd2cSJim Jagielski 						}
2714*b1cdbd2cSJim Jagielski 
2715*b1cdbd2cSJim Jagielski 						if( bHasValue && bCouldBeFormula && (aValue1.getValueType() == ::getCppuType((const double*)0)) )
2716*b1cdbd2cSJim Jagielski 						{
2717*b1cdbd2cSJim Jagielski 							aValue2 >>= aFormula;
2718*b1cdbd2cSJim Jagielski 							bHasValue = false;
2719*b1cdbd2cSJim Jagielski 						}
2720*b1cdbd2cSJim Jagielski 
2721*b1cdbd2cSJim Jagielski 						if( bHasValue )
2722*b1cdbd2cSJim Jagielski 						{
2723*b1cdbd2cSJim Jagielski 							aValues[nKeyTime] = makeAny( ValuePair( aValue1, aValue2 ) );
2724*b1cdbd2cSJim Jagielski 						}
2725*b1cdbd2cSJim Jagielski 						else
2726*b1cdbd2cSJim Jagielski 						{
2727*b1cdbd2cSJim Jagielski 							aValues[nKeyTime] = aValue1;
2728*b1cdbd2cSJim Jagielski 						}
2729*b1cdbd2cSJim Jagielski 					}
2730*b1cdbd2cSJim Jagielski 				}
2731*b1cdbd2cSJim Jagielski 			}
2732*b1cdbd2cSJim Jagielski 			pIter = pAtom->findNextChildAtom(DFF_msofbtAnimKeyTime, pIter);
2733*b1cdbd2cSJim Jagielski 		}
2734*b1cdbd2cSJim Jagielski 
2735*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2736*b1cdbd2cSJim Jagielski         dump( " keyTimes=\"" );
2737*b1cdbd2cSJim Jagielski 		for( int i=0; i<nKeyTimes; ++i )
2738*b1cdbd2cSJim Jagielski             dump( "%f;", aKeyTimes[i] );
2739*b1cdbd2cSJim Jagielski 
2740*b1cdbd2cSJim Jagielski 		if( aFormula.getLength() )
2741*b1cdbd2cSJim Jagielski 		{
2742*b1cdbd2cSJim Jagielski 			dump( "formula=\"%s", aFormula );
2743*b1cdbd2cSJim Jagielski 		}
2744*b1cdbd2cSJim Jagielski 
2745*b1cdbd2cSJim Jagielski         dump( "\" values=\"" );
2746*b1cdbd2cSJim Jagielski         double nVal;
2747*b1cdbd2cSJim Jagielski         OUString aStr;
2748*b1cdbd2cSJim Jagielski 		for( int i=0; i<nKeyTimes; ++i )
2749*b1cdbd2cSJim Jagielski         {
2750*b1cdbd2cSJim Jagielski 			if( i != 0 )
2751*b1cdbd2cSJim Jagielski 				dump( ";" );
2752*b1cdbd2cSJim Jagielski 
2753*b1cdbd2cSJim Jagielski             if( aValues[i] >>= aStr )
2754*b1cdbd2cSJim Jagielski                 dump( "%s",
2755*b1cdbd2cSJim Jagielski                       ::rtl::OUStringToOString( aStr,
2756*b1cdbd2cSJim Jagielski                                                 RTL_TEXTENCODING_ASCII_US ).getStr() );
2757*b1cdbd2cSJim Jagielski             else if( aValues[i] >>= nVal )
2758*b1cdbd2cSJim Jagielski                 dump( "%f", nVal );
2759*b1cdbd2cSJim Jagielski             else
2760*b1cdbd2cSJim Jagielski             {
2761*b1cdbd2cSJim Jagielski                 ValuePair aValuePair;
2762*b1cdbd2cSJim Jagielski 
2763*b1cdbd2cSJim Jagielski                 if( aValues[i] >>= aValuePair )
2764*b1cdbd2cSJim Jagielski                 {
2765*b1cdbd2cSJim Jagielski                     if( aValuePair.First >>= aStr )
2766*b1cdbd2cSJim Jagielski                         dump( "%s",
2767*b1cdbd2cSJim Jagielski                               ::rtl::OUStringToOString( aStr,
2768*b1cdbd2cSJim Jagielski                                                         RTL_TEXTENCODING_ASCII_US ).getStr() );
2769*b1cdbd2cSJim Jagielski                     else if( aValuePair.First >>= nVal )
2770*b1cdbd2cSJim Jagielski                         dump( "%f", nVal );
2771*b1cdbd2cSJim Jagielski                     else
2772*b1cdbd2cSJim Jagielski                         dump( "%X", (sal_Int32)&aValuePair.First );
2773*b1cdbd2cSJim Jagielski 
2774*b1cdbd2cSJim Jagielski                     if( aValuePair.Second >>= aStr )
2775*b1cdbd2cSJim Jagielski                         dump( ",%s",
2776*b1cdbd2cSJim Jagielski                               ::rtl::OUStringToOString( aStr,
2777*b1cdbd2cSJim Jagielski                                                         RTL_TEXTENCODING_ASCII_US ).getStr() );
2778*b1cdbd2cSJim Jagielski                     else if( aValuePair.Second >>= nVal )
2779*b1cdbd2cSJim Jagielski                         dump( ",%f", nVal );
2780*b1cdbd2cSJim Jagielski                     else
2781*b1cdbd2cSJim Jagielski                         dump( ",%X", (sal_Int32)&aValuePair.Second );
2782*b1cdbd2cSJim Jagielski                 }
2783*b1cdbd2cSJim Jagielski             }
2784*b1cdbd2cSJim Jagielski         }
2785*b1cdbd2cSJim Jagielski         dump( "\"" );
2786*b1cdbd2cSJim Jagielski #endif
2787*b1cdbd2cSJim Jagielski 
2788*b1cdbd2cSJim Jagielski 		xAnim->setKeyTimes( aKeyTimes );
2789*b1cdbd2cSJim Jagielski 		xAnim->setValues( aValues );
2790*b1cdbd2cSJim Jagielski 		xAnim->setFormula( aFormula );
2791*b1cdbd2cSJim Jagielski 	}
2792*b1cdbd2cSJim Jagielski }
2793*b1cdbd2cSJim Jagielski 
2794*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2795*b1cdbd2cSJim Jagielski 
importAttributeValue(const Atom * pAtom,Any & rAny)2796*b1cdbd2cSJim Jagielski bool AnimationImporter::importAttributeValue( const Atom* pAtom, Any& rAny )
2797*b1cdbd2cSJim Jagielski {
2798*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimAttributeValue, "invalid call to ppt::AnimationImporter::importAttributeValue()!" );
2799*b1cdbd2cSJim Jagielski 
2800*b1cdbd2cSJim Jagielski 	bool bOk = false;
2801*b1cdbd2cSJim Jagielski 
2802*b1cdbd2cSJim Jagielski 	if( pAtom && pAtom->seekToContent() )
2803*b1cdbd2cSJim Jagielski 	{
2804*b1cdbd2cSJim Jagielski 		sal_uInt32 nRecLen = pAtom->getLength();
2805*b1cdbd2cSJim Jagielski 		if ( nRecLen >= 1 )
2806*b1cdbd2cSJim Jagielski 		{
2807*b1cdbd2cSJim Jagielski 			sal_Int8 nType;
2808*b1cdbd2cSJim Jagielski 			mrStCtrl >> nType;
2809*b1cdbd2cSJim Jagielski 			switch( nType )
2810*b1cdbd2cSJim Jagielski 			{
2811*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PROP_TYPE_BYTE :
2812*b1cdbd2cSJim Jagielski 				{
2813*b1cdbd2cSJim Jagielski 					if ( nRecLen == 2 )
2814*b1cdbd2cSJim Jagielski 					{
2815*b1cdbd2cSJim Jagielski 						sal_uInt8 nByte;
2816*b1cdbd2cSJim Jagielski 						mrStCtrl >> nByte;
2817*b1cdbd2cSJim Jagielski 						rAny <<= nByte;
2818*b1cdbd2cSJim Jagielski 
2819*b1cdbd2cSJim Jagielski 						bOk = true;
2820*b1cdbd2cSJim Jagielski 					}
2821*b1cdbd2cSJim Jagielski 				}
2822*b1cdbd2cSJim Jagielski 				break;
2823*b1cdbd2cSJim Jagielski 
2824*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PROP_TYPE_INT32 :
2825*b1cdbd2cSJim Jagielski 				{
2826*b1cdbd2cSJim Jagielski 					if ( nRecLen == 5 )
2827*b1cdbd2cSJim Jagielski 					{
2828*b1cdbd2cSJim Jagielski 						sal_uInt32 nInt32;
2829*b1cdbd2cSJim Jagielski 						mrStCtrl >> nInt32;
2830*b1cdbd2cSJim Jagielski 						rAny <<= nInt32;
2831*b1cdbd2cSJim Jagielski 
2832*b1cdbd2cSJim Jagielski 						bOk = true;
2833*b1cdbd2cSJim Jagielski 					}
2834*b1cdbd2cSJim Jagielski 				}
2835*b1cdbd2cSJim Jagielski 				break;
2836*b1cdbd2cSJim Jagielski 
2837*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PROP_TYPE_FLOAT:
2838*b1cdbd2cSJim Jagielski 				{
2839*b1cdbd2cSJim Jagielski 					if( nRecLen == 5 )
2840*b1cdbd2cSJim Jagielski 					{
2841*b1cdbd2cSJim Jagielski 						float fFloat;
2842*b1cdbd2cSJim Jagielski 						mrStCtrl >> fFloat;
2843*b1cdbd2cSJim Jagielski 						rAny <<= (double)fFloat;
2844*b1cdbd2cSJim Jagielski 
2845*b1cdbd2cSJim Jagielski 						bOk = true;
2846*b1cdbd2cSJim Jagielski 					}
2847*b1cdbd2cSJim Jagielski 				}
2848*b1cdbd2cSJim Jagielski 				break;
2849*b1cdbd2cSJim Jagielski 
2850*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PROP_TYPE_UNISTRING :
2851*b1cdbd2cSJim Jagielski 				{
2852*b1cdbd2cSJim Jagielski 					if ( ( nRecLen & 1 ) && ( nRecLen > 1 ) )
2853*b1cdbd2cSJim Jagielski 					{
2854*b1cdbd2cSJim Jagielski 						String aString;
2855*b1cdbd2cSJim Jagielski 						mpPPTImport->MSDFFReadZString( mrStCtrl, aString, nRecLen - 1, sal_True );
2856*b1cdbd2cSJim Jagielski 						rtl::OUString aOUString( aString );
2857*b1cdbd2cSJim Jagielski 						rAny <<= aOUString;
2858*b1cdbd2cSJim Jagielski 
2859*b1cdbd2cSJim Jagielski 						bOk = true;
2860*b1cdbd2cSJim Jagielski 					}
2861*b1cdbd2cSJim Jagielski 				}
2862*b1cdbd2cSJim Jagielski 				break;
2863*b1cdbd2cSJim Jagielski 			}
2864*b1cdbd2cSJim Jagielski 		}
2865*b1cdbd2cSJim Jagielski 	}
2866*b1cdbd2cSJim Jagielski 
2867*b1cdbd2cSJim Jagielski 	DBG_ASSERT( bOk, "invalid value inside ppt::AnimationImporter::importAttributeValue()!" );
2868*b1cdbd2cSJim Jagielski 	return bOk;
2869*b1cdbd2cSJim Jagielski }
2870*b1cdbd2cSJim Jagielski 
2871*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2872*b1cdbd2cSJim Jagielski 
importAnimationEvents(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2873*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimationEvents( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2874*b1cdbd2cSJim Jagielski {
2875*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xNode.is() && pAtom, "invalid call to ppt::AnimationImporter::importAnimationEvents()!" );
2876*b1cdbd2cSJim Jagielski 
2877*b1cdbd2cSJim Jagielski 	Any aBegin, aEnd, aNext, aPrev;
2878*b1cdbd2cSJim Jagielski 
2879*b1cdbd2cSJim Jagielski 	const Atom* pEventAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimEvent );
2880*b1cdbd2cSJim Jagielski 	while( pEventAtom )
2881*b1cdbd2cSJim Jagielski 	{
2882*b1cdbd2cSJim Jagielski 		Any* pEvents = NULL;
2883*b1cdbd2cSJim Jagielski 
2884*b1cdbd2cSJim Jagielski 		switch( pEventAtom->getInstance() )
2885*b1cdbd2cSJim Jagielski 		{
2886*b1cdbd2cSJim Jagielski 		case 1: pEvents = &aBegin; break;
2887*b1cdbd2cSJim Jagielski 		case 2: pEvents = &aEnd; break;
2888*b1cdbd2cSJim Jagielski 		case 3: pEvents = &aNext; break;
2889*b1cdbd2cSJim Jagielski 		case 4: pEvents = &aPrev; break;
2890*b1cdbd2cSJim Jagielski 		}
2891*b1cdbd2cSJim Jagielski 
2892*b1cdbd2cSJim Jagielski 		if( pEvents )
2893*b1cdbd2cSJim Jagielski 		{
2894*b1cdbd2cSJim Jagielski 			Event aEvent;
2895*b1cdbd2cSJim Jagielski 			aEvent.Trigger = EventTrigger::NONE;
2896*b1cdbd2cSJim Jagielski 			aEvent.Repeat = 0;
2897*b1cdbd2cSJim Jagielski 
2898*b1cdbd2cSJim Jagielski 			const Atom* pChildAtom = pEventAtom->findFirstChildAtom();
2899*b1cdbd2cSJim Jagielski 
2900*b1cdbd2cSJim Jagielski 			while( pChildAtom && pChildAtom->seekToContent() )
2901*b1cdbd2cSJim Jagielski 			{
2902*b1cdbd2cSJim Jagielski 				switch( pChildAtom->getType() )
2903*b1cdbd2cSJim Jagielski 				{
2904*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimTrigger:
2905*b1cdbd2cSJim Jagielski 				{
2906*b1cdbd2cSJim Jagielski 					sal_Int32 nU1, nTrigger, nU3, nBegin;
2907*b1cdbd2cSJim Jagielski 					mrStCtrl >> nU1;
2908*b1cdbd2cSJim Jagielski 					mrStCtrl >> nTrigger;
2909*b1cdbd2cSJim Jagielski 					mrStCtrl >> nU3;
2910*b1cdbd2cSJim Jagielski 					mrStCtrl >> nBegin;
2911*b1cdbd2cSJim Jagielski 
2912*b1cdbd2cSJim Jagielski 					switch( nTrigger )
2913*b1cdbd2cSJim Jagielski 					{
2914*b1cdbd2cSJim Jagielski 					case 0: aEvent.Trigger = EventTrigger::NONE; break;
2915*b1cdbd2cSJim Jagielski 					case 1: aEvent.Trigger = EventTrigger::ON_BEGIN; break;
2916*b1cdbd2cSJim Jagielski 					case 2: aEvent.Trigger = EventTrigger::ON_END; break;
2917*b1cdbd2cSJim Jagielski 					case 3: aEvent.Trigger = EventTrigger::BEGIN_EVENT; break;
2918*b1cdbd2cSJim Jagielski 					case 4: aEvent.Trigger = EventTrigger::END_EVENT; break;
2919*b1cdbd2cSJim Jagielski 					case 5: aEvent.Trigger = EventTrigger::ON_CLICK; break;
2920*b1cdbd2cSJim Jagielski 					case 6: aEvent.Trigger = EventTrigger::ON_DBL_CLICK; break;
2921*b1cdbd2cSJim Jagielski 					case 7: aEvent.Trigger = EventTrigger::ON_MOUSE_ENTER; break;
2922*b1cdbd2cSJim Jagielski 					case 8: aEvent.Trigger = EventTrigger::ON_MOUSE_LEAVE; break;
2923*b1cdbd2cSJim Jagielski 					case 9: aEvent.Trigger = EventTrigger::ON_NEXT; break;
2924*b1cdbd2cSJim Jagielski 					case 10: aEvent.Trigger = EventTrigger::ON_PREV; break;
2925*b1cdbd2cSJim Jagielski 					case 11: aEvent.Trigger = EventTrigger::ON_STOP_AUDIO; break;
2926*b1cdbd2cSJim Jagielski 					}
2927*b1cdbd2cSJim Jagielski 
2928*b1cdbd2cSJim Jagielski 					if( (nBegin != 0) || (aEvent.Trigger == EventTrigger::NONE) )
2929*b1cdbd2cSJim Jagielski 						aEvent.Offset = (nBegin == -1) ? makeAny( Timing_INDEFINITE ) : makeAny( (double)(nBegin / 1000.0) );
2930*b1cdbd2cSJim Jagielski 				}
2931*b1cdbd2cSJim Jagielski 				break;
2932*b1cdbd2cSJim Jagielski 				case DFF_msofbtAnimateTargetElement:
2933*b1cdbd2cSJim Jagielski 				{
2934*b1cdbd2cSJim Jagielski 					sal_Int16 nSubType;
2935*b1cdbd2cSJim Jagielski 					importTargetElementContainer( pChildAtom, aEvent.Source, nSubType );
2936*b1cdbd2cSJim Jagielski 				}
2937*b1cdbd2cSJim Jagielski 				break;
2938*b1cdbd2cSJim Jagielski 				default:
2939*b1cdbd2cSJim Jagielski 				{
2940*b1cdbd2cSJim Jagielski 					DBG_ERROR("unknown atom inside ppt::AnimationImporter::importAnimationEvents()!");
2941*b1cdbd2cSJim Jagielski 				}
2942*b1cdbd2cSJim Jagielski 				}
2943*b1cdbd2cSJim Jagielski 
2944*b1cdbd2cSJim Jagielski 				pChildAtom = pEventAtom->findNextChildAtom( pChildAtom );
2945*b1cdbd2cSJim Jagielski 			}
2946*b1cdbd2cSJim Jagielski 
2947*b1cdbd2cSJim Jagielski 			*pEvents = addToSequence( *pEvents, (aEvent.Trigger == EventTrigger::NONE) ? aEvent.Offset : makeAny( aEvent ) );
2948*b1cdbd2cSJim Jagielski 		}
2949*b1cdbd2cSJim Jagielski 
2950*b1cdbd2cSJim Jagielski 		pEventAtom = pAtom->findNextChildAtom( DFF_msofbtAnimEvent, pEventAtom );
2951*b1cdbd2cSJim Jagielski 	}
2952*b1cdbd2cSJim Jagielski 
2953*b1cdbd2cSJim Jagielski 	xNode->setBegin( aBegin );
2954*b1cdbd2cSJim Jagielski 	xNode->setEnd( aEnd );
2955*b1cdbd2cSJim Jagielski 	// TODO: xNode->setNext( aNext );
2956*b1cdbd2cSJim Jagielski 	// TODO: xNode->setPrev( aNext );
2957*b1cdbd2cSJim Jagielski 
2958*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
2959*b1cdbd2cSJim Jagielski 	if( aBegin.hasValue() )
2960*b1cdbd2cSJim Jagielski 	{
2961*b1cdbd2cSJim Jagielski 		dump( " begin=\"" );
2962*b1cdbd2cSJim Jagielski 		dump( aBegin );
2963*b1cdbd2cSJim Jagielski 		dump( "\"" );
2964*b1cdbd2cSJim Jagielski 	}
2965*b1cdbd2cSJim Jagielski 
2966*b1cdbd2cSJim Jagielski 	if( aEnd.hasValue() )
2967*b1cdbd2cSJim Jagielski 	{
2968*b1cdbd2cSJim Jagielski 		dump( " end=\"" );
2969*b1cdbd2cSJim Jagielski 		dump( aEnd );
2970*b1cdbd2cSJim Jagielski 		dump( "\"" );
2971*b1cdbd2cSJim Jagielski 	}
2972*b1cdbd2cSJim Jagielski 
2973*b1cdbd2cSJim Jagielski 	if( aNext.hasValue() )
2974*b1cdbd2cSJim Jagielski 	{
2975*b1cdbd2cSJim Jagielski 		dump( " next=\"" );
2976*b1cdbd2cSJim Jagielski 		dump( aNext );
2977*b1cdbd2cSJim Jagielski 		dump( "\"" );
2978*b1cdbd2cSJim Jagielski 	}
2979*b1cdbd2cSJim Jagielski 
2980*b1cdbd2cSJim Jagielski 	if( aPrev.hasValue() )
2981*b1cdbd2cSJim Jagielski 	{
2982*b1cdbd2cSJim Jagielski 		dump( " prev=\"" );
2983*b1cdbd2cSJim Jagielski 		dump( aPrev );
2984*b1cdbd2cSJim Jagielski 		dump( "\"" );
2985*b1cdbd2cSJim Jagielski 	}
2986*b1cdbd2cSJim Jagielski #endif
2987*b1cdbd2cSJim Jagielski }
2988*b1cdbd2cSJim Jagielski 
2989*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
2990*b1cdbd2cSJim Jagielski 
importAnimationActions(const Atom * pAtom,const Reference<XAnimationNode> & xNode)2991*b1cdbd2cSJim Jagielski void AnimationImporter::importAnimationActions( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
2992*b1cdbd2cSJim Jagielski {
2993*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationActions()!");
2994*b1cdbd2cSJim Jagielski 
2995*b1cdbd2cSJim Jagielski 	if( pAtom )
2996*b1cdbd2cSJim Jagielski 	{
2997*b1cdbd2cSJim Jagielski 		const Atom* pActionAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAction );
2998*b1cdbd2cSJim Jagielski 
2999*b1cdbd2cSJim Jagielski 		if( pActionAtom && pActionAtom->seekToContent() )
3000*b1cdbd2cSJim Jagielski 		{
3001*b1cdbd2cSJim Jagielski 			sal_Int32 nConcurrent, nNextAction, nEndSync, nU4, nU5;
3002*b1cdbd2cSJim Jagielski 			mrStCtrl >> nConcurrent;
3003*b1cdbd2cSJim Jagielski 			mrStCtrl >> nNextAction;
3004*b1cdbd2cSJim Jagielski 			mrStCtrl >> nEndSync;
3005*b1cdbd2cSJim Jagielski 			mrStCtrl >> nU4;
3006*b1cdbd2cSJim Jagielski 			mrStCtrl >> nU5;
3007*b1cdbd2cSJim Jagielski 
3008*b1cdbd2cSJim Jagielski 			if( nEndSync == 1 )
3009*b1cdbd2cSJim Jagielski 				xNode->setEndSync( makeAny( AnimationEndSync::ALL ) );
3010*b1cdbd2cSJim Jagielski 
3011*b1cdbd2cSJim Jagielski 	#ifdef DBG_ANIM_LOG
3012*b1cdbd2cSJim Jagielski 			dump( " concurrent=\"%s\"", nConcurrent == 0 ? "disabled" : (nConcurrent == 1 ? "enabled" : "unknown") );
3013*b1cdbd2cSJim Jagielski 
3014*b1cdbd2cSJim Jagielski 			dump( " nextAction=\"%s\"", nNextAction == 0 ? "none" : (nNextAction == 1 ? "seek" : "unknown") );
3015*b1cdbd2cSJim Jagielski 
3016*b1cdbd2cSJim Jagielski 			if( nEndSync != 0 )
3017*b1cdbd2cSJim Jagielski 			{
3018*b1cdbd2cSJim Jagielski 				dump( " endSync=\"%s\"", nEndSync == 1 ? "all" : "unknown" );
3019*b1cdbd2cSJim Jagielski 			}
3020*b1cdbd2cSJim Jagielski 
3021*b1cdbd2cSJim Jagielski 			dump( " action_4=\"%#lx\"", nU4 );
3022*b1cdbd2cSJim Jagielski 			dump( " action_5=\"%#lx\"", nU5 );
3023*b1cdbd2cSJim Jagielski 	#endif
3024*b1cdbd2cSJim Jagielski 		}
3025*b1cdbd2cSJim Jagielski 	}
3026*b1cdbd2cSJim Jagielski }
3027*b1cdbd2cSJim Jagielski 
3028*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
3029*b1cdbd2cSJim Jagielski 
importTargetElementContainer(const Atom * pAtom,Any & rTarget,sal_Int16 & rSubType)3030*b1cdbd2cSJim Jagielski sal_Int32 AnimationImporter::importTargetElementContainer( const Atom* pAtom, Any& rTarget, sal_Int16& rSubType )
3031*b1cdbd2cSJim Jagielski {
3032*b1cdbd2cSJim Jagielski 	rSubType = ShapeAnimationSubType::AS_WHOLE;
3033*b1cdbd2cSJim Jagielski 	sal_Int32 nRefMode = -1;
3034*b1cdbd2cSJim Jagielski 
3035*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateTargetElement), "invalid call to ppt::AnimationImporter::importTargetElementContainer()!" );
3036*b1cdbd2cSJim Jagielski 	if( pAtom )
3037*b1cdbd2cSJim Jagielski 	{
3038*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
3039*b1cdbd2cSJim Jagielski 		while( pChildAtom && pChildAtom->seekToContent() )
3040*b1cdbd2cSJim Jagielski 		{
3041*b1cdbd2cSJim Jagielski 			switch( pChildAtom->getType() )
3042*b1cdbd2cSJim Jagielski 			{
3043*b1cdbd2cSJim Jagielski 			case DFF_msofbtAnimReference:
3044*b1cdbd2cSJim Jagielski 			{
3045*b1cdbd2cSJim Jagielski 				sal_Int32 nRefType,nRefId;
3046*b1cdbd2cSJim Jagielski 				sal_Int32 begin,end;
3047*b1cdbd2cSJim Jagielski 				mrStCtrl >> nRefMode;
3048*b1cdbd2cSJim Jagielski 				mrStCtrl >> nRefType;
3049*b1cdbd2cSJim Jagielski 				mrStCtrl >> nRefId;
3050*b1cdbd2cSJim Jagielski 				mrStCtrl >> begin;
3051*b1cdbd2cSJim Jagielski 				mrStCtrl >> end;
3052*b1cdbd2cSJim Jagielski 
3053*b1cdbd2cSJim Jagielski 				switch( nRefType )
3054*b1cdbd2cSJim Jagielski 				{
3055*b1cdbd2cSJim Jagielski 				case 1: // shape
3056*b1cdbd2cSJim Jagielski 				{
3057*b1cdbd2cSJim Jagielski 					SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId );
3058*b1cdbd2cSJim Jagielski 					if( pSdrObject == NULL )
3059*b1cdbd2cSJim Jagielski 						break;
3060*b1cdbd2cSJim Jagielski 
3061*b1cdbd2cSJim Jagielski 					rTarget <<= pSdrObject->getUnoShape();
3062*b1cdbd2cSJim Jagielski 
3063*b1cdbd2cSJim Jagielski 					switch( nRefMode )
3064*b1cdbd2cSJim Jagielski 					{
3065*b1cdbd2cSJim Jagielski // default			case 0: rSubType = ShapeAnimationSubType::AS_WHOLE; break;
3066*b1cdbd2cSJim Jagielski 					case 6: rSubType = ShapeAnimationSubType::ONLY_BACKGROUND; break;
3067*b1cdbd2cSJim Jagielski 					case 8: rSubType = ShapeAnimationSubType::ONLY_TEXT; break;
3068*b1cdbd2cSJim Jagielski 					case 2: // one paragraph
3069*b1cdbd2cSJim Jagielski 					{
3070*b1cdbd2cSJim Jagielski 						if( ((begin == -1) && (end == -1)) || !pSdrObject->ISA( SdrTextObj )  )
3071*b1cdbd2cSJim Jagielski 							break;
3072*b1cdbd2cSJim Jagielski 
3073*b1cdbd2cSJim Jagielski 						SdrTextObj* pTextObj = static_cast< SdrTextObj* >( pSdrObject );
3074*b1cdbd2cSJim Jagielski 
3075*b1cdbd2cSJim Jagielski 						const OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
3076*b1cdbd2cSJim Jagielski 						if( pOPO == NULL )
3077*b1cdbd2cSJim Jagielski 							break;
3078*b1cdbd2cSJim Jagielski 
3079*b1cdbd2cSJim Jagielski 						const EditTextObject& rEditTextObject = pOPO->GetTextObject();
3080*b1cdbd2cSJim Jagielski 
3081*b1cdbd2cSJim Jagielski 						const sal_uInt16 nParaCount = rEditTextObject.GetParagraphCount();
3082*b1cdbd2cSJim Jagielski 
3083*b1cdbd2cSJim Jagielski 						sal_uInt16 nPara = 0;
3084*b1cdbd2cSJim Jagielski 
3085*b1cdbd2cSJim Jagielski 						while( (nPara < nParaCount) && (begin > 0) )
3086*b1cdbd2cSJim Jagielski 						{
3087*b1cdbd2cSJim Jagielski 							sal_Int32 nParaLength = rEditTextObject.GetText( nPara ).Len() + 1;
3088*b1cdbd2cSJim Jagielski 							begin -= nParaLength;
3089*b1cdbd2cSJim Jagielski 							end -= nParaLength;
3090*b1cdbd2cSJim Jagielski 							nPara++;
3091*b1cdbd2cSJim Jagielski 						}
3092*b1cdbd2cSJim Jagielski 
3093*b1cdbd2cSJim Jagielski 						if( nPara < nParaCount )
3094*b1cdbd2cSJim Jagielski 						{
3095*b1cdbd2cSJim Jagielski 							ParagraphTarget aParaTarget;
3096*b1cdbd2cSJim Jagielski 							rTarget >>= aParaTarget.Shape;
3097*b1cdbd2cSJim Jagielski 							aParaTarget.Paragraph = nPara;
3098*b1cdbd2cSJim Jagielski 							rTarget = makeAny( aParaTarget );
3099*b1cdbd2cSJim Jagielski 
3100*b1cdbd2cSJim Jagielski 							rSubType = ShapeAnimationSubType::ONLY_TEXT;
3101*b1cdbd2cSJim Jagielski 							dump( " paragraph %d,", (sal_Int32)nPara);
3102*b1cdbd2cSJim Jagielski 							dump( " %d characters", (sal_Int32)end );
3103*b1cdbd2cSJim Jagielski 						}
3104*b1cdbd2cSJim Jagielski 					}
3105*b1cdbd2cSJim Jagielski 					}
3106*b1cdbd2cSJim Jagielski 				}
3107*b1cdbd2cSJim Jagielski 				break;
3108*b1cdbd2cSJim Jagielski 
3109*b1cdbd2cSJim Jagielski 				case 2: // sound
3110*b1cdbd2cSJim Jagielski 					{
3111*b1cdbd2cSJim Jagielski 						OUString aSoundURL( ((ImplSdPPTImport*)mpPPTImport)->ReadSound( nRefId ) );
3112*b1cdbd2cSJim Jagielski 						rTarget <<= aSoundURL;
3113*b1cdbd2cSJim Jagielski 						dump( " srcRef=\"%s\"", aSoundURL );
3114*b1cdbd2cSJim Jagielski 					}
3115*b1cdbd2cSJim Jagielski 					break;
3116*b1cdbd2cSJim Jagielski 				case 3: // audio object
3117*b1cdbd2cSJim Jagielski 				case 4: // video object
3118*b1cdbd2cSJim Jagielski 					{
3119*b1cdbd2cSJim Jagielski 						SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId );
3120*b1cdbd2cSJim Jagielski 						if( pSdrObject == NULL )
3121*b1cdbd2cSJim Jagielski 							break;
3122*b1cdbd2cSJim Jagielski 
3123*b1cdbd2cSJim Jagielski 						rTarget <<= pSdrObject->getUnoShape();
3124*b1cdbd2cSJim Jagielski 					}
3125*b1cdbd2cSJim Jagielski 					break;
3126*b1cdbd2cSJim Jagielski 				default:
3127*b1cdbd2cSJim Jagielski 					DBG_ERROR("unknown reference type");
3128*b1cdbd2cSJim Jagielski 				}
3129*b1cdbd2cSJim Jagielski 
3130*b1cdbd2cSJim Jagielski 
3131*b1cdbd2cSJim Jagielski //				dump( " ref=\"%s\"", nRefMode == 3 ? "source" : ( nRefMode == 0 ? "target" : "unknown" ) );
3132*b1cdbd2cSJim Jagielski //				dump( " type=\"%s\"", nRefType == 1 ? "shape" : ( nRefType == 2 ? "sound": "unknown" ) );
3133*b1cdbd2cSJim Jagielski //				dump( " id=\"%lu\"", (sal_Int32)nRefId );
3134*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
3135*b1cdbd2cSJim Jagielski 				if((begin != -1) || (end != -1) )
3136*b1cdbd2cSJim Jagielski 				{
3137*b1cdbd2cSJim Jagielski //					dump( " text_begin=\"%ld\"", begin );
3138*b1cdbd2cSJim Jagielski //					dump( " text_end=\"%ld\"", end );
3139*b1cdbd2cSJim Jagielski 				}
3140*b1cdbd2cSJim Jagielski #endif
3141*b1cdbd2cSJim Jagielski 			}
3142*b1cdbd2cSJim Jagielski 			break;
3143*b1cdbd2cSJim Jagielski 			case 0x2b01:
3144*b1cdbd2cSJim Jagielski 			{
3145*b1cdbd2cSJim Jagielski 				sal_Int32 nU1;
3146*b1cdbd2cSJim Jagielski 				mrStCtrl >> nU1;
3147*b1cdbd2cSJim Jagielski 
3148*b1cdbd2cSJim Jagielski 				// HINT: nU1 == 1 : target document. ?
3149*b1cdbd2cSJim Jagielski //				dump( " unknown_0x2b01=\"%#lx\"", nU1 );
3150*b1cdbd2cSJim Jagielski 			}
3151*b1cdbd2cSJim Jagielski 			break;
3152*b1cdbd2cSJim Jagielski 			default:
3153*b1cdbd2cSJim Jagielski 				DBG_ERROR("unknwon atom inside ppt::AnimationImporter::importTargetElementContainer()!");
3154*b1cdbd2cSJim Jagielski 				break;
3155*b1cdbd2cSJim Jagielski 			}
3156*b1cdbd2cSJim Jagielski 
3157*b1cdbd2cSJim Jagielski 		pChildAtom = pAtom->findNextChildAtom( pChildAtom );
3158*b1cdbd2cSJim Jagielski 
3159*b1cdbd2cSJim Jagielski 		}
3160*b1cdbd2cSJim Jagielski 	}
3161*b1cdbd2cSJim Jagielski 
3162*b1cdbd2cSJim Jagielski 	return nRefMode;
3163*b1cdbd2cSJim Jagielski }
3164*b1cdbd2cSJim Jagielski 
3165*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
3166*b1cdbd2cSJim Jagielski 
importPropertySetContainer(const Atom * pAtom,PropertySet & rSet)3167*b1cdbd2cSJim Jagielski void AnimationImporter::importPropertySetContainer( const Atom* pAtom, PropertySet& rSet )
3168*b1cdbd2cSJim Jagielski {
3169*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimPropertySet), "invalid call to ppt::AnimationImporter::importPropertySetContainer()!" );
3170*b1cdbd2cSJim Jagielski 
3171*b1cdbd2cSJim Jagielski 	if( pAtom )
3172*b1cdbd2cSJim Jagielski 	{
3173*b1cdbd2cSJim Jagielski 		const Atom* pChildAtom = pAtom->findFirstChildAtom();
3174*b1cdbd2cSJim Jagielski 		while( pChildAtom )
3175*b1cdbd2cSJim Jagielski 		{
3176*b1cdbd2cSJim Jagielski 			if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue )
3177*b1cdbd2cSJim Jagielski 			{
3178*b1cdbd2cSJim Jagielski 				Any aAny;
3179*b1cdbd2cSJim Jagielski 				importAttributeValue( pChildAtom, aAny );
3180*b1cdbd2cSJim Jagielski 				rSet.maProperties[ pChildAtom->getInstance() ] = aAny;
3181*b1cdbd2cSJim Jagielski 			}
3182*b1cdbd2cSJim Jagielski 			else
3183*b1cdbd2cSJim Jagielski 			{
3184*b1cdbd2cSJim Jagielski 				DBG_ERROR("unknwon atom inside ppt::AnimationImporter::importPropertySetContainer()!");
3185*b1cdbd2cSJim Jagielski 			}
3186*b1cdbd2cSJim Jagielski 
3187*b1cdbd2cSJim Jagielski 			pChildAtom = pAtom->findNextChildAtom( pChildAtom );
3188*b1cdbd2cSJim Jagielski 		}
3189*b1cdbd2cSJim Jagielski 	}
3190*b1cdbd2cSJim Jagielski }
3191*b1cdbd2cSJim Jagielski 
3192*b1cdbd2cSJim Jagielski // ====================================================================
3193*b1cdbd2cSJim Jagielski 
3194*b1cdbd2cSJim Jagielski #ifdef DBG_ANIM_LOG
dump_atom_header(const Atom * pAtom,bool bOpen,bool bAppend)3195*b1cdbd2cSJim Jagielski void AnimationImporter::dump_atom_header( const Atom* pAtom, bool bOpen, bool bAppend )
3196*b1cdbd2cSJim Jagielski {
3197*b1cdbd2cSJim Jagielski 	if( pAtom )
3198*b1cdbd2cSJim Jagielski 	{
3199*b1cdbd2cSJim Jagielski 		const char* pTitle;
3200*b1cdbd2cSJim Jagielski 
3201*b1cdbd2cSJim Jagielski 		bool bUnknown = false;
3202*b1cdbd2cSJim Jagielski 
3203*b1cdbd2cSJim Jagielski 		switch( pAtom->getType() )
3204*b1cdbd2cSJim Jagielski 		{
3205*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimEvent: pTitle = "AnimEvent"; break;
3206*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimTrigger: pTitle = "AnimTrigger"; break;
3207*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateMotion:	pTitle = "AnimateMotion"; break;
3208*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimPropertySet: pTitle = "AnimPropertySet"; break;
3209*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateAttributeNames: pTitle = "AnimAttributeName"; break;
3210*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimAttributeValue: pTitle = "AnimAttributeValue"; break;
3211*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimGroup: pTitle = "AnimGroup"; break;
3212*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimNode: pTitle = "AnimNode"; break;
3213*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimValue: pTitle = "AnimValue"; break;
3214*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateFilter: pTitle = "animateFilter"; break;
3215*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimate: pTitle = "animate"; break;
3216*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateSet: pTitle = "set"; break;
3217*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimKeyTime: pTitle = "AnimKeyTime"; break;
3218*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimKeyPoints: pTitle = "AnimKeyPoints"; break;
3219*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimReference: pTitle = "AnimReference"; break;
3220*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateTargetElement: pTitle = "AnimTargetElementContainer"; break;
3221*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimAction: pTitle = "AnimAction"; break;
3222*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimCommand: pTitle = "AnimCommand"; break;
3223*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateTarget: pTitle = "TransformationTarget"; break;
3224*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateTargetSettings: pTitle = "TransformationTargetSettings"; break;
3225*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimIteration: pTitle = "iterate"; break;
3226*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateColorData: pTitle = "colorData"; break;
3227*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateScaleData: pTitle = "scaleData"; break;
3228*b1cdbd2cSJim Jagielski 		case DFF_msofbtAnimateSetData: pTitle = "setData"; break;
3229*b1cdbd2cSJim Jagielski 
3230*b1cdbd2cSJim Jagielski 		default:
3231*b1cdbd2cSJim Jagielski 			{
3232*b1cdbd2cSJim Jagielski 				static char buffer[128];
3233*b1cdbd2cSJim Jagielski 				sprintf( buffer, "unknown_%#x", pAtom->getType() );
3234*b1cdbd2cSJim Jagielski 				pTitle = buffer;
3235*b1cdbd2cSJim Jagielski 			}
3236*b1cdbd2cSJim Jagielski 		}
3237*b1cdbd2cSJim Jagielski 
3238*b1cdbd2cSJim Jagielski 		if( bOpen )
3239*b1cdbd2cSJim Jagielski 		{
3240*b1cdbd2cSJim Jagielski 			fprintf(mpFile, "<%s", pTitle );
3241*b1cdbd2cSJim Jagielski 
3242*b1cdbd2cSJim Jagielski 			fprintf(mpFile, " instance=\"%hu\"%s",
3243*b1cdbd2cSJim Jagielski 						pAtom->getInstance(),
3244*b1cdbd2cSJim Jagielski 						bAppend ? "" : ">\n");
3245*b1cdbd2cSJim Jagielski 		}
3246*b1cdbd2cSJim Jagielski 		else
3247*b1cdbd2cSJim Jagielski 		{
3248*b1cdbd2cSJim Jagielski 			if( bAppend )
3249*b1cdbd2cSJim Jagielski 				fprintf(mpFile,"/>\n");
3250*b1cdbd2cSJim Jagielski 			else
3251*b1cdbd2cSJim Jagielski 				fprintf(mpFile, "</%s>\n", pTitle );
3252*b1cdbd2cSJim Jagielski 		}
3253*b1cdbd2cSJim Jagielski 	}
3254*b1cdbd2cSJim Jagielski }
3255*b1cdbd2cSJim Jagielski 
3256*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
3257*b1cdbd2cSJim Jagielski 
dump(sal_uInt32 nLen,bool bNewLine)3258*b1cdbd2cSJim Jagielski void AnimationImporter::dump( sal_uInt32 nLen, bool bNewLine )
3259*b1cdbd2cSJim Jagielski {
3260*b1cdbd2cSJim Jagielski 	char * faul = "0123456789abcdef";
3261*b1cdbd2cSJim Jagielski 
3262*b1cdbd2cSJim Jagielski 	sal_uInt32 i = 0;
3263*b1cdbd2cSJim Jagielski 	int b = 0;
3264*b1cdbd2cSJim Jagielski 	sal_Int8 nData;
3265*b1cdbd2cSJim Jagielski 
3266*b1cdbd2cSJim Jagielski 	for( i = 0; i < nLen; i++ )
3267*b1cdbd2cSJim Jagielski 	{
3268*b1cdbd2cSJim Jagielski 		mrStCtrl >> nData;
3269*b1cdbd2cSJim Jagielski 
3270*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%c%c ", faul[ (nData >> 4) & 0x0f ], faul[ nData & 0x0f ] );
3271*b1cdbd2cSJim Jagielski 
3272*b1cdbd2cSJim Jagielski 		b++;
3273*b1cdbd2cSJim Jagielski 		if( bNewLine && (b == 32) )
3274*b1cdbd2cSJim Jagielski 		{
3275*b1cdbd2cSJim Jagielski 			fprintf(mpFile,"\n");
3276*b1cdbd2cSJim Jagielski 			b = 0;
3277*b1cdbd2cSJim Jagielski 		}
3278*b1cdbd2cSJim Jagielski 	}
3279*b1cdbd2cSJim Jagielski 	if( (b != 0) && bNewLine )
3280*b1cdbd2cSJim Jagielski 		fprintf(mpFile,"\n");
3281*b1cdbd2cSJim Jagielski }
3282*b1cdbd2cSJim Jagielski 
3283*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
3284*b1cdbd2cSJim Jagielski 
dump_atom(const Atom * pAtom,bool bNewLine)3285*b1cdbd2cSJim Jagielski void AnimationImporter::dump_atom( const Atom* pAtom, bool bNewLine )
3286*b1cdbd2cSJim Jagielski {
3287*b1cdbd2cSJim Jagielski 	if( pAtom )
3288*b1cdbd2cSJim Jagielski 	{
3289*b1cdbd2cSJim Jagielski 		if( pAtom->isContainer() )
3290*b1cdbd2cSJim Jagielski 		{
3291*b1cdbd2cSJim Jagielski 			const Atom* pChildAtom = pAtom->findFirstChildAtom();
3292*b1cdbd2cSJim Jagielski 			while( pChildAtom )
3293*b1cdbd2cSJim Jagielski 			{
3294*b1cdbd2cSJim Jagielski 				if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue )
3295*b1cdbd2cSJim Jagielski 				{
3296*b1cdbd2cSJim Jagielski 					fprintf(mpFile, "<attributeValue instance=\"%hu\"", pChildAtom->getInstance() );
3297*b1cdbd2cSJim Jagielski 
3298*b1cdbd2cSJim Jagielski 					Any aValue;
3299*b1cdbd2cSJim Jagielski 					if( importAttributeValue( pChildAtom, aValue ) )
3300*b1cdbd2cSJim Jagielski 					{
3301*b1cdbd2cSJim Jagielski 						sal_Int32 nInt;
3302*b1cdbd2cSJim Jagielski 						rtl::OUString aString;
3303*b1cdbd2cSJim Jagielski 						double fDouble;
3304*b1cdbd2cSJim Jagielski 
3305*b1cdbd2cSJim Jagielski 						if( aValue >>= nInt )
3306*b1cdbd2cSJim Jagielski 						{
3307*b1cdbd2cSJim Jagielski 							fprintf(mpFile, " value=\"%ld\"", nInt );
3308*b1cdbd2cSJim Jagielski 						}
3309*b1cdbd2cSJim Jagielski 						else if( aValue >>= aString )
3310*b1cdbd2cSJim Jagielski 						{
3311*b1cdbd2cSJim Jagielski                             UniString aTmp( aString );
3312*b1cdbd2cSJim Jagielski 							ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3313*b1cdbd2cSJim Jagielski 							fprintf(mpFile, " value=\"%s\"", aStr.GetBuffer() );
3314*b1cdbd2cSJim Jagielski 						}
3315*b1cdbd2cSJim Jagielski 						else if( aValue >>= fDouble )
3316*b1cdbd2cSJim Jagielski 						{
3317*b1cdbd2cSJim Jagielski 							fprintf(mpFile, " value=\"%g\"", fDouble );
3318*b1cdbd2cSJim Jagielski 						}
3319*b1cdbd2cSJim Jagielski 					}
3320*b1cdbd2cSJim Jagielski 					else
3321*b1cdbd2cSJim Jagielski 					{
3322*b1cdbd2cSJim Jagielski 						if( pChildAtom->seekToContent() )
3323*b1cdbd2cSJim Jagielski 						{
3324*b1cdbd2cSJim Jagielski 							fprintf(mpFile, " value=\""  );
3325*b1cdbd2cSJim Jagielski 							dump_atom( pChildAtom, false );
3326*b1cdbd2cSJim Jagielski 							fprintf(mpFile, "\"");
3327*b1cdbd2cSJim Jagielski 						}
3328*b1cdbd2cSJim Jagielski 					}
3329*b1cdbd2cSJim Jagielski 
3330*b1cdbd2cSJim Jagielski 					fprintf(mpFile, "/>\n" );
3331*b1cdbd2cSJim Jagielski 				}
3332*b1cdbd2cSJim Jagielski 				else
3333*b1cdbd2cSJim Jagielski 				{
3334*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, true, pChildAtom->getType() == DFF_msofbtAnimAttributeValue );
3335*b1cdbd2cSJim Jagielski 					dump_atom( pChildAtom );
3336*b1cdbd2cSJim Jagielski 					dump_atom_header( pChildAtom, false, pChildAtom->getType() == DFF_msofbtAnimAttributeValue );
3337*b1cdbd2cSJim Jagielski 				}
3338*b1cdbd2cSJim Jagielski 
3339*b1cdbd2cSJim Jagielski 				pChildAtom = pAtom->findNextChildAtom(pChildAtom);
3340*b1cdbd2cSJim Jagielski 			}
3341*b1cdbd2cSJim Jagielski 		}
3342*b1cdbd2cSJim Jagielski 		else if( pAtom->seekToContent() )
3343*b1cdbd2cSJim Jagielski 		{
3344*b1cdbd2cSJim Jagielski 			dump( pAtom->getLength(), bNewLine );
3345*b1cdbd2cSJim Jagielski 		}
3346*b1cdbd2cSJim Jagielski 	}
3347*b1cdbd2cSJim Jagielski }
3348*b1cdbd2cSJim Jagielski 
3349*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
3350*b1cdbd2cSJim Jagielski 
dump_anim_group(const Atom * pAtom,const AnimationNode & rNode,const PropertySet & rSet,bool bOpen)3351*b1cdbd2cSJim Jagielski void AnimationImporter::dump_anim_group( const Atom* pAtom, const AnimationNode& rNode, const PropertySet& rSet, bool bOpen )
3352*b1cdbd2cSJim Jagielski {
3353*b1cdbd2cSJim Jagielski 	fprintf( mpFile, bOpen ? "<" : "</" );
3354*b1cdbd2cSJim Jagielski 
3355*b1cdbd2cSJim Jagielski 	switch( rNode.mnGroupType )
3356*b1cdbd2cSJim Jagielski 	{
3357*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_PAR:
3358*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "par" );
3359*b1cdbd2cSJim Jagielski 		break;
3360*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_SEQ:
3361*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "seq" );
3362*b1cdbd2cSJim Jagielski 		break;
3363*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_NODE:
3364*b1cdbd2cSJim Jagielski 		switch( rNode.mnNodeType )
3365*b1cdbd2cSJim Jagielski 		{
3366*b1cdbd2cSJim Jagielski 		case mso_Anim_Behaviour_FILTER:
3367*b1cdbd2cSJim Jagielski 			fprintf( mpFile, "animateFilter" );
3368*b1cdbd2cSJim Jagielski 			break;
3369*b1cdbd2cSJim Jagielski 		case mso_Anim_Behaviour_ANIMATION:
3370*b1cdbd2cSJim Jagielski 			if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
3371*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "set" );
3372*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
3373*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "animateColor" );
3374*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
3375*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "animateScale" );
3376*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
3377*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "animateRotation" );
3378*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
3379*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "animateMotion" );
3380*b1cdbd2cSJim Jagielski 			else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
3381*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "command" );
3382*b1cdbd2cSJim Jagielski 			else
3383*b1cdbd2cSJim Jagielski                 fprintf( mpFile, "animation" );
3384*b1cdbd2cSJim Jagielski 			break;
3385*b1cdbd2cSJim Jagielski 		default:
3386*b1cdbd2cSJim Jagielski 			{
3387*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "unknown_node_%#lx", rNode.mnNodeType );
3388*b1cdbd2cSJim Jagielski 			}
3389*b1cdbd2cSJim Jagielski 			break;
3390*b1cdbd2cSJim Jagielski 		}
3391*b1cdbd2cSJim Jagielski 		break;
3392*b1cdbd2cSJim Jagielski 	case mso_Anim_GroupType_MEDIA:
3393*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "media" );
3394*b1cdbd2cSJim Jagielski 		break;
3395*b1cdbd2cSJim Jagielski 	default:
3396*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "unknown_group_%#lx", rNode.mnGroupType );
3397*b1cdbd2cSJim Jagielski 		break;
3398*b1cdbd2cSJim Jagielski 	}
3399*b1cdbd2cSJim Jagielski 
3400*b1cdbd2cSJim Jagielski 	if( bOpen )
3401*b1cdbd2cSJim Jagielski 	{
3402*b1cdbd2cSJim Jagielski 		dump( rNode );
3403*b1cdbd2cSJim Jagielski 		dump( rSet );
3404*b1cdbd2cSJim Jagielski 	}
3405*b1cdbd2cSJim Jagielski 
3406*b1cdbd2cSJim Jagielski 	fprintf(mpFile,">\n");
3407*b1cdbd2cSJim Jagielski }
3408*b1cdbd2cSJim Jagielski 
dump(const AnimationNode & rNode)3409*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const AnimationNode& rNode )
3410*b1cdbd2cSJim Jagielski {
3411*b1cdbd2cSJim Jagielski 	// dump animation node
3412*b1cdbd2cSJim Jagielski 	if( rNode.mnRestart != 0 )
3413*b1cdbd2cSJim Jagielski 	{
3414*b1cdbd2cSJim Jagielski 		fprintf(mpFile," restart=\"%s\"",
3415*b1cdbd2cSJim Jagielski 			rNode.mnRestart == 1 ? "always" : (rNode.mnRestart == 2 ? "whenOff" : (rNode.mnRestart == 3 ? "never" : "unknown")) );
3416*b1cdbd2cSJim Jagielski 	}
3417*b1cdbd2cSJim Jagielski 
3418*b1cdbd2cSJim Jagielski 	if( rNode.mnFill )
3419*b1cdbd2cSJim Jagielski 	{
3420*b1cdbd2cSJim Jagielski 		fprintf(mpFile," fill=\"%s\"",
3421*b1cdbd2cSJim Jagielski 			rNode.mnFill == 1 ? "remove" : (rNode.mnFill == 3 ? "hold" : (rNode.mnFill == 2 ? "freeze" : "unknown")) );
3422*b1cdbd2cSJim Jagielski 	}
3423*b1cdbd2cSJim Jagielski 
3424*b1cdbd2cSJim Jagielski 	if( rNode.mnDuration > 0 )
3425*b1cdbd2cSJim Jagielski 	{
3426*b1cdbd2cSJim Jagielski 		double fSeconds = rNode.mnDuration;
3427*b1cdbd2cSJim Jagielski 		fSeconds /= 1000.0;
3428*b1cdbd2cSJim Jagielski 		fprintf(mpFile, " dur=\"%g\"", fSeconds);
3429*b1cdbd2cSJim Jagielski 	}
3430*b1cdbd2cSJim Jagielski 	else if( rNode.mnDuration < 0 )
3431*b1cdbd2cSJim Jagielski 	{
3432*b1cdbd2cSJim Jagielski 		fprintf(mpFile, " dur=\"indefinite\"" );
3433*b1cdbd2cSJim Jagielski 	}
3434*b1cdbd2cSJim Jagielski 
3435*b1cdbd2cSJim Jagielski 	if( rNode.mnU1 ) fprintf(mpFile," u1=\"%#lx\"", rNode.mnU1);
3436*b1cdbd2cSJim Jagielski 	if( rNode.mnU3 ) fprintf(mpFile," u3=\"%#lx\"", rNode.mnU3);
3437*b1cdbd2cSJim Jagielski 	if( rNode.mnU4 ) fprintf(mpFile," u4=\"%#lx\"", rNode.mnU4);
3438*b1cdbd2cSJim Jagielski }
3439*b1cdbd2cSJim Jagielski 
dump(Any & rAny)3440*b1cdbd2cSJim Jagielski void AnimationImporter::dump( Any& rAny )
3441*b1cdbd2cSJim Jagielski {
3442*b1cdbd2cSJim Jagielski 	Sequence< Any > aSeq;
3443*b1cdbd2cSJim Jagielski 	sal_Int32 nInt;
3444*b1cdbd2cSJim Jagielski 	double fDouble;
3445*b1cdbd2cSJim Jagielski 	OUString aString;
3446*b1cdbd2cSJim Jagielski 	sal_Bool bBool;
3447*b1cdbd2cSJim Jagielski 	Event aEvent;
3448*b1cdbd2cSJim Jagielski 	Timing aTiming;
3449*b1cdbd2cSJim Jagielski 
3450*b1cdbd2cSJim Jagielski 	if( rAny >>= aSeq )
3451*b1cdbd2cSJim Jagielski 	{
3452*b1cdbd2cSJim Jagielski 		const sal_Int32 nSize = aSeq.getLength();
3453*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex = 0;
3454*b1cdbd2cSJim Jagielski 		while( nIndex < nSize )
3455*b1cdbd2cSJim Jagielski 		{
3456*b1cdbd2cSJim Jagielski 			dump( aSeq[nIndex++] );
3457*b1cdbd2cSJim Jagielski 			if(nIndex < nSize)
3458*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "," );
3459*b1cdbd2cSJim Jagielski 		}
3460*b1cdbd2cSJim Jagielski 	}
3461*b1cdbd2cSJim Jagielski 	else if( rAny >>= aString )
3462*b1cdbd2cSJim Jagielski 	{
3463*b1cdbd2cSJim Jagielski         UniString aTmp(aString);
3464*b1cdbd2cSJim Jagielski 		ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3465*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%s", aStr.GetBuffer() );
3466*b1cdbd2cSJim Jagielski 	}
3467*b1cdbd2cSJim Jagielski 	else if( rAny >>= nInt )
3468*b1cdbd2cSJim Jagielski 	{
3469*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%ld", nInt );
3470*b1cdbd2cSJim Jagielski 	}
3471*b1cdbd2cSJim Jagielski 	else if( rAny >>= bBool )
3472*b1cdbd2cSJim Jagielski 	{
3473*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%s", bBool ? "true" : "false" );
3474*b1cdbd2cSJim Jagielski 	}
3475*b1cdbd2cSJim Jagielski 	else if( rAny >>= fDouble )
3476*b1cdbd2cSJim Jagielski 	{
3477*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%g", fDouble );
3478*b1cdbd2cSJim Jagielski 	}
3479*b1cdbd2cSJim Jagielski 	else if( rAny >>= aTiming )
3480*b1cdbd2cSJim Jagielski 	{
3481*b1cdbd2cSJim Jagielski 		fprintf( mpFile, "%s", aTiming == (Timing_INDEFINITE) ? "indefinite" : "media" );
3482*b1cdbd2cSJim Jagielski 	}
3483*b1cdbd2cSJim Jagielski 	else if( rAny >>= aEvent )
3484*b1cdbd2cSJim Jagielski 	{
3485*b1cdbd2cSJim Jagielski 		static const char* triggers[] =
3486*b1cdbd2cSJim Jagielski 		{
3487*b1cdbd2cSJim Jagielski 			"none","onbegin","onend","begin",
3488*b1cdbd2cSJim Jagielski 			"end","onclick","ondoubleclick","onmouseenter",
3489*b1cdbd2cSJim Jagielski 			"onmouseleave","onpptnext","onpptprev","onstopaudio"
3490*b1cdbd2cSJim Jagielski 		};
3491*b1cdbd2cSJim Jagielski 
3492*b1cdbd2cSJim Jagielski 		if( aEvent.Trigger != EventTrigger::NONE )
3493*b1cdbd2cSJim Jagielski 		{
3494*b1cdbd2cSJim Jagielski 			if( aEvent.Source.hasValue() )
3495*b1cdbd2cSJim Jagielski 			{
3496*b1cdbd2cSJim Jagielski 				dump_target( aEvent.Source );
3497*b1cdbd2cSJim Jagielski 				dump( "." );
3498*b1cdbd2cSJim Jagielski 			}
3499*b1cdbd2cSJim Jagielski 
3500*b1cdbd2cSJim Jagielski 			dump( triggers[ aEvent.Trigger ] );
3501*b1cdbd2cSJim Jagielski 		}
3502*b1cdbd2cSJim Jagielski 
3503*b1cdbd2cSJim Jagielski 		if( aEvent.Offset.hasValue() )
3504*b1cdbd2cSJim Jagielski 		{
3505*b1cdbd2cSJim Jagielski 			double fOffset;
3506*b1cdbd2cSJim Jagielski 			if( aEvent.Offset >>= fOffset )
3507*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "%g", fOffset );
3508*b1cdbd2cSJim Jagielski 			else
3509*b1cdbd2cSJim Jagielski 				dump( "indefinite" );
3510*b1cdbd2cSJim Jagielski 		}
3511*b1cdbd2cSJim Jagielski 	}
3512*b1cdbd2cSJim Jagielski }
3513*b1cdbd2cSJim Jagielski 
dump(const PropertySet & rSet)3514*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const PropertySet& rSet )
3515*b1cdbd2cSJim Jagielski {
3516*b1cdbd2cSJim Jagielski 	// dump property set
3517*b1cdbd2cSJim Jagielski 
3518*b1cdbd2cSJim Jagielski 	map< sal_Int32, Any >::const_iterator aIter( rSet.maProperties.begin() );
3519*b1cdbd2cSJim Jagielski 	const map< sal_Int32, Any >::const_iterator aEnd( rSet.maProperties.end() );
3520*b1cdbd2cSJim Jagielski 	while( aIter != aEnd )
3521*b1cdbd2cSJim Jagielski 	{
3522*b1cdbd2cSJim Jagielski 		bool bKnown = false;
3523*b1cdbd2cSJim Jagielski 
3524*b1cdbd2cSJim Jagielski 		const sal_Int32 nInstance = (*aIter).first;
3525*b1cdbd2cSJim Jagielski 		Any aAny( (*aIter).second );
3526*b1cdbd2cSJim Jagielski 
3527*b1cdbd2cSJim Jagielski 		switch ( nInstance )
3528*b1cdbd2cSJim Jagielski 		{
3529*b1cdbd2cSJim Jagielski 		case DFF_ANIM_COLORSPACE:
3530*b1cdbd2cSJim Jagielski 		{
3531*b1cdbd2cSJim Jagielski 			sal_Int32 nColorSpace;
3532*b1cdbd2cSJim Jagielski 			if( aAny >>= nColorSpace )
3533*b1cdbd2cSJim Jagielski 			{
3534*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " colorSpace=\"%s\"", (nColorSpace == 0) ? "rgb" : (nColorSpace == 1) ? "hsl" : "unknown" );
3535*b1cdbd2cSJim Jagielski 				bKnown = true;
3536*b1cdbd2cSJim Jagielski 			}
3537*b1cdbd2cSJim Jagielski 		}
3538*b1cdbd2cSJim Jagielski 		break;
3539*b1cdbd2cSJim Jagielski 
3540*b1cdbd2cSJim Jagielski 		case DFF_ANIM_DIRECTION:
3541*b1cdbd2cSJim Jagielski //		case DFF_ANIM_MASTERREL:
3542*b1cdbd2cSJim Jagielski 		{
3543*b1cdbd2cSJim Jagielski 			sal_Bool bDirection;
3544*b1cdbd2cSJim Jagielski 			if( aAny >>= bDirection )
3545*b1cdbd2cSJim Jagielski 			{
3546*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " direction=\"%s\"", bDirection ? "cclockwise" : "clockwise"  );
3547*b1cdbd2cSJim Jagielski 				bKnown = true;
3548*b1cdbd2cSJim Jagielski 			}
3549*b1cdbd2cSJim Jagielski 			else
3550*b1cdbd2cSJim Jagielski 			{
3551*b1cdbd2cSJim Jagielski 				sal_Int32 nMasterRel;
3552*b1cdbd2cSJim Jagielski 				if( aAny >>= nMasterRel )
3553*b1cdbd2cSJim Jagielski 				{
3554*b1cdbd2cSJim Jagielski 					fprintf( mpFile, " direction=\"%s\"", nMasterRel == 0 ? "sameClick" : ( nMasterRel == 2 ? "nextClick" : "lastClick" )  );
3555*b1cdbd2cSJim Jagielski 					bKnown = true;
3556*b1cdbd2cSJim Jagielski 				}
3557*b1cdbd2cSJim Jagielski 			}
3558*b1cdbd2cSJim Jagielski 		}
3559*b1cdbd2cSJim Jagielski 		break;
3560*b1cdbd2cSJim Jagielski 
3561*b1cdbd2cSJim Jagielski 		case DFF_ANIM_OVERRIDE:		// TODO
3562*b1cdbd2cSJim Jagielski 		{
3563*b1cdbd2cSJim Jagielski 			sal_Int32 nOverride;
3564*b1cdbd2cSJim Jagielski 			if( aAny >>= nOverride )
3565*b1cdbd2cSJim Jagielski 			{
3566*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " override=\"%s\"", (nOverride == 1) ? "childStyle" : (nOverride == 0) ? "normal" : "unknown" );
3567*b1cdbd2cSJim Jagielski 				bKnown = true;
3568*b1cdbd2cSJim Jagielski 			}
3569*b1cdbd2cSJim Jagielski 		}
3570*b1cdbd2cSJim Jagielski 		break;
3571*b1cdbd2cSJim Jagielski 
3572*b1cdbd2cSJim Jagielski 		case DFF_ANIM_PATH_EDIT_MODE:
3573*b1cdbd2cSJim Jagielski 		{
3574*b1cdbd2cSJim Jagielski 			sal_Bool bPathEditMode;
3575*b1cdbd2cSJim Jagielski 			if( aAny >>= bPathEditMode )
3576*b1cdbd2cSJim Jagielski 			{
3577*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " pptPathEditMode=\"%s\"", bPathEditMode ? "relative" : "fixed" );
3578*b1cdbd2cSJim Jagielski 				bKnown = true;
3579*b1cdbd2cSJim Jagielski 			}
3580*b1cdbd2cSJim Jagielski 		}
3581*b1cdbd2cSJim Jagielski 		break;
3582*b1cdbd2cSJim Jagielski 
3583*b1cdbd2cSJim Jagielski 		case DFF_ANIM_PRESET_ID :
3584*b1cdbd2cSJim Jagielski 		{
3585*b1cdbd2cSJim Jagielski 			sal_Int32 nPresetId ;
3586*b1cdbd2cSJim Jagielski 			if( aAny >>= nPresetId )
3587*b1cdbd2cSJim Jagielski 			{
3588*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " presetid=\"%ld\"", nPresetId );
3589*b1cdbd2cSJim Jagielski 				bKnown = true;
3590*b1cdbd2cSJim Jagielski 			}
3591*b1cdbd2cSJim Jagielski 		}
3592*b1cdbd2cSJim Jagielski 		break;
3593*b1cdbd2cSJim Jagielski 
3594*b1cdbd2cSJim Jagielski 		case DFF_ANIM_PRESET_SUB_TYPE :
3595*b1cdbd2cSJim Jagielski 		{
3596*b1cdbd2cSJim Jagielski 			sal_Int32 nPointsType ;
3597*b1cdbd2cSJim Jagielski 			if( aAny >>= nPointsType )
3598*b1cdbd2cSJim Jagielski 			{
3599*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " presetSubType=\"%ld\"", nPointsType );
3600*b1cdbd2cSJim Jagielski 				bKnown = true;
3601*b1cdbd2cSJim Jagielski 			}
3602*b1cdbd2cSJim Jagielski 		}
3603*b1cdbd2cSJim Jagielski 		break;
3604*b1cdbd2cSJim Jagielski 
3605*b1cdbd2cSJim Jagielski 		case DFF_ANIM_PRESET_CLASS :
3606*b1cdbd2cSJim Jagielski 		{
3607*b1cdbd2cSJim Jagielski 			sal_Int32 nPresetClass;
3608*b1cdbd2cSJim Jagielski 			if ( aAny >>= nPresetClass )
3609*b1cdbd2cSJim Jagielski 			{
3610*b1cdbd2cSJim Jagielski 				const char* pMode;
3611*b1cdbd2cSJim Jagielski 				switch( nPresetClass )
3612*b1cdbd2cSJim Jagielski 				{
3613*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_USER_DEFINED:		pMode = "userdefined"; break;
3614*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_ENTRANCE:			pMode = "entrance"; break;
3615*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_EXIT:				pMode = "exit"; break;
3616*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_EMPHASIS:			pMode = "emphasis"; break;
3617*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_MOTIONPATH:		pMode = "motionpath"; break;
3618*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_OLE_ACTION:		pMode = "oleaction"; break;
3619*b1cdbd2cSJim Jagielski 				case DFF_ANIM_PRESS_CLASS_MEDIACALL:		pMode = "mediacall"; break;
3620*b1cdbd2cSJim Jagielski 				default:
3621*b1cdbd2cSJim Jagielski 				{
3622*b1cdbd2cSJim Jagielski 					static char buffer[128];
3623*b1cdbd2cSJim Jagielski 					sprintf( buffer, "%ld", nPresetClass );
3624*b1cdbd2cSJim Jagielski 					pMode = buffer;
3625*b1cdbd2cSJim Jagielski 				}
3626*b1cdbd2cSJim Jagielski 				break;
3627*b1cdbd2cSJim Jagielski 				}
3628*b1cdbd2cSJim Jagielski 
3629*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " class=\"%s\"", pMode);
3630*b1cdbd2cSJim Jagielski 				bKnown = true;
3631*b1cdbd2cSJim Jagielski 			}
3632*b1cdbd2cSJim Jagielski 		}
3633*b1cdbd2cSJim Jagielski 		break;
3634*b1cdbd2cSJim Jagielski 
3635*b1cdbd2cSJim Jagielski 		case DFF_ANIM_NODE_TYPE :
3636*b1cdbd2cSJim Jagielski 		{
3637*b1cdbd2cSJim Jagielski 			sal_Int32 nNodeType;
3638*b1cdbd2cSJim Jagielski 			if ( aAny >>= nNodeType )
3639*b1cdbd2cSJim Jagielski 			{
3640*b1cdbd2cSJim Jagielski 				const char* pNode;
3641*b1cdbd2cSJim Jagielski 				switch( nNodeType )
3642*b1cdbd2cSJim Jagielski 				{
3643*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_ON_CLICK:		pNode = "onclick";	break;
3644*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS:	pNode = "withprevious"; break;
3645*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS:	pNode = "afterprevious"; break;
3646*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE:	pNode = "mainsequence"; break;
3647*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_TIMING_ROOT:	pNode = "timingroot"; break;
3648*b1cdbd2cSJim Jagielski 					case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:pNode = "interactivesequence"; break;
3649*b1cdbd2cSJim Jagielski 					default :
3650*b1cdbd2cSJim Jagielski 					{
3651*b1cdbd2cSJim Jagielski 						static char buffer[128];
3652*b1cdbd2cSJim Jagielski 						sprintf( buffer, "%ld", nNodeType );
3653*b1cdbd2cSJim Jagielski 						pNode = buffer;
3654*b1cdbd2cSJim Jagielski 					}
3655*b1cdbd2cSJim Jagielski 					break;
3656*b1cdbd2cSJim Jagielski 				}
3657*b1cdbd2cSJim Jagielski 
3658*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " nodeType=\"%s\"", pNode);
3659*b1cdbd2cSJim Jagielski 				bKnown = true;
3660*b1cdbd2cSJim Jagielski 			}
3661*b1cdbd2cSJim Jagielski 		}
3662*b1cdbd2cSJim Jagielski 		break;
3663*b1cdbd2cSJim Jagielski 
3664*b1cdbd2cSJim Jagielski 		case DFF_ANIM_GROUP_ID:
3665*b1cdbd2cSJim Jagielski 		{
3666*b1cdbd2cSJim Jagielski 			sal_Int32 nGroupId;
3667*b1cdbd2cSJim Jagielski 			if ( aAny >>= nGroupId )
3668*b1cdbd2cSJim Jagielski 			{
3669*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " groupId=\"%ld\"", nGroupId );
3670*b1cdbd2cSJim Jagielski 				bKnown = true;
3671*b1cdbd2cSJim Jagielski 			}
3672*b1cdbd2cSJim Jagielski 		}
3673*b1cdbd2cSJim Jagielski 		break;
3674*b1cdbd2cSJim Jagielski 
3675*b1cdbd2cSJim Jagielski 		case DFF_ANIM_ID:
3676*b1cdbd2cSJim Jagielski 		{
3677*b1cdbd2cSJim Jagielski 			rtl::OUString aString;
3678*b1cdbd2cSJim Jagielski 			if( aAny >>= aString )
3679*b1cdbd2cSJim Jagielski 			{
3680*b1cdbd2cSJim Jagielski                 UniString aTmp(aString);
3681*b1cdbd2cSJim Jagielski 				ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3682*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " id=\"%s\"", aStr.GetBuffer() );
3683*b1cdbd2cSJim Jagielski 				bKnown = true;
3684*b1cdbd2cSJim Jagielski 			}
3685*b1cdbd2cSJim Jagielski 		}
3686*b1cdbd2cSJim Jagielski 		break;
3687*b1cdbd2cSJim Jagielski 
3688*b1cdbd2cSJim Jagielski 		case DFF_ANIM_EVENT_FILTER:
3689*b1cdbd2cSJim Jagielski 		{
3690*b1cdbd2cSJim Jagielski 			rtl::OUString aString;
3691*b1cdbd2cSJim Jagielski 			if( aAny >>= aString )
3692*b1cdbd2cSJim Jagielski 			{
3693*b1cdbd2cSJim Jagielski                 UniString aTmp(aString);
3694*b1cdbd2cSJim Jagielski 				ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3695*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " eventFilter=\"%s\"", aStr.GetBuffer() );
3696*b1cdbd2cSJim Jagielski 				bKnown = true;
3697*b1cdbd2cSJim Jagielski 			}
3698*b1cdbd2cSJim Jagielski 		}
3699*b1cdbd2cSJim Jagielski 		break;
3700*b1cdbd2cSJim Jagielski 
3701*b1cdbd2cSJim Jagielski 		case DFF_ANIM_ENDAFTERSLIDE:
3702*b1cdbd2cSJim Jagielski 		{
3703*b1cdbd2cSJim Jagielski 			sal_Int32 nEndAfterSlide;
3704*b1cdbd2cSJim Jagielski 			if( aAny >>= nEndAfterSlide )
3705*b1cdbd2cSJim Jagielski 			{
3706*b1cdbd2cSJim Jagielski 				fprintf(mpFile, " endAfterSlide=\"%ld\"", nEndAfterSlide );
3707*b1cdbd2cSJim Jagielski 			bKnown = true;
3708*b1cdbd2cSJim Jagielski 			}
3709*b1cdbd2cSJim Jagielski 		}
3710*b1cdbd2cSJim Jagielski 
3711*b1cdbd2cSJim Jagielski 		case DFF_ANIM_TIMEFILTER:
3712*b1cdbd2cSJim Jagielski 		{
3713*b1cdbd2cSJim Jagielski 			rtl::OUString aString;
3714*b1cdbd2cSJim Jagielski 			if( aAny >>= aString )
3715*b1cdbd2cSJim Jagielski 			{
3716*b1cdbd2cSJim Jagielski                 UniString aTmp(aString);
3717*b1cdbd2cSJim Jagielski 				ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3718*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " timeFilter=\"%s\"", aStr.GetBuffer() );
3719*b1cdbd2cSJim Jagielski 				bKnown = true;
3720*b1cdbd2cSJim Jagielski 			}
3721*b1cdbd2cSJim Jagielski 		}
3722*b1cdbd2cSJim Jagielski 		break;
3723*b1cdbd2cSJim Jagielski 
3724*b1cdbd2cSJim Jagielski 		case DFF_ANIM_RUNTIMECONTEXT:
3725*b1cdbd2cSJim Jagielski 		{
3726*b1cdbd2cSJim Jagielski 			rtl::OUString aString;
3727*b1cdbd2cSJim Jagielski 			if( aAny >>= aString )
3728*b1cdbd2cSJim Jagielski 			{
3729*b1cdbd2cSJim Jagielski                 UniString aTmp(aString);
3730*b1cdbd2cSJim Jagielski 				ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3731*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " runtimeContext=\"%s\"", aStr.GetBuffer() );
3732*b1cdbd2cSJim Jagielski 				bKnown = true;
3733*b1cdbd2cSJim Jagielski 			}
3734*b1cdbd2cSJim Jagielski 		}
3735*b1cdbd2cSJim Jagielski 		break;
3736*b1cdbd2cSJim Jagielski 
3737*b1cdbd2cSJim Jagielski 		case DFF_ANIM_VOLUME:
3738*b1cdbd2cSJim Jagielski 		{
3739*b1cdbd2cSJim Jagielski 			double fVolume;
3740*b1cdbd2cSJim Jagielski 			if( aAny >>= fVolume )
3741*b1cdbd2cSJim Jagielski 			{
3742*b1cdbd2cSJim Jagielski 				fprintf( mpFile, " volume=\"%g%%\"", (double)(fVolume * 100.0) );
3743*b1cdbd2cSJim Jagielski 				bKnown = true;
3744*b1cdbd2cSJim Jagielski 			}
3745*b1cdbd2cSJim Jagielski 		}
3746*b1cdbd2cSJim Jagielski 		break;
3747*b1cdbd2cSJim Jagielski 
3748*b1cdbd2cSJim Jagielski 		case DFF_ANIM_AFTEREFFECT:
3749*b1cdbd2cSJim Jagielski 		{
3750*b1cdbd2cSJim Jagielski 			sal_Bool bAfterEffect;
3751*b1cdbd2cSJim Jagielski 			if( aAny >>= bAfterEffect )
3752*b1cdbd2cSJim Jagielski 			{
3753*b1cdbd2cSJim Jagielski 				fprintf( mpFile, "afterEffect=\"%s\"", bAfterEffect ? "true" : "false" );
3754*b1cdbd2cSJim Jagielski 				bKnown = true;
3755*b1cdbd2cSJim Jagielski 			}
3756*b1cdbd2cSJim Jagielski 		}
3757*b1cdbd2cSJim Jagielski 		break;
3758*b1cdbd2cSJim Jagielski 
3759*b1cdbd2cSJim Jagielski 		}
3760*b1cdbd2cSJim Jagielski 
3761*b1cdbd2cSJim Jagielski 
3762*b1cdbd2cSJim Jagielski 		if( !bKnown )
3763*b1cdbd2cSJim Jagielski 		{
3764*b1cdbd2cSJim Jagielski 			fprintf( mpFile, " unknown_%lu=\"", nInstance );
3765*b1cdbd2cSJim Jagielski 			dump( aAny );
3766*b1cdbd2cSJim Jagielski 			fprintf( mpFile, "\"" );
3767*b1cdbd2cSJim Jagielski 		}
3768*b1cdbd2cSJim Jagielski 
3769*b1cdbd2cSJim Jagielski 		aIter++;
3770*b1cdbd2cSJim Jagielski 	}
3771*b1cdbd2cSJim Jagielski }
3772*b1cdbd2cSJim Jagielski 
dump_target(Any & rAny)3773*b1cdbd2cSJim Jagielski void AnimationImporter::dump_target( Any& rAny )
3774*b1cdbd2cSJim Jagielski {
3775*b1cdbd2cSJim Jagielski 	Any aSource, aSourceData;
3776*b1cdbd2cSJim Jagielski 	Sequence< Any > aSeq;
3777*b1cdbd2cSJim Jagielski 	if( rAny >>= aSeq )
3778*b1cdbd2cSJim Jagielski 	{
3779*b1cdbd2cSJim Jagielski 		if( aSeq.getLength() >= 1 ) aSource = aSeq[0];
3780*b1cdbd2cSJim Jagielski 		if( aSeq.getLength() >= 2 ) aSourceData = aSeq[1];
3781*b1cdbd2cSJim Jagielski 	}
3782*b1cdbd2cSJim Jagielski 	else
3783*b1cdbd2cSJim Jagielski 	{
3784*b1cdbd2cSJim Jagielski 		aSource = rAny;
3785*b1cdbd2cSJim Jagielski 	}
3786*b1cdbd2cSJim Jagielski 
3787*b1cdbd2cSJim Jagielski 	Reference< XShape > xShape;
3788*b1cdbd2cSJim Jagielski 	aSource >>= xShape;
3789*b1cdbd2cSJim Jagielski 	if( xShape.is() )
3790*b1cdbd2cSJim Jagielski 	{
3791*b1cdbd2cSJim Jagielski 		OUString aStr( xShape->getShapeType() );
3792*b1cdbd2cSJim Jagielski 		dump( aStr );
3793*b1cdbd2cSJim Jagielski 
3794*b1cdbd2cSJim Jagielski 		if( aSourceData.hasValue() )
3795*b1cdbd2cSJim Jagielski 		{
3796*b1cdbd2cSJim Jagielski 			dump( "(" );
3797*b1cdbd2cSJim Jagielski 			dump( aSourceData );
3798*b1cdbd2cSJim Jagielski 			dump( ")" );
3799*b1cdbd2cSJim Jagielski 		}
3800*b1cdbd2cSJim Jagielski 	}
3801*b1cdbd2cSJim Jagielski }
3802*b1cdbd2cSJim Jagielski 
dump(const char * pText)3803*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * pText )
3804*b1cdbd2cSJim Jagielski {
3805*b1cdbd2cSJim Jagielski 	fprintf( mpFile, "%s", pText );
3806*b1cdbd2cSJim Jagielski }
3807*b1cdbd2cSJim Jagielski 
dump(const rtl::OUString & rString)3808*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const rtl::OUString& rString )
3809*b1cdbd2cSJim Jagielski {
3810*b1cdbd2cSJim Jagielski     UniString aTmp( rString );
3811*b1cdbd2cSJim Jagielski 	ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3812*b1cdbd2cSJim Jagielski 	fprintf( mpFile, aStr.GetBuffer() );
3813*b1cdbd2cSJim Jagielski }
3814*b1cdbd2cSJim Jagielski 
dump(const char * pText,sal_Int32 nInt)3815*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * pText, sal_Int32 nInt )
3816*b1cdbd2cSJim Jagielski {
3817*b1cdbd2cSJim Jagielski 	fprintf( mpFile, pText, nInt );
3818*b1cdbd2cSJim Jagielski }
3819*b1cdbd2cSJim Jagielski 
dump(const char * pText,double fDouble)3820*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * pText, double fDouble )
3821*b1cdbd2cSJim Jagielski {
3822*b1cdbd2cSJim Jagielski 	fprintf( mpFile, pText, fDouble );
3823*b1cdbd2cSJim Jagielski }
3824*b1cdbd2cSJim Jagielski 
dump(const char * pText,const char * pText2)3825*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * pText, const char * pText2 )
3826*b1cdbd2cSJim Jagielski {
3827*b1cdbd2cSJim Jagielski 	fprintf( mpFile, pText, pText2 );
3828*b1cdbd2cSJim Jagielski }
3829*b1cdbd2cSJim Jagielski 
dump(const char * pText,const OUString & rString)3830*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * pText, const OUString& rString )
3831*b1cdbd2cSJim Jagielski {
3832*b1cdbd2cSJim Jagielski     UniString aTmp( rString );
3833*b1cdbd2cSJim Jagielski 	ByteString aStr( aTmp, RTL_TEXTENCODING_UTF8 );
3834*b1cdbd2cSJim Jagielski 	fprintf( mpFile, pText, aStr.GetBuffer() );
3835*b1cdbd2cSJim Jagielski }
3836*b1cdbd2cSJim Jagielski 
3837*b1cdbd2cSJim Jagielski #else
3838*b1cdbd2cSJim Jagielski 
dump_atom_header(const Atom *,bool,bool)3839*b1cdbd2cSJim Jagielski void AnimationImporter::dump_atom_header( const Atom* , bool , bool  )
3840*b1cdbd2cSJim Jagielski {
3841*b1cdbd2cSJim Jagielski }
3842*b1cdbd2cSJim Jagielski 
dump_atom(const Atom *,bool)3843*b1cdbd2cSJim Jagielski void AnimationImporter::dump_atom( const Atom* , bool  )
3844*b1cdbd2cSJim Jagielski {
3845*b1cdbd2cSJim Jagielski }
3846*b1cdbd2cSJim Jagielski 
dump_target(::com::sun::star::uno::Any &)3847*b1cdbd2cSJim Jagielski void AnimationImporter::dump_target( ::com::sun::star::uno::Any&  )
3848*b1cdbd2cSJim Jagielski {
3849*b1cdbd2cSJim Jagielski }
3850*b1cdbd2cSJim Jagielski 
dump(::com::sun::star::uno::Any &)3851*b1cdbd2cSJim Jagielski void AnimationImporter::dump( ::com::sun::star::uno::Any&  )
3852*b1cdbd2cSJim Jagielski {
3853*b1cdbd2cSJim Jagielski }
3854*b1cdbd2cSJim Jagielski 
dump(const PropertySet &)3855*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const PropertySet&  )
3856*b1cdbd2cSJim Jagielski {
3857*b1cdbd2cSJim Jagielski }
3858*b1cdbd2cSJim Jagielski 
dump(const AnimationNode &)3859*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const AnimationNode&  )
3860*b1cdbd2cSJim Jagielski {
3861*b1cdbd2cSJim Jagielski }
3862*b1cdbd2cSJim Jagielski 
dump(const char *)3863*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char *  )
3864*b1cdbd2cSJim Jagielski {
3865*b1cdbd2cSJim Jagielski }
3866*b1cdbd2cSJim Jagielski 
dump(const char *,sal_Int32)3867*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * , sal_Int32  )
3868*b1cdbd2cSJim Jagielski {
3869*b1cdbd2cSJim Jagielski }
3870*b1cdbd2cSJim Jagielski 
dump(const char *,double)3871*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * , double  )
3872*b1cdbd2cSJim Jagielski {
3873*b1cdbd2cSJim Jagielski }
3874*b1cdbd2cSJim Jagielski 
dump(const char *,const char *)3875*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * , const char *  )
3876*b1cdbd2cSJim Jagielski {
3877*b1cdbd2cSJim Jagielski }
3878*b1cdbd2cSJim Jagielski 
dump(const char *,const rtl::OUString &)3879*b1cdbd2cSJim Jagielski void AnimationImporter::dump( const char * , const rtl::OUString&  )
3880*b1cdbd2cSJim Jagielski {
3881*b1cdbd2cSJim Jagielski }
3882*b1cdbd2cSJim Jagielski 
3883*b1cdbd2cSJim Jagielski #endif
3884*b1cdbd2cSJim Jagielski 
3885*b1cdbd2cSJim Jagielski } // namespace ppt;
3886*b1cdbd2cSJim Jagielski 
3887