idlehomescreen/xmluicontroller/src/pmodtiterator.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluicontroller/src/pmodtiterator.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,205 @@
+/*
+* Copyright (c) 2006-2007 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:  DT iterator.
+*
+*/
+
+
+
+// INCLUDE FILES
+//#include    "xndomlist.h"
+#include    "xnnodeappif.h"
+
+#include    "pmodtiterator.h"
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Finds next sibling.
+// Returns NULL if there is no siblings left or there is no parent i.e this is a
+// root node
+// Returns: CXnDomNode* Pointer to the node or NULL
+//          
+// -----------------------------------------------------------------------------
+//
+
+static CXnNodeAppIf* NextSiblingL( CXnNodeAppIf& aNode )
+    {
+    CXnNodeAppIf* left( NULL );
+    CXnNodeAppIf* parent( NULL );
+    TRAP_IGNORE( parent = aNode.ParentL() );
+    if ( parent )
+        {
+        RPointerArray<CXnNodeAppIf> nodeList;
+        TRAP_IGNORE( nodeList = parent->ChildrenL() );
+        CleanupClosePushL( nodeList );
+        TInt currentIndex( nodeList.Find( &aNode ) );
+        TInt nextIndex( ++currentIndex );
+        TInt length( nodeList.Count() );
+        if ( nextIndex < length )  
+            {
+            left = nodeList[ nextIndex ];
+            }
+        CleanupStack::PopAndDestroy( &nodeList );
+        }
+    return left;     
+    }
+    
+    
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPmODTIterator::CPmODTIterator( CXnNodeAppIf& aRootNode  ):
+    iFirst(&aRootNode), iCurrent(&aRootNode)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPmODTIterator::ConstructL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// NewL
+// -----------------------------------------------------------------------------
+//
+CPmODTIterator* CPmODTIterator::NewL( CXnNodeAppIf& aRootNode )
+    {
+    CPmODTIterator* self = new( ELeave ) CPmODTIterator( aRootNode );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CPmODTIterator::~CPmODTIterator()
+    {
+    iDepthLevel.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// First node
+// -----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CPmODTIterator::First()
+    {
+    return iFirst;
+    }
+    
+// -----------------------------------------------------------------------------
+// Next node
+// -----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CPmODTIterator::NextL()
+    {
+    CXnNodeAppIf* firstChild( NULL );     
+    
+    //Initialise iCurrent if the whole tree has been walked through 
+    if (!iCurrent) 
+        {
+        iCurrent = iFirst;
+        }
+    RPointerArray<CXnNodeAppIf> children = iCurrent->ChildrenL();
+    if( children.Count() > 0 )
+        {
+        firstChild = children[0];
+        }
+    children.Close();
+        
+    // Current node has childs left
+    if (firstChild)
+        {
+        //Keep count of depth level
+        PushL( *iCurrent );
+        iCurrent = firstChild;
+        }
+    else //If current node has siblings left
+        {
+        SkipBranchL();
+        }
+    return iCurrent;
+    }
+
+// -----------------------------------------------------------------------------
+// SkipBranch
+// -----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CPmODTIterator::SkipBranchL()
+    {
+    CXnNodeAppIf* sibling = NextSiblingL(*iCurrent);
+    if(sibling)
+        {
+        iCurrent = sibling;    
+        }
+    else //Current node don't have any childs or siblings left
+        {
+        // Reverse the tree by moving up in hierarchy
+        // Move up one level in hierarchy and check if siblings exists or we are in a 
+        // root level
+        TBool stop( EFalse );
+        while( !stop && iDepthLevel.Count() )
+            {
+            iCurrent = Pop();                   //Reach the previous level
+            sibling = NextSiblingL( *iCurrent ); //Check if siblings exist
+            if ( sibling && iDepthLevel.Count() )
+                {
+                iCurrent = sibling;
+                stop = ETrue;
+                }
+            else                                //We didn't find any siblings
+                {
+                iCurrent = NULL;
+                }
+            }
+        }
+    return iCurrent;
+    }
+    
+// -----------------------------------------------------------------------------
+// Push node into stack.
+// -----------------------------------------------------------------------------
+//
+void CPmODTIterator::PushL( CXnNodeAppIf& aNode )
+    {
+    iDepthLevel.AppendL( &aNode );
+    }
+
+// -----------------------------------------------------------------------------
+// Pop node from stack.
+// -----------------------------------------------------------------------------
+//
+CXnNodeAppIf* CPmODTIterator::Pop()
+    {
+    CXnNodeAppIf* pop = NULL;
+    TInt count( iDepthLevel.Count() );
+    if ( count )
+        {
+        pop = iDepthLevel[ count-1 ];
+        iDepthLevel.Remove( count-1 );
+        }
+    return pop;    
+    }