fep/aknfep/src/AknFepKeyCatcher.cpp
changeset 36 a7632c26d895
parent 35 0f326f2e628e
child 42 b3eaa440ab06
--- a/fep/aknfep/src/AknFepKeyCatcher.cpp	Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,771 +0,0 @@
-/*
-* Copyright (c) 2002-2004 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:           
-*       Provides the CAknFepKeyCatcher methods.
-*
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-#include <eikenv.h>
-#include <eikappui.h>               //iEikonEnv
-#include <e32keys.h>                //keys
-#include <uikon.hrh>                //keys
-
-#include "AknFepKeyCatcher.h"
-#include "AknFepManager.h"
-#include "AknFepGlobalEnums.h"
-#include "AknFepPanic.h"
-#include "AknFepPluginManager.h"
-#include <AknDef.h>
-#include <PtiEngine.h>
-#include <PtiDefs.h>                //keys
-#include <featmgr.h>                //FeatureManager
-#include <AvkonInternalCRKeys.h>
-
-LOCAL_C void FepObserverHandleCompletionOfTransactionL(MCoeFepObserver& aFepObserver)
-    {
-    aFepObserver.HandleCompletionOfTransactionL();
-    }
-
-CAknFepKeyCatcherInterface::~CAknFepKeyCatcherInterface()
-    {
-    }
-
-void CAknFepKeyCatcherInterface::HandleChangeInFocus()
-    {
-    }
-
-CAknFepKeyCatcher* CAknFepKeyCatcher::NewL(CAknFepManager& aFepMan)
-    {
-    CAknFepKeyCatcher* self=new(ELeave) CAknFepKeyCatcher(aFepMan);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(); //self
-    return self;
-    }
-
-CAknFepKeyCatcher::~CAknFepKeyCatcher()
-    {
-    CloseWindow();
-    if(NULL != iEikonEnv->EikAppUi())
-        {
-        iEikonEnv->EikAppUi()->RemoveFromStack(this);
-#ifdef RD_SCALABLE_UI_V2
-        (CEikonEnv::Static())->RemoveMessageMonitorObserver(*this); 
-#endif //RD_SCALABLE_UI_V2
-        }
-    }
-
-TKeyResponse CAknFepKeyCatcher::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode)
-    {
-   
-#ifdef RD_SCALABLE_UI_V2     
-    if (aEventCode == EEventKeyUp && 
-        aKeyEvent.iScanCode == EStdKeyNo)
-        {
-        iFepMan.HandleEndKeyL();
-        }
-#endif //RD_SCALABLE_UI_V2 
-    // Temporary solution for Disable key tone when press key in Virtual ITUT
-    iFepMan.NeedDisableKeySound(aKeyEvent, aEventCode);
-    // sort out if we're doing long or short presses...
-    TKeyPressLength length = aKeyEvent.iRepeats ? ELongKeyPress : EShortKeyPress;
-    if (iKeyCatcherState == EAknFepStateNull)
-        {
-        if (aEventCode == EEventKeyUp && iLongPressedScanCode == aKeyEvent.iScanCode)
-            {
-            // An editor has lost focus during long key press (for example SCT popup 
-            // is shown during long keypress of star key).
-            // EFlagLongKeyPressHandled needs to be reseted also in this case.
-            ClearFlag(EFlagLongKeyPressHandled);
-            iLongPressedScanCode = 0;
-            }
-        if((aEventCode == EEventKeyDown) && (aKeyEvent.iScanCode==EStdKeyRightShift) 
-                && (iFepMan.KeyboardLayout()== EPtiKeyboard12Key) && !iFepMan.Japanese() 
-                &&  !iFepMan.IsChineseInputLanguage()  )
-            {
-            iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateShiftkeyWasPressedBeforeLosingFocus);
-            }
-        else if ((aEventCode == EEventKeyUp) && (aKeyEvent.iScanCode==EStdKeyRightShift) 
-                && (iFepMan.KeyboardLayout()== EPtiKeyboard12Key) 
-                && iFepMan.IsCcpuFlagSet(CAknFepManager::ECcpuStateShiftkeyWasPressedBeforeLosingFocus))
-            {
-            iFepMan.ClearCcpuFlag(CAknFepManager::ECcpuStateShiftkeyWasPressedBeforeLosingFocus);
-            }
-        
-        TInt keyCode = aKeyEvent.iCode;
-        if (keyCode == EKeyF19 || keyCode == EKeyF22 ||
-            keyCode == EKeyF23 || keyCode == EKeyF24 )
-            {
-            // Internal FEP key events that are simulated by FEP are always 
-            // also consumed by FEP. In this situation FEP has simulated the
-            // key event but the editor is unfocused right after.
-            return EKeyWasConsumed;
-            }
-        // FEP does not handle any keyevents if there are not any FEP aware editor focused, except shift key. 
-        // Notice that shift key is handled only if CAknFepKeyCatcher is constructed by focusing some editor.
-        
-        if (iFepMan.HashKeySelectionInUse())
-        	{        	
-        	// Hash key selection should work also with uneditable editors, therefore
-        	// we need to fake it as a shift key press here.
-	        if (aKeyEvent.iScanCode == EStdKeyHash)
-    	    	{
-    	    	if (aEventCode == EEventKeyUp)
-    	    		{		
-    	    		if (iFepMan.IsFlagSet(CAknFepManager::EFlagLongShiftKeyPress))	   			    	    		
-    	    			{    	    			    	    		
-    	    			// We need to generate real shift up event for editor to
-    	    			// cancel ccpu-mode.
-		   				TKeyEvent ccpuStart = {0, EStdKeyLeftShift, 0, 0};
-    	 				CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, aEventCode);
-    	    			}
-    	    		else
-    	    			{
-    	    			// CCpu-mode was not yet activated. Just cancel the timer.
-    	    			iFepMan.CancelShiftKeyTimer();
-    	    			}		
-    	 			return EKeyWasNotConsumed;       	    		
-    	    		}
-				else if (aEventCode == EEventKeyDown)   	    		
-					{
-					return iFepMan.HandleShiftKeyEventL(aEventCode);        							
-					}
-        		}
-    	    }
-    	
-    	if( keyCode == EKeyEscape )
-    		{
-    		return iFepMan.HandleKeyEventL(keyCode, length);	
-    		}
-    		
-        if ((aKeyEvent.iScanCode==EStdKeyRightShift || aKeyEvent.iScanCode==EStdKeyLeftShift))
-            {
-            if (aEventCode == EEventKeyUp)
-                {
-                iFepMan.SetExtendedFlag(CAknFepManager::EExtendedFlagShiftReleasedOnPopup);
-                }
-            else
-                {
-                iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShiftReleasedOnPopup);
-                }
-            }
-        else
-            {
-            return EKeyWasNotConsumed;
-            }
-        }
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-     if(iKeyCatcherState != EAknFepStateNull)
-        {
-            if(iFepMan.IsFnKeyMapped() &&
-                (iFepMan.HandleFnKeyEventL( aKeyEvent, aEventCode ) == EKeyWasConsumed))
-            {
-            return EKeyWasConsumed;        
-            }
-
-        }
-#endif
-	
-     if ( aEventCode == EEventKeyUp && 
-          aKeyEvent.iScanCode == EStdKeyHash &&
-          iFepMan.IsExtendedFlagSet(CAknFepManager::EExtendedFlagShortPressHashKey) )
-         {
-         // We are here because of short press of has key. Since, we had consumed
-         // short press of hash key, we re-simulate is again, so that the respective
-         // application can handle it as per their need.
-         
-         TKeyEvent keyHash = {EPtiKeyHash, EStdKeyHash, 0, 0};
-         CCoeEnv::Static()->SimulateKeyEventL(keyHash, EEventKey);
-         iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
-         }
-    // Check for the Wireless Keyboard Modifier Flag.
-    const TUint KModifierExternalKeyboard = 0x00200000;
-    if ( aKeyEvent.iModifiers & KModifierExternalKeyboard )
-        {        
-        if ( iFepMan.IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction |
-             CAknFepManager::EFlagInsideMultitapInlineEditingTransaction) ) 
-            {
-            if (iFepMan.IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
-                {
-                // Remove any no matching word indicator.
-                iFepMan.TryRemoveNoMatchesIndicatorL();
-                }
-            // Ensure the CBA is in the default state.
-            iFepMan.UpdateCbaL(NULL);
-            // Close FEP UI, commit the inline edit and show the cursor.            
-            iFepMan.TryCloseUiL(); 
-            }        
-        // Allow the key through to the underlying control.
-        return EKeyWasNotConsumed;
-        }
-    
-    TKeyResponse retCode;
-	if (iFepMan.HandleCcpuModeKeyEventL(aKeyEvent, aEventCode,
-	                                   retCode, IsFlagSet(EFlagLongKeyPressHandled)))
-		{
-		return retCode;	
-		}
-
-#ifdef RD_SCALABLE_UI_V2
-    // Set text selection when tap arrow keys
-	if(iFepMan.HandleSelModeArrowKeyEventL(aKeyEvent, aEventCode, retCode))
-        {
-        return retCode;
-        }        
-#endif //RD_SCALABLE_UI_V2	
-
-    
-  
-    if ( ( aKeyEvent.iModifiers & EModifierCtrl
-#ifdef RD_INTELLIGENT_TEXT_INPUT     
-           || aKeyEvent.iScanCode==EStdKeyRightCtrl
-           || aKeyEvent.iScanCode==EStdKeyLeftCtrl
-#endif
-		 )
-        && aKeyEvent.iScanCode != EStdKeyBackspace  
-        && aKeyEvent.iScanCode != EStdKeyDelete )
-        {// Chinese qwerty increment input mode by Ctrl+Shift
-		return iFepMan.HandleQwertyControlKeyEventL(aKeyEvent, aEventCode);        
-        }
-
-    // handling hash key event in japanese input
-    if (iFepMan.IsFeatureSupportedJapanese()
-     && aKeyEvent.iScanCode==EStdKeyHash && !iFepMan.IsOnlyNumericPermitted())
-        {
-        return HandleHashKeyJapaneseL(aKeyEvent, aEventCode);
-        }
-    
-    // Let FepMan handle chr key
-    if (aKeyEvent.iScanCode==EStdKeyLeftFunc)
-        {
-        if (iFepMan.HandleQwertyChrKeyEventL(aEventCode))
-            {
-            return EKeyWasConsumed;
-            }
-        }
-    //let FepMan handle shifts
-    if ( aKeyEvent.iScanCode==EStdKeyRightShift || aKeyEvent.iScanCode
-            ==EStdKeyLeftShift )
-        {
-        // phrase creation
-        if ( iFepMan.IsPinyinPhraseCreation() )
-            {
-            return EKeyWasConsumed;
-            }
-        else
-            {
-            return iFepMan.HandleShiftKeyEventL( aEventCode );
-            }
-        }
-    
-    if (iFepMan.Japanese())
-        {
-        if ((aKeyEvent.iScanCode==EStdKeyDevice0) || (aKeyEvent.iScanCode==EStdKeyDevice1))
-            {
-            if (aEventCode != EEventKey)
-                {
-                return EKeyWasNotConsumed;
-                }
-            }
-        }
-
-    if (aEventCode==EEventKeyUp)
-        {
-        if ( iLongPressedScanCode == aKeyEvent.iScanCode )
-            {
-            ClearFlag(EFlagLongKeyPressHandled);
-            iLongPressedScanCode = 0;
-            }
-        
-        if ( (EStdKeyDelete == aKeyEvent.iScanCode || 
-              EStdKeyBackspace == aKeyEvent.iScanCode))  
-                {
-                iFepMan.SetLongClearAfterCloseUI(EFalse);               
-                }
-            
-        iFepMan.ClearFlag(CAknFepManager::EFlagCharacterAdded);
-        }
-
-
-    //let FepMan to try to handle Thai 0 key
-    TBool thai0Keyhandling = EFalse;
-
-    if (aKeyEvent.iScanCode==EPtiKey0 
-        && (!(aKeyEvent.iModifiers & EModifierSpecial)  // If the key is produced by hardware key
-          // In VKB and FSQ latin range 0 could be input with virtual keyboard
-          || (iFepMan.PluginInputMode() != EPluginInputModeFSQ  
-             && iFepMan.PluginInputMode() != EPluginInputModeVkb)))
-        {
-        if (iFepMan.HandleThai0KeyEvent(aEventCode, length, thai0Keyhandling) == EKeyWasConsumed)
-            {
-            return (EKeyWasConsumed); // Eats some key events to find out when o key goes up
-            }
-        if (thai0Keyhandling)
-            {
-            if(length == ELongKeyPress)
-                {
-                SetFlag(EFlagLongKeyPressHandled);
-                iLongPressedScanCode = aKeyEvent.iScanCode;
-                }
-            return (iFepMan.HandleKeyEventL(EPtiKey0, length));
-            }
-        }
-    TInt keyCode = aKeyEvent.iCode;
-    TKeyResponse response = EKeyWasNotConsumed;
-    
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-    if ((aKeyEvent.iScanCode == EStdKeyNkpAsterisk ||aKeyEvent.iScanCode == EPtiKeyStar )&& iFepMan.KeyboardLayout() == EPtiKeyboard12Key)
-    	{
-    	//For Special Editors like Java numeric editor, EventKeyUp is allowed to flow through FEP.
-    	//All other events for Special Editor is not consumed by FEP.
-    	if(iFepMan.IsSpecialNumericEditor() && iFepMan.IsOnlyNumericPermitted() && aEventCode != EEventKeyUp)
-    		{
-    		return EKeyWasNotConsumed;
-    		}
-#ifdef FF_HOME_SCREEN_EASY_DIALING
-				// If Easy Dialing Feature in Phone Idle is turned on then,
-				// phoneIdleinEasyDialingNumericMode is set to True
-        TBool phoneIdleinEasyDialingNumericMode = EFalse;
-        phoneIdleinEasyDialingNumericMode = 
-        	(iFepMan.EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor) &&
-        	(iFepMan.InputMode() == ENumber || iFepMan.InputMode() == ENativeNumber);
-#endif           
-    	// For all Numeric Editors, only Event Key is allowed to flow through
-    	// When Easy Dialing is on, the editor in not numeric, even though in this scenario only Event key is allowed throug FEP
-    	if ( (iFepMan.IsOnlyNumericPermitted()
-#ifdef FF_HOME_SCREEN_EASY_DIALING    	
-    		 || phoneIdleinEasyDialingNumericMode 
-#endif    		 
-    		 )&& 
-    	     aEventCode != EEventKey)
-    		{
-    		return EKeyWasConsumed;
-    		}
-    	
-    	/* 
-    	For Long Key press:
-    		We only have Event Key, and FEP handles it for launching SCT.
-    	For short key presses:
-    		For Non numeric editors:
-    			EventDown and Eventkey:
-    				FEP consumes it - if FEP is in Inline edit or it can launch SCT. It is consumed by below check and does not flow further.
-    				Else, these events flow through FEP. Later decision is made to consume the event or not.
-    			EventUpKey:
-    				FEP consumes it - if FEP is in Inline edit or it can launch SCT. Desired functionality is achieved after flowing through FEP.
-    				Else, these events flow through FEP. Later decision is made to consume the event or not.
-    		For Numeric Editors:
-    			FEP handles EventKey for star key looping or launching sct. Other events does not reach here.
-    	*/
-    	if ( length != ELongKeyPress && 
-    	     aEventCode != EEventKeyUp && 
-    	     (
-    	      iFepMan.IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) ||
-    	      !iFepMan.IsAbleToLaunchSCT() 
-    	     ) &&
-    	     (!iFepMan.IsOnlyNumericPermitted()
-#ifdef FF_HOME_SCREEN_EASY_DIALING    	
-    		  && !phoneIdleinEasyDialingNumericMode 
-#endif    		     	     
-    	     )
-    	   )
-    		{
-            return EKeyWasConsumed;
-    		}
-    	keyCode = EPtiKeyStar;
-    	}
-    else
-#endif
-    //only interested in EventKeys apart from for the shift key
-    if (aEventCode!=EEventKey)
-        {
-        // For Japanese, don't pass EEventKeyUp and EEventKeyDown
-        // event to application side if we are inputting Hiragana/Kanji.
-        if (iFepMan.Japanese() && iKeyCatcherState == EAknFepStateUIActive)
-            {
-            // arrow keys
-            if (aKeyEvent.iScanCode == EStdKeyDownArrow
-                  || aKeyEvent.iScanCode == EStdKeyRightArrow
-                  || aKeyEvent.iScanCode == EStdKeyLeftArrow
-                  || aKeyEvent.iScanCode == EStdKeyUpArrow)
-                {
-                return EKeyWasConsumed;
-                }
-            }
-
-        if ((iKeyCatcherState == EAknFepStateInitial)
-            && (aEventCode == EEventKeyUp) && (aKeyEvent.iScanCode == EStdKeyBackspace))
-            {
-            CCoeEnv::Static()->ForEachFepObserverCall(FepObserverHandleCompletionOfTransactionL);
-            }
-
-        return EKeyWasNotConsumed;  
-        }
-
-    //if we've done a long press, and we get repeats, don't pass it on to the fep man.
-
-    if (!(iFepMan.Japanese()&&
-          (aKeyEvent.iCode == EKeyLeftArrow
-        || aKeyEvent.iCode == EKeyRightArrow
-        || aKeyEvent.iCode == EKeyDownArrow
-        || aKeyEvent.iCode == EKeyUpArrow)))
-        {
-        if (!(aKeyEvent.iCode == EKeyPrevious || aKeyEvent.iCode == EKeyNext))
-            {                	
-            if (IsFlagSet(EFlagLongKeyPressHandled)&&(aKeyEvent.iRepeats))
-                {
-                return EKeyWasConsumed;         
-                }
-            }
-        }
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-    CAknFepFnKeyManager::TFnKeyState fnKeyStateBeforeKey = iFepMan.FnKeyState();
-
-	// the short key press was blocked, don't allow the long key press to go through
-	if ( IsFlagSet(EFlagBlockAllLongKeyPressEvents) && length == ELongKeyPress 
-								&& !IsNaviKey(aKeyEvent.iCode) )
-		{
-		return EKeyWasNotConsumed;
-		}
-	// if the editor has no free space	
-	// the key press is a valid one 
-	// (it is not for eg. a simulated key press for case change)
-	// we are not in between multitapping
-	// block the subsequent long key press also	
-	if ( length == EShortKeyPress && !iFepMan.EditorHasFreeSpace() 
-		&& iFepMan.PtiEngine()->IsValidKey((TPtiKey)aKeyEvent.iScanCode)   
-		&& !iFepMan.IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction) ) 
-    	{
-    	SetFlag(EFlagBlockAllLongKeyPressEvents); // block the subsequent long key press also
-    	return EKeyWasNotConsumed;
-    	}
-    else
-    	{
-    	ClearFlag(EFlagBlockAllLongKeyPressEvents);
-    	}	
-#endif // RD_INTELLIGENT_TEXT_INPUT 
-    if (iFepMan.HandleQwertyKeyEventL(aKeyEvent, response))
-        {
-
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ 
-		ClearFlag(EFlagBlockAllLongKeyPressEvents);	
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__    
-			TPtiKeyboardType keyboardType = iFepMan.KeyboardLayout();
-	        if( (length == ELongKeyPress) &&
-            (
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ 
-            iFepMan.LongPressNumberEntryOnQwerty()||
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__          
-            (keyboardType == EPtiKeyboardHalfQwerty)) &&
-            iFepMan.KeyMapsDifferentCharacterWithFn( (TPtiKey)aKeyEvent.iScanCode ) && 
-            fnKeyStateBeforeKey == CAknFepFnKeyManager::EFnKeyNone )
-            {
-            SetFlag(EFlagLongKeyPressHandled); // don't allow any more long presses to go through.
-            iLongPressedScanCode = aKeyEvent.iScanCode;
-            }
-#endif // RD_INTELLIGENT_TEXT_INPUT      
-        return response;
-        }
-#ifdef RD_INTELLIGENT_TEXT_INPUT		
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__ 
-        // key was not handled because there is no space in editor
-    else if( !iFepMan.EditorHasFreeSpace() && ( iFepMan.KeyboardLayout() != EPtiKeyboard12Key))
-    	{		
-    	SetFlag(EFlagBlockAllLongKeyPressEvents);
-    	}
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__          			
-#endif // RD_INTELLIGENT_TEXT_INPUT    
-	if (iFepMan.IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed))
-		{
-		// If shift (ie. edit-key) is pressed in itu-t mode, block all the numeric keys, 
-		// otherwise they will be routed to edwin and prodec unwanted character.
-		if ((aKeyEvent.iScanCode >= EPtiKey1 && aKeyEvent.iScanCode <= EPtiKey9) ||
-		    aKeyEvent.iScanCode == EPtiKey0 || aKeyEvent.iScanCode == EStdKeyFullStop )
-			{
-			return EKeyWasConsumed;
-			}		
-		}        
-		
-	if (iFepMan.IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed))
-		{
-		if ((aKeyEvent.iScanCode >= EPtiKeyQwertyA && aKeyEvent.iScanCode <= EPtiKeyQwertyZ) ||
-		     aKeyEvent.iScanCode == EStdKeyFullStop )
-			{
-			return EKeyWasConsumed;
-			}		
-		}        
-        
-    // bulk of the selection.
-    switch(keyCode)
-        {
-    case EKeyLeftArrow: //fall through
-    case EKeyRightArrow:
-    case EKeyDownArrow:
-    case EKeyUpArrow:
-        response = iFepMan.HandleKeyEventL(keyCode, length);
-        break;
-    case EKeyCBA1:
-        {
-        TInt inputMode = iFepMan.InputMode();
-        if ( iKeyCatcherState == EAknFepStateUIActive && 
-            inputMode >= ECangJie && inputMode <= EStroke )
-            {
-            // Left softkey does not have functionality in Chinese input modes when 
-            // FEP UI is active.
-            // phrase creation
-            iFepMan.HandleKeyEventL( keyCode, length );
-            response = EKeyWasConsumed;
-            break;
-            }
-        }
-        //fall through
-    case EKeyOK:
-    case EKeyCBA2:
-    case EPtiKey0:
-    case EPtiKey1:
-    case EPtiKey2:
-    case EPtiKey3:
-    case EPtiKey4:
-    case EPtiKey5:
-    case EPtiKey6:
-    case EPtiKey7:
-    case EPtiKey8:
-    case EPtiKey9:
-    case EPtiKeyStar:
-    case EPtiKeyHash:
-    case EKeyEscape:
-        if(length == ELongKeyPress)
-            {
-            SetFlag(EFlagLongKeyPressHandled); // don't allow any more long presses to go through.
-            iLongPressedScanCode = aKeyEvent.iScanCode;
-            }
-        //fall through
-    case EKeyBackspace:
-    case EKeyDelete:
-        
-        // This check is added to handle the case when user enters a consonant
-        // followed by a halant, follwed by digit using long key press.
-        // When backspace is done, first time, the digit gets deleted.
-        // Second time, only halant should be deleted. But since ZWS is
-        // present, the entire syllable gets deleted. Hence we forcefully
-        // remove the ZWS.
-        
-        if( keyCode == EKeyBackspace && 
-            iFepMan.PreviousChar( ETrue ) == ( ZERO_WIDTH_SPACE ) )
-            {
-            // Remove the Zero Width Space
-	    	iFepMan.RemovePreviousCharacterL();
-            }
-
-#ifdef RD_MARATHI
-		if( ( keyCode == EKeyBackspace ) && 
-			iFepMan.PreviousChar( ETrue ) == ( ZERO_WIDTH_JOINER ))
-			{
-			// Remove the Zero Width Joiner
-			iFepMan.RemovePreviousCharacterL();
-			}
-#endif // RD_MARATHI
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-		if( keyCode == EKeyBackspace && 
-			( (aKeyEvent.iModifiers & EModifierLeftShift) ||
-			  (aKeyEvent.iModifiers & EModifierRightShift) ||
-			  (aKeyEvent.iModifiers & EModifierShift) ))
-			{
-			keyCode = EKeyDelete;
-			}
-#endif //RD_INTELLIGENT_TEXT_INPUT			
-        response = iFepMan.HandleKeyEventL(keyCode, length, aEventCode );
-        break;
-    case EKeyF19: // Fep simulated event to asynchronously update the case.
-    case EKeyF22:
-    case EKeyF23:
-    case EKeyF24:
-        response = iFepMan.HandleKeyEventL(keyCode, length);
-        break;
-    case EKeyPowerOff:
-    case EKeyPhoneEnd:
-    case EKeyApplication:
-#ifndef RD_INTELLIGENT_TEXT_INPUT
-    		// To rip off suggested word completion when user press END / APPLICATION
-    			if(iFepMan.IsAutoCompleteOn())
-    			{
-    			iFepMan.RemoveSuggestedCompletionL();	
-    			}
-#endif //RD_INTELLIGENT_TEXT_INPUT
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-		response = iFepMan.HandleKeyEventL(keyCode, length);
-#endif //RD_INTELLIGENT_TEXT_INPUT
-        break;
-    case EKeyPhoneSend:
-        // handling phone send key event in japanese input
-        if (iFepMan.IsFeatureSupportedJapanese())
-            {
-            if (iFepMan.Japanese() && iKeyCatcherState == EAknFepStateUIActive)
-                {
-                // Ensure the CBA is in the default state.
-                iFepMan.UpdateCbaL(NULL);
-                // Close FEP UI, commit the inline edit and show the cursor.            
-                iFepMan.TryCloseUiL();
-                }
-            }
-        break;
-    default:
-        break;
-        }
-   
-    return response;
-    }
-
-void CAknFepKeyCatcher::SetState(const enum TAknFepManagerState aState)
-    {
-    iKeyCatcherState=aState;
-    }
-
-CAknFepKeyCatcher::CAknFepKeyCatcher(CAknFepManager& aFepMan)
-    : iFepMan(aFepMan),
-      iKeyCatcherState(EAknFepStateNull)
-    {
-    }
-
-void CAknFepKeyCatcher::ConstructL()
-    {
-    // Set up fep key catching control - front window, null size, non-focusing
-    CreateWindowL();
-    SetFocusing(EFalse);    
-    RWindow& window=Window();
-    window.SetOrdinalPosition(0, ECoeWinPriorityFep);
-    TPoint fepControlPos(0, 0);
-    SetExtent(fepControlPos, TSize(0,0));               //null size
-    window.SetExtent(fepControlPos, TSize(0,0));
-    window.SetNonFading(ETrue);
-    if(NULL == iEikonEnv->EikAppUi())
-        {
-        User::Leave(KErrCancel);
-        }
-    iEikonEnv->EikAppUi()->AddToStackL(this, ECoeStackPriorityFep, 
-                                       ECoeStackFlagRefusesFocus|ECoeStackFlagSharable);
-#ifdef RD_SCALABLE_UI_V2
-    (CEikonEnv::Static())->AddMessageMonitorObserverL(*this); 
-#endif  //RD_SCALABLE_UI_V2
-    SetBlank();
-    }
-
-TKeyResponse CAknFepKeyCatcher::HandleHashKeyJapaneseL(const TKeyEvent& aKeyEvent, 
-                                                       TEventCode aEventCode)
-    {
-    // handling hash keypress event only
-    __ASSERT_DEBUG(aKeyEvent.iScanCode==EStdKeyHash, AknFepPanic(EAknFepPanicNotSupportKey));
-
-    // No handling case
-    if (aEventCode == EEventKeyDown
-     || iKeyCatcherState == EAknFepStateNull)
-        {
-        if (aEventCode == EEventKeyUp)
-            {
-            ClearFlag(EFlagLongKeyPressHandled);
-            }
-        return EKeyWasNotConsumed;
-        }
-    
-    // sort out if we're doing long or short presses...
-    TKeyPressLength length = aKeyEvent.iRepeats ? ELongKeyPress : EShortKeyPress;
-
-    // long keypress is handled once, after key event always is consumed.
-    if (aEventCode == EEventKey && IsFlagSet(EFlagLongKeyPressHandled) )
-        {
-        return EKeyWasConsumed;
-        }
-    
-    if (length == ELongKeyPress && !IsFlagSet(EFlagLongKeyPressHandled))
-        {
-        SetFlag(EFlagLongKeyPressHandled);
-        }
-    
-    // Always handling case
-    if (aEventCode != EEventKeyUp && IsFlagSet(EFlagLongKeyPressHandled)
-        || aEventCode == EEventKeyUp && !IsFlagSet(EFlagLongKeyPressHandled))
-        {
-        TKeyResponse response = iFepMan.HandleKeyEventL(EPtiKeyHash, length);
-        __ASSERT_DEBUG(response != EKeyWasNotConsumed, AknFepPanic(EAknFepPanicNotHandleHashKey));
-        }
-    else if (aEventCode == EEventKey
-          && iKeyCatcherState == EAknFepStateUIActive)
-        {
-        // Ensure the CBA is in the default state.
-        iFepMan.UpdateCbaL(NULL);
-        // Close FEP UI, commit the inline edit and show the cursor.
-        iFepMan.TryCloseUiL();
-        }
-
-    if (aEventCode == EEventKeyUp)
-        {
-        ClearFlag(EFlagLongKeyPressHandled);
-        }
-    
-    return EKeyWasConsumed;
-    }
-
-void CAknFepKeyCatcher::HandleResourceChange(TInt aType)
-    {
-    if(aType == KEikDynamicLayoutVariantSwitch)  //If the layout has been changed, notify fep manager
-        {
-        iFepMan.HandleResourceChange(aType);
-        }
-
-    CCoeControl::HandleResourceChange(aType);
-    }
-TBool CAknFepKeyCatcher::IsNaviKey(TUint aCode)
-	{
-	switch(aCode)
-		{
-			case EKeyBackspace:
-			case EKeyLeftArrow:
-			case EKeyRightArrow:
-			case EKeyUpArrow:
-			case EKeyDownArrow:
-			case EKeyDelete:
-				return ETrue;
-			default:
-				return EFalse;	
-		}
-	}
-#ifdef RD_SCALABLE_UI_V2
-
-void CAknFepKeyCatcher::MonitorWsMessage(const TWsEvent& aEvent)
-    {
-	switch (aEvent.Type())
-		{
-	    case EEventPointer:
-            TRAP_IGNORE(iFepMan.HandlePointerEventL(*aEvent.Pointer()));
-		    break;
-		default:
-		    break;
-		}
-    }
-
-#endif //RD_SCALABLE_UI_V2 
-
-// End of file