diff -r 000000000000 -r f72a12da539e idlehomescreen/xmluicontroller/src/pmodtiterator.cpp --- /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 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 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; + }