/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef INCLUDED_SLIDESHOW_ANIMATIONNODE_HXX
#define INCLUDED_SLIDESHOW_ANIMATIONNODE_HXX

#include "disposable.hxx"

#include <com/sun/star/animations/XAnimationNode.hpp>
#include <boost/shared_ptr.hpp>

namespace slideshow {
namespace internal {

/** This interface is used to mirror every XAnimateNode object 
    in the presentation core.
*/
class AnimationNode : public Disposable
{
public:
    /** The current state of this AnimationNode
     */
    enum NodeState {
        /// Invalid state, node is disposed or otherwise invalid
        INVALID      =0,
        /// Unresolved start time
        UNRESOLVED   =1,
        /// Resolved start time, node will start eventually
        RESOLVED     =2,
        /// Node is active
        ACTIVE       =4,
        /// Node is frozen (no longer active, but changes remain in place)
        FROZEN       =8,
        /// Node has completed an active lifecycle,
        /// and any effect is removed from the document
        ENDED       =16
    };
    
    /** Query the corresponding XAnimationNode.
     */
    virtual ::com::sun::star::uno::Reference< 
        ::com::sun::star::animations::XAnimationNode >
    getXAnimationNode() const = 0;
    
    /** Init this node
        
        If this node is not in state INVALID, init() sets up the
        node state and schedules necessary events.
        If this node has children, they have their init() called, too.
        You will call this method whenever a slide is going to be
        shown.
        
        @return true, if init was successful; state has changed to UNRESOLVED
    */
    virtual bool init() = 0;
    
    /** Resolve node start time
        
        Nodes can have unresolved start times, i.e. indefinite
        start time for container nodes, or child nodes whose
        parent has not yet started. Calling this method fixes
        the node's start time. This does not mean that this
        node immediately starts its animations, that is only
        the case for begin=0.0. The node will change its state
        to RESOLVED.
        
        @return true, if a start event was successfully scheduled.
    */
    virtual bool resolve() = 0;
    
    /** Immediately start this node
        
        This method starts the animation on this node, without
        begin timeout. The node will change its state to ACTIVE.
        
        @return true, if start was successful. This method
        might return false, if e.g. a restart is not permitted
        on this node.
    */
    virtual bool activate() = 0;
    
    /** Immediately stop this node
        
        This method stops the animation on this node. The node
        will change its state to either ENDED or FROZEN,
        depending on XAnimationNode attributes.
    */
    virtual void deactivate() = 0;
    
    /** End the animation on this node
        
        This method force-ends animation on this node. Parents
        may call this for their children, if their active
        duration ends. An ended animation will no longer have
        any effect on the shape attributes. The node will
        change its state to ENDED.
    */
    virtual void end() = 0;
    
    /** Query node state
        
        @return the current state of this animation node.
    */
    virtual NodeState getState() const = 0;
    
    /** Register a deactivating listener
        
        This method registers another AnimationNode as an
        deactivating listener, which gets notified via a
        notifyDeactivating() call. The node calls all
        registered listener, when it leaves the ACTIVE state.
        
        @param rNotifee AnimationNode to notify
    */
    virtual bool registerDeactivatingListener(
        const ::boost::shared_ptr< AnimationNode >& rNotifee ) = 0;
    
    /** Called to notify another AnimationNode's deactivation
        
        @param rNotifier The instance who calls this method.
    */
    virtual void notifyDeactivating(
        const ::boost::shared_ptr< AnimationNode >& rNotifier ) = 0;
    
    /** Query node whether it has an animation pending.
        
        @return true, if this node (or at least one of its children)
        has an animation pending. Used to determine if the main
        sequence is actually empty, or contains effects
    */
    virtual bool hasPendingAnimation() const = 0;
};

typedef ::boost::shared_ptr< AnimationNode > AnimationNodeSharedPtr;

} // namespace internal
} // namespace presentation

#endif /* INCLUDED_SLIDESHOW_ANIMATIONNODE_HXX */

