diff -r 000000000000 -r 8466d47a6819 emailcontacts/contactactionmenu/src/cfsccontactactionmenuimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailcontacts/contactactionmenu/src/cfsccontactactionmenuimpl.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,642 @@ +/* +* Copyright (c) 2008 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: Implementation of the class CFscContactActionMenuImpl. +* +*/ + + +// INCUDES +#include "emailtrace.h" +#include +#include "cfsccontactactionservice.h" +#include +#include +#include +#include +#include +#include + +#include "cfsccontactactionmenuimpl.h" +#include "fsccontactactionmenuuids.hrh" +#include "cfsccontactactionmenumodelimpl.h" +#include "tfsccontactactionmenuconstructparameters.h" +#include "cfsccontactactionmenulist.h" +#include "cfsccontactactionmenuitemimpl.h" +#include "cfsccontactactionmenucasitemimpl.h" + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KFscContactActionMenuImplImpUid, + CFscContactActionMenuImpl::NewL ) + }; + + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::NewL +// --------------------------------------------------------------------------- +// +CFscContactActionMenuImpl* CFscContactActionMenuImpl::NewL( + TAny* aParams ) + { + FUNC_LOG; + + TFscContactActionMenuConstructParameters* params = + reinterpret_cast< TFscContactActionMenuConstructParameters* >( aParams ); + + CFscContactActionMenuImpl* self = + new (ELeave) CFscContactActionMenuImpl( *params ); + CleanupStack::PushL( self ); + self->ConstructL( *params ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::~CFscContactActionMenuImpl +// --------------------------------------------------------------------------- +// +CFscContactActionMenuImpl::~CFscContactActionMenuImpl() + { + FUNC_LOG; + delete iModel; + delete iList; + delete iWait; + delete iTextResolver; + delete iDummyMenuItem; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::ExecuteL +// --------------------------------------------------------------------------- +// +TFscActionMenuResult CFscContactActionMenuImpl::ExecuteL( + TFscContactActionMenuPosition aPosition, TInt aIndex, MFsActionMenuPositionGiver* aPositionGiver) + { + FUNC_LOG; + + // Initialise some member variables + iExit = EFalse; + iMenuResult = EFscMenuDismissed; + iError = KErrNone; + + // Check if menu is empty + if ( iModel->VisibleItemCount() > 0 ) + { + iList = CFscContactActionMenuList::NewL( + this, iModel, ( iMode == EFscContactActionMenuModeAI ), aPositionGiver, iOpenedFromMR ); + // Execute menu + TRAP( iError, DoExecuteL( aPosition, aIndex ) ); + + // Delete iList + iSelectedItemIndex = iList->SelectedItemIndex(); + delete iList; + iList = NULL; + + User::LeaveIfError( iError ); + } + + return iMenuResult; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::Dismiss +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::Dismiss( TBool aSlide ) + { + FUNC_LOG; + iExit = !aSlide; + iMenuResult = EFscMenuDismissed; + // cancel action execution if running + // needs to be canceled to close select popup dialog + if ( iIsActionExecuting ) + { + iModel->Service()->CancelExecute(); + iIsActionExecuting = EFalse; + } + + DoDismiss(); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::Model +// --------------------------------------------------------------------------- +// +MFscContactActionMenuModel& CFscContactActionMenuImpl::Model() + { + FUNC_LOG; + return *iModel; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::FocusedItemIndex +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuImpl::FocusedItemIndex() + { + FUNC_LOG; + TInt result = iSelectedItemIndex; + if ( iList != NULL ) + { + result = iList->SelectedItemIndex(); + } + return result; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::FocusedItem +// --------------------------------------------------------------------------- +// +CFscContactActionMenuItem& CFscContactActionMenuImpl::FocusedItem() + { + FUNC_LOG; + TInt i = FocusedItemIndex(); + TInt err = KErrNone; + + CFscContactActionMenuItem* focusedItem = NULL; + + TRAP( err, focusedItem = &(iModel->ItemL( i )) ); + if ( err != KErrNone ) + { + CCoeEnv::Static()->HandleError( err ); + focusedItem = iDummyMenuItem; + } + + return *focusedItem; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::HandleListEvent +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::HandleListEvent( + TFscContactActionMenuListEvent aEvent, + TInt aError ) + { + FUNC_LOG; + switch ( aEvent ) + { + case EFscMenuEventItemClicked: + { + HandleItemClick(); + break; + } + case EFscMenuEventError: + { + iError = aError; + //break not needed because menu will be dismissed + } + case EFscMenuEventExitKey: + { + iExit = ETrue; + //break not needed because menu will be dismissed + } + case EFscMenuEventCloseKey: + { + iMenuResult = EFscMenuDismissed; + DoDismiss(); + break; + } + case EFscMenuEventMenuHidden: + { + StopWait(); + + // Hide Cba and fade + HideMenuCba(); + iFader.FadeBehindPopup( this, iList, EFalse ); + break; + } + case EFscMenuLayoutChanged: + { + Dismiss( iExit ); + break; + } + default: + { + // nothing to do here + break; + } + } + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::CountFadedComponents +// --------------------------------------------------------------------------- +// +TBool CFscContactActionMenuImpl::IsOperationCompleted() + { + FUNC_LOG; + return isExecuteCompleted; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::SetOpenedFromMR +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::SetOpenedFromMR( TBool aOpenedFromMR ) + { + iOpenedFromMR = aOpenedFromMR; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::CountFadedComponents +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuImpl::CountFadedComponents() + { + FUNC_LOG; + TInt count = 1; + if ( iList ) + { + count++; + } + return count; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::FadedComponent +// --------------------------------------------------------------------------- +// +CCoeControl* CFscContactActionMenuImpl::FadedComponent(TInt aIndex) + { + FUNC_LOG; + CCoeControl* cntrl = NULL; + switch (aIndex) + { + case 0: + { + cntrl = iButtonGroupContainer; + break; + } + case 1: + { + cntrl = iList; + break; + } + default: + { + cntrl = NULL; + break; + } + } + return cntrl; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::FadedComponent +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::HandleGainingForeground() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::FadedComponent +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::HandleLosingForeground() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::ProcessCommandL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::ProcessCommandL(TInt aCommandId) + { + FUNC_LOG; + if ( isExecuteCompleted ) + { + switch ( aCommandId ) + { + case EAknSoftkeyCancel: + { + iMenuResult = EFscMenuDismissed; + DoDismiss(); + break; + } + case EAknSoftkeySelect: + { + HandleItemClick(); + break; + } + default: + { + // Nothing to do + break; + } + } + } + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::CFscContactActionMenuImpl +// --------------------------------------------------------------------------- +// +CFscContactActionMenuImpl::CFscContactActionMenuImpl( + const TFscContactActionMenuConstructParameters& aParams ) + : CFscContactActionMenu(), iMode(aParams.iMode), + iSelectedItemIndex( 0 ), isExecuteCompleted( ETrue ), + iOpenedFromMR( EFalse ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::ConstructL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::ConstructL( + const TFscContactActionMenuConstructParameters& aParams ) + { + FUNC_LOG; + iModel = CFscContactActionMenuModelImpl::NewL( aParams.iService ); + iWait = new ( ELeave ) CActiveSchedulerWait(); + iTextResolver = CTextResolver::NewL( *CCoeEnv::Static() ); + iDummyMenuItem = CFscContactActionMenuItemImpl::NewL(); + iDummyMenuItem->SetImplementationUid( KNullUid ); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::DoExecuteL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::DoExecuteL( + TFscContactActionMenuPosition aPosition, + TInt aIndex ) + { + FUNC_LOG; + + // Show list + iList->ShowL( aPosition, aIndex ); + ShowMenuCbaL(); + iFader.FadeBehindPopup( this, iList, ETrue ); + + // Wait untill dialog is hidden again + StartWait(); + + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::DoDismiss +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::DoDismiss() + { + FUNC_LOG; + if ( iList ) + { + iList->Hide( !iExit ); // If no instant exit, slide + } + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::StartWait +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::StartWait() + { + FUNC_LOG; + iWait->Start(); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::StopWait +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::StopWait() + { + FUNC_LOG; + if ( iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::ShowMenuCbaL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::ShowMenuCbaL() + { + FUNC_LOG; + + TInt cbaResource = 0; + if ( iList->ItemCount() > 0) + { + cbaResource = R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT; + } + else + { + cbaResource = R_AVKON_SOFTKEYS_CANCEL; + } + + iButtonGroupContainer = CEikButtonGroupContainer::NewL( + CEikButtonGroupContainer::ECba, + CEikButtonGroupContainer::EHorizontal, + this, cbaResource, *iList, + CEikButtonGroupContainer::EDelayActivation ); + + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::HideMenuCba +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::HideMenuCba() + { + FUNC_LOG; + delete iButtonGroupContainer; + iButtonGroupContainer = NULL; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::HandleItemClick +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::HandleItemClick() + { + FUNC_LOG; + + TInt selectedItemIndex = FocusedItemIndex(); + TInt itemCount = iModel->VisibleItemCount(); + if ( selectedItemIndex >= 0 && selectedItemIndex < itemCount ) + { + // Check type of selected item + CFscContactActionMenuItem* baseItem = NULL; + TRAP( iError, baseItem = &iModel->VisibleItemL( selectedItemIndex ) ); + + if ( iError == KErrNone ) + { + // Check type of selected item + CFscContactActionMenuCasItemImpl* item = + dynamic_cast( baseItem ); + if ( item != NULL ) + { + iMenuResult = EFscCasItemSelectedAndExecuting; + TUid actionUid = item->ImplementationUid(); + isExecuteCompleted = EFalse; + iIsActionExecuting = ETrue; + TRAP( iError, + iModel->Service()->ExecuteL( actionUid, this ) ); + } + else + { + // Custom item is not executed by the menu + iMenuResult = EFscCustomItemSelected; + DoDismiss(); + } + } + + if ( iError != KErrNone ) + { + // Show error note + TPtrC buf; + buf.Set( iTextResolver->ResolveErrorString( iError ) ); + if ( buf.Length() > 0 ) + { + CAknWarningNote* note = new CAknWarningNote(); + + if ( note ) + { + // If error string was found and note execution is + // successfull iError will be KErrNone. Otherwise + // iError will be delivered to the client application + TRAP( iError, note->ExecuteLD( buf ) ); + } + else + { + iError = KErrNoMemory; + } + } + } + } + else + { + iMenuResult = EFscMenuDismissed; + } + + } + + +// --------------------------------------------------------------------------- +// From MFscContactActionServiceObserver. +// Called when QueryActionsL method is complete. +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::QueryActionsComplete() + { + FUNC_LOG; + // CAS observer method implementation - not used in this component + } + +// --------------------------------------------------------------------------- +// From MFscContactActionServiceObserver. +// Called when QueryActionsL method failed. +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::QueryActionsFailed( TInt /*aError*/ ) + { + FUNC_LOG; + // CAS observer method implementation - not used in this component + } + +// --------------------------------------------------------------------------- +// From MFscContactActionServiceObserver. +// Called when ExecuteL method is complete. +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::ExecuteComplete() + { + FUNC_LOG; + isExecuteCompleted = ETrue; + iIsActionExecuting = EFalse; + iMenuResult = EFscCasItemSelectedAndExecuted; + DoDismiss(); + } + +// --------------------------------------------------------------------------- +// From MFscContactActionServiceObserver. +// Called when ExecuteL method failed. +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::ExecuteFailed( TInt aError ) + { + FUNC_LOG; + iError = aError; + isExecuteCompleted = ETrue; + + //Fix for: EJKA-7KAEVA + if ( KErrCancel != iError ) + { + // Show error note + TPtrC buf; + buf.Set( iTextResolver->ResolveErrorString( iError ) ); + if ( buf.Length() > 0 ) + { + CAknWarningNote* note = new CAknWarningNote(); + + if ( note ) + { + // If error string was found and note execution is + // successfull iError will be KErrNone. Otherwise + // iError will be delivered to the client application + TRAP( iError, note->ExecuteLD( buf ) ); + } + else + { + iError = KErrNoMemory; + } + } + } + else + { + iError = KErrNone; + iIsActionExecuting = EFalse; + iMenuResult = EFscMenuDismissed; + } + DoDismiss(); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuImpl::UpdateFadeColors +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuImpl::UpdateFadeColors() + { + FUNC_LOG; + + } + +// ======== GLOBAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ImplementationGroupProxy +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / + sizeof( TImplementationProxy ); + return ImplementationTable; + } +