emailcontacts/contactactionmenu/src/cfsccontactactionmenuimpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 16:20:14 +0300
branchRCL_3
changeset 14 b13141f05c3d
parent 0 8466d47a6819
permissions -rw-r--r--
Revision: 201015 Kit: 201017

/*
* 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 <ecom/implementationproxy.h>
#include "cfsccontactactionservice.h"
#include <eikbtgpc.h>
#include <avkon.rsg>
#include <avkon.hrh>
#include <AknsUtils.h>
#include <aknnotewrappers.h> 
#include <textresolver.h> 

#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<CFscContactActionMenuCasItemImpl*>( 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;
    }