/**************************************************************
 * 
 * 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_SHAPEMANAGER_HXX
#define INCLUDED_SLIDESHOW_SHAPEMANAGER_HXX

#include "disposable.hxx"
#include <com/sun/star/uno/Reference.hxx>
#include <boost/shared_ptr.hpp>

namespace com {  namespace sun { namespace star { namespace drawing {
    class XShape;
} } } }

/* Definition of ShapeManager interface */

namespace slideshow
{
    namespace internal
    {
        class HyperlinkArea;
        class AnimatableShape;
        class Shape;

        /** ShapeManager interface

            Implementers of this interface manage appearance and
            animation of slideshow shapes.
         */
        class ShapeManager : public Disposable
        {
        public:
            /** Notify the ShapeManager that the given Shape starts an
                animation now.

				This method enters animation mode for the Shape. If
				the shape is already in animation mode, the call is
				counted, and the shape only leaves animation mode
				after a corresponding number of leaveAnimationMode()
				calls.
             */
            virtual void enterAnimationMode( const boost::shared_ptr<AnimatableShape>& rShape ) = 0;

            /** Notify the ShapeManager that the given Shape is no
                longer animated.

				When called a corresponding number of times as
				enterAnimationMode() for a given shape, this methods
				ends animation mode for the given Shape. It is illegal
				to call this method more often than
				enterAnimationMode().
             */
            virtual void leaveAnimationMode( const boost::shared_ptr<AnimatableShape>& rShape ) = 0;

            /** Notify that a shape needs an update

            	This method notifies the ShapeManager that a shape
            	update is necessary. Use this if e.g. a running
            	animation changed the shape appearance.

                @param rShape
                Shape which needs an update
             */
            virtual void notifyShapeUpdate( const boost::shared_ptr<Shape>& rShape ) = 0;

            /** Lookup a Shape from an XShape model object

            	This method looks up the internal shape map for one
            	representing the given XShape.

                @param xShape
                The XShape object, for which the representing Shape
                should be looked up.
             */
            virtual boost::shared_ptr<Shape> lookupShape(
                ::com::sun::star::uno::Reference< 
                    ::com::sun::star::drawing::XShape > const & xShape ) const = 0;

            /** Register given shape as a hyperlink target

                @param rArea
                Hyperlink sensitive area. Will participate in
                hyperlink region lookup. Must be in absolute user
                space coordinates.
             */
            virtual void addHyperlinkArea( const boost::shared_ptr<HyperlinkArea>& rArea ) = 0;

            /** Unregister given shape as a hyperlink target

                @param rArea
                Hyperlink sensitive area. Will cease to participate in
                hyperlink region lookup.
             */
            virtual void removeHyperlinkArea( const boost::shared_ptr<HyperlinkArea>& rArea ) = 0;
        };

        typedef ::boost::shared_ptr< ShapeManager > ShapeManagerSharedPtr;
    }
}

#endif /* INCLUDED_SLIDESHOW_SHAPEMANAGER_HXX */
