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