phoneapp/phoneuicontrol/src/cphonekeyeventforwarder.cpp
branchGCC_SURGE
changeset 51 f39ed5e045e0
parent 40 bab96b7ed1a4
parent 46 bc5a64e5bc3c
--- a/phoneapp/phoneuicontrol/src/cphonekeyeventforwarder.cpp	Tue Jun 15 14:14:38 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,570 +0,0 @@
-/*
-* Copyright (c) 2007 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:  Key event forwarder.
-*
-*/
-
-
-// INCLUDE FILES
-#include <eikenv.h>
-#include <eikappui.h>
-#include <bldvariant.hrh>
-#include <featmgr.h>
-#include <PtiDefs.h>
-
-#include "mphonestatemachine.h"
-#include "mphonekeyeventhandler.h"
-#include "cphonekeys.h"
-#include "cphonekeyeventforwarder.h"
-#include "cphonepubsubproxy.h"
-#include "cphonetimer.h"
-#include "phonelogger.h"
-#include "phoneui.pan"
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::NewL
-// -----------------------------------------------------------------------------
-//
-CPhoneKeyEventForwarder* CPhoneKeyEventForwarder::NewL(
-        const TRect& aRect,
-        MPhoneStateMachine* aStateMachine,
-        MPhoneViewCommandHandle* aViewCommandHandle )
-    {
-    CPhoneKeyEventForwarder* self =
-        new (ELeave) CPhoneKeyEventForwarder( aStateMachine, aViewCommandHandle );
-
-    CleanupStack::PushL( self );
-    self->ConstructL( aRect );
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::~CPhoneKeyEventForwarder
-// -----------------------------------------------------------------------------
-//
-CPhoneKeyEventForwarder::~CPhoneKeyEventForwarder()
-    {
-    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneKeyEventForwarder::~CPhoneKeyEventForwarder");
-
-    CEikonEnv* env = static_cast<CEikonEnv*>(ControlEnv());
-    if( env )
-        {
-        env->EikAppUi()->RemoveFromStack( this );
-        }
-    delete iLongPressKeyEventTimer;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::CountComponentControls
-// -----------------------------------------------------------------------------
-//
-TInt CPhoneKeyEventForwarder::CountComponentControls() const
-    {
-    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneKeyEventForwarder::CountComponentControls");
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::ComponentControl
-// -----------------------------------------------------------------------------
-//
-CCoeControl* CPhoneKeyEventForwarder::ComponentControl(
-        TInt /*aIndex*/ ) const
-    {
-    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneKeyEventForwarder::ComponentControl");
-    return NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::SizeChanged
-// -----------------------------------------------------------------------------
-//
-void CPhoneKeyEventForwarder::SizeChanged()
-    {
-    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneKeyEventForwarder::SizeChanged");
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::Draw
-// -----------------------------------------------------------------------------
-//
-void CPhoneKeyEventForwarder::Draw(
-        const TRect& /*aRect*/ ) const
-    {
-    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneKeyEventForwarder::Draw");
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::OfferKeyEventL
-// Checks is hte keyevent such that the number entry can be opened
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::OfferKeyEventL(
-        const TKeyEvent& aKeyEvent,
-        TEventCode aType )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::OfferKeyEventL");
-
-    TKeyResponse ret( EKeyWasNotConsumed );
-    TKeyEvent keyEvent = aKeyEvent;
-
-    ret = OfferKeyEventBeforeControlStackL( aKeyEvent, aType );
-
-    // Convert event. Use already converted iKeyPressedDown.
-    // Do not convert other than DTMF tones
-    if( CPhoneKeys::IsDtmfTone( aKeyEvent, aType ) )
-        {
-        keyEvent.iCode = iKeyPressedDown;
-        }
-
-    if ( !keyEvent.iRepeats )
-        {
-        // Start and stop dtmf
-        iStateMachine->State()->HandleDtmfKeyToneL( keyEvent, aType );
-        if( aType != EEventKeyUp &&
-            ( CPhoneKeys::IsNumericKey( keyEvent, aType ) ||
-              IsAlphaNumericKey( keyEvent ) )
-          )
-            {
-            // Do not open number entry with up key
-            iStateMachine->State()->HandleCreateNumberEntryL( keyEvent, aType );
-            }
-        }
-
-    return ret;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::CPhoneKeyEventForwarder
-// -----------------------------------------------------------------------------
-//
-CPhoneKeyEventForwarder::CPhoneKeyEventForwarder(
-    MPhoneStateMachine* aStateMachine,
-    MPhoneViewCommandHandle* aViewCommandHandle  )
-    : iStateMachine( aStateMachine ),
-    iViewCommandHandle( aViewCommandHandle )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::CPhoneKeyEventForwarder");
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CPhoneKeyEventForwarder::ConstructL( const TRect& aRect )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::ConstructL");
-
-    if ( FeatureManager::FeatureSupported( KFeatureIdKeypadNoSlider ) )
-        {
-        RWindowGroup& groupWin = iCoeEnv->RootWin();
-        }
-    // Create invisible control.
-    CreateWindowL();
-    MakeVisible( EFalse );
-    SetRect( aRect );
-
-    CEikonEnv* env = static_cast<CEikonEnv*>(ControlEnv());
-    if( env )
-        {
-        env->EikAppUi()->AddToStackL(
-            this,
-            ECoeStackPriorityEnvironmentFilter,
-            ECoeStackFlagRefusesFocus );
-        }
-
-    // Create the long press key event timer
-    iLongPressKeyEventTimer = CPhoneTimer::NewL();
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::IsAlphaNumericKey
-// -----------------------------------------------------------------------------
-//
-TBool CPhoneKeyEventForwarder::IsAlphaNumericKey( const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::IsAlphaNumericKey");
-
-    TBool alphaNumeric =
-       iStateMachine->State()->IsAlphanumericSupportedAndCharInput( aKeyEvent );
-
-    return alphaNumeric;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::ConvertHalfQwertySpecialChar
-// -----------------------------------------------------------------------------
-//
-TBool CPhoneKeyEventForwarder::ConvertHalfQwertySpecialChar( TUint& aCode,
-        const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::ConvertHalfQwertySpecialChar");
-
-    TBool ret( EFalse );
-    TInt keyboard(KErrNotFound);
-    
-    if( keyboard == EPtiKeyboardHalfQwerty )
-        {
-        switch ( aKeyEvent.iScanCode )
-           {
-           case EStdKeyLeftShift:
-               ret = ETrue;
-               aCode = KPhoneDtmfHashCharacter;
-               break;
-           case EStdKeyLeftFunc:
-               ret = ETrue;
-               aCode = KPhoneDtmfStarCharacter;
-               break;
-           case EStdKeySpace:
-               ret = ETrue;
-               aCode = KPhoneDtmf0Character;
-               break;
-           default:
-               break;
-           }
-        }
-
-    __PHONELOG1( EBasic, EPhoneControl,
-        "CPhoneKeyEventForwarder::ConvertHalfQwertySpecialChar =%d ",
-        ret );
-
-    return ret;
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::OfferKeyEventBeforeControlStackL
-// Let phone handle before other components in control stack
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::OfferKeyEventBeforeControlStackL(
-    const TKeyEvent& aKeyEvent,
-    TEventCode aType )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::OfferKeyEventBeforeControlStackL");
-
-    TKeyResponse response( EKeyWasNotConsumed );
-    if( !IsKeyBlocked( aKeyEvent ) )
-        {
-        // Handle key events before FEP
-        // This is must becouse FEP consumes * key and when
-        // editor is in alphanumeric mode FEP consumes all alphanumeric
-        // keys
-        switch( aType )
-            {
-             // EEventKeyDown
-            case EEventKeyDown:
-                response = HandleEventKeyDownBeforeControlStackL( aKeyEvent );
-                break;
-            // EEventKey
-            case EEventKey:
-                response = HandleEventKeyBeforeControlStackL( aKeyEvent );
-                break;
-            // EEventKeyUp
-            case EEventKeyUp:
-                response = HandleEventKeyUpBeforeControlStackL( aKeyEvent );
-                break;
-            default:
-                break;
-            }
-
-        }
-    return response;
-    }
-
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::OfferKeyEventAfterControlStackL
-// Let phone handle keys if no one has done it already
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::OfferKeyEventAfterControlStackL(
-    const TKeyEvent& aKeyEvent,
-    TEventCode aType )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::OfferKeyEventAfterControlStackL");
-    
-    if( !IsKeyBlocked( aKeyEvent ) )
-        {
-        // Send key to editor
-        iStateMachine->State()->HandleKeyEventL( aKeyEvent, aType );
-        
-        if( EEventKeyUp == aType 
-                && EKeyNull != iKeyPressedDown )
-            {
-            // Handle short key press
-            iStateMachine->State()->HandleKeyMessageL( 
-                MPhoneKeyEvents::EPhoneKeyShortPress, 
-                TKeyCode( iKeyPressedDown ) );
-
-            // Reset key code
-            iScanCode = EStdKeyNull;
-            iKeyPressedDown = EKeyNull;
-            }
-        }
-
-    return EKeyWasNotConsumed;
-    }
-
-// -----------------------------------------------------------
-// CPhoneKeyEventForwarder::HandleEventKeyDownBeforeControlStackL
-// -----------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::HandleEventKeyDownBeforeControlStackL(
-    const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::HandleEventKeyDownBeforeControlStackL");
-
-    // Convert key code
-    ConvertKeyCode( iKeyPressedDown, aKeyEvent );
-    // Save key scan code
-    iScanCode = aKeyEvent.iScanCode;
-
-    // Start the key press timer
-    iKeyPressTime.UniversalTime();
-
-    // Cancel the long press key event timer, if it is active
-    if ( iLongPressKeyEventTimer->IsActive() )
-        {
-        iLongPressKeyEventTimer->CancelTimer();
-        }
-
-    // Re-start the timer
-    iLongPressKeyEventTimer->After(
-        KPhoneLongPressKeyEventDuration,
-        TCallBack( DoHandleLongPressKeyEventCallbackL,
-        this ) );
-
-    return ( EKeyWasNotConsumed );
-    }
-
-// -----------------------------------------------------------
-// CPhoneKeyEventForwarder::HandleEventKeyBeforeControlStackL
-// Both short key press event (iRepeats == 0) and
-// long key press event (iRepeats == 1) are handled here
-// -----------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::HandleEventKeyBeforeControlStackL(
-    const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::HandleEventKeyBeforeControlStackL");
-
-    TKeyResponse response( EKeyWasNotConsumed );
-
-    // Convert event.
-    TKeyEvent keyEvent = aKeyEvent;
-    keyEvent.iCode = iKeyPressedDown;
-
-    if(  aKeyEvent.iRepeats > 0 &&
-        CPhoneKeys::IsDtmfTone( keyEvent, EEventKey ) )
-        {
-        // Do not repeat dtmf characters
-        response = EKeyWasConsumed;
-        }
-
-    return response;
-    }
-
-// -----------------------------------------------------------
-// CPhoneKeyEventForwarder::HandleEventKeyUpBeforeControlStackL
-// -----------------------------------------------------------
-//
-TKeyResponse CPhoneKeyEventForwarder::HandleEventKeyUpBeforeControlStackL(
-    const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::HandleEventKeyUpBeforeControlStackL");
-
-    // Send a long press key event to the current state provided
-    // that the key scan code is the same as the key that was pressed
-    if ( iScanCode == aKeyEvent.iScanCode )
-        {
-        // Pass the key press duration to the current state
-        TTime now;
-        now.UniversalTime();
-        TTimeIntervalMicroSeconds keyPressDuration = now.MicroSecondsFrom(
-           iKeyPressTime );
-        iStateMachine->State()->HandleKeyPressDurationL(
-            TKeyCode( iKeyPressedDown ),
-            keyPressDuration );
-
-        // Cancel the long press timer, if it is active. Otherwise
-        // ignore the key event since it was already handled as a long press
-        // key event.
-        if ( iLongPressKeyEventTimer->IsActive() )
-            {
-            iLongPressKeyEventTimer->CancelTimer();
-            }
-        }
-
-    return EKeyWasNotConsumed;
-    }
-
-// ---------------------------------------------------------
-// CPhoneKeyEventForwarder::DoHandleLongPressKeyEventCallback
-//
-// This routine is called when the long press key event timer expires
-// after KPhoneLongPressKeyEventDuration.
-// ---------------------------------------------------------
-//
-TInt CPhoneKeyEventForwarder::DoHandleLongPressKeyEventCallbackL( TAny* aAny )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::DoHandleLongPressKeyEventCallbackL");
-
-    __ASSERT_DEBUG( aAny,
-        Panic( EPhoneCtrlUnknownPanic ) );
-
-    reinterpret_cast< CPhoneKeyEventForwarder* >( aAny )->
-        HandleLongPressKeyEventL();
-
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------
-// CPhoneKeyEventForwarder::HandleLongPressKeyEventL
-// Handle long press key event
-// ---------------------------------------------------------
-//
-void CPhoneKeyEventForwarder::HandleLongPressKeyEventL()
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::HandleLongPressKeyEventL");
-
-    // In alphanumeric mode EEventKey-event is not received so we must
-    // compare also with scan code.
-    if ( KPhoneDtmfHashCharacter == iKeyPressedDown )
-        {
-        // Separate handling for long hash key because there is so much
-        // different functionality under it and it works differently
-        // in different protocols.
-        iStateMachine->State()->HandleLongHashL();
-        }
-    else if ( KPhoneDtmfStarCharacter == iKeyPressedDown )
-        {
-        // KPhoneDtmfStarCharacter value used in configuration file for
-        // long key press application launching
-        iStateMachine->State()->HandleKeyMessageL(
-               MPhoneKeyEvents::EPhoneKeyLongPress,
-               TKeyCode( KPhoneDtmfStarCharacter ) );
-        }
-    else
-        {
-        __PHONELOG1(
-            EBasic, EPhoneControl,
-            "CPhoneKeyEventHandler::HandleLongPressKeyEventL iCode(%d)",
-            iKeyPressedDown );
-        iStateMachine->State()->HandleKeyMessageL(
-            MPhoneKeyEvents::EPhoneKeyLongPress,
-            TKeyCode( iKeyPressedDown ) );
-        }
-
-    // Reset key code
-    iScanCode = EStdKeyNull;
-    iKeyPressedDown = EKeyNull;
-    }
-
-// -----------------------------------------------------------
-// CPhoneKeyEventForwarder::ConvertKeyCode
-// -----------------------------------------------------------
-//
-void CPhoneKeyEventForwarder::ConvertKeyCode( TUint& aCode,
-        const TKeyEvent& aKeyEvent )
-    {
-    __LOGMETHODSTARTEND( EPhoneControl,
-        "CPhoneKeyEventForwarder::ConvertKeyCode");
-
-    // Handler for special device key mapping in case iScanCode
-    // to iCode conversion hasn't been handled by CAknAppUi::GetAliasKeyCodeL
-    __PHONELOG1( EBasic, EPhoneControl,
-        "CPhoneKeyEventHandler::ConvertKeyCode scan code (%d)",
-        aKeyEvent.iScanCode );
-
-    if( !ConvertHalfQwertySpecialChar( aCode, aKeyEvent ) )
-        {
-        switch ( aKeyEvent.iScanCode )
-            {
-            case EStdKeyEnter:
-                aCode = EKeyEnter;
-                break;
-            case EStdKeyYes:
-                aCode = EKeyYes;
-                break;
-            case EStdKeyNo:
-                aCode = EKeyNo;
-                break;
-            case EStdKeyDeviceF:
-                aCode = EKeyDeviceF;  // EStdKeyDeviceF mapping for unlock switch.
-                break;
-            case EStdKeyHash:
-                aCode = KPhoneDtmfHashCharacter;
-                break;
-            case EStdKeyNkpAsterisk:
-                aCode = KPhoneDtmfStarCharacter;
-                break;              
-            case EStdKeyApplication0:
-                aCode = EKeyApplication0;
-                break;
-
-            default:
-                aCode = aKeyEvent.iScanCode; // Use default code
-                break;
-            }
-        }
-
-    __PHONELOG1( EBasic, EPhoneControl,
-        "CPhoneKeyEventHandler::ConvertKeyCode aCode (%d)", aCode );
-    }
-
-// -----------------------------------------------------------------------------
-// CPhoneKeyEventForwarder::IsKeyBlocked
-// -----------------------------------------------------------------------------
-//
-TBool CPhoneKeyEventForwarder::IsKeyBlocked( const TKeyEvent& aKeyEvent ) const
-    {
-    TBool ret = EFalse;
-    
-    // Check blocked keys
-    const RArray<TInt>& keyScanCodeList = iStateMachine->State()->GetBlockedKeyList();
-    TInt count = keyScanCodeList.Count();
-    if( count )
-        {
-        for( TInt i = 0; i < count; i++ )
-            {
-            if( keyScanCodeList[i] == aKeyEvent.iScanCode )
-                {
-                ret = ETrue;
-                }
-            }
-        }
-    __PHONELOG1( EBasic, EPhoneControl,
-        "CPhoneKeyEventHandler::IsKeyBlocked return (%d)", ret );
-    
-    return ret;
-    }
-
-//  End of File
-