diff -r 000000000000 -r ca436256272f profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileIndexHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileIndexHandler.cpp Thu Dec 17 08:45:58 2009 +0200 @@ -0,0 +1,235 @@ +/* +* Copyright (c) 2002 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: Profile index handler (for use of Settings Container +* if multiple profiles are edited) +* +*/ + + +// INCLUDES +#include "CProfileIndexHandler.h" + +#include +#include + +#include "CProfileEngineHandler.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::CProfileIndexHandler +// C++ constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CProfileIndexHandler::CProfileIndexHandler( + CProfileEngineHandler& aEngineHandler ) + : iEngineHandler( aEngineHandler ) + { + } + +void CProfileIndexHandler::ConstructL() + { + } + +EXPORT_C CProfileIndexHandler* CProfileIndexHandler::NewL( + CProfileEngineHandler& aEngineHandler ) + { + CProfileIndexHandler* self = + new( ELeave ) CProfileIndexHandler( aEngineHandler ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CProfileIndexHandler::~CProfileIndexHandler() + { + iIndexArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::CurrentProfileIndex +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CProfileIndexHandler::CurrentProfileIndex() const + { + return iCurrentProfileIndex; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::SetCurrentProfileIndex +// Note that there is no boundary checking. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CProfileIndexHandler::SetCurrentProfileIndex( TInt aIndex ) + { + iCurrentProfileIndex = aIndex; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::CreateIndexArrayL +// Resets the index array and populates it with zeroes +// ----------------------------------------------------------------------------- +// +void CProfileIndexHandler::CreateIndexArrayL() + { + iIndexArray.Reset(); + TItem item = { 0, 0 }; + TInt count( iEngineHandler.IdArray()->MdcaCount() ); + while( --count >= 0 ) + { + User::LeaveIfError( iIndexArray.Append( item ) ); + } + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::StoreIndices +// ----------------------------------------------------------------------------- +// +void CProfileIndexHandler::StoreIndices() + { + if( !iListBox ) + { + return; + } + + TItem& item = iIndexArray[iCurrentProfileIndex]; + item.iIndex = iListBox->View()->CurrentItemIndex(); + item.iTopIndex = iListBox->View()->TopItemIndex() - item.iIndex; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::LoadIndices +// ----------------------------------------------------------------------------- +// +void CProfileIndexHandler::LoadIndices() + { + if( !iListBox ) + { + return; + } + + const TInt KMaxLastIndex( 2 ); // Three items fit to screen at the same time + + TInt lastIndex( iListBox->Model()->MatchableTextArray()->MdcaCount() - 1 ); + + TItem item = iIndexArray[iCurrentProfileIndex]; + if( item.iIndex > lastIndex ) + { + item.iIndex = lastIndex; + } + if( item.iIndex < 0 ) + { + item.iIndex = 0; + } + item.iTopIndex += item.iIndex; + if( item.iTopIndex > lastIndex - KMaxLastIndex ) + { + item.iTopIndex = lastIndex - KMaxLastIndex; + } + if( item.iTopIndex < 0 ) + { + item.iTopIndex = 0; + } + + iListBox->View()->SetCurrentItemIndex( item.iIndex ); + iListBox->View()->SetTopItemIndex( item.iTopIndex ); + iListBox->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::IndexAt +// ----------------------------------------------------------------------------- +// +TInt CProfileIndexHandler::IndexAt( TInt aIndex ) const + { + return iIndexArray[aIndex].iIndex; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::TopIndexAt +// ----------------------------------------------------------------------------- +// +TInt CProfileIndexHandler::TopIndexAt( TInt aIndex ) const + { + return iIndexArray[aIndex].iTopIndex; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::RemoveAndInsert +// ----------------------------------------------------------------------------- +// +TInt CProfileIndexHandler::RemoveAndInsert( + TInt aOldIndex, TInt aNewIndex, TInt aIndexValue, TInt aTopIndexValue ) + { + TInt count( iIndexArray.Count() ); + if( aOldIndex < 0 || aOldIndex >= count ) + { + return KErrNotFound; + } + if( aNewIndex < 0 || aNewIndex > count ) + { + return KErrArgument; + } + iIndexArray.Remove( aOldIndex ); + TItem item = { aIndexValue, aTopIndexValue }; + iIndexArray.Insert( item, aNewIndex ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::SetListBox +// ----------------------------------------------------------------------------- +// +void CProfileIndexHandler::SetListBox( CEikListBox* aListBox ) + { + iListBox = aListBox; + } + +// ----------------------------------------------------------------------------- +// CProfileIndexHandler::ReadIdArrayAndUpdateL +// ----------------------------------------------------------------------------- +// +TInt CProfileIndexHandler::ReadIdArrayAndUpdateL() + { + // Index of the profile before the engine rearranges the profiles. + TInt oldProfileIndex( iCurrentProfileIndex ); + + // ID of the profile so that we can find it after the engine + // rearranges the profiles. + TInt profileId( iEngineHandler.IdForIndex( oldProfileIndex ) ); + + // Store the indices for edited profile. + StoreIndices(); + + TInt newItemIndex( IndexAt( oldProfileIndex ) ); + TInt newTopItemIndex( TopIndexAt( oldProfileIndex ) ); + + // Refresh profile names. Order of the profiles may change. + iEngineHandler.ReadIdArrayL(); + + // Find out which of the profiles is now the edited profile + TInt newProfileIndex( iEngineHandler.IdArray()->FindById( profileId ) ); + + // Set it to current profile + SetCurrentProfileIndex( newProfileIndex ); + + // Update indices + User::LeaveIfError( RemoveAndInsert( oldProfileIndex, newProfileIndex, + newItemIndex, newTopItemIndex ) ); + + return newProfileIndex; + } + +// End of File