fep/aknfep/src/AknFepFnKeyManager.cpp
changeset 40 2cb9bae34d17
parent 31 f1bdd6b078d1
child 49 37f5d84451bd
equal deleted inserted replaced
31:f1bdd6b078d1 40:2cb9bae34d17
     1 /*
       
     2 * Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0""
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:            Provides CAknFepManager definition
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 
       
    26 
       
    27 
       
    28 
       
    29 #ifdef _DEBUG
       
    30 #include <eikenv.h>
       
    31 #endif
       
    32 
       
    33 #include <fepbase.h>
       
    34 #include <avkon.hrh>
       
    35 #include <aknedsts.h>               //CAknEdwinState
       
    36 
       
    37 #include "AknFepFnKeyManager.h"
       
    38 #include "AknFepManager.h"
       
    39 #include <centralrepository.h>
       
    40 #include <AknFepInternalCRKeys.h>
       
    41 #include "PtiEngine.h"
       
    42 
       
    43 
       
    44 /*this part is removed 
       
    45 const   TUid    KPhoneUidAppPhone = { 0x100058B3 };
       
    46 const   TUid    KUidCalc = { 0x10005902 };
       
    47 const   TUid    KUidIdle = { 0x101fd64c };
       
    48 */
       
    49 const   TStdScanCode stdFnKeyCode(EStdKeyRightFunc);    // Defines the std key code for Fn key
       
    50 
       
    51 ////////////////////////////////////////////////////////////
       
    52 //   CAknFepFnKeyManager implementation
       
    53 //////////////////////////////////////////////////////////// 
       
    54 CAknFepFnKeyManager::CAknFepFnKeyManager( CAknFepManager& aFepMan, 
       
    55                     CAknFepSharedDataInterface* aSharedDataInterface)
       
    56 :iFepMan( aFepMan ),
       
    57  iFnKeyState( EFnKeyNone ),
       
    58  iIsQwertyMode (EFalse),
       
    59  iSharedDataInterface(aSharedDataInterface),
       
    60  iShiftKeyPressed( EFalse )
       
    61     {
       
    62     iIsQwertyMode = iSharedDataInterface->QwertyInputMode();
       
    63 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
       
    64 #ifdef RD_INTELLIGENT_TEXT_INPUT
       
    65     iWasPreviousModePredictive = iFepMan.WesternPredictive();
       
    66 #endif // RD_INTELLIGENT_TEXT_INPUT
       
    67 #else   
       
    68     iWasPreviousModePredictive = iSharedDataInterface->PredictiveTextOn();
       
    69 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__     
       
    70     // The CR key KAknFepFnKeyState is reset the Fn key state NONE
       
    71     iSharedDataInterface->SetFnKeyState(0);
       
    72     }
       
    73 
       
    74 CAknFepFnKeyManager* CAknFepFnKeyManager::NewL( CAknFepManager& aFepMan,
       
    75                                             CAknFepSharedDataInterface* aSharedDataInterface)
       
    76     {
       
    77     CAknFepFnKeyManager* self = new(ELeave) CAknFepFnKeyManager( aFepMan,aSharedDataInterface );
       
    78     CleanupStack::PushL(self);
       
    79     self->ConstructL();
       
    80     CleanupStack::Pop();
       
    81     return self;
       
    82     }
       
    83 
       
    84 CAknFepFnKeyManager::~CAknFepFnKeyManager()
       
    85     {    
       
    86     iFnKeyState=EFnKeyNone;
       
    87     }
       
    88     
       
    89 void CAknFepFnKeyManager::ConstructL()
       
    90     {    
       
    91     }
       
    92 
       
    93 void CAknFepFnKeyManager::SetQwertyInputMode(TBool aQwertyState)
       
    94     {
       
    95     iIsQwertyMode = aQwertyState;
       
    96     }
       
    97 void CAknFepFnKeyManager::ClearFnKeyState()
       
    98     {
       
    99     iFnKeyState = EFnKeyNone;
       
   100     iFepMan.UpdateIndicators();    
       
   101     }
       
   102 
       
   103 CAknFepFnKeyManager::TFnKeyState CAknFepFnKeyManager::FnKeyState()
       
   104     {
       
   105     return iFnKeyState;
       
   106     }
       
   107 
       
   108 void CAknFepFnKeyManager::SetFnKeyState(CAknFepFnKeyManager::TFnKeyState aState)
       
   109     {
       
   110     TPtiKeyboardType keyboardType = iFepMan.KeyboardLayout();
       
   111     //This function is only supported for EFnKeyNext and half Qwerty keypad at the moment.
       
   112     if(keyboardType == EPtiKeyboardHalfQwerty && EFnKeyNext == iFnKeyState &&
       
   113         aState == EFnKeyNone)
       
   114         {    
       
   115         
       
   116         //if(aState == EFnKeyNext && keyboardType == EPtiKeyboardHalfQwerty)
       
   117         //	{
       
   118         //	iFepMan.PtiEngine()->CancelTimerActivity();
       
   119         //	}
       
   120         iFnKeyState = aState;
       
   121         iFepMan.SetCase( (TCase)iPreviousCase );
       
   122         iFepMan.UpdateIndicators();
       
   123         }
       
   124 #ifdef RD_INTELLIGENT_TEXT_INPUT  
       
   125     else if(keyboardType == EPtiKeyboardQwerty3x11 && EFnKeyNone == iFnKeyState &&
       
   126         aState == EFnKeyLock)
       
   127         {
       
   128         UpdatePreviousCase();
       
   129         iFnKeyState = aState;
       
   130         iFepMan.SetCase(EFnKeyLowerCase);
       
   131         iFepMan.UpdateIndicators();
       
   132         }
       
   133 #endif // RD_INTELLIGENT_TEXT_INPUT 		
       
   134 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__  
       
   135 #ifdef RD_INTELLIGENT_TEXT_INPUT  
       
   136     //Half QWERTY state uses this to change from EFnKeyNext aFnKeyNone
       
   137  	   else if ( iFnKeyState == EFnKeyNone && aState == EFnKeyNext )
       
   138         {
       
   139         // QWERTY long press implementation uses this function to set the Fn state.
       
   140         UpdatePreviousCase();
       
   141         iFnKeyState=EFnKeyNext;
       
   142         }
       
   143 
       
   144 #endif // RD_INTELLIGENT_TEXT_INPUT  
       
   145 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
       
   146      // TODO: above piece of code should be simplify.    
       
   147      // Set the Fn Key state  
       
   148  	 else
       
   149  	    {
       
   150  	    iFnKeyState = aState;    
       
   151  	    }
       
   152     }
       
   153 TKeyResponse CAknFepFnKeyManager::HandleFnKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType, 
       
   154                                                      TCoeInputCapabilities aInputCapabilities ) 
       
   155     {
       
   156     
       
   157     TKeyResponse keyResponse = EKeyWasNotConsumed;
       
   158     TPtiKeyboardType keyboardType = iFepMan.KeyboardLayout();
       
   159 
       
   160     if(!iIsQwertyMode)
       
   161         {
       
   162         return keyResponse;
       
   163         }
       
   164         
       
   165   	if(!iFepMan.IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed) && 
       
   166       !iFepMan.IsFlagSet(CAknFepManager::EFlagLongShiftKeyPress)
       
   167       && iShiftKeyPressed )
       
   168         {
       
   169         iShiftKeyPressed = EFalse;
       
   170         }
       
   171                 
       
   172     TInt caseFromFep = iFepMan.GetCurrentCase();
       
   173     
       
   174     TBool lockLater = EFalse;    
       
   175     if(  EEventKeyDown == aType )
       
   176         {
       
   177         if( stdFnKeyCode == aKeyEvent.iScanCode )
       
   178     		{
       
   179             iFepMan.PtiEngine()->CancelTimerActivity();
       
   180     		if( iPreviousKeyWasFnKey )
       
   181     			{
       
   182     			lockLater	= ETrue;
       
   183     			}
       
   184     		iPreviousKeyWasFnKey = ETrue; 			
       
   185     		}    
       
   186     	else
       
   187     		{
       
   188     		iPreviousKeyWasFnKey = EFalse; 				
       
   189     		}        
       
   190         }
       
   191     if(aKeyEvent.iRepeats && stdFnKeyCode != aKeyEvent.iScanCode &&
       
   192             iFnKeyState == EFnKeyNext)
       
   193         {
       
   194         // To fix the bug : Long press of number at the begin of editor. Then enter any character. 
       
   195         // The character is shown in upper case.
       
   196         if (ELowerCase == caseFromFep)
       
   197             {
       
   198             iFepMan.SetCase( (TCase)caseFromFep );
       
   199             }
       
   200         // To Fix Error: Character is NOT entered as per the input mode
       
   201         // when the character is entered after pressing Shift + Fn + Shift keys
       
   202         else if(!(EStdKeyRightShift == aKeyEvent.iScanCode ||
       
   203         		  EStdKeyLeftShift == aKeyEvent.iScanCode))
       
   204 	        {
       
   205             iFepMan.SetCase( (TCase)iPreviousCase );	
       
   206             }
       
   207             
       
   208 #ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
       
   209 #ifdef RD_INTELLIGENT_TEXT_INPUT  
       
   210          // For QWERTY Predictive ---->
       
   211         if(iWasPreviousModePredictive)
       
   212         	{
       
   213         	// We usually end up here when using the long key press to enter Fn symbols
       
   214 			iFepMan.SetWesternPredictive(ETrue); 
       
   215 		   	iFepMan.TryChangeModeL(ELatin);               	
       
   216         	}
       
   217         // For QWERTY Predictive <----
       
   218 
       
   219 #endif // RD_INTELLIGENT_TEXT_INPUT  
       
   220 #endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__    
       
   221         iFnKeyState = EFnKeyNone;
       
   222         iFepMan.UpdateIndicators();
       
   223         }
       
   224      
       
   225     if( stdFnKeyCode == aKeyEvent.iScanCode )
       
   226         {
       
   227         // Consume the function key events.
       
   228         keyResponse = EKeyWasConsumed;
       
   229         }
       
   230     if (iFepMan.IsHybridAplhaEditor())
       
   231         keyResponse = EKeyWasNotConsumed;
       
   232  
       
   233     
       
   234     // check for the case when in Half Qwerty and both shift and fn keys are
       
   235     // pressed and fn key is released while shift is still down
       
   236     if( EEventKeyUp == aType && 
       
   237     	stdFnKeyCode == aKeyEvent.iScanCode &&
       
   238     	iShiftKeyPressed &&
       
   239     	EPtiKeyboardHalfQwerty == keyboardType )
       
   240     	{
       
   241     	ClearFnKeyState();
       
   242     	}
       
   243     	    
       
   244     if( EStdKeyRightShift == aKeyEvent.iScanCode ||  EStdKeyLeftShift == aKeyEvent.iScanCode )
       
   245         {
       
   246         if( EEventKeyDown == aType ) 
       
   247             {
       
   248             iShiftKeyPressed = ETrue;
       
   249             }
       
   250         if( EEventKeyUp == aType )
       
   251             {
       
   252             iShiftKeyPressed = EFalse;
       
   253             }
       
   254         }
       
   255         
       
   256     // For Shift key handling.
       
   257     // Shift Key should be ignored in locked state.
       
   258      
       
   259     if( ( EFnKeyNext == iFnKeyState ) 
       
   260     && EEventKeyDown == aType &&
       
   261     ( EStdKeyRightShift == aKeyEvent.iScanCode ||  EStdKeyLeftShift == aKeyEvent.iScanCode)) 
       
   262         {
       
   263         // Fnkey event+ shift key event. Change to FnKey Upper case
       
   264         iFepMan.SetCase( EFnKeyUpperCase );
       
   265         if( keyboardType == EPtiKeyboardHalfQwerty )
       
   266             {
       
   267             iFepMan.SetCase( EFnKeyLowerCase );
       
   268             }
       
   269         return EKeyWasNotConsumed;
       
   270         }
       
   271     //===================================================		
       
   272 	
       
   273 	// GQF clarification Fn+Shift
       
   274 	// If shift key is hold on, So fn key state should be EFnKeyNext
       
   275 	// So next text mode goes to function upper
       
   276 	if( aType == EEventKeyUp && iShiftKeyPressed &&  stdFnKeyCode == aKeyEvent.iScanCode)	
       
   277 		{
       
   278 		if( EFnKeyPressed == iFnKeyState)
       
   279 			{
       
   280 			iFepMan.PtiEngine()->CancelTimerActivity();
       
   281 			iFnKeyState=EFnKeyNext;
       
   282 			iFepMan.SetCase( EFnKeyUpperCase );				
       
   283 			}			
       
   284         else if (EFnKeyPressedAgain == iFnKeyState )
       
   285             {
       
   286             CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyLock"));
       
   287             iFnKeyState = EFnKeyLock;	                
       
   288             UpdatePreviousCase();
       
   289             iFepMan.SetCase( EFnKeyUpperCase );
       
   290             }
       
   291         else if(EFnKeyDown == iFnKeyState)
       
   292             {
       
   293             iFnKeyState = EFnKeyNone;
       
   294             UpdatePreviousCase();
       
   295             iFepMan.SetCase( EUpperCase );	
       
   296             }
       
   297 		iFepMan.UpdateIndicators();
       
   298 		}
       
   299 	// Holding shift key, press key just after releasing fn key,
       
   300 	// Fn key state goes to EFnKeyNone mode.
       
   301 	if( aType == EEventKeyUp && iShiftKeyPressed && iFnKeyState==EFnKeyNext && stdFnKeyCode != aKeyEvent.iScanCode &&  !(EStdKeyRightShift == aKeyEvent.iScanCode ||  EStdKeyLeftShift == aKeyEvent.iScanCode))
       
   302 		{
       
   303 		iFnKeyState=EFnKeyNone;		
       
   304 		iFepMan.SetCase( EUpperCase );		
       
   305 		iFepMan.UpdateIndicators();
       
   306 		}
       
   307 		
       
   308 	//====================================================
       
   309 		
       
   310     // Fnkey event+ shift key event -> when fn and shift key are kept pressed.
       
   311     if( (iShiftKeyPressed && EFnKeyNone != iFnKeyState ) )
       
   312         {
       
   313         if( (EFnKeyPressed == iFnKeyState) &&
       
   314         	(stdFnKeyCode != aKeyEvent.iScanCode) &&
       
   315         	!( EStdKeyRightShift == aKeyEvent.iScanCode ||  EStdKeyLeftShift == aKeyEvent.iScanCode ))
       
   316 	        {
       
   317      	   	CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyDown"));
       
   318           	iFnKeyState=EFnKeyDown;	      	
       
   319 	        }
       
   320         
       
   321         // Thre is no Functin shift reverse mode
       
   322         // So, In shift key press if fn key state is not none
       
   323         // text case stte is function upper.
       
   324         if( aType == EEventKeyDown && stdFnKeyCode == aKeyEvent.iScanCode)
       
   325         	{
       
   326         	if ( EFnKeyNext == iFnKeyState )
       
   327         		{       	     	
       
   328        	     	if(lockLater)
       
   329        	     	    {
       
   330        	     	    //CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyPressedAgain "));
       
   331        	     	    iFnKeyState=EFnKeyPressedAgain;
       
   332        	     	    } 					
       
   333         		}
       
   334         	else if ( EFnKeyLock == iFnKeyState )
       
   335 	        	{
       
   336        	     	//CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyDown"));
       
   337               	iFnKeyState=EFnKeyDown;
       
   338 	        	}
       
   339         	}
       
   340         iFepMan.SetCase( EFnKeyUpperCase );
       
   341         if( keyboardType == EPtiKeyboardHalfQwerty )
       
   342             {
       
   343             iFepMan.SetCase( EFnKeyLowerCase );
       
   344             }
       
   345         iFepMan.UpdateIndicators();
       
   346         return EKeyWasNotConsumed;
       
   347         }
       
   348 
       
   349     // Check the input mode of the currently focused editor (when available)
       
   350     MCoeFepAwareTextEditor* fepAwareTextEditor = aInputCapabilities.FepAwareTextEditor();
       
   351     
       
   352     if ( fepAwareTextEditor && fepAwareTextEditor->Extension1() )
       
   353         {
       
   354         if( EAknEditorNumericInputMode == 
       
   355             ( static_cast<CAknEdwinState*>( fepAwareTextEditor->Extension1()->State( KNullUid ) ) )->CurrentInputMode() )
       
   356             // If number input mode is detected, handle it as number input
       
   357             // capability with greatest available variation of letters
       
   358             {
       
   359             // Use EDialableCharacters since it provides most flexibility for number input
       
   360             aInputCapabilities.SetCapabilities( TCoeInputCapabilities::EDialableCharacters );
       
   361             }            
       
   362         }
       
   363         
       
   364     if ( EFnKeyForced != iFnKeyState )
       
   365         {
       
   366         // Handling of Fn key events.
       
   367         // If Fn key is held down while characters are typed, all following key 
       
   368         // events are exchanged.
       
   369         // If Fn key is only pressed (key down + key up, not held down), only
       
   370         // the very next key event is exchanged.
       
   371         // If the next key event after Fn key is another Fn key event, the 
       
   372         // Fn lock mode is activated. Then all following key events are
       
   373         // exchanged until the Fn key is pressed again.       
       
   374          
       
   375         if( EEventKeyDown == aType && stdFnKeyCode == aKeyEvent.iScanCode )
       
   376             {
       
   377             if ( EFnKeyNext == iFnKeyState )
       
   378                 {                
       
   379                 if(lockLater)
       
   380             		{
       
   381             		CEikonEnv::Static()->InfoMsg(_L("iFnKeyState=EFnKeyPressedAgain"));	
       
   382             		iFnKeyState=EFnKeyPressedAgain;
       
   383           			}
       
   384               	else
       
   385               	    {
       
   386               	    iFnKeyState=EFnKeyPressed;
       
   387               	    }		              			
       
   388                 }
       
   389             else if ( EFnKeyLock == iFnKeyState )
       
   390                 {
       
   391                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState=EFnKeyDown"));
       
   392                 iFnKeyState=EFnKeyDown;
       
   393                 }
       
   394             //else 
       
   395             // Sahoo
       
   396             else if ( EFnKeyDown != iFnKeyState )
       
   397                 {
       
   398                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState=EFnKeyPressed"));
       
   399                 iFnKeyState=EFnKeyPressed;
       
   400                 }
       
   401             iFepMan.UpdateIndicators();    
       
   402             return keyResponse;
       
   403             }
       
   404         // Sahoo            
       
   405         if( EEventKeyDown == aType && EFnKeyPressed == iFnKeyState )
       
   406             {
       
   407             iFnKeyState=EFnKeyDown;
       
   408             iFepMan.SetCase( EFnKeyLowerCase );
       
   409             }
       
   410 #ifdef __WINS        
       
   411         // NOTE: This following HACK is to ensure working in emulator environment,
       
   412         // where Alt Gr key seems to send always two separate key events:
       
   413         // EStdKeyRightFunc and EStdKeyLeftCtrl
       
   414         if ( EStdKeyLeftCtrl == aKeyEvent.iScanCode )
       
   415             {
       
   416             return;
       
   417             }
       
   418         // HACK ends
       
   419 #endif
       
   420         
       
   421         if( EEventKeyUp == aType && stdFnKeyCode == aKeyEvent.iScanCode )
       
   422             {
       
   423             if ( EFnKeyPressedAgain == iFnKeyState )
       
   424                 {
       
   425                	if(! iFepMan.IsFlagSet(CAknFepManager::EFlagQwertyShiftMode))
       
   426 	               	{
       
   427 	                CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyLock"));
       
   428 	                iFnKeyState = EFnKeyLock;
       
   429 		           	}
       
   430                	else
       
   431 	               	{
       
   432 	                CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyNext"));
       
   433 	                iFepMan.PtiEngine()->CancelTimerActivity();
       
   434 	                iFnKeyState = EFnKeyNext;               		
       
   435 	               	}
       
   436                 UpdatePreviousCase();
       
   437                 iFepMan.ClearFlag(CAknFepManager::EFlagQwertyShiftMode);             
       
   438                 iFepMan.SetCase( EFnKeyLowerCase );
       
   439                 }
       
   440             else if ( EFnKeyPressed == iFnKeyState )
       
   441                 {
       
   442                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyNext"));
       
   443                 iFepMan.PtiEngine()->CancelTimerActivity();
       
   444                 iFnKeyState = EFnKeyNext;
       
   445                 
       
   446                 UpdatePreviousCase();
       
   447                 
       
   448                 // After pressing shift key Press Fn key,
       
   449                 // So its goes to function upper mode
       
   450                 if( iFepMan.IsFlagSet(CAknFepManager::EFlagQwertyShiftMode))
       
   451                 	iFepMan.SetCase( EFnKeyUpperCase );
       
   452                 else
       
   453                     iFepMan.SetCase( EFnKeyLowerCase );
       
   454                 }
       
   455             else
       
   456                 {
       
   457                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyNone"));
       
   458                 
       
   459                 // For Shift key handling.
       
   460                 if( EFnKeyDown == iFnKeyState || EFnKeyNext == iFnKeyState )
       
   461                     {
       
   462                     iFepMan.SetCase( (TCase)iPreviousCase );
       
   463                     }
       
   464                 iFnKeyState = EFnKeyNone;
       
   465                 }
       
   466             if( EEventKeyUp == aType && iFnKeyState == EFnKeyNone )
       
   467                 {
       
   468                 // To fix the bug :Fn key lock. then type a number with short press at begin of 
       
   469                 // editor. Now press Fn key to go to Fn none state. 
       
   470                 // Press a character. The char is in upper case
       
   471                 if (ELowerCase == caseFromFep)
       
   472 		            {
       
   473 		            iFepMan.SetCase( (TCase)caseFromFep );
       
   474 		            }
       
   475 		        // To Fix Error: Character is NOT entered as per the input mode
       
   476 		        // when the character is entered after pressing Shift + Fn + Shift keys
       
   477 		        else if(!(EStdKeyRightShift == aKeyEvent.iScanCode ||
       
   478 		            	  EStdKeyLeftShift == aKeyEvent.iScanCode))
       
   479 		            {
       
   480 		            iFepMan.SetCase( (TCase)iPreviousCase );	
       
   481 		            }
       
   482                 }
       
   483             iFepMan.UpdateIndicators();
       
   484             return keyResponse;
       
   485             }
       
   486         }
       
   487                 
       
   488     // Now detect the input mode for telephone and calculator apps
       
   489 /*    if ( aInputCapabilities.IsNone() )
       
   490         {   // Idle and Calculator do not provide input capabilities at all.
       
   491         if ( KPhoneUidAppPhone == aCurrentTopAppUid || KUidIdle == aCurrentTopAppUid )
       
   492             {
       
   493             aInputCapabilities.SetCapabilities( TCoeInputCapabilities::EDialableCharacters );
       
   494             }
       
   495         if ( aCurrentTopAppUid == KUidCalc )
       
   496             {
       
   497             aInputCapabilities.SetCapabilities( TCoeInputCapabilities::EWesternNumericReal );
       
   498             }
       
   499         }        
       
   500 */        
       
   501     // Now handle the automatic number mode
       
   502     if ((iFnKeyState != EFnKeyForced) && 
       
   503         ( aInputCapabilities.SupportsWesternNumericIntegerPositive() ||
       
   504          aInputCapabilities.SupportsWesternNumericIntegerNegative() ||
       
   505          aInputCapabilities.SupportsWesternNumericReal() ||
       
   506          aInputCapabilities.SupportsDialableCharacters() )         
       
   507        )
       
   508         {
       
   509         // If input mode is numeric, Fn key is automated (=forced)
       
   510         iFnKeyState = EFnKeyForced;
       
   511         
       
   512         UpdatePreviousCase();
       
   513         
       
   514         iFepMan.SetCase( EFnKeyLowerCase );
       
   515         iFepMan.UpdateIndicators();
       
   516         //Forced input mode
       
   517         // The CR key KAknFepFnKeyState set to Locked
       
   518         iSharedDataInterface->SetFnKeyState(EFnKeyForced/*=6*/);        
       
   519         CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyForced"));   
       
   520         }
       
   521 #ifdef __REVERSE_FN_KEY_SUPPORTED
       
   522     //Reverse Fn Key mapping!
       
   523     //Just one of the cases for Reverse Fn key mapping!
       
   524     // There are manu more of these!
       
   525     if((EFnKeyForced == iFnKeyState && aKeyEvent.iModifiers & EModifierRightFunc ) )
       
   526     	{    	
       
   527     	iFepMan.SetCase( (TCase)iPreviousCase );    	
       
   528     	iFepMan.SetReverseFnkeyInputMode(ETrue);    	
       
   529     	}
       
   530     else if(iFepMan.IsReverseFnkeyInput())
       
   531     	{
       
   532     	iFepMan.SetReverseFnkeyInputMode(EFalse);           
       
   533         iFepMan.SetCase(EFnKeyLowerCase);
       
   534     	}
       
   535 #endif //__REVERSE_FN_KEY_SUPPORTED
       
   536         
       
   537     // If any of the following states apply, the key event should be exchanged.        
       
   538     if ( EFnKeyPressed == iFnKeyState ||
       
   539          EFnKeyDown == iFnKeyState ||
       
   540          EFnKeyNext == iFnKeyState ||
       
   541          EFnKeyPressedAgain == iFnKeyState ||
       
   542          EFnKeyLock == iFnKeyState ||
       
   543          EFnKeyForced == iFnKeyState )
       
   544         {
       
   545         // For telephone number editor key events for w, p and + must be accepted as is
       
   546         if( aInputCapabilities.SupportsDialableCharacters() && ( 'W' == aKeyEvent.iScanCode ||
       
   547                                                                  'P' == aKeyEvent.iScanCode ||
       
   548                                                                  '+' == aKeyEvent.iScanCode ||
       
   549                                                                  'w' == aKeyEvent.iCode ||
       
   550                                                                  'p' == aKeyEvent.iCode ||
       
   551                                                                  '+' == aKeyEvent.iCode) )
       
   552             {
       
   553             return keyResponse;
       
   554             }
       
   555             
       
   556         if( EEventKeyUp == aType )
       
   557             {
       
   558             if ( EFnKeyPressed == iFnKeyState || EFnKeyPressedAgain == iFnKeyState )
       
   559                 {
       
   560                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyDown"));
       
   561                 iFnKeyState = EFnKeyDown;                
       
   562                 UpdatePreviousCase();
       
   563                 
       
   564                 // Fn key hold on and press any key
       
   565                 if( iFepMan.IsFlagSet(CAknFepManager::EFlagQwertyShiftMode))
       
   566                 	iFepMan.SetCase( EFnKeyUpperCase );
       
   567                 else
       
   568                 	iFepMan.SetCase( EFnKeyLowerCase );
       
   569                 }
       
   570                 
       
   571              // Debasish MT error fixing
       
   572             else if( EFnKeyNext == iFnKeyState && iFepMan.IsFlagSet(CAknFepManager::EFlagQwertyShiftMode))
       
   573 	            {
       
   574 	            // keep the sate as it is
       
   575 	            UpdatePreviousCase();	
       
   576 	            iFepMan.SetCase( EFnKeyUpperCase );
       
   577 	            
       
   578 	            if( keyboardType == EPtiKeyboardHalfQwerty )
       
   579                     {
       
   580                     iFepMan.SetCase( EFnKeyLowerCase );
       
   581                     }
       
   582 	            }
       
   583             else if ( EFnKeyNext == iFnKeyState )
       
   584                 {
       
   585                 //This has to be done if the keyboard type is not half Qwerty
       
   586                 if(keyboardType == EPtiKeyboardHalfQwerty)
       
   587                     return keyResponse;
       
   588                 CEikonEnv::Static()->InfoMsg(_L("iFnKeyState = EFnKeyNone"));
       
   589                 
       
   590                 // To fix the bug : At begin of editor, press Fn key. Now press a number.
       
   591                 // Now state is FnKeyNone. Type any char. The case is upper.
       
   592                 // For Shift key handling.
       
   593                 if( EFnKeyDown == iFnKeyState || EFnKeyNext == iFnKeyState )
       
   594                     {
       
   595 		 			if (ELowerCase == caseFromFep)
       
   596 	            		{
       
   597 	            		iFepMan.SetCase( (TCase)caseFromFep );
       
   598 	            		}
       
   599 			        // To Fix Error: Character is NOT entered as per the input mode
       
   600 			        // when the character is entered after pressing Shift + Fn + Shift keys
       
   601 		 			else if(!(EStdKeyRightShift == aKeyEvent.iScanCode ||  
       
   602 		 						  EStdKeyLeftShift == aKeyEvent.iScanCode))
       
   603 	            		{
       
   604 	            		iFepMan.SetCase( (TCase)iPreviousCase );	
       
   605 	            		}
       
   606                     }
       
   607                  iFnKeyState = EFnKeyNone;
       
   608                 }
       
   609             iFepMan.UpdateIndicators();
       
   610             }                        
       
   611         }
       
   612 
       
   613     return keyResponse;
       
   614     }
       
   615   
       
   616 void CAknFepFnKeyManager::UpdatePreviousCase()
       
   617     {
       
   618     iPreviousCase = iFepMan.GetCurrentCase();
       
   619     }
       
   620 // End of File
       
   621