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 #ifndef INCLUDED_SLIDESHOW_BASENODE_HXX
24*b1cdbd2cSJim Jagielski #define INCLUDED_SLIDESHOW_BASENODE_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx>
27*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
28*b1cdbd2cSJim Jagielski #include <osl/diagnose.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "event.hxx"
31*b1cdbd2cSJim Jagielski #include "animationnode.hxx"
32*b1cdbd2cSJim Jagielski #include "slideshowcontext.hxx"
33*b1cdbd2cSJim Jagielski #include "shapesubset.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp>
36*b1cdbd2cSJim Jagielski #include <vector>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski namespace slideshow {
39*b1cdbd2cSJim Jagielski namespace internal {
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski /** Context for every node.
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski     Besides the global AnimationNodeFactory::Context data,
44*b1cdbd2cSJim Jagielski     this struct also contains the current DocTree subset
45*b1cdbd2cSJim Jagielski     for this node. If start and end index of the
46*b1cdbd2cSJim Jagielski     DocTreeNode are equal, the node should use the
47*b1cdbd2cSJim Jagielski     complete shape.
48*b1cdbd2cSJim Jagielski */
49*b1cdbd2cSJim Jagielski struct NodeContext
50*b1cdbd2cSJim Jagielski {
NodeContextslideshow::internal::NodeContext51*b1cdbd2cSJim Jagielski     NodeContext( const SlideShowContext&                 rContext,
52*b1cdbd2cSJim Jagielski                  const ::basegfx::B2DVector&             rSlideSize )
53*b1cdbd2cSJim Jagielski         : maContext( rContext ),
54*b1cdbd2cSJim Jagielski           maSlideSize( rSlideSize ),
55*b1cdbd2cSJim Jagielski           mpMasterShapeSubset(),
56*b1cdbd2cSJim Jagielski           mnStartDelay(0.0),
57*b1cdbd2cSJim Jagielski           mbIsIndependentSubset( true )
58*b1cdbd2cSJim Jagielski         {}
59*b1cdbd2cSJim Jagielski 
disposeslideshow::internal::NodeContext60*b1cdbd2cSJim Jagielski     void dispose()
61*b1cdbd2cSJim Jagielski     {
62*b1cdbd2cSJim Jagielski         maContext.dispose();
63*b1cdbd2cSJim Jagielski         mpMasterShapeSubset.reset();
64*b1cdbd2cSJim Jagielski     }
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     /// Context as passed to createAnimationNode()
67*b1cdbd2cSJim Jagielski     SlideShowContext                 maContext;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     /// Size in user coordinate space of the corresponding slide
70*b1cdbd2cSJim Jagielski     ::basegfx::B2DVector             maSlideSize;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     /// Shape to be used (provided by parent, e.g. for iterations)
73*b1cdbd2cSJim Jagielski     ShapeSubsetSharedPtr             mpMasterShapeSubset;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski     /// Additional delay to node begin (to offset iterate effects)
76*b1cdbd2cSJim Jagielski     double                           mnStartDelay;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     /// When true, subset must be created during slide initialization
79*b1cdbd2cSJim Jagielski     bool                             mbIsIndependentSubset;
80*b1cdbd2cSJim Jagielski };
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski class BaseContainerNode;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski /** This interface extends AnimationNode with some
85*b1cdbd2cSJim Jagielski     file-private accessor methods.
86*b1cdbd2cSJim Jagielski */
87*b1cdbd2cSJim Jagielski class BaseNode : public AnimationNode,
88*b1cdbd2cSJim Jagielski                  public  ::osl::DebugBase<BaseNode>,
89*b1cdbd2cSJim Jagielski                  private ::boost::noncopyable
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski public:
92*b1cdbd2cSJim Jagielski     BaseNode( ::com::sun::star::uno::Reference<
93*b1cdbd2cSJim Jagielski               ::com::sun::star::animations::XAnimationNode> const& xNode,
94*b1cdbd2cSJim Jagielski               ::boost::shared_ptr<BaseContainerNode> const&        pParent,
95*b1cdbd2cSJim Jagielski               NodeContext const&                                   rContext );
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski     /** Provide the node with a shared_ptr to itself.
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski         Since implementation has to create objects which need
100*b1cdbd2cSJim Jagielski         a shared_ptr to this node, and a pointee cannot
101*b1cdbd2cSJim Jagielski         retrieve a shared_ptr to itself internally, have to
102*b1cdbd2cSJim Jagielski         set that from the outside.
103*b1cdbd2cSJim Jagielski     */
104*b1cdbd2cSJim Jagielski     void setSelf( const ::boost::shared_ptr< BaseNode >& rSelf );
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski #if defined(VERBOSE) && defined(DBG_UTIL)
108*b1cdbd2cSJim Jagielski     virtual void showState() const;
109*b1cdbd2cSJim Jagielski     virtual const char* getDescription() const;
110*b1cdbd2cSJim Jagielski     void showTreeFromWithin() const;
111*b1cdbd2cSJim Jagielski #endif
112*b1cdbd2cSJim Jagielski 
getParentNode() const113*b1cdbd2cSJim Jagielski     const ::boost::shared_ptr< BaseContainerNode >& getParentNode() const
114*b1cdbd2cSJim Jagielski         { return mpParent; }
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     // Disposable:
117*b1cdbd2cSJim Jagielski     virtual void dispose();
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski     // AnimationNode:
120*b1cdbd2cSJim Jagielski     virtual bool init();
121*b1cdbd2cSJim Jagielski     virtual bool resolve();
122*b1cdbd2cSJim Jagielski     virtual bool activate();
123*b1cdbd2cSJim Jagielski     virtual void deactivate();
124*b1cdbd2cSJim Jagielski     virtual void end();
125*b1cdbd2cSJim Jagielski     virtual ::com::sun::star::uno::Reference<
126*b1cdbd2cSJim Jagielski         ::com::sun::star::animations::XAnimationNode> getXAnimationNode() const;
127*b1cdbd2cSJim Jagielski     virtual NodeState getState() const;
128*b1cdbd2cSJim Jagielski     virtual bool registerDeactivatingListener(
129*b1cdbd2cSJim Jagielski         const AnimationNodeSharedPtr& rNotifee );
130*b1cdbd2cSJim Jagielski     // nop:
131*b1cdbd2cSJim Jagielski     virtual void notifyDeactivating( const AnimationNodeSharedPtr& rNotifier );
132*b1cdbd2cSJim Jagielski 
isMainSequenceRootNode() const133*b1cdbd2cSJim Jagielski     bool isMainSequenceRootNode() const { return mbIsMainSequenceRootNode; }
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski protected:
136*b1cdbd2cSJim Jagielski     void scheduleDeactivationEvent( EventSharedPtr const& pEvent =
137*b1cdbd2cSJim Jagielski                                     EventSharedPtr() );
138*b1cdbd2cSJim Jagielski 
getContext() const139*b1cdbd2cSJim Jagielski     SlideShowContext const&                 getContext() const { return maContext; }
getSelf() const140*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<BaseNode> const&    getSelf() const { return mpSelf; }
141*b1cdbd2cSJim Jagielski 
checkValidNode() const142*b1cdbd2cSJim Jagielski     bool checkValidNode() const {
143*b1cdbd2cSJim Jagielski         ENSURE_OR_THROW( mpSelf, "no self ptr set!" );
144*b1cdbd2cSJim Jagielski         bool const bRet = (meCurrState != INVALID);
145*b1cdbd2cSJim Jagielski         OSL_ENSURE( bRet, "### INVALID node!" );
146*b1cdbd2cSJim Jagielski         return bRet;
147*b1cdbd2cSJim Jagielski     }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski private:
150*b1cdbd2cSJim Jagielski     // all state affecting methods have "_st" counterparts being called at
151*b1cdbd2cSJim Jagielski     // derived classes when in state transistion: no-ops here at BaseNode...
152*b1cdbd2cSJim Jagielski     virtual bool init_st();
153*b1cdbd2cSJim Jagielski     virtual bool resolve_st();
154*b1cdbd2cSJim Jagielski     virtual void activate_st();
155*b1cdbd2cSJim Jagielski     virtual void deactivate_st( NodeState eDestState );
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski private:
158*b1cdbd2cSJim Jagielski     /// notifies
159*b1cdbd2cSJim Jagielski     /// - all registered deactivation listeners
160*b1cdbd2cSJim Jagielski     /// - single animation end (every node)
161*b1cdbd2cSJim Jagielski     /// - slide animations (if main sequence root node)
162*b1cdbd2cSJim Jagielski     void notifyEndListeners() const;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     /// Get the node's restart mode
165*b1cdbd2cSJim Jagielski     sal_Int16 getRestartMode();
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     /** Get the default restart mode
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski         If this node's default mode is
170*b1cdbd2cSJim Jagielski         AnimationRestart::DEFAULT, this method recursively
171*b1cdbd2cSJim Jagielski         calls the parent node.
172*b1cdbd2cSJim Jagielski     */
173*b1cdbd2cSJim Jagielski     sal_Int16 getRestartDefaultMode() const;
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     /// Get the node's fill mode
176*b1cdbd2cSJim Jagielski     sal_Int16 getFillMode();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski     /** Get the default fill mode.
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski         If this node's default mode is AnimationFill::DEFAULT,
181*b1cdbd2cSJim Jagielski         this method recursively calls the parent node.
182*b1cdbd2cSJim Jagielski     */
183*b1cdbd2cSJim Jagielski     sal_Int16 getFillDefaultMode() const;
184*b1cdbd2cSJim Jagielski 
isTransition(NodeState eFromState,NodeState eToState,bool debugAssert=true) const185*b1cdbd2cSJim Jagielski     bool isTransition( NodeState eFromState, NodeState eToState,
186*b1cdbd2cSJim Jagielski                        bool debugAssert = true ) const {
187*b1cdbd2cSJim Jagielski         (void) debugAssert; // avoid warning
188*b1cdbd2cSJim Jagielski         bool const bRet =((mpStateTransitionTable[eFromState] & eToState) != 0);
189*b1cdbd2cSJim Jagielski         OSL_ENSURE( !debugAssert || bRet, "### state unreachable!" );
190*b1cdbd2cSJim Jagielski         return bRet;
191*b1cdbd2cSJim Jagielski     }
192*b1cdbd2cSJim Jagielski 
inStateOrTransition(int mask) const193*b1cdbd2cSJim Jagielski     bool inStateOrTransition( int mask ) const {
194*b1cdbd2cSJim Jagielski         return ((meCurrState & mask) != 0 ||
195*b1cdbd2cSJim Jagielski                 (meCurrentStateTransition & mask) != 0);
196*b1cdbd2cSJim Jagielski     }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     class StateTransition;
199*b1cdbd2cSJim Jagielski     friend class StateTransition;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski private:
202*b1cdbd2cSJim Jagielski     SlideShowContext                                   maContext;
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski     typedef ::std::vector< AnimationNodeSharedPtr >    ListenerVector;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski     ListenerVector                                     maDeactivatingListeners;
207*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference<
208*b1cdbd2cSJim Jagielski         ::com::sun::star::animations::XAnimationNode > mxAnimationNode;
209*b1cdbd2cSJim Jagielski     ::boost::shared_ptr< BaseContainerNode >           mpParent;
210*b1cdbd2cSJim Jagielski     ::boost::shared_ptr< BaseNode >                    mpSelf;
211*b1cdbd2cSJim Jagielski     const int*                                         mpStateTransitionTable;
212*b1cdbd2cSJim Jagielski     const double                                       mnStartDelay;
213*b1cdbd2cSJim Jagielski     NodeState                                          meCurrState;
214*b1cdbd2cSJim Jagielski     int                                                meCurrentStateTransition;
215*b1cdbd2cSJim Jagielski     EventSharedPtr                                     mpCurrentEvent;
216*b1cdbd2cSJim Jagielski     const bool                                         mbIsMainSequenceRootNode;
217*b1cdbd2cSJim Jagielski };
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< BaseNode > BaseNodeSharedPtr;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski } // namespace internal
222*b1cdbd2cSJim Jagielski } // namespace slideshow
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski #endif /* INCLUDED_SLIDESHOW_BASENODE_HXX */
225*b1cdbd2cSJim Jagielski 
226