--- /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 <eikbtgpc.h> // CEikButtonGroupContainer
+#include <avkon.hrh>
+
+#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