diff -r 000000000000 -r 2f259fa3e83a commonuis/CommonDialogs/src/CAknFileSelectionEventHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonuis/CommonDialogs/src/CAknFileSelectionEventHandler.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,387 @@ +/* +* Copyright (c) 2002-2006 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: ?Description +* +*/ + + +// INCLUDES +#include "CAknFileSelectionEventHandler.h" + +#include // CEikButtonGroupContainer +#include + +#include "CAknFileSelectionModel.h" +#include "MAknFileSelectionObserver.h" +#include "AknCFDUtility.h" + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::CAknFileSelectionEventHandler +// +// +// ----------------------------------------------------------------------------- +// +CAknFileSelectionEventHandler::CAknFileSelectionEventHandler( + CCoeEnv* aCoeEnv, + CAknFileSelectionModel* aModel, + const TCommonDialogType& aDialogType, + MAknFileSelectionObserver*& aObserver, + const HBufC*& aLeftSoftkeyFile, + const HBufC*& aLeftSoftkeyFolder, + const HBufC*& aRightSoftkeyRootFolder, + const HBufC*& aRightSoftkeySubfolder ) + : iCoeEnv( aCoeEnv ), + iModel( aModel ), + iDialogType( aDialogType ), + iObserver( aObserver ), + iLeftSoftkeyFile( aLeftSoftkeyFile ), + iLeftSoftkeyFolder( aLeftSoftkeyFolder ), + iRightSoftkeyRootFolder( aRightSoftkeyRootFolder ), + iRightSoftkeySubfolder( aRightSoftkeySubfolder ) + { + ResetSoftkeyStatus(); + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CAknFileSelectionEventHandler::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::NewL +// +// ----------------------------------------------------------------------------- +// +CAknFileSelectionEventHandler* CAknFileSelectionEventHandler::NewL( + CCoeEnv* aCoeEnv, + CAknFileSelectionModel* aModel, + const TCommonDialogType& aDialogType, + MAknFileSelectionObserver*& aObserver, + const HBufC*& aLeftSoftkeyFile, + const HBufC*& aLeftSoftkeyFolder, + const HBufC*& aRightSoftkeyRootFolder, + const HBufC*& aRightSoftkeySubfolder ) + { + CAknFileSelectionEventHandler* self = new( ELeave ) CAknFileSelectionEventHandler( + aCoeEnv, aModel, aDialogType, aObserver, + aLeftSoftkeyFile, aLeftSoftkeyFolder, aRightSoftkeyRootFolder, aRightSoftkeySubfolder ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// Destructor +CAknFileSelectionEventHandler::~CAknFileSelectionEventHandler() + { + } + + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::PushIndicesL +// +// +// ----------------------------------------------------------------------------- +// +void CAknFileSelectionEventHandler::PushIndicesL( TInt aTopIndex, TInt aFocus ) + { + TFocusItem* item = new( ELeave ) TFocusItem( aTopIndex, aFocus ); + CleanupStack::PushL( item ); + iStack.PushL( item ); + CleanupStack::Pop(); + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::PopIndices +// +// +// ----------------------------------------------------------------------------- +// +void CAknFileSelectionEventHandler::PopIndices( TInt& aTopIndex, TInt& aFocus ) + { + if( iStack.IsEmpty() ) + { + aTopIndex = 0; + aFocus = 0; + return; + } + TFocusItem* item = iStack.Pop(); + aTopIndex = item->iTopIndex; + aFocus = item->iFocus; + delete item; + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::ResetSoftkeyStatus +// +// +// ----------------------------------------------------------------------------- +// +void CAknFileSelectionEventHandler::ResetSoftkeyStatus() + { + iCurrentLeftSoftkey = EFirstTime; + iCurrentRightSoftkey = EFirstTime; + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::UpdateSoftkeysL +// +// +// ----------------------------------------------------------------------------- +// +void CAknFileSelectionEventHandler::UpdateSoftkeysL( TInt aCurrentItemIndex, + CEikButtonGroupContainer* aContainer ) + { + if( !aContainer ) + { + return; + } + TBool needDrawing( EFalse ); + TSoftkeyStatus targetLeftSoftkey( ESKNotVisible ); + TSoftkeyStatus targetRightSoftkey( ESKNotVisible ); + + // Solve correct left softkey + if( iModel->MdcaCount() > 0 ) + { + if( ( aCurrentItemIndex == 0 ) && + ( AknCFDUtility::DirectoriesOnly( iDialogType ) ) ) + { + targetLeftSoftkey = ESKFileFocused; + } + else + { + if( iModel->Entry( aCurrentItemIndex ).IsDir() ) + { + targetLeftSoftkey = ESKFolderFocused; + } + else + { + targetLeftSoftkey = ESKFileFocused; + } + } + } + + // Solve correct right softkey + if( iModel->DirectoryLevel() > 0 ) + { + targetRightSoftkey = ESKInSubfolder; + } + else + { + targetRightSoftkey = ESKInRootFolder; + } + + MEikButtonGroup* bg = aContainer->ButtonGroup(); + + // Change left softkey text if needed + if( targetLeftSoftkey != iCurrentLeftSoftkey ) + { + TInt commandId( bg->CommandId( 0 ) ); // Left softkey command id + switch( targetLeftSoftkey ) + { + case ESKFileFocused: + { + aContainer->SetCommandL( commandId, *iLeftSoftkeyFile ); + break; + } + case ESKFolderFocused: + { + aContainer->SetCommandL( commandId, *iLeftSoftkeyFolder ); + break; + } + case ESKNotVisible: + { + aContainer->SetCommandL( commandId, KNullDesC ); + break; + } + default: + { + break; + } + } + needDrawing = ETrue; + iCurrentLeftSoftkey = targetLeftSoftkey; + } + + // Change right softkey text if needed + if( targetRightSoftkey != iCurrentRightSoftkey ) + { + TInt commandId( bg->CommandId( 2 ) ); // Right softkey command id + switch( targetRightSoftkey ) + { + case ESKInRootFolder: + { + aContainer->SetCommandL( commandId, *iRightSoftkeyRootFolder ); + break; + } + case ESKInSubfolder: + { + aContainer->SetCommandL( commandId, *iRightSoftkeySubfolder ); + break; + } + case ESKNotVisible: + { + aContainer->SetCommandL( commandId, KNullDesC ); + break; + } + default: + { + break; + } + } + needDrawing = ETrue; + iCurrentRightSoftkey = targetRightSoftkey; + } + + // Redraw if necessary + if( needDrawing ) + { + aContainer->DrawNow(); + } + } + +// ----------------------------------------------------------------------------- +// CAknFileSelectionEventHandler::HandleEventL +// +// +// ----------------------------------------------------------------------------- +// +MAknCommonDialogsEventObserver::TAction CAknFileSelectionEventHandler::HandleEventL( + TEvent aEvent, + TInt& aFocusedItemIndex, + TInt& aTopItemIndex, + CEikButtonGroupContainer* aContainer ) + { + + // Default action is did nothing + TAction returnType( EDidNothing ); + // Cache entry count + TInt entries( iModel->MdcaCount() ); + + //TEntry entry; + + if( entries > 0 ) + { + iEntry = iModel->Entry( aFocusedItemIndex ); + } + + switch( aEvent ) + { + case ERightSoftkeyPress: // USER HAS HIT RIGHT SOFTKEY + { + if( iModel->DirectoryLevel() > 0 ) // We are not in the root folder + { + while( ETrue ) // Find until existing contents + { + entries = iModel->GotoParentFolderL(); + PopIndices( aTopItemIndex, aFocusedItemIndex ); + if( entries > 0 || entries < KErrNotFound ) + { + break; + } + } + if( entries > 0 ) + { + if (aFocusedItemIndex >= entries) + { + aFocusedItemIndex = entries - 1; + } + UpdateSoftkeysL( aFocusedItemIndex, aContainer ); + returnType = EItemsUpdated; + } + } + else // We are in the root folder + { + returnType = ETryingToExit; + } + break; + } + + case ELeftSoftkeyPress: // USER HAS HIT LEFT SOFTKEY + case ESelectionKeyPress: // USER HAS HIT SELECTION KEY + case EEventClicked: + { + if( entries > 0 ) // There are entries in the directory + { + if( ( aFocusedItemIndex == 0 ) && ( AknCFDUtility::DirectoriesOnly( iDialogType ) ) ) + { + returnType = ETryingToExit; + break; + } + if( iEntry.IsDir() ) + { + entries = iModel->GotoSubFolderL( iEntry.iName ); + if ( ( entries == 0 ) && ( iDialogType == ECFDDialogTypeSelect ) ) + { + entries = iModel->GotoParentFolderL(); + returnType = ELaunchEmptyPopup; + } + else if ( entries >= KErrNone ) + { + PushIndicesL( aTopItemIndex, aFocusedItemIndex ); + // In new folder the focus is always on first item + aTopItemIndex = 0; + aFocusedItemIndex = 0; + UpdateSoftkeysL( aFocusedItemIndex, aContainer ); + returnType = EItemsUpdated; + } + } + else // The selected entry is a file + { + returnType = ETryingToExit; + } + } + break; + } + + case EFocusChange: // USER HAS HIT UP OR DOWN + { + UpdateSoftkeysL( aFocusedItemIndex, aContainer ); + break; + } + + default: + { + break; + } + } + if( ( returnType == ETryingToExit ) && ( aEvent != ERightSoftkeyPress ) ) + { + if( iObserver ) + { + //TPath path; + HBufC * bufPath = HBufC::NewLC(KMaxPath); + TPtr path = bufPath->Des(); + + iModel->GetCurrentPath( path ); + if( !iObserver->OkToExitL( path, iEntry ) ) + { + returnType = EDidNothing; + } + + CleanupStack::PopAndDestroy(); + } + } + return returnType; + } + +// End of File