mulwidgets/muldatamodel/src/multree.cpp
changeset 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/muldatamodel/src/multree.cpp	Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* 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:  MulTree Implementaiton
+*
+*/
+
+
+#include "multree.h"
+
+#include <stdexcept>
+
+#include "mulassert.h"
+#include "mulmodeldef.h"
+#include "muldatapath.h"
+
+namespace Alf
+	{
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// AddNode
+// -----------------------------------------------------------------------------
+//
+void MulTree::AddNode(const MulDataPath& aPath,int aIndex)
+	{
+	//Find parent node
+	MulTreeNode* node = FindNode( aPath );
+	
+	//update index of other child
+	for( int i = 0 ; i < node->ChildCount() ; i++ )
+		{
+		MulTreeNode* childNode = node->Child(i);
+		int index = childNode->Index();
+		if( childNode->Index() >= aIndex )
+			{
+			childNode->SetIndex( childNode->Index()+1 );
+			}
+		}	
+	
+	//insert node in to parent node
+	std::auto_ptr<MulTreeNode> childNode( new (EMM) MulTreeNode(aIndex));
+	node->InsertChild(childNode,aIndex);
+	}
+
+// -----------------------------------------------------------------------------
+// RemoveNode
+// -----------------------------------------------------------------------------
+//
+void MulTree::RemoveNode(const MulDataPath& aPath, int aIndex )
+	{
+	MulTreeNode* node = FindNode( aPath );
+	node->RemoveChild(aIndex);
+	
+	//update index of other child
+	for( int i = 0 ; i < node->ChildCount() ; i++ )
+		{
+		MulTreeNode* childNode = node->Child(i);
+		int index = childNode->Index();
+		if( childNode->Index() > aIndex )
+			{
+			childNode->SetIndex( childNode->Index()-1 );
+			}
+		}	
+	}
+
+// -----------------------------------------------------------------------------
+// FindNode
+// -----------------------------------------------------------------------------
+//
+MulTreeNode* MulTree::FindNode( const MulDataPath& aPath ) const
+	{	
+	MulTreeNode* currentNode = mRootNode.get();
+	for( int i = 0; i < aPath.Depth() ;i++ )
+		{
+		int index = aPath[i];
+		if( currentNode->HasChild() )
+			{
+			currentNode = FindChildNode( currentNode,index);
+			}
+		else
+			{
+			__MUL_ASSERT_DEBUG( false , KLInvalidArgument );
+			}
+		}
+	return currentNode;
+	}
+
+// -----------------------------------------------------------------------------
+// FindNode
+// -----------------------------------------------------------------------------
+//
+MulTreeNode* MulTree::FindChildNode(MulTreeNode* aParentNode,int aIndex) const
+	{
+	MulTreeNode* currentNode = aParentNode;
+	MulTreeNode* foundNode = NULL;
+	int index = 0; 
+	bool found(false);
+	int childCount = currentNode->ChildCount();
+	while( !found && index < childCount )
+		{	
+		MulTreeNode* childNode = currentNode->Child(index);
+		if( aIndex == childNode->Index() )
+			{
+			found = true;
+			foundNode = childNode;
+			}
+		index++;
+		}
+		
+	if( found == false )
+		{
+		__MUL_ASSERT_DEBUG( false , KLInvalidArgument );
+		}
+		
+	return foundNode;
+	}
+
+// -----------------------------------------------------------------------------
+// FindNode
+// -----------------------------------------------------------------------------
+//
+MulDataPath MulTree::FindNode( int aIndex ) const
+	{	
+	int absoluteIndex = -1;
+	return FindNode( mRootNode.get(), absoluteIndex, aIndex );	
+	}
+
+// -----------------------------------------------------------------------------
+// FindNode
+// -----------------------------------------------------------------------------
+//
+MulDataPath MulTree::FindNode( MulTreeNode* aNode, int& aAbsoluteIndex, int aIndex ) const
+	{	
+	MulTreeNode* currentNode = aNode;
+	if( currentNode->HasChild() )
+		{
+		for(int i = 0 ; i < currentNode->ChildCount() ; i++ )
+			{
+			aAbsoluteIndex++;
+			MulTreeNode* childNode = currentNode->Child(i);
+			
+#ifdef _DEBUG
+			bool hasChild = childNode->HasChild();
+			int count = childNode->ChildCount();
+			bool isExpanded = childNode->IsExpanded();
+#endif //_DEBUG
+			
+			if( aAbsoluteIndex == aIndex )
+				{
+				MulDataPath path= Path(*childNode);
+				path.SetIndex(i);
+				return path;
+				}
+			 else if( childNode->HasChild() && childNode->IsExpanded() )
+				{
+				MulDataPath path = FindNode( childNode, aAbsoluteIndex , aIndex );
+				if(path.Index() != KNotInitialized )
+					{
+					return path;
+					}
+				}			
+			}
+		}
+	//__MUL_ASSERT_DEBUG( false , KLInvalidArgument );
+	MulDataPath path;
+	path.SetIndex(KNotInitialized);
+	return path; 
+	}
+
+// -----------------------------------------------------------------------------
+// Path
+// -----------------------------------------------------------------------------
+//
+MulDataPath MulTree::Path(MulTreeNode& aNode) const
+	{
+	MulTreeNode* parentNode = aNode.Parent();
+	std::vector<int> pathArray;
+	while( parentNode && parentNode != mRootNode.get() )
+		{
+		int index = parentNode->Index();
+		pathArray.push_back( parentNode->Index() );
+		parentNode = parentNode->Parent();
+		}
+	
+	int count = pathArray.size();
+	
+	MulDataPath path;
+	for( int i= pathArray.size()- 1 ; i >=0 ; i-- )
+		{
+		path.Append( pathArray[i] );
+		}
+	pathArray.clear();
+	return path;
+	}
+
+// -----------------------------------------------------------------------------
+// NodeCount
+// -----------------------------------------------------------------------------
+//
+int MulTree::NodeCount() const
+	{
+	int nodeCount =NodeCount( mRootNode.get() );
+	return nodeCount;
+	}
+
+// -----------------------------------------------------------------------------
+// NodeCount
+// -----------------------------------------------------------------------------
+//
+int MulTree::NodeCount(MulTreeNode* aCurrentNode ) const
+	{
+	int nodeCount = 0;
+	if(aCurrentNode->HasChild())
+		{
+		nodeCount = aCurrentNode->ChildCount();
+		for(int i=0;i< aCurrentNode->ChildCount();i++)
+			{
+			nodeCount+= NodeCount(aCurrentNode->Child(i));
+			}
+		}
+	return nodeCount;
+	}
+
+// -----------------------------------------------------------------------------
+// ExpandedNodeCount
+// -----------------------------------------------------------------------------
+//
+int MulTree::ExpandedNodeCount() const
+	{
+	int nodeCount = ExpandedNodeCount( mRootNode.get() );
+	return nodeCount;
+	}
+
+// -----------------------------------------------------------------------------
+// ExpandedNodeCount
+// -----------------------------------------------------------------------------
+//
+int MulTree::ExpandedNodeCount(MulTreeNode* aCurrentNode ) const
+	{
+	int nodeCount = 0;
+	if( aCurrentNode->HasChild() && aCurrentNode->IsExpanded() )
+		{
+		nodeCount = aCurrentNode->ChildCount();
+		for( int i=0; i< aCurrentNode->ChildCount() ; i++ )
+			{
+			nodeCount+= ExpandedNodeCount( aCurrentNode->Child(i) );
+			}
+		}
+	return nodeCount;
+	}
+
+// -----------------------------------------------------------------------------
+// NodeIndex
+// -----------------------------------------------------------------------------
+//
+int MulTree::NodeIndex( const MulDataPath& aPath, int aIndex ) const
+	{
+	MulDataPath path( aPath );
+	path.SetIndex( aIndex );
+	
+	int absoluteIndex = -1;
+	int index = NodeIndex( mRootNode.get(), path, absoluteIndex );
+	
+	return index;
+	}
+
+// -----------------------------------------------------------------------------
+// NodeIndex
+// -----------------------------------------------------------------------------
+//
+int MulTree::NodeIndex( MulTreeNode* aCurrentNode, const MulDataPath& aPath, int& aAbsoluteIndex ) const
+	{	
+	MulTreeNode* currentNode = aCurrentNode;
+	if( currentNode->HasChild() )
+		{
+		for(int i = 0 ; i < currentNode->ChildCount() ; i++ )
+			{
+			aAbsoluteIndex++;
+			MulTreeNode* childNode = currentNode->Child(i);
+			
+#ifdef _DEBUG
+			bool hasChild = childNode->HasChild();
+			int count = childNode->ChildCount();
+			bool isExpanded = childNode->IsExpanded();
+#endif //_DEBUG
+			
+			MulDataPath path = Path(*childNode);
+			path.SetIndex(i);
+			
+			if( path.IsEqual(aPath) )
+				{
+				return aAbsoluteIndex;
+				}
+			 else if( childNode->HasChild() && childNode->IsExpanded() )
+				{
+				int index = NodeIndex( childNode, aPath, aAbsoluteIndex );
+				if( index != KNotInitialized )
+					{
+					return index;
+					}
+				}			
+			}
+		}
+	return KNotInitialized; 
+	}
+		
+	} //namespace Alf
+	
+	//End of file