/** Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved.* This component and the accompanying materials are made available* under the terms of "Eclipse Public License v1.0"* which accompanies this distribution, and is available* at the URL "http://www.eclipse.org/legal/epl-v10.html".** Initial Contributors:* Nokia Corporation - initial contribution.** Contributors:** Description: Header for MulTree**/#ifndef MULTREE_H_#define MULTREE_H_#include <memory>#include <vector>#include <osn/osnnew.h>namespace Alf {//Forward declarationclass MulDataPath;class MulTreeNode {public: /** * Constuctor * * @param aIndex Index of this node */ MulTreeNode( int aIndex ) { mParent = NULL; mExpandedState = false; mIndex = aIndex; } /** * Constuctor * * @param aParent Parent node for this node. Node dosent take ownership of aParent * @param aIndex Index of this node */ MulTreeNode( MulTreeNode* aParent, int aIndex ) { mParent = aParent; mExpandedState = false; mIndex = aIndex; } /** * Destructor */ ~MulTreeNode() { int count = mChilds.size(); for(int i = 0 ; i < count ; ++i ) { delete Child(i); } mChilds.clear(); } /** * Insert child node in this node at given index * * @param aChild Child node.Takes ownership of aChild * @param aIndex index at which child node to be inserted */ void InsertChild( std::auto_ptr<MulTreeNode> aChild, int aIndex ) { aChild->mParent = this; mChilds.insert( mChilds.begin() + aIndex, aChild.get() ); aChild.release(); } /** * Remove child node from this node. * * @param aIndex Index of child that need to be removed */ void RemoveChild( int aIndex ) { MulTreeNode* childNode = Child(aIndex); delete childNode; childNode = NULL; mChilds.erase( mChilds.begin() + aIndex ); } /** * Number of child node that this node contains * * @return Number of childs */ int ChildCount() const { return mChilds.size(); } /** * Return child node at given index * * @param aIndex index of child node * @return Child node at given index */ MulTreeNode* Child( int aIndex ) { //At checks for out of bound condition we dont need to check again return mChilds.at(aIndex); } /** * Check that weather this node is parent node and has any childs * * @retrun true if node has cilds false otherwise */ bool HasChild() const { return ( ChildCount() > 0 ); } /** * Return parent of this node * * @return Parent of node */ MulTreeNode* Parent() const { return mParent; } /** * Set Index of node to current path * * @param aIndex index of node */ void SetIndex( int aIndex ) { mIndex = aIndex; } /** * Return index of node * * @return index of node. */ int Index() const { return mIndex; } /** * Expand or unexpand node. * * @param aExpendedState New state of node */ void SetExpanded( bool aExpandedState ) { mExpandedState = aExpandedState; } /** * Return weather this node is expended or not * * @return true if expended, false otherwise */ bool IsExpanded() const { return mExpandedState; }private: MulTreeNode* mParent; //not own int mIndex; bool mExpandedState; std::vector<MulTreeNode*> mChilds; //owns all children };class MulTree {public: //Constructor and Destructor /** * C++ Constructor */ MulTree() { //create root node for tree mRootNode.reset( new (EMM) MulTreeNode(0) ); mRootNode->SetExpanded( true ); mRootNode->SetIndex(0); } /** * Destructor */ ~MulTree() { }public: //New method /** * Create new node at specified index * * @param aPath Path to parent node * @param aIndex Position at which node to be inserted in parent node */ void AddNode( const MulDataPath& aPath, int aIndex ); /** * Remove node from specified index * * @param aPath Path to parent node * @param aIndex Posiotin at which node to be remove from parent node */ void RemoveNode( const MulDataPath& aPath, int aIndex ); /** * Finds node with specified path * * @param aPath path of node to be find * @return Node does not return ownership */ MulTreeNode* FindNode( const MulDataPath& aPath ) const; /** * Finds node with specified index in specified node * * @param aParentNode Parent node in which search required to be made * @param aIndex Index of node to be find * @return Node does not return ownership */ MulTreeNode* FindChildNode( MulTreeNode* aParentNode, int aIndex ) const; /** * Find node with specified absolute index and return path to that node. * * @param aIndex Index of node * @return Path to node */ MulDataPath FindNode( int aIndex ) const; /** * Create and return path for given node * * @param aNode Node of which path is required * @return Path of node */ MulDataPath Path( MulTreeNode& aNode ) const; /** * Return number of node this tree contains * * @return Number of nodes */ int NodeCount() const; /** * Return number of node this node branch * * @return Number of nodes */ int NodeCount(MulTreeNode* aCurrentNode ) const; /** * Return number of items, * Checks that node is expanded or not, * if expanded then add it counts child count else ignore child count. * * @return Node count */ int ExpandedNodeCount() const; /** * Return number of items, * Checks that node is expanded or not, * if expanded then add it couts child count else ignore child count. * * @param aCurrentNode Node of which count is needed * * @return Node count */ int ExpandedNodeCount(MulTreeNode* aCurrentNode ) const; /** * Returns node's absolute index * * @param aPath Path to node * @param aIndex index of node in path * @return position of node in whole tree */ int NodeIndex( const MulDataPath& aPath, int aIndex ) const;private: /** * Find node with specified absolute index and return path to that node. * * @param aNode Node in which index to be find * @param aIndex Index of node * @return Path to node */ MulDataPath FindNode( MulTreeNode* aNode, int& aAbsoluteIndex, int aIndex ) const; /** * Returns node's absolute index * * @param aCurrentNode Node to compare path with * @param aPath Path of node which absolute index is required * @param aAbsoluteIndex Counter variable * @return position of node in whole tree */ int NodeIndex( MulTreeNode* aCurrentNode, const MulDataPath& aPath,int& aAbsoluteIndex ) const;private: //data std::auto_ptr<MulTreeNode> mRootNode; //root of tree - owned }; } //namespace Alf#endif /*MULTREE_H_*/