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