/**************************************************************
 * 
 * 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_DRAWSHAPESUBSETTING_HXX
#define INCLUDED_SLIDESHOW_DRAWSHAPESUBSETTING_HXX

#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>

#include "doctreenode.hxx"
#include "attributableshape.hxx"


class GDIMetaFile;

namespace slideshow
{
    namespace internal
    {
        /** This class encapsulates the subsetting aspects of a
            DrawShape.
         */
        class DrawShapeSubsetting : private boost::noncopyable
        {
        public:
            /** Create empty shape subset handling.

            	This method creates a subset handler which contains no
            	subset information. All methods will return default
            	values.

                @param rMtf
                Metafile to retrieve subset info from (must have been
                generated with verbose text comments switched on).                
             */
            DrawShapeSubsetting();

            /** Create new shape subset handling.

            	This method creates a subset handler which initially
            	displays the whole shape.

                @param rMtf
                Metafile to retrieve subset info from (must have been
                generated with verbose text comments switched on).                
             */
            explicit DrawShapeSubsetting( const ::boost::shared_ptr< GDIMetaFile >& rMtf );

            /** Create new shape subset handling.

            	@param rShapeSubset
                The subset this object represents (can be empty, then
                denoting 'represents a whole shape')

                @param rMtf
                Metafile to retrieve subset info from (must have been
                generated with verbose text comments switched on).                
             */
            DrawShapeSubsetting( const DocTreeNode&			 				rShapeSubset,
                                 const ::boost::shared_ptr< GDIMetaFile >&	rMtf );

            /** Reset metafile.

                Use this method to completely reset the
                ShapeSubsetting, with a new metafile. Note that any
                information previously set will be lost, including
                added subset shapes!

                @param rMtf
                Metafile to retrieve subset info from (must have been
                generated with verbose text comments switched on).                
             */
            void reset( const ::boost::shared_ptr< GDIMetaFile >&   rMtf );

            /** Reset metafile and subset.

                Use this method to completely reset the
                ShapeSubsetting, with a new metafile and subset
                range. Note that any information previously set will
                be lost, including added subset shapes!

            	@param rShapeSubset
                The subset this object represents (can be empty, then
                denoting 'represents a whole shape')

                @param rMtf
                Metafile to retrieve subset info from (must have been
                generated with verbose text comments switched on).                
             */
            void reset( const DocTreeNode&                          rShapeSubset,
                        const ::boost::shared_ptr< GDIMetaFile >&   rMtf );


            // Shape subsetting methods
            // ========================================================

            /// Return subset node for this shape
            DocTreeNode 				getSubsetNode		() const;

            /// Return true, if any child subset shapes exist
            bool		 				hasSubsetShapes		() const;

            /// Get subset shape for given node, if any
            AttributableShapeSharedPtr 	getSubsetShape		( const DocTreeNode& rTreeNode ) const;

            /// Add child subset shape (or increase use count, if already existent)
            void 						addSubsetShape		( const AttributableShapeSharedPtr& rShape );

            /** Revoke subset shape

            	This method revokes a subset shape, decrementing the
            	use count for this subset by one. If the use count
            	reaches zero (i.e. when the number of addSubsetShape()
            	matches the number of revokeSubsetShape() calls for
            	the same subset), the subset entry is removed from the
            	internal list, and subsequent getSubsetShape() calls
            	will return the empty pointer for this subset.

                @return true, if the subset shape was physically
                removed from the list (false is returned, when nothing
                was removed, either because only the use count was
                decremented, or there was no such subset found, in the
                first place).
             */
            bool 						revokeSubsetShape	( const AttributableShapeSharedPtr& rShape );


            // Doc tree methods
            // ========================================================

            /// Return overall number of nodes for given type
            sal_Int32 	getNumberOfTreeNodes		( DocTreeNode::NodeType eNodeType ) const;

            /// Return tree node of given index and given type
            DocTreeNode getTreeNode					( sal_Int32				nNodeIndex,
                                                      DocTreeNode::NodeType	eNodeType ) const;

            /// Return number of nodes of given type, below parent node
            sal_Int32 	getNumberOfSubsetTreeNodes	( const DocTreeNode& 	rParentNode,
                                                      DocTreeNode::NodeType eNodeType ) const;

            /// Return tree node of given index and given type, relative to parent node
            DocTreeNode getSubsetTreeNode			( const DocTreeNode& 	rParentNode,
                                                      sal_Int32				nNodeIndex,
                                                      DocTreeNode::NodeType	eNodeType ) const;
            
            // Helper
            // ========================================================

            /** Return a vector of currently active subsets.
                
            	Needed when rendering a shape, this method provides a
            	vector of subsets currently visible (the range as
            	returned by getEffectiveSubset(), minus the parts that
            	are currently hidden, because displayed by child
            	shapes).
             */
            const VectorOfDocTreeNodes& getActiveSubsets() const;

            /** This enum classifies each action index in the
                metafile.

                Of interest are, of course, the places where
                structural shape and/or text elements end. The
                remainder of the action gets classified as 'noop'
             */
            enum IndexClassificator
            {
                CLASS_NOOP,
                CLASS_SHAPE_START,
                CLASS_SHAPE_END,

                CLASS_LINE_END,
                CLASS_PARAGRAPH_END,
                CLASS_SENTENCE_END,
                CLASS_WORD_END,
                CLASS_CHARACTER_CELL_END
            };

            typedef ::std::vector< IndexClassificator > IndexClassificatorVector;

        private:
            /** Entry for subset shape

            	This struct contains data for every subset shape
            	generated. Note that for a given start/end action
            	index combination, only one subset instance is
            	generated (and reused for subsequent queries).
             */
            struct SubsetEntry
            {
                AttributableShapeSharedPtr	mpShape;
                sal_Int32					mnStartActionIndex;
                sal_Int32					mnEndActionIndex;

                /// Number of times this subset was queried, and not yet revoked
                int							mnSubsetQueriedCount;

                sal_Int32 getHashValue() const
                {
                    // TODO(Q3): That's a hack. We assume that start
                    // index will always be less than 65535 (if this
                    // assumption is violated, hash map performance
                    // will degrade severely)
                    return mnStartActionIndex*SAL_MAX_INT16 + mnEndActionIndex;
                }

                /// The shape set is ordered according to this method
                bool operator<(const SubsetEntry& rOther) const
                {
                    return getHashValue() < rOther.getHashValue();
                }
                
            };

            typedef ::std::set< SubsetEntry > 		ShapeSet;

            void ensureInitializedNodeTree() const;
            void updateSubsetBounds( const SubsetEntry& rSubsetEntry );
            void updateSubsets();
            void initCurrentSubsets();
            void reset();

            sal_Int32 	implGetNumberOfTreeNodes( const IndexClassificatorVector::const_iterator&	rBegin,
                                                  const IndexClassificatorVector::const_iterator&	rEnd,
                                                  DocTreeNode::NodeType 							eNodeType ) const;
            DocTreeNode implGetTreeNode( const IndexClassificatorVector::const_iterator&	rBegin,
                                         const IndexClassificatorVector::const_iterator&	rEnd,
                                         sal_Int32			 								nNodeIndex,
                                         DocTreeNode::NodeType								eNodeType ) const;

            mutable IndexClassificatorVector	maActionClassVector;

            /// Metafile to retrieve subset info from
            ::boost::shared_ptr< GDIMetaFile >	mpMtf;	

            /// Subset of the metafile represented by this object
            DocTreeNode                         maSubset;

            /// the list of subset shapes spawned from this one. 
            ShapeSet							maSubsetShapes;

            /// caches minimal subset index from maSubsetShapes
            sal_Int32							mnMinSubsetActionIndex;

            /// caches maximal subset index from maSubsetShapes
            sal_Int32							mnMaxSubsetActionIndex;

            /** Current number of subsets to render (calculated from
                maSubset and mnMin/MaxSubsetActionIndex).

                Note that this is generally _not_ equivalent to
                maSubset, as it excludes all active subset children!
             */
            mutable VectorOfDocTreeNodes		maCurrentSubsets;
            
            /// Whether the shape's doc tree has been initialized successfully, or not
            mutable bool						mbNodeTreeInitialized;
        };

    }
}

#endif /* INCLUDED_SLIDESHOW_DRAWSHAPESUBSETTING_HXX */
