xref: /trunk/main/sd/inc/CustomAnimationEffect.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1*c45d927aSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c45d927aSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c45d927aSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c45d927aSAndrew Rist  * distributed with this work for additional information
6*c45d927aSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c45d927aSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c45d927aSAndrew Rist  * "License"); you may not use this file except in compliance
9*c45d927aSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*c45d927aSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*c45d927aSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c45d927aSAndrew Rist  * software distributed under the License is distributed on an
15*c45d927aSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c45d927aSAndrew Rist  * KIND, either express or implied.  See the License for the
17*c45d927aSAndrew Rist  * specific language governing permissions and limitations
18*c45d927aSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*c45d927aSAndrew Rist  *************************************************************/
21*c45d927aSAndrew Rist 
22*c45d927aSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _SD_CUSTOMANIMATIONEFFECT_HXX
25cdf0e10cSrcweir #define _SD_CUSTOMANIMATIONEFFECT_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <com/sun/star/animations/XAnimationNode.hpp>
28cdf0e10cSrcweir #include <com/sun/star/animations/XTimeContainer.hpp>
29cdf0e10cSrcweir #include <com/sun/star/animations/XAudio.hpp>
30cdf0e10cSrcweir #include <com/sun/star/drawing/XShape.hpp>
31cdf0e10cSrcweir #include <com/sun/star/util/XChangesListener.hpp>
32cdf0e10cSrcweir #include <tools/string.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <comphelper/stl_types.hxx>
37cdf0e10cSrcweir #include <vcl/timer.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <sddllapi.h>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <list>
42cdf0e10cSrcweir #include <map>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir class SdrPathObj;
45cdf0e10cSrcweir 
46cdf0e10cSrcweir namespace sd {
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // --------------------------------------------------------------------
49cdf0e10cSrcweir 
50cdf0e10cSrcweir enum EValue { VALUE_FROM, VALUE_TO, VALUE_BY, VALUE_FIRST, VALUE_LAST };
51cdf0e10cSrcweir 
52cdf0e10cSrcweir class CustomAnimationEffect;
53cdf0e10cSrcweir class AnimationTrigger;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir class CustomAnimationPreset;
56cdf0e10cSrcweir typedef boost::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir typedef boost::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir typedef std::list< CustomAnimationEffectPtr > EffectSequence;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir class EffectSequenceHelper;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir class CustomAnimationEffect
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     friend class MainSequence;
67cdf0e10cSrcweir     friend class EffectSequenceHelper;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir public:
70cdf0e10cSrcweir     SD_DLLPUBLIC CustomAnimationEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
71cdf0e10cSrcweir     SD_DLLPUBLIC virtual ~CustomAnimationEffect();
72cdf0e10cSrcweir 
getNode() const73cdf0e10cSrcweir     const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& getNode() const { return mxNode; }
74cdf0e10cSrcweir     void setNode( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
75cdf0e10cSrcweir     void replaceNode( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     CustomAnimationEffectPtr clone() const;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir     // attributes
getPresetId() const80cdf0e10cSrcweir     const rtl::OUString&    getPresetId() const { return maPresetId; }
getPresetSubType() const81cdf0e10cSrcweir     const rtl::OUString&    getPresetSubType() const { return maPresetSubType; }
getProperty() const82cdf0e10cSrcweir     const rtl::OUString&    getProperty() const { return maProperty; }
83cdf0e10cSrcweir 
getPresetClass() const84cdf0e10cSrcweir     sal_Int16               getPresetClass() const { return mnPresetClass; }
85cdf0e10cSrcweir     void                    setPresetClass( sal_Int16 nPresetClass );
86cdf0e10cSrcweir 
getNodeType() const87cdf0e10cSrcweir     sal_Int16       getNodeType() const { return mnNodeType; }
88cdf0e10cSrcweir     SD_DLLPUBLIC void           setNodeType( sal_Int16 nNodeType );
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     ::com::sun::star::uno::Any              getRepeatCount() const;
91cdf0e10cSrcweir     void            setRepeatCount( const ::com::sun::star::uno::Any& rRepeatCount );
92cdf0e10cSrcweir 
93cdf0e10cSrcweir     ::com::sun::star::uno::Any              getEnd() const;
94cdf0e10cSrcweir     void            setEnd( const ::com::sun::star::uno::Any& rEnd );
95cdf0e10cSrcweir 
96cdf0e10cSrcweir     sal_Int16       getFill() const;
97cdf0e10cSrcweir     void            setFill( sal_Int16 nFill );
98cdf0e10cSrcweir 
getBegin() const99cdf0e10cSrcweir     double          getBegin() const { return mfBegin; }
100cdf0e10cSrcweir     SD_DLLPUBLIC void           setBegin( double fBegin );
101cdf0e10cSrcweir 
getDuration() const102cdf0e10cSrcweir     double          getDuration() const { return mfDuration; }
103cdf0e10cSrcweir     SD_DLLPUBLIC void           setDuration( double fDuration );
104cdf0e10cSrcweir 
getAbsoluteDuration() const105cdf0e10cSrcweir     double          getAbsoluteDuration() const { return mfAbsoluteDuration; }
106cdf0e10cSrcweir 
getName() const107cdf0e10cSrcweir     const String&   getName() const { return maName; }
setName(const String & rName)108cdf0e10cSrcweir     void            setName( const String& rName ) { maName = rName; }
109cdf0e10cSrcweir 
getIterateType() const110cdf0e10cSrcweir     sal_Int16       getIterateType() const { return mnIterateType; }
111cdf0e10cSrcweir     SD_DLLPUBLIC void           setIterateType( sal_Int16 nIterateType );
112cdf0e10cSrcweir 
getIterateInterval() const113cdf0e10cSrcweir     double          getIterateInterval() const { return mfIterateInterval; }
114cdf0e10cSrcweir     SD_DLLPUBLIC void           setIterateInterval( double fIterateInterval );
115cdf0e10cSrcweir 
getTarget() const116cdf0e10cSrcweir     ::com::sun::star::uno::Any  getTarget() const { return maTarget; }
117cdf0e10cSrcweir     SD_DLLPUBLIC void                       setTarget( const ::com::sun::star::uno::Any& rTarget );
118cdf0e10cSrcweir 
hasAfterEffect() const119cdf0e10cSrcweir     sal_Bool        hasAfterEffect() const { return mbHasAfterEffect; }
setHasAfterEffect(sal_Bool bHasAfterEffect)120cdf0e10cSrcweir     void            setHasAfterEffect( sal_Bool bHasAfterEffect ) { mbHasAfterEffect = bHasAfterEffect; }
121cdf0e10cSrcweir 
getDimColor() const122cdf0e10cSrcweir     ::com::sun::star::uno::Any  getDimColor() const { return maDimColor; }
setDimColor(::com::sun::star::uno::Any aDimColor)123cdf0e10cSrcweir     void                        setDimColor( ::com::sun::star::uno::Any aDimColor ) { maDimColor = aDimColor; }
124cdf0e10cSrcweir 
IsAfterEffectOnNext() const125cdf0e10cSrcweir     bool            IsAfterEffectOnNext() const { return mbAfterEffectOnNextEffect; }
setAfterEffectOnNext(bool bOnNextEffect)126cdf0e10cSrcweir     void            setAfterEffectOnNext( bool bOnNextEffect ) { mbAfterEffectOnNextEffect = bOnNextEffect; }
127cdf0e10cSrcweir 
getParaDepth() const128cdf0e10cSrcweir     sal_Int32       getParaDepth() const { return mnParaDepth; }
129cdf0e10cSrcweir 
hasText() const130cdf0e10cSrcweir     sal_Bool        hasText() const { return mbHasText; }
131cdf0e10cSrcweir 
getCommand() const132cdf0e10cSrcweir     sal_Int16       getCommand() const { return mnCommand; }
133cdf0e10cSrcweir 
getAcceleration() const134cdf0e10cSrcweir     double          getAcceleration() const { return mfAcceleration; }
135cdf0e10cSrcweir     void            setAcceleration( double fAcceleration );
136cdf0e10cSrcweir 
getDecelerate() const137cdf0e10cSrcweir     double          getDecelerate() const { return mfDecelerate; }
138cdf0e10cSrcweir     void            setDecelerate( double fDecelerate );
139cdf0e10cSrcweir 
getAutoReverse() const140cdf0e10cSrcweir     sal_Bool        getAutoReverse() const { return mbAutoReverse; }
141cdf0e10cSrcweir     void            setAutoReverse( sal_Bool bAutoReverse );
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     ::com::sun::star::uno::Any  getProperty( sal_Int32 nNodeType, const rtl::OUString& rAttributeName, EValue eValue );
144cdf0e10cSrcweir     bool                        setProperty( sal_Int32 nNodeType, const rtl::OUString& rAttributeName, EValue eValue, const ::com::sun::star::uno::Any& rValue );
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     ::com::sun::star::uno::Any  getTransformationProperty( sal_Int32 nTransformType, EValue eValue );
147cdf0e10cSrcweir     bool                        setTransformationProperty( sal_Int32 nTransformType, EValue eValue, const ::com::sun::star::uno::Any& rValue );
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     ::com::sun::star::uno::Any  getColor( sal_Int32 nIndex );
150cdf0e10cSrcweir     void                        setColor( sal_Int32 nIndex, const ::com::sun::star::uno::Any& rColor );
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     ::com::sun::star::uno::Any  getRotation();
153cdf0e10cSrcweir     void                        setRotation( const ::com::sun::star::uno::Any& rRotation );
154cdf0e10cSrcweir 
getGroupId() const155cdf0e10cSrcweir     sal_Int32       getGroupId() const { return mnGroupId; }
156cdf0e10cSrcweir     void            setGroupId( sal_Int32 nGroupId );
157cdf0e10cSrcweir 
getTargetSubItem() const158cdf0e10cSrcweir     sal_Int16       getTargetSubItem() const { return mnTargetSubItem; }
159cdf0e10cSrcweir     SD_DLLPUBLIC void           setTargetSubItem( sal_Int16 nSubItem );
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     ::rtl::OUString getPath() const;
162cdf0e10cSrcweir     void setPath( const ::rtl::OUString& rPath );
163cdf0e10cSrcweir 
164cdf0e10cSrcweir     bool checkForText();
165cdf0e10cSrcweir     bool calculateIterateDuration();
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     void setAudio( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAudio >& xAudio );
168cdf0e10cSrcweir     bool getStopAudio() const;
169cdf0e10cSrcweir     SD_DLLPUBLIC void setStopAudio();
170cdf0e10cSrcweir     SD_DLLPUBLIC void createAudio( const ::com::sun::star::uno::Any& rSource, double fVolume = 1.0 );
171cdf0e10cSrcweir     void removeAudio();
getAudio() const172cdf0e10cSrcweir     const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAudio >& getAudio() const { return mxAudio; }
173cdf0e10cSrcweir 
getEffectSequence() const174cdf0e10cSrcweir     EffectSequenceHelper*   getEffectSequence() const { return mpEffectSequence; }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     // helper
177cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > createAfterEffectNode() const throw (com::sun::star::uno::Exception);
178cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getTargetShape() const;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     // static helpers
181cdf0e10cSrcweir     static sal_Int32 get_node_type( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
182cdf0e10cSrcweir     static sal_Int32 getNumberOfSubitems( const ::com::sun::star::uno::Any& aTarget, sal_Int16 nIterateType );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     SdrPathObj* createSdrPathObjFromPath();
185cdf0e10cSrcweir     void updateSdrPathObjFromPath( SdrPathObj& rPathObj );
186cdf0e10cSrcweir     void updatePathFromSdrPathObj( const SdrPathObj& rPathObj );
187cdf0e10cSrcweir 
188cdf0e10cSrcweir protected:
setEffectSequence(EffectSequenceHelper * pSequence)189cdf0e10cSrcweir     void setEffectSequence( EffectSequenceHelper* pSequence ) { mpEffectSequence = pSequence; }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir private:
192cdf0e10cSrcweir     sal_Int16       mnNodeType;
193cdf0e10cSrcweir     rtl::OUString   maPresetId;
194cdf0e10cSrcweir     rtl::OUString   maPresetSubType;
195cdf0e10cSrcweir     rtl::OUString   maProperty;
196cdf0e10cSrcweir     sal_Int16       mnPresetClass;
197cdf0e10cSrcweir     double          mfBegin;
198cdf0e10cSrcweir     double          mfDuration;                 // this is the maximum duration of the subeffects
199cdf0e10cSrcweir     double          mfAbsoluteDuration;         // this is the maximum duration of the subeffects including possible iterations
200cdf0e10cSrcweir     sal_Int32       mnGroupId;
201cdf0e10cSrcweir     sal_Int16       mnIterateType;
202cdf0e10cSrcweir     double          mfIterateInterval;
203cdf0e10cSrcweir     sal_Int32       mnParaDepth;
204cdf0e10cSrcweir     sal_Bool        mbHasText;
205cdf0e10cSrcweir     double          mfAcceleration;
206cdf0e10cSrcweir     double          mfDecelerate;
207cdf0e10cSrcweir     sal_Bool        mbAutoReverse;
208cdf0e10cSrcweir     sal_Int16       mnTargetSubItem;
209cdf0e10cSrcweir     sal_Int16       mnCommand;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     EffectSequenceHelper* mpEffectSequence;
212cdf0e10cSrcweir 
213cdf0e10cSrcweir     String          maName;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > mxNode;
216cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAudio > mxAudio;
217cdf0e10cSrcweir     ::com::sun::star::uno::Any maTarget;
218cdf0e10cSrcweir 
219cdf0e10cSrcweir     sal_Bool        mbHasAfterEffect;
220cdf0e10cSrcweir     ::com::sun::star::uno::Any maDimColor;
221cdf0e10cSrcweir     bool        mbAfterEffectOnNextEffect;
222cdf0e10cSrcweir };
223cdf0e10cSrcweir 
224cdf0e10cSrcweir struct stl_CustomAnimationEffect_search_node_predict
225cdf0e10cSrcweir {
226cdf0e10cSrcweir     stl_CustomAnimationEffect_search_node_predict( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xSearchNode );
227cdf0e10cSrcweir     bool operator()( CustomAnimationEffectPtr pEffect ) const;
228cdf0e10cSrcweir     const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& mxSearchNode;
229cdf0e10cSrcweir };
230cdf0e10cSrcweir 
231cdf0e10cSrcweir enum ESequenceHint { EFFECT_EDITED, EFFECT_REMOVED, EFFECT_ADDED };
232cdf0e10cSrcweir 
233cdf0e10cSrcweir /** this listener is implemented by UI components to track changes in the animation core */
234cdf0e10cSrcweir class ISequenceListener
235cdf0e10cSrcweir {
236cdf0e10cSrcweir public:
237cdf0e10cSrcweir     virtual void notify_change() = 0;
238cdf0e10cSrcweir };
239cdf0e10cSrcweir 
240cdf0e10cSrcweir /** this class keeps track of a group of animations that build up
241cdf0e10cSrcweir     a text animation for a single shape */
242cdf0e10cSrcweir class CustomAnimationTextGroup
243cdf0e10cSrcweir {
244cdf0e10cSrcweir     friend class EffectSequenceHelper;
245cdf0e10cSrcweir 
246cdf0e10cSrcweir public:
247cdf0e10cSrcweir     CustomAnimationTextGroup( const ::com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rTarget, sal_Int32 nGroupId );
248cdf0e10cSrcweir 
249cdf0e10cSrcweir     void reset();
250cdf0e10cSrcweir     void addEffect( CustomAnimationEffectPtr& pEffect );
251cdf0e10cSrcweir 
getTarget() const252cdf0e10cSrcweir     const ::com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& getTarget() const { return maTarget; }
getEffects() const253cdf0e10cSrcweir     const EffectSequence& getEffects() const { return maEffects; }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     /* -1: as single object, 0: all at once, n > 0: by n Th paragraph */
getTextGrouping() const256cdf0e10cSrcweir     sal_Int32 getTextGrouping() const { return mnTextGrouping; }
257cdf0e10cSrcweir 
getAnimateForm() const258cdf0e10cSrcweir     sal_Bool getAnimateForm() const { return mbAnimateForm; }
getTextReverse() const259cdf0e10cSrcweir     sal_Bool getTextReverse() const { return mbTextReverse; }
getTextGroupingAuto() const260cdf0e10cSrcweir     double getTextGroupingAuto() const { return mfGroupingAuto; }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir private:
263cdf0e10cSrcweir     EffectSequence maEffects;
264cdf0e10cSrcweir     ::com::sun::star::uno::Reference< com::sun::star::drawing::XShape > maTarget;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     sal_Int32 mnTextGrouping;
267cdf0e10cSrcweir     sal_Bool mbAnimateForm;
268cdf0e10cSrcweir     sal_Bool mbTextReverse;
269cdf0e10cSrcweir     double mfGroupingAuto;
270cdf0e10cSrcweir     sal_Int32 mnLastPara;
271cdf0e10cSrcweir     sal_Int8 mnDepthFlags[5];
272cdf0e10cSrcweir     sal_Int32 mnGroupId;
273cdf0e10cSrcweir };
274cdf0e10cSrcweir 
275cdf0e10cSrcweir typedef boost::shared_ptr< CustomAnimationTextGroup > CustomAnimationTextGroupPtr;
276cdf0e10cSrcweir typedef std::map< sal_Int32, CustomAnimationTextGroupPtr > CustomAnimationTextGroupMap;
277cdf0e10cSrcweir 
278cdf0e10cSrcweir class EffectSequenceHelper
279cdf0e10cSrcweir {
280cdf0e10cSrcweir friend class MainSequence;
281cdf0e10cSrcweir 
282cdf0e10cSrcweir public:
283cdf0e10cSrcweir     EffectSequenceHelper();
284cdf0e10cSrcweir     EffectSequenceHelper( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTimeContainer >& xSequenceRoot );
285cdf0e10cSrcweir     virtual ~EffectSequenceHelper();
286cdf0e10cSrcweir 
287cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > getRootNode();
288cdf0e10cSrcweir 
289cdf0e10cSrcweir     CustomAnimationEffectPtr append( const CustomAnimationPresetPtr& pDescriptor, const ::com::sun::star::uno::Any& rTarget, double fDuration = -1.0 );
290cdf0e10cSrcweir     CustomAnimationEffectPtr append( const SdrPathObj& rPathObj, const ::com::sun::star::uno::Any& rTarget, double fDuration = -1.0 );
291cdf0e10cSrcweir     SD_DLLPUBLIC void append( const CustomAnimationEffectPtr& pEffect );
292cdf0e10cSrcweir     void insert( EffectSequence::iterator& rPos, const CustomAnimationEffectPtr& pEffect );
293cdf0e10cSrcweir     void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, double fDuration = -1.0 );
294cdf0e10cSrcweir     void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, const rtl::OUString& rPresetSubType, double fDuration = -1.0 );
295cdf0e10cSrcweir     void remove( const CustomAnimationEffectPtr& pEffect );
296cdf0e10cSrcweir 
297cdf0e10cSrcweir     void create( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
298cdf0e10cSrcweir     void createEffectsequence( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
299cdf0e10cSrcweir     void processAfterEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
300cdf0e10cSrcweir     void createEffects( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode );
301cdf0e10cSrcweir 
getCount() const302cdf0e10cSrcweir     sal_Int32 getCount() const { return sal::static_int_cast< sal_Int32 >( maEffects.size() ); }
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     virtual CustomAnimationEffectPtr findEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode ) const;
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     virtual bool disposeShape( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
307cdf0e10cSrcweir     virtual void insertTextRange( const com::sun::star::uno::Any& aTarget );
308cdf0e10cSrcweir     virtual void disposeTextRange( const com::sun::star::uno::Any& aTarget );
309cdf0e10cSrcweir     virtual bool hasEffect( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
310cdf0e10cSrcweir     virtual void onTextChanged( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
311cdf0e10cSrcweir 
312cdf0e10cSrcweir     /** this must be called if effects from this sequence are changed.
313cdf0e10cSrcweir         the method will call the registered listeners */
314cdf0e10cSrcweir     void update( const CustomAnimationEffectPtr& pEffect );
315cdf0e10cSrcweir 
316cdf0e10cSrcweir     /** this method rebuilds the animation nodes */
317cdf0e10cSrcweir     virtual void rebuild();
318cdf0e10cSrcweir 
getBegin()319cdf0e10cSrcweir     EffectSequence::iterator getBegin() { return maEffects.begin(); }
getEnd()320cdf0e10cSrcweir     EffectSequence::iterator getEnd() { return maEffects.end(); }
321cdf0e10cSrcweir     EffectSequence::iterator find( const CustomAnimationEffectPtr& pEffect );
322cdf0e10cSrcweir 
getSequence()323cdf0e10cSrcweir     EffectSequence& getSequence() { return maEffects; }
324cdf0e10cSrcweir 
325cdf0e10cSrcweir     void addListener( ISequenceListener* pListener );
326cdf0e10cSrcweir     void removeListener( ISequenceListener* pListener );
327cdf0e10cSrcweir 
328cdf0e10cSrcweir     // text group methods
329cdf0e10cSrcweir 
330cdf0e10cSrcweir     CustomAnimationTextGroupPtr findGroup( sal_Int32 nGroupId );
331cdf0e10cSrcweir     SD_DLLPUBLIC CustomAnimationTextGroupPtr    createTextGroup( CustomAnimationEffectPtr pEffect, sal_Int32 nTextGrouping, double fTextGroupingAuto, sal_Bool bAnimateForm, sal_Bool bTextReverse );
332cdf0e10cSrcweir     void setTextGrouping( CustomAnimationTextGroupPtr pTextGroup, sal_Int32 nTextGrouping );
333cdf0e10cSrcweir     void setAnimateForm( CustomAnimationTextGroupPtr pTextGroup, sal_Bool bAnimateForm );
334cdf0e10cSrcweir     void setTextGroupingAuto( CustomAnimationTextGroupPtr pTextGroup, double fTextGroupingAuto );
335cdf0e10cSrcweir     void setTextReverse( CustomAnimationTextGroupPtr pTextGroup, sal_Bool bAnimateForm );
336cdf0e10cSrcweir 
getSequenceType() const337cdf0e10cSrcweir     sal_Int32 getSequenceType() const { return mnSequenceType; }
338cdf0e10cSrcweir 
getTriggerShape() const339cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getTriggerShape() const { return mxEventSource; }
setTriggerShape(const::com::sun::star::uno::Reference<::com::sun::star::drawing::XShape> & xTrigger)340cdf0e10cSrcweir     void setTriggerShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xTrigger ) { mxEventSource = xTrigger; }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir     virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const;
343cdf0e10cSrcweir     virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir protected:
346cdf0e10cSrcweir     virtual void implRebuild();
347cdf0e10cSrcweir     virtual void reset();
348cdf0e10cSrcweir 
349cdf0e10cSrcweir     void createTextGroupParagraphEffects( CustomAnimationTextGroupPtr pTextGroup, CustomAnimationEffectPtr pEffect, bool bUsed );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     void notify_listeners();
352cdf0e10cSrcweir 
353cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTimeContainer > createParallelTimeContainer() const;
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     void updateTextGroups();
356cdf0e10cSrcweir 
357cdf0e10cSrcweir protected:
358cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTimeContainer > mxSequenceRoot;
359cdf0e10cSrcweir     EffectSequence maEffects;
360cdf0e10cSrcweir     std::list< ISequenceListener* > maListeners;
361cdf0e10cSrcweir     CustomAnimationTextGroupMap maGroupMap;
362cdf0e10cSrcweir     sal_Int32 mnSequenceType;
363cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > mxEventSource;
364cdf0e10cSrcweir };
365cdf0e10cSrcweir 
366cdf0e10cSrcweir class MainSequence;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir class InteractiveSequence : public EffectSequenceHelper
369cdf0e10cSrcweir {
370cdf0e10cSrcweir friend class MainSequence;
371cdf0e10cSrcweir friend class MainSequenceChangeGuard;
372cdf0e10cSrcweir 
373cdf0e10cSrcweir public:
374cdf0e10cSrcweir     InteractiveSequence( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTimeContainer >& xSequenceRoot, MainSequence* pMainSequence );
375cdf0e10cSrcweir 
376cdf0e10cSrcweir     /** this method rebuilds the animation nodes */
377cdf0e10cSrcweir     virtual void rebuild();
378cdf0e10cSrcweir 
379cdf0e10cSrcweir private:
380cdf0e10cSrcweir     virtual void implRebuild();
381cdf0e10cSrcweir 
382cdf0e10cSrcweir     MainSequence*   mpMainSequence;
383cdf0e10cSrcweir };
384cdf0e10cSrcweir 
385cdf0e10cSrcweir typedef boost::shared_ptr< InteractiveSequence > InteractiveSequencePtr;
386cdf0e10cSrcweir typedef std::list< InteractiveSequencePtr > InteractiveSequenceList;
387cdf0e10cSrcweir 
388cdf0e10cSrcweir class MainSequence : public EffectSequenceHelper, public ISequenceListener
389cdf0e10cSrcweir {
390cdf0e10cSrcweir     friend class UndoAnimation;
391cdf0e10cSrcweir     friend class MainSequenceRebuildGuard;
392cdf0e10cSrcweir     friend class MainSequenceChangeGuard;
393cdf0e10cSrcweir 
394cdf0e10cSrcweir public:
395cdf0e10cSrcweir     MainSequence();
396cdf0e10cSrcweir     MainSequence( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xTimingRootNode );
397cdf0e10cSrcweir     ~MainSequence();
398cdf0e10cSrcweir 
399cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode > getRootNode();
400cdf0e10cSrcweir     void reset( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xTimingRootNode );
401cdf0e10cSrcweir 
402cdf0e10cSrcweir     /** this method rebuilds the animation nodes */
403cdf0e10cSrcweir     virtual void rebuild();
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     virtual CustomAnimationEffectPtr findEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xNode ) const;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     virtual bool disposeShape( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
408cdf0e10cSrcweir     virtual void insertTextRange( const com::sun::star::uno::Any& aTarget );
409cdf0e10cSrcweir     virtual void disposeTextRange( const com::sun::star::uno::Any& aTarget );
410cdf0e10cSrcweir     virtual bool hasEffect( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
411cdf0e10cSrcweir     virtual void onTextChanged( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape );
412cdf0e10cSrcweir 
getInteractiveSequenceList() const413cdf0e10cSrcweir     const InteractiveSequenceList& getInteractiveSequenceList() const { return maInteractiveSequenceList; }
414cdf0e10cSrcweir 
415cdf0e10cSrcweir     virtual void notify_change();
416cdf0e10cSrcweir 
417cdf0e10cSrcweir     bool setTrigger( const CustomAnimationEffectPtr& pEffect, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xTriggerShape );
418cdf0e10cSrcweir 
419cdf0e10cSrcweir     /** starts a timer that recreates the internal structure from the API core after 1 second */
420cdf0e10cSrcweir     void startRecreateTimer();
421cdf0e10cSrcweir 
422cdf0e10cSrcweir     /** starts a timer that rebuilds the API core from the internal structure after 1 second */
423cdf0e10cSrcweir     void startRebuildTimer();
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const;
426cdf0e10cSrcweir     virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const;
427cdf0e10cSrcweir 
428cdf0e10cSrcweir protected:
429cdf0e10cSrcweir     /** permits rebuilds until unlockRebuilds() is called. All rebuild calls during a locked sequence are
430cdf0e10cSrcweir         process after unlockRebuilds() call. lockRebuilds() and unlockRebuilds() calls can be nested. */
431cdf0e10cSrcweir     void lockRebuilds();
432cdf0e10cSrcweir     void unlockRebuilds();
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     DECL_LINK( onTimerHdl, Timer * );
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     virtual void implRebuild();
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     void init();
439cdf0e10cSrcweir 
440cdf0e10cSrcweir     void createMainSequence();
441cdf0e10cSrcweir     virtual void reset();
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     InteractiveSequencePtr createInteractiveSequence( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xShape );
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     InteractiveSequenceList maInteractiveSequenceList;
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::util::XChangesListener > mxChangesListener;
448cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::animations::XTimeContainer > mxTimingRootNode;
449cdf0e10cSrcweir     Timer maTimer;
450cdf0e10cSrcweir     bool mbTimerMode;
451cdf0e10cSrcweir     bool mbRebuilding;
452cdf0e10cSrcweir 
453cdf0e10cSrcweir     long mnRebuildLockGuard;
454cdf0e10cSrcweir     bool mbPendingRebuildRequest;
455cdf0e10cSrcweir     sal_Int32 mbIgnoreChanges;
456cdf0e10cSrcweir };
457cdf0e10cSrcweir 
458cdf0e10cSrcweir typedef boost::shared_ptr< MainSequence > MainSequencePtr;
459cdf0e10cSrcweir 
460cdf0e10cSrcweir class MainSequenceRebuildGuard
461cdf0e10cSrcweir {
462cdf0e10cSrcweir public:
463cdf0e10cSrcweir     MainSequenceRebuildGuard( const MainSequencePtr& pMainSequence );
464cdf0e10cSrcweir     ~MainSequenceRebuildGuard();
465cdf0e10cSrcweir 
466cdf0e10cSrcweir private:
467cdf0e10cSrcweir     MainSequencePtr mpMainSequence;
468cdf0e10cSrcweir };
469cdf0e10cSrcweir 
470cdf0e10cSrcweir }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir #endif // _SD_CUSTOMANIMATIONEFFECT_HXX
473