diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/CommonUI/src/CPbk2ViewGraph.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/CommonUI/src/CPbk2ViewGraph.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,399 @@ +/* +* Copyright (c) 2005-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: Phonebook 2 view nodes and graphs. +* +*/ + + +// INCLUDE FILES +#include + +// System includes +#include // RResourceFile +#include // TResourceReader + +/// Unnamed namespace for local definitions +namespace { + +/** + * Comparison operator for TPbk2ViewTransition objects. + * + * @param aLeft Left hand side to compare. + * @param aRight Right hand side to compare. + * @return ETrue if the objects are equal, EFalse otherwise. + */ +inline TBool operator== + ( const TPbk2ViewTransition& aLeft, + const TPbk2ViewTransition& aRight ) + { + return ( aLeft.iEvent == aRight.iEvent && aLeft.iNode == aRight.iNode ); + } + +/** + * Compares tab group orderings. + * + * @param aLhs Left hand side (LHS). + * @param aRhs Right hand side (RHS). + * @return Positive integer if LHS is greater than RHS. + * Zero if LHS is equal to RHS. + * Negative integer if RHS is greater than LHS. + */ +TInt TabGroupOrdering + ( const CPbk2ViewNode& aLhs, const CPbk2ViewNode& aRhs ) + { + return ( aLhs.TabGroupOrdering() - aRhs.TabGroupOrdering() ); + } + +#ifdef _DEBUG + +enum TPaniCode + { + EPanic_NodeAlreadyExists = 1, + EPanic_FindViewsInTabGroupL_OOB + }; + +void Panic(TPaniCode aReason) + { + _LIT( KPanicText, "CPbk2ViewGraph" ); + User::Panic( KPanicText, aReason ); + } + +#endif // _DEBUG + +} /// namespace + + + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2ViewNode* CPbk2ViewNode::NewL( + TUid aViewId, + TUid aDefaultPrevViewId, + TBool aExitNode, + TPbk2TabGroupId aTabGroupId, + TPbk2TabGroupOrdering aTabGroupOrdering, + TInt aTabResourceId, + TResourceReader& aTransitionReader) + { + CPbk2ViewNode* self = new(ELeave) CPbk2ViewNode(aViewId, + aDefaultPrevViewId, aExitNode, aTabGroupId, aTabGroupOrdering, + aTabResourceId); + CleanupStack::PushL(self); + self->ReadTransitionsL(aTransitionReader); + CleanupStack::Pop(self); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::CPbk2ViewNode +// -------------------------------------------------------------------------- +// +CPbk2ViewNode::CPbk2ViewNode() : + iTransitions( 1 ) // Reallocation granularity of 1 + { + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::CPbk2ViewNode +// -------------------------------------------------------------------------- +// +CPbk2ViewNode::CPbk2ViewNode( + TUid aViewId, + TUid aDefaultPrevViewId, + TBool aExitNode, + TPbk2TabGroupId aTabGroupId, + TPbk2TabGroupOrdering aTabGroupOrdering, + TInt aTabResourceId) : + iViewId ( aViewId ), + iDefaultPrevViewId ( aDefaultPrevViewId ), + iExitNode ( aExitNode ), + iTransitions( 1 ), // Reallocation granularity of 1 + iTabGroupId ( aTabGroupId ), + iTabGroupOrdering ( aTabGroupOrdering ), + iTabResourceId ( aTabResourceId ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::~CPbk2ViewNode +// -------------------------------------------------------------------------- +// +CPbk2ViewNode::~CPbk2ViewNode() + { + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::FindTransition +// -------------------------------------------------------------------------- +// +EXPORT_C TBool CPbk2ViewNode::FindTransition + ( const TPbk2ViewTransition& aTransition ) const + { + for (TInt i=0; i < iTransitions.Count(); ++i) + { + if (iTransitions[i] == aTransition) + { + return ETrue; + } + } + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::FindTransition +// -------------------------------------------------------------------------- +// +TPbk2ViewTransition* CPbk2ViewNode::FindTransition + ( TPbk2ViewTransitionEvent aEvent ) + { + TPbk2ViewTransition* transition = NULL; + + for ( TInt i=0; i < iTransitions.Count(); ++i ) + { + if ( iTransitions[i].iEvent == aEvent ) + { + transition = &iTransitions[i]; + break; + } + } + return transition; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewNode::ReadTransitionsL +// -------------------------------------------------------------------------- +// +void CPbk2ViewNode::ReadTransitionsL( TResourceReader& aResReader ) + { + // read view transitions + TInt transCount = aResReader.ReadInt16(); // transitions[] + iTransitions.SetReserveL(transCount); + while (transCount-- > 0) + { + // read PBK2_VIEW_TRANSITION resource struct + aResReader.ReadInt8(); // read version number + TPbk2ViewTransition trans; + trans.iEvent = TPbk2ViewTransitionEvent(aResReader.ReadInt32()); + trans.iTargetViewId.iUid = aResReader.ReadInt32(); + trans.iNode = NULL; + iTransitions.AppendL(trans); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::~CPbk2ViewGraph +// -------------------------------------------------------------------------- +// +CPbk2ViewGraph::~CPbk2ViewGraph() + { + if (iNodes) + { + iNodes->ResetAndDestroy(); + } + delete iNodes; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2ViewGraph* CPbk2ViewGraph::NewL( TResourceReader& aResReader ) + { + CPbk2ViewGraph* self = new(ELeave) CPbk2ViewGraph; + CleanupStack::PushL(self); + self->ConstructL(aResReader); + CleanupStack::Pop(self); //self + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::ConstructL +// -------------------------------------------------------------------------- +// +void CPbk2ViewGraph::ConstructL( TResourceReader& aResReader ) + { + iNodes = new ( ELeave ) CPbk2ViewNodeArray( 1 ); + AppendNodesFromResourceL( aResReader ); + // unravel the view id's to pointers to view graph nodes + LinkNodesWithTransitions(); + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::FindNodeWithViewId +// -------------------------------------------------------------------------- +// +EXPORT_C CPbk2ViewNode* CPbk2ViewGraph::FindNodeWithViewId + ( TUid aViewId ) const + { + if (aViewId != KNullUid) + { + TInt count = iNodes->Count(); + while (count-- > 0) + { + CPbk2ViewNode* node = iNodes->At(count); + if (node->iViewId == aViewId) + { + return node; + } + } + } + return NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::ModifyViewGraphL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2ViewGraph::ModifyViewGraphL( + TResourceReader& aResReader ) + { + AppendNodesFromResourceL( aResReader ); + // unravel the view id's to pointers to view graph nodes + LinkNodesWithTransitions(); + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::AddViewNode +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2ViewGraph::AddViewNodeL( + CPbk2ViewNode* aNode) + { + __ASSERT_DEBUG(!FindNodeWithViewId(aNode->iViewId), + Panic(EPanic_NodeAlreadyExists)); + + iNodes->AppendL(aNode); + // unravel the view id's to pointers to view graph nodes + LinkNodesWithTransitions(); + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::FindViewsInTabGroupL +// returns the nodes in the tab group in the tab group sort order +// -------------------------------------------------------------------------- +// +EXPORT_C RPointerArray CPbk2ViewGraph::FindViewsInTabGroupL( + TPbk2TabGroupId aTabGroupId ) const + { + RPointerArray result; + CleanupClosePushL(result); + + TLinearOrder ordering(TabGroupOrdering); + const TInt count = Count(); + + __ASSERT_DEBUG( iNodes->Count() >= count, + Panic( EPanic_FindViewsInTabGroupL_OOB ) ); + + // loop through all the view graph nodes + for (TInt i = 0; i < count; ++i) + { + // if the tab group id is the one were looking for + // insert it into the result array + if (iNodes->At(i)->iTabGroupId == aTabGroupId) + { + result.InsertInOrder(iNodes->At(i), ordering); + } + } + CleanupStack::Pop(); // result + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::AppendNodesFromResourceL +// Appends the nodes from resource to iNodes. +// -------------------------------------------------------------------------- +// +void CPbk2ViewGraph::AppendNodesFromResourceL( TResourceReader& aResReader ) + { + // reads an array of PBK2_VIEW_NODE resource structures + TInt count = aResReader.ReadInt16(); + iNodes->SetReserveL(iNodes->Count() + count); + while (count-- > 0) + { + // create view node for each element in resource structure + CPbk2ViewNode* node = new(ELeave) CPbk2ViewNode; + CleanupStack::PushL(node); + + // read PBK2_VIEW_NODE resource struct + aResReader.ReadInt8(); // read version number + node->iViewId.iUid = aResReader.ReadInt32(); + node->iDefaultPrevViewId.iUid = aResReader.ReadInt32(); + node->iDefaultPreviousNode = NULL; + node->iPreviousNode = NULL; + node->iExitNode = aResReader.ReadInt8(); + + // read view transitions + node->ReadTransitionsL(aResReader); + + // read tab group id's and resource id's + node->iTabGroupId = TPbk2TabGroupId(aResReader.ReadInt32()); + node->iTabGroupOrdering = TPbk2TabGroupOrdering( + aResReader.ReadInt32() ); + // reads the link id of a PBK2_VIEW_NODE_TAB structure + node->iTabResourceId = aResReader.ReadInt32(); + + __ASSERT_DEBUG(!FindNodeWithViewId(node->iViewId), + Panic(EPanic_NodeAlreadyExists)); + iNodes->AppendL(node); + CleanupStack::Pop(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ViewGraph::LinkNodesWithTransitions +// -------------------------------------------------------------------------- +// +void CPbk2ViewGraph::LinkNodesWithTransitions() + { + // loop through all the view graph nodes + const TInt count( iNodes->Count() ); + for (TInt i = 0; i < count; ++i) + { + CPbk2ViewNode* node = iNodes->At(i); + // Find the nodes previous views node from the graph + // and set this nodes previous node pointer + node->iDefaultPreviousNode = FindNodeWithViewId + ( node->iDefaultPrevViewId ); + + // loop through the transitions of this node + TInt transCount = node->iTransitions.Count(); + while (transCount-- > 0) + { + TPbk2ViewTransition& trans = node->iTransitions.At(transCount); + switch (trans.iEvent) + { + // ignore left and right transitions + case EPbk2ViewTransitionLeft: + { + break; + } + case EPbk2ViewTransitionRight: + { + break; + } + default: + { + // find the transitions node pointer and set it to the + // transition node + trans.iNode = FindNodeWithViewId(trans.iTargetViewId); + break; + } + } + } + } + } + +// End of File