--- a/fep/aknfep/src/AknFepHashKeyManager.cpp Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1549 +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:
-*
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-#include "AknFepHashKeyManager.h"
-#include "AknFepManager.h"
-#include "AknFepCaseManager.h"
-#include "AknFepUiIndicInputManager.h"
-
-#include <aknedsts.h>
-#include <uikon.hrh>
-#include <coedef.h>
-
-#include <PtiEngine.h>
-
-//move to class definition
-#define EHashKeyTimeout 700000 // 0.7s
-
-CAknFepHashKeyManager* CAknFepHashKeyManager::NewL(CAknFepManager& aFepMan,
- CAknFepCaseManager* aCaseMan)
- {
- CAknFepHashKeyManager* self = new(ELeave) CAknFepHashKeyManager(aFepMan, aCaseMan);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop();
- return self;
- }
-
-CAknFepHashKeyManager::~CAknFepHashKeyManager()
- {
- delete iHashKeyTimer;
- }
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyEventL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- switch (iHashKeyStyle)
- {
- case EHashKeyStyleWestern:
- response = HandleKeyWesternL(aLength);
- break;
- case EHashKeyStyleChineseWithWestern:
- response = HandleKeyWesternWithChineseL(aLength);
- break;
- case EHashKeyStyleJapanese:
- response = HandleKeyJapaneseL(aLength);
- break;
- case EHashKeyStyleKoreanWithWestern:
- response = HandleKeyWesternWithKoreanL(aLength);
- break;
- default:
- break;
- }
- return response;
- }
-
-void CAknFepHashKeyManager::SetMode(TInt aMode, TBool aWesternPredictive)
- {
- iMode = aMode;
- iWesternPredictive = aWesternPredictive;
- }
-
-void CAknFepHashKeyManager::SetHashKeyStyle(THashKeyStyle aHashKeyStyle)
- {
- iHashKeyStyle = aHashKeyStyle;
- }
-
-void CAknFepHashKeyManager::CancelHashKeyTimer()
- {
- if (iHashKeyTimer->IsActive())
- {
- iHashKeyTimer->Cancel();
- }
- }
-
-CAknFepHashKeyManager::CAknFepHashKeyManager(CAknFepManager& aFepMan, CAknFepCaseManager* aCaseMan)
- :iHashKeyStyle(EHashKeyStyleWestern),
- iFepMan(aFepMan),
- iCaseMan(aCaseMan)
- {
- iLanguageChangedOrChangeFromNumberMode = EFalse;
- iIndicSelectionLoopIndex = -1; // Cannot use 'iFepMan.WesternPredictive(ELatin);' since FepMan is not completely constructed at the construction of this
- }
-
-void CAknFepHashKeyManager::ConstructL()
- {
- iHashKeyTimer = CPeriodic::NewL(CActive::EPriorityStandard);
- }
-
-TInt CAknFepHashKeyManager::HashKeyTimerTimeoutCallback(TAny* aObj)
- {
- STATIC_CAST(CAknFepHashKeyManager*, aObj)->HashKeyTimerTimeout();
- return KErrNone;
- }
-
-void CAknFepHashKeyManager::HashKeyTimerTimeout()
- {
- iHashKeyTimer->Cancel();
- }
-
-void CAknFepHashKeyManager::RevertPredictiveTextSettingChangeL()
- {
- if ( !iFepMan.InputLanguageSupportsCaseChanges() && iFepMan.EditorState()&&
- !( iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9) )
- {
- // Reverts predictive text settings change made with short key press.
- iFepMan.SetWesternPredictive( !iFepMan.WesternPredictive(ELatin) );
- iFepMan.TryChangeModeL(ELatin);
- }
- }
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyWesternL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
- TBool phoneIdle = (iFepMan.EditorType() == CAknExtendedInputCapabilities::EPhoneNumberEditor);
- if(phoneIdle)
- {
- return response;
- }
- iLastModeNumber = (iMode == ENumber || iMode == ENativeNumber);
-
- if ( (iMode == ENumber || iMode == ENativeNumber) && !iFepMan.HashKeySelectionInUse())
- {
- if (aLength == ELongKeyPress)
- {
- // Clear the EExtendedFlagShortPressHashKey, only for non numeric only editors
- // so as to indicate we are in a long press of hash key event.
- // In case of numeric only editor, we should re-simulate hash and let application
- // handle it.
-
- if ( !iFepMan.IsOnlyNumericPermitted() )
- {
- iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
-
- // Long press of hash key switches to alpha mode
- // if it is permitted mode in the editor.
- iFepMan.TryChangeToModeBeforeL();
- ResetIndicHashKeyStateL();
- }
- response = EKeyWasConsumed;
- }
- else if (!iFepMan.IsExtendedFlagSet(CAknFepManager::EExtendedFlagShortPressHashKey))
- {
- // Set the flag to indicate its a short press of key event
- iFepMan.SetExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
- response = EKeyWasConsumed;
- }
- else
- {
- // We are not suppose to be here. Just a fail safe check to guard us against
- // erroneous situations.
-
- iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
- }
- }
- else
- {
- if ( aLength == EShortKeyPress )
- {
- if (iFepMan.HashKeySelectionInUse())
- {
- // New style hash key loop when long hash-key press is used for text selection.
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- // To rip off suggested word completion when user wants to
- // switch to number or multitap mode
- if(iFepMan.IsAutoCompleteOn())
- {
- iFepMan.RemoveSuggestedCompletionL();
- }
-#endif //RD_INTELLIGENT_TEXT_INPUT
- return HandleKeyWesternSelectionStyleL(aLength);
- }
-
- if ( iLastModeNumber )
- {
- // The key should not be consumed in number mode? FEP Manager may
- // put special chars into the editor or the key event
- // is passed to the editor.
-
- // But now the event is consumed. Same happens also in
- // Chinese languages because # key is reserved for
- // other purpose.
- response = EKeyWasConsumed;
- }
-
- if(IsIndicHashKeyStyleRequired())
- {
- return (SetIndicStateL());
- }
- // Traditional hash key loop
- if ( iFepMan.InputLanguageSupportsCaseChanges() )
- {
- if (iHashKeyTimer->IsActive())
- {
- iHashKeyTimer->Cancel();
- iCaseMan->RevertCaseChange();
- // Toggle predictive setting.
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- // To rip off suggested word completion when user wants to
- // switch to number or multitap mode
- if(iFepMan.IsAutoCompleteOn())
- {
- iFepMan.RemoveSuggestedCompletionL();
- }
-
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStataCommitPredictiveWord);
- iFepMan.SetWesternPredictive( !iFepMan.WesternPredictive(ELatin) );
- iFepMan.TryChangeModeL(ELatin);
- }
- else
- {
- iCaseMan->ManualCaseUpdate();
- iHashKeyTimer->Start(EHashKeyTimeout, EHashKeyTimeout,
- TCallBack(HashKeyTimerTimeoutCallback, this));
- }
- }
- else // Case changes are not allowed.
- {
- if (iHashKeyTimer->IsActive())
- {
- iHashKeyTimer->Cancel();
- // Double press of hash key does not have functionality.
- }
- else
- {
- // Toggle predictive setting.
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- // AutoComplete - Fix - Begin
- if(iFepMan.IsAutoCompleteOn())
- {
- iFepMan.RemoveSuggestedCompletionL();
- }
- // AutoComplete - Fix - End
-
-#endif //RD_INTELLIGENT_TEXT_INPUT
- iFepMan.SetWesternPredictive( !iFepMan.WesternPredictive(ELatin) );
- iFepMan.TryChangeModeL(ELatin);
- iHashKeyTimer->Start(EHashKeyTimeout, EHashKeyTimeout,
- TCallBack(HashKeyTimerTimeoutCallback, this));
- }
- }
- response = EKeyWasConsumed;
- }
- else // Long key press of hash key
- {
- // Clear EExtendedFlagShortPressHashKey flag as soon as long press happens
- iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
-
- // Toggle number mode / alpha mode
- if (iLastModeNumber && !IsIndicHashKeyStyleRequired() &&
- !iFepMan.HashKeySelectionInUse()) // For Indic it is handled in SetIndicPreviousStateL()
- {
- // If short hash key press event is passed to the editor, it
- // needs to be removed here from the editor.
-
- iFepMan.TryChangeToModeBeforeL();
- }
- else
- {
- // Input mode is incremented.
- if (!iFepMan.HashKeySelectionInUse())
- {
-#ifndef RD_INTELLIGENT_TEXT_INPUT
- // To rip off suggested word completion when user wants to switch to number mode
- if(iFepMan.IsAutoCompleteOn())
- {
- iFepMan.RemoveSuggestedCompletionL();
- }
-
-#endif //RD_INTELLIGENT_TEXT_INPUT
- if(IsIndicHashKeyStyleRequired())
- {
- SetIndicPreviousStateL();
- }
- else
- {
- RevertPredictiveTextSettingChangeL();
- }
- if( iFepMan.IsSupportNativeNumber())
- {
- iFepMan.TryChangeModeL( ENativeNumber );
- }
- else
- {
- iFepMan.TryChangeModeL( ENumber );
- }
- }
- else if (!iFepMan.IsCcpuFlagSet(CAknFepManager::ECcpuStateEdwinInSelectionMode) &&
- iFepMan.OkToActivateSelectionMode())
- {
- // User wants to select and not to change mode, so cancel the mode change
- // caused by initial hash key press.
- if(iLastModeNumber && !IsIndicHashKeyStyleRequired())
- {
- iFepMan.TryChangeToModeBeforeL();
- }
- else
- {
- SetPreviousSelectionStyleModeL();
- }
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateHashDown |
- CAknFepManager::ECcpuStateEdwinInSelectionMode |
- CAknFepManager::ECcpuStateHashKeyDeleteDone );
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- }
- }
- response = EKeyWasConsumed;
- }
- }
- return response;
- }
-
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyWesternWithChineseL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
- if ( iFepMan.IsOnlyNumericPermitted() )
- {
- if ( aLength == ELongKeyPress )
- {
- response = EKeyWasConsumed;
- if ( iFepMan.HashKeySelectionInUse() )
- {
- TText prevCh = iFepMan.PreviousChar();
- if (prevCh == '#')
- {
- iFepMan.RemovePreviousCharacterL();
- }
- }
-
- iFepMan.SetCcpuFlag( CAknFepManager::ECcpuStateHashDown |
- CAknFepManager::ECcpuStateEdwinInSelectionMode );
- TKeyEvent ccpuStart = { EKeyF21, EStdKeyF21, 0, 0 };
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL( ccpuStart, EEventKey );
- }
- //else let the FEP Man put special chars into the editor
- }
- else
- {
- if (aLength == EShortKeyPress)
- {
- if (iMode == ENumber || iMode == ENativeNumber)
- {
- iLastModeNumber = ETrue;
- }
- else
- {
- iLastModeNumber = EFalse;
- }
- CAknEdwinState* editorState = iFepMan.EditorState();
- TInt permittedCases = editorState->PermittedCases();
- permittedCases = permittedCases == 0 ?
- EAknEditorLowerCase | EAknEditorUpperCase : permittedCases;
- if ( iMode == ELatin && (permittedCases & EAknEditorTextCase))
- {
- // Latin case update is changed back to automatic if latin
- // text case is allowed and the case is changed manually from #-key.
- iFepMan.ClearFlag(CAknFepManager::EFlagSupressAutoUpdate);
- }
- TInt currentCase = iCaseMan->CurrentCase();
-
- // Is current latin case last available case.
- TBool lastCase = ( ( !(permittedCases & EAknEditorTextCase) &&
- (( currentCase == EAknEditorLowerCase) ||
- ( currentCase == EAknEditorUpperCase &&
- !(permittedCases & EAknEditorLowerCase)) ) ||
- ( editorState->Flags() & EAknEditorFlagFixedCase) ) ||
- ( editorState->Flags() & EAknEditorFlagForceTransparentFepModes) );
-
- if (iMode == ELatin &&
- !iFepMan.IsFlagSet(CAknFepManager::EFlagChangeInputMode) &&
- !lastCase )
- {
- // Input mode is still Latin. Only case is updated.
- if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->ManualCaseUpdate();
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
-
- // Next time input mode is changed if any text is not entered before.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else
- {
- // Input mode is incremented.
- iFepMan.TryIncrementModeL(iMode);
-
- iFepMan.ClearFlag(CAknFepManager::EFlagChangeInputMode);
-
- if (iMode == ELatin) // New mode after Increment.
- {
- if (editorState->Flags() & EAknEditorFlagFixedCase)
- {
- // Only one fixed case is available. Use it.
- iCaseMan->ConfigureCaseStateFromEditorState();
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (editorState->Flags() & EAknEditorFlagForceTransparentFepModes)
- {
- // Only lower case is used with find pane.
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagSupressAutoUpdate);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else
- {
- if (permittedCases & EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- if ( !(permittedCases & EAknEditorLowerCase))
- {
- // We need to move to next input mode since only upper case
- // is permitted in Latin input mode.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- }
- }
- }
- else // Long keypress
- {
- if (!iFepMan.HashKeySelectionInUse())
- {
- if (iLastModeNumber)
- {
- iFepMan.TryChangeToModeBeforeL();
- }
- else
- {
- if( iFepMan.IsSupportNativeNumber())
- {
- iFepMan.TryChangeModeL( ENativeNumber );
- }
- else
- {
- iFepMan.TryChangeModeL(ENumber);
- }
- }
- }
- else if (!iFepMan.IsCcpuFlagSet(CAknFepManager::ECcpuStateEdwinInSelectionMode) &&
- iFepMan.OkToActivateSelectionMode())
- {
- // User wants to select and not to change mode, so cancel the mode change
- // caused by initial hash key press.
- MPtiLanguage* lang = iFepMan.PtiEngine()->CurrentLanguage();
- TInt inputLang = ELangTest;
- if (lang)
- {
- inputLang = lang->LanguageCode();
- }
- const TInt inputMode = iFepMan.InputMode();
-
- if ((inputLang == ELangPrcChinese && inputMode == EPinyin) ||
- (inputLang == ELangTaiwanChinese && inputMode == EZhuyin) ||
- (inputLang == ELangHongKongChinese && inputMode == EStroke))
- {
- // Hash key selection was initiated from number mode,
- // return there.
- iFepMan.TryChangeModeL(ENumber);
- }
- else
- {
- iFepMan.TryChangeToModeBeforeL();
- }
-
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateHashDown |
- CAknFepManager::ECcpuStateEdwinInSelectionMode );
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- }
- }
- response = EKeyWasConsumed;
- }
- return response;
- }
-
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyJapaneseL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
- if (aLength == ELongKeyPress)
- {
- response = HandleLongKeypressJapaneseL();
- }
- else
- {
- response = HandleSortKeypressJapaneseL();
- }
- return response;
- }
-
-TKeyResponse CAknFepHashKeyManager::HandleLongKeypressJapaneseL()
- {
- TKeyResponse response = EKeyWasConsumed;
-
- if (iFepMan.IsOnlyNumericPermitted())
- {
- if (iFepMan.HashKeySelectionInUse())
- {
- TText prevCh = iFepMan.PreviousChar();
- if (prevCh == '#')
- {
- iFepMan.RemovePreviousCharacterL();
- }
- }
- }
-
- if (iMode == EHiraganaKanji || iMode == ELatin)
- {
- // predictive input is turned on/off
- // Commit string on transitory input
- iFepMan.TryCloseUiL();
-
- if(iWesternPredictive)
- {
- iFepMan.TryChangePredictiveInputModeL(EFalse);
- }
- else
- {
- iFepMan.TryChangePredictiveInputModeL(ETrue);
- }
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateChangeToPredictionMode);
- }
- else if (iMode == EHiragana)
- {
- // nothing to do
- }
- else
- {
- // Input mode is incremented.
- iFepMan.TryIncrementModeL(iMode);
- if ( iMode == ELatin )
- {
- if (iCaseMan->IsAbleChangeCase())
- {
- CAknEdwinState* editorState = iFepMan.EditorState();
- TInt permittedCases = editorState->PermittedCases();
- if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else
- {
- if ( iFepMan.CaseBefore() )
- {
- iCaseMan->SetCurrentCase(iFepMan.CaseBefore());
- }
- else if (permittedCases & EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- if ( !(permittedCases & EAknEditorLowerCase))
- {
- // We need to move to next input mode since only upper case
- // is permitted in Latin input mode.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- }
- }
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateChangeToPredictionMode);
- }
-
- if (iFepMan.HashKeySelectionInUse()
- && !iFepMan.IsCcpuFlagSet(CAknFepManager::ECcpuStateEdwinInSelectionMode)
- && iFepMan.OkToActivateSelectionMode())
- {
- // User wants to select and not to change mode, so cancel the mode change
- // caused by initial hash key press.
- SetPreviousSelectionStyleModeL();
-
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStateHashDown |
- CAknFepManager::ECcpuStateEdwinInSelectionMode );
- TKeyEvent ccpuStart = {EKeyF21, EStdKeyF21, 0, 0};
- // to enable copy/paste support on cba. We simulate via CCoeEnv
- // to avoid fep SimulateKeyEventL adding shift modifiers
- CCoeEnv::Static()->SimulateKeyEventL(ccpuStart, EEventKey);
- }
-
- return response;
- }
-
-TKeyResponse CAknFepHashKeyManager::HandleSortKeypressJapaneseL()
- {
- TKeyResponse response = EKeyWasConsumed;
- if (iFepMan.IsOnlyNumericPermitted())
- {
- response = EKeyWasNotConsumed;
- }
- else if (iMode == EHiragana)
- {
- response = EKeyWasConsumed;
- }
- else if (iFepMan.HashKeySelectionInUse()
- && iPreviousSelection)
- {
- // User wants to select and not to change mode, so not change to input mode
- response = EKeyWasConsumed;
- iPreviousSelection = EFalse;
- }
- else
- {
- CancelHashKeyTimer();
- if ( iMode == ELatin && iCaseMan->IsAbleChangeCase())
- {
- // Input mode is incremented.
- iFepMan.TryIncrementModeL(iMode);
- if (iFepMan.IsQwerty())
- {
- if ( iMode == ELatin )
- {
- iFepMan.TryIncrementModeL(ENumber);
- }
- }
- }
- else if ( iMode == ELatin && !iCaseMan->IsAbleChangeCase() && iFepMan.IsQwerty())
- {
- // In Qwerty input and not be able to change case mode,
- // Number mode must be skipped.
- iFepMan.TryIncrementModeL(ENumber);
- }
- else
- {
- // Input mode is incremented.
- iFepMan.TryIncrementModeL(iMode);
- if ( iMode == ELatin )
- {
- if (iCaseMan->IsAbleChangeCase())
- {
- CAknEdwinState* editorState = iFepMan.EditorState();
- TInt permittedCases = editorState->PermittedCases();
- if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else
- {
- if ( iFepMan.CaseBefore() )
- {
- iCaseMan->SetCurrentCase(iFepMan.CaseBefore());
- }
- else if (permittedCases & EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- if ( !(permittedCases & EAknEditorLowerCase))
- {
- // We need to move to next input mode since only upper case
- // is permitted in Latin input mode.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- }
- }
- }
- }
-
- return response;
- }
-
-
-enum
- {
- EHashPredictionBit = 0x01,
- EHashTextCaseBit = 0x02,
- EHashUpperCaseBit = 0x04,
- EHashLowerCaseBit = 0x08,
- EHashNumberModeBit = 0x10,
- };
-
-enum
- {
- EHashLatinLowerMode = EHashLowerCaseBit,
- EHashLatinUpperMode = EHashUpperCaseBit,
- EHashLatinTextMode = EHashTextCaseBit,
- EHashPredLowerMode = EHashLowerCaseBit | EHashPredictionBit,
- EHashPredUpperMode = EHashUpperCaseBit | EHashPredictionBit,
- EHashPredTextMode = EHashTextCaseBit | EHashPredictionBit
- };
-
-enum
- {
- EHashIndicMultitapMode,
- EHashIndicPredictiveMode,
-#ifdef RD_HINDI_PHONETIC_INPUT
- EHashIndicPhoneticLowerMode,
- EHashIndicPhoneticUpperMode,
-#endif
- EHashIndicLatinTextMode,
- EHashIndicLatinLowerMode,
- EHashIndicLatinUpperMode,
- EHashNumberMode
-
- };
-// Here we enumerate possible mode sequences for selection style has key loop.
-// Number mode is handled as a special case. This only consumes 24 bytes.
-const TInt KNumModesInLoop = 4;
-const TUint8 allHashKeyLoops[] =
- {
- EHashLatinLowerMode, EHashLatinUpperMode, EHashPredLowerMode, EHashPredUpperMode,
- EHashLatinUpperMode, EHashLatinLowerMode, EHashPredUpperMode, EHashPredLowerMode,
- EHashLatinTextMode, EHashLatinLowerMode, EHashPredTextMode, EHashPredLowerMode,
- EHashPredLowerMode, EHashPredUpperMode, EHashLatinLowerMode, EHashLatinUpperMode,
- EHashPredUpperMode, EHashPredLowerMode, EHashLatinUpperMode, EHashLatinLowerMode,
- EHashPredTextMode, EHashPredLowerMode, EHashLatinTextMode, EHashLatinLowerMode
- };
-
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyWesternSelectionStyleL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if (aLength == EShortKeyPress)
- {
- if (iFepMan.IsOnlyNumericPermitted())
- {
- if (!iFepMan.IsExtendedFlagSet(CAknFepManager::EExtendedFlagShortPressHashKey))
- {
- // Set the flag to indicate its a short press of key event
- iFepMan.SetExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
- response = EKeyWasConsumed;
- }
- else
- {
- iFepMan.ClearExtendedFlag(CAknFepManager::EExtendedFlagShortPressHashKey);
- }
- return response;
- }
-
- if(IsIndicHashKeyStyleRequired())
- {
- return (SetIndicStateL());
- }
-
- if (!iSelectionLoop)
- {
- TInt index = 0;
- if (iFepMan.WesternPredictive(ELatin))
- {
- index += (3 * KNumModesInLoop);
- }
-
- switch (iCaseMan->CurrentCase())
- {
- case EAknEditorUpperCase:
- index += KNumModesInLoop;
- break;
- case EAknEditorTextCase:
- index += (2 * KNumModesInLoop);
- break;
- default:
- break;
- }
-
- iSelectionLoop = &allHashKeyLoops[index];
-
- if (iMode == ENumber || iMode == ENativeNumber)
- {
- iSelectionLoopIndex = -1;
- }
- }
-
- if (!iFepMan.InputLanguageSupportsCaseChanges())
- {
- // Jumping by 2 always ignores case change.
- iSelectionLoopIndex += 2;
- }
- else
- {
- iSelectionLoopIndex++;
- }
-
- if (iSelectionLoopIndex >= 0 && (iSelectionLoop[iSelectionLoopIndex] & EHashPredictionBit) != 0)
- {
- MPtiLanguage* curLang = iFepMan.PtiEngine()->CurrentLanguage();
- if(!iFepMan.InputLanguageSupportsCaseChanges())
- {
- MCoeFepAwareTextEditor* edit = iFepMan.FepAwareTextEditor();
- if(edit && edit->DocumentLengthForFep() > 0)
- {
- edit->GetCursorSelectionForFep(iPreviousIndicCursorPosition);
- }
-
- }
- if ((curLang && curLang->HasInputMode(EPtiEnginePredictive) == EFalse) ||
- (iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9))
- {
- // If next one would be prediction, but prediction is not allowed,
- // skip modes.
- iSelectionLoopIndex += 2;
- }
- }
-
- if (iSelectionLoopIndex >= KNumModesInLoop)
- {
- iSelectionLoopIndex = -1;
- }
-
- SetSelectionStyleModeL();
-
- response = EKeyWasConsumed;
- }
-
- return response;
- }
-
-
-void CAknFepHashKeyManager::SetPreviousSelectionStyleModeL()
- {
- if(IsIndicHashKeyStyleRequired())
- {
- SetIndicPreviousStateL();
- return;
- }
- if (iFepMan.IsOnlyNumericPermitted() || !iSelectionLoop)
- {
- // iSelectionLoop is not used in Japanese variant,
- // so, it keeps previous selection.
- if (!iSelectionLoop)
- {
- iPreviousSelection = ETrue;
- }
- return;
- }
-
- if (!iFepMan.InputLanguageSupportsCaseChanges())
- {
- // Jumping by 2 always ignores case change.
- iSelectionLoopIndex -= 2;
- if (iSelectionLoopIndex >= 0 &&
- (iSelectionLoop[iSelectionLoopIndex] & EHashPredictionBit) == 0 )
- {
-
- MCoeFepAwareTextEditor* edit = iFepMan.FepAwareTextEditor();
- if(edit && edit->DocumentLengthForFep() > 0)
- {
- edit->SetCursorSelectionForFepL(iPreviousIndicCursorPosition);
- }
- }
- }
- else
- {
- iSelectionLoopIndex--;
- }
-
- if (iSelectionLoopIndex >= 0 &&
- (iSelectionLoop[iSelectionLoopIndex] & EHashPredictionBit) != 0 &&
- (iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9))
- {
- // If next one would be prediction, but prediction is not allowed,
- // skip modes.
- iSelectionLoopIndex -= 2;
- }
-
- if (iSelectionLoopIndex < -1)
- {
- // Jump over to the end of list
- iSelectionLoopIndex = KNumModesInLoop - 1;
- }
-
- SetSelectionStyleModeL();
- }
-
-
-
-void CAknFepHashKeyManager::SetSelectionStyleModeL()
- {
- TBool wasPredictive = iFepMan.WesternPredictive();
- TBool willBePredictive = EFalse;
-
- if (iSelectionLoopIndex == -1)
- {
- // Set number mode.
- if( iFepMan.IsSupportNativeNumber())
- {
- iFepMan.TryChangeModeL( ENativeNumber );
- }
- else
- {
- iFepMan.TryChangeModeL(ENumber);
- }
- }
- else
- {
- willBePredictive = (iSelectionLoop[iSelectionLoopIndex] & EHashPredictionBit) != 0;
- iFepMan.SetWesternPredictive(willBePredictive);
- if (iSelectionLoop[iSelectionLoopIndex] & EHashLowerCaseBit)
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase, ETrue);
- }
- else if (iSelectionLoop[iSelectionLoopIndex] & EHashUpperCaseBit)
- {
- // Let case manager to decide whether we use text case or
- // upper case.
- CAknEdwinState* editorState = iFepMan.EditorState();
- TInt permittedCases = EAknEditorAllCaseModes;
- if(editorState)
- permittedCases = editorState->PermittedCases();
- if (!(permittedCases&EAknEditorTextCase ) ||
- iCaseMan->CapsLockRequired(EAknEditorLowerCase))
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase, ETrue);
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase, ETrue);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase, ETrue);
- }
- iFepMan.SetFlag(CAknFepManager::EFlagSupressAutoUpdate);
- if (!(wasPredictive && willBePredictive))
- {
- // Do not do this if this is just case change inside predictive mode,
- // otherwise active word will be committed.
- iFepMan.SetCcpuFlag(CAknFepManager::ECcpuStataCommitPredictiveWord);
- iFepMan.TryChangeModeL(ELatin);
- }
- iFepMan.ClearFlag(CAknFepManager::EFlagSupressAutoUpdate);
- }
- }
-void CAknFepHashKeyManager::UpdateCaseForIndicHashLoop()
- {
- switch (iCaseMan->CurrentCase())
- {
- case EAknEditorUpperCase:
- iIndicSelectionLoopIndex = EHashIndicLatinUpperMode;
- break;
- case EAknEditorTextCase:
- iIndicSelectionLoopIndex = EHashIndicLatinTextMode;
- break;
- case EAknEditorLowerCase:
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- break;
- default:
- break;
- }
- }
-
-
-TBool CAknFepHashKeyManager::IsIndicHashKeyStyleRequired()
- {
- if(TAknFepUiIndicInputManager::IsIndicLangauge(iFepMan.GetInputLanguageFromSharedDataInterface())
-#ifdef RD_HINDI_PHONETIC_INPUT
- || TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(
- iFepMan.GetInputLanguageFromSharedDataInterface())
-#endif
- )
- {
- CAknEdwinState* editorState = iFepMan.EditorState();
- if (editorState && !(editorState->Flags() & EAknEditorFlagLatinInputModesOnly))
- {
- return ETrue;
- }
- }
- return EFalse;
- }
-
-
-TKeyResponse CAknFepHashKeyManager::SetIndicPreviousStateL()
- {
- TKeyResponse response = EKeyWasNotConsumed;
- if (iFepMan.IsOnlyNumericPermitted())
- {
- return response;
- }
- switch(iIndicSelectionLoopIndex)
- {
- case EHashIndicMultitapMode:
- case EHashIndicPredictiveMode: // fall through
- if(iLanguageChangedOrChangeFromNumberMode)
- {
- if(iFepMan.HashKeySelectionInUse())
- {
- iIndicSelectionLoopIndex = EHashNumberMode;
- }
- else
- {
- iFepMan.ChangeInputLanguageL(ELangEnglish);
- if(iIndicSelectionLoopIndex) // if hindi predictive is on, turn off for english
- {
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(ELatin);
- }
- UpdateCaseForIndicHashLoop();
- }
- }
- else
- {
- // Reverts predictive text settings change made with short key press.
- if(iIndicSelectionLoopIndex) // Meaning predictive state
- {
- iIndicSelectionLoopIndex = EHashIndicMultitapMode; // change to multitap
- MCoeFepAwareTextEditor* edit = iFepMan.FepAwareTextEditor();
- if(edit && edit->DocumentLengthForFep() > 0)
- {
- edit->SetCursorSelectionForFepL(iPreviousIndicCursorPosition);
- }
- }
- else
- {
- iIndicSelectionLoopIndex = EHashIndicPredictiveMode; // change to predictive
- }
- }
- break;
-#ifdef RD_HINDI_PHONETIC_INPUT
- case EHashIndicPhoneticLowerMode:
- case EHashIndicPhoneticUpperMode:
- if(iFepMan.WasLastKeyPressAHashKey())
- {
- iFepMan.ChangeInputLanguageL(ELangEnglish);
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(ELatin);
- iLanguageChangedOrChangeFromNumberMode = ETrue;
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- }
- else
- {
- if(iIndicSelectionLoopIndex == EHashIndicPhoneticUpperMode)
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticLowerMode;
- }
- else if(iIndicSelectionLoopIndex == EHashIndicPhoneticLowerMode)
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticUpperMode;
- }
- }
- break;
-#endif
- case EHashIndicLatinTextMode: // Text Case
- case EHashIndicLatinUpperMode: // Upper Case
- case EHashIndicLatinLowerMode: // Lower Case
- if(iLanguageChangedOrChangeFromNumberMode)
- {
- iFepMan.ChangeInputLanguageL(iFepMan.GetInputLanguageFromSharedDataInterface());
- iIndicSelectionLoopIndex = iIndicPredictiveState;
- }
- else
- {
- if (iIndicSelectionLoopIndex == EHashIndicLatinLowerMode)
- {
- iIndicSelectionLoopIndex = EHashIndicLatinUpperMode;
- }
- else
- {
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- }
- iCaseMan->UpdateCase(ENullNaviEvent);
- if(iCaseMan->CurrentCase() == EAknEditorTextCase)
- {
- iIndicSelectionLoopIndex = EHashIndicLatinTextMode;
- }
- else
- {
- iCaseMan->RevertCaseChange();
- }
- }
- break;
-
- case EHashNumberMode:
- if(iFepMan.HashKeySelectionInUse())
- {
- iFepMan.ChangeInputLanguageL(ELangEnglish);
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(ELatin);
- UpdateCaseForIndicHashLoop();
- }
- break;
- }
- SetIndicSelectionStateL();
- return EKeyWasConsumed;
- }
-
-void CAknFepHashKeyManager::ResetIndicHashKeyStateL()
- {
- if(IsIndicHashKeyStyleRequired())
- {
- TInt editorMode = iFepMan.EditorState()->CurrentInputMode();
- if(editorMode == EAknEditorNumericInputMode)
- {
- iIndicSelectionLoopIndex = EHashNumberMode;
- }
- else
- {
- MPtiLanguage* curLang = iFepMan.PtiEngine()->CurrentLanguage();
- if(curLang && curLang->LanguageCode()!=ELangEnglish )
- {
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(iFepMan.IsIndicPhoneticInputLanguage())
- {
- if(iCaseMan->CurrentCase() == EAknEditorUpperCase)
- iIndicSelectionLoopIndex = EHashIndicPhoneticUpperMode;
- else
- iIndicSelectionLoopIndex = EHashIndicPhoneticLowerMode;
- }
- else
- {
-#endif
- iIndicPredictiveState = iIndicSelectionLoopIndex = iFepMan.WesternPredictive(ELatin);
-#ifdef RD_HINDI_PHONETIC_INPUT
- }
-#endif
- }
- else
- {
- UpdateCaseForIndicHashLoop();
- }
- }
- }
- }
-
-TKeyResponse CAknFepHashKeyManager::SetIndicStateL()
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if (iFepMan.IsOnlyNumericPermitted())
- {
- return response;
- }
-
- iLanguageChangedOrChangeFromNumberMode = EFalse;
- if(iIndicSelectionLoopIndex == -1)
- {
- iIndicPredictiveState = iIndicSelectionLoopIndex =
- (iFepMan.WesternPredictive(ELatin) &&
- (!( iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9)));
- // Cannot be done in constructor as FepMan is not completely initialized
- }
-
- switch(iIndicSelectionLoopIndex)
- {
- case EHashIndicMultitapMode:
- case EHashIndicPredictiveMode: //fall through
-
- iIndicPredictiveState = iIndicSelectionLoopIndex; // 0 for multitap and 1 for predictive
- if(iFepMan.WasLastKeyPressAHashKey() ||
- ( iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9))
- {
- //iFepMan.ChangeInputLanguageL(ELangEnglish);
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(ELatin);
- iLanguageChangedOrChangeFromNumberMode = ETrue;
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- iCaseMan->UpdateCase(ENullNaviEvent);
- if(iCaseMan->CurrentCase() == EAknEditorTextCase)
- {
- iIndicSelectionLoopIndex = EHashIndicLatinTextMode;
- }
- else
- {
- iCaseMan->RevertCaseChange();
- }
- }
- else
- {
- if(iIndicSelectionLoopIndex) // Meaning predictive state
- {
- iIndicSelectionLoopIndex = EHashIndicMultitapMode; // change to multitap
- }
- else
- {
- if(!( iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9))
- {
- iIndicSelectionLoopIndex = EHashIndicPredictiveMode; // change to predictive
- MCoeFepAwareTextEditor* edit = iFepMan.FepAwareTextEditor();
- if(edit && edit->DocumentLengthForFep() > 0)
- {
- edit->GetCursorSelectionForFep(iPreviousIndicCursorPosition);
- }
- }
- }
- }
- break;
-#ifdef RD_HINDI_PHONETIC_INPUT
- case EHashIndicPhoneticLowerMode:
- case EHashIndicPhoneticUpperMode:
- if(iFepMan.WasLastKeyPressAHashKey())
- {
- //iFepMan.ChangeInputLanguageL(ELangEnglish);
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(ELatin);
- iLanguageChangedOrChangeFromNumberMode = ETrue;
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- }
- else
- {
- if(iIndicSelectionLoopIndex == EHashIndicPhoneticUpperMode)
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticLowerMode;
- }
- else if(iIndicSelectionLoopIndex == EHashIndicPhoneticLowerMode)
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticUpperMode;
- }
- }
- break;
-#endif
- case EHashIndicLatinTextMode: // Text Case
- case EHashIndicLatinLowerMode: // Lower Case
- case EHashIndicLatinUpperMode: // Upper Case
- if(iFepMan.WasLastKeyPressAHashKey())
- {
- //iFepMan.ChangeInputLanguageL(iFepMan.GetInputLanguageFromSharedDataInterface());
- iLanguageChangedOrChangeFromNumberMode = ETrue;
- if(iFepMan.HashKeySelectionInUse())
- {
- iIndicSelectionLoopIndex = EHashNumberMode; // change to number
- }
- else
- {
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(
- iFepMan.GetInputLanguageFromSharedDataInterface()))
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticLowerMode;
- }
- else
- {
-#endif
- iIndicSelectionLoopIndex = iIndicPredictiveState; // change to hindi [multitap or predictive based on previous setting]
-#ifdef RD_HINDI_PHONETIC_INPUT
- }
-#endif
- }
- }
- else
- {
- switch (iCaseMan->CurrentCase())
- {
- case EAknEditorUpperCase:
- case EAknEditorTextCase: //fall through
- iIndicSelectionLoopIndex = EHashIndicLatinLowerMode;
- break;
- case EAknEditorLowerCase:
- iIndicSelectionLoopIndex = EHashIndicLatinUpperMode;
- break;
- default:
- break;
- }
- }
- break;
-
- case EHashNumberMode:
- if(iFepMan.HashKeySelectionInUse())
- {
- iLanguageChangedOrChangeFromNumberMode = ETrue;
-#ifdef RD_HINDI_PHONETIC_INPUT
- if(TAknFepUiIndicInputManager :: IsIndicPhoneticLanguage(
- iFepMan.GetInputLanguageFromSharedDataInterface()))
- {
- iIndicSelectionLoopIndex = EHashIndicPhoneticLowerMode;
- iFepMan.TryChangeModeL(ELatin);
- }
- else
- {
-#endif
- iIndicSelectionLoopIndex = iIndicPredictiveState; // change to hindi [multitap or predictive based on previous setting]
-#ifdef RD_HINDI_PHONETIC_INPUT
- }
-#endif
- }
- break;
-
- default:
- break;
- }
-
- SetIndicSelectionStateL();
- return EKeyWasConsumed;
- }
-
-
-
-
-void CAknFepHashKeyManager::SetIndicSelectionStateL()
- {
- switch(iIndicSelectionLoopIndex)
- {
-
- case EHashIndicMultitapMode:
- {
- iFepMan.SetWesternPredictive(EFalse);
- iFepMan.TryChangeModeL(EHindi);
- }
- break;
-
- case EHashIndicPredictiveMode:
- if(!( iFepMan.EditorState()->Flags() & EAknEditorFlagNoT9)) // make sure predictive is supported for editor
- {
- iFepMan.SetWesternPredictive(ETrue);
- iFepMan.TryChangeModeL(EHindi);
- }
- break;
-#ifdef RD_HINDI_PHONETIC_INPUT
- case EHashIndicPhoneticLowerMode:
- iCaseMan->SetCurrentCase(EAknEditorLowerCase, ETrue);
- break;
-
- case EHashIndicPhoneticUpperMode:
- iCaseMan->SetCurrentCase(EAknEditorUpperCase, ETrue);
- break;
-#endif
- case EHashIndicLatinTextMode:
- iCaseMan->SetCurrentCase(EAknEditorTextCase, ETrue);
- break;
-
- case EHashIndicLatinUpperMode:
- iCaseMan->SetCurrentCase(EAknEditorUpperCase, ETrue);
- break;
-
- case EHashIndicLatinLowerMode:
- iCaseMan->SetCurrentCase(EAknEditorLowerCase, ETrue);
- break;
-
- case EHashNumberMode:
- if( iFepMan.IsSupportNativeNumber())
- {
- iFepMan.TryChangeModeL(ENativeNumber);
- }
- else
- {
- iFepMan.TryChangeModeL(ENumber);
- }
- break;
- default:
- break;
- }
- }
-
-void CAknFepHashKeyManager::ResetPreviousSelectionStyleMode()
- {
- iPreviousSelection = EFalse;
- }
-#ifdef RD_HINDI_PHONETIC_INPUT
-void CAknFepHashKeyManager::HandleSetIndicStateL()
- {
- //calling SetIndicStateL only if currently it is in upper mode
- if(iIndicSelectionLoopIndex == EHashIndicPhoneticUpperMode)
- SetIndicStateL();
- }
-#endif
-
-TKeyResponse CAknFepHashKeyManager::HandleKeyWesternWithKoreanL(TKeyPressLength aLength)
- {
- TKeyResponse response = EKeyWasNotConsumed;
-
- if(iMode == ELatin)
- {
- iFepMan.SetWesternPredictive(EFalse);
- }
-
- if (iFepMan.IsOnlyNumericPermitted())
- {
- if (aLength == ELongKeyPress)
- {
- TText prevCh = iFepMan.PreviousChar();
- if (prevCh == '#')
- {
- iFepMan.RemovePreviousCharacterL();
- }
-
- response = EKeyWasConsumed;
- }
- //else let the FEP Man put special chars into the editor
- }
- else
- {
- if (aLength == EShortKeyPress)
- {
- if (iMode == ENumber)
- {
- response = EKeyWasNotConsumed;
- return response;
- }
- }
- else // Long keypress
- {
- if (iMode == ENumber)
- {
- iLastModeNumber = ETrue;
-
- TText prevCh = iFepMan.PreviousChar();
- if (prevCh == '#')
- {
- iFepMan.RemovePreviousCharacterL();
- }
- }
- else
- {
- iLastModeNumber = EFalse;
- }
-
- CAknEdwinState* editorState = iFepMan.EditorState();
- TInt permittedCases = editorState->PermittedCases();
- permittedCases = permittedCases == 0 ?
- EAknEditorLowerCase | EAknEditorUpperCase : permittedCases;
- if ( iMode == ELatin && (permittedCases & EAknEditorTextCase))
- {
- // Latin case update is changed back to automatic if latin
- // text case is allowed and the case is changed manually from #-key.
- iFepMan.ClearFlag(CAknFepManager::EFlagSupressAutoUpdate);
- }
- TInt currentCase = iCaseMan->CurrentCase();
-
- // Is current latin case last available case.
- TBool lastCase = ( ( !(permittedCases & EAknEditorTextCase) &&
- (( currentCase == EAknEditorLowerCase) ||
- ( currentCase == EAknEditorUpperCase &&
- !(permittedCases & EAknEditorLowerCase)) ) ||
- ( editorState->Flags() & EAknEditorFlagFixedCase) ) ||
- ( editorState->Flags() & EAknEditorFlagForceTransparentFepModes) );
-
- if (iMode == ELatin &&
- !iFepMan.IsFlagSet(CAknFepManager::EFlagChangeInputMode) &&
- !lastCase )
- {
- // Input mode is still Latin. Only case is updated.
- if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->ManualCaseUpdate();
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- }
-
- // Next time input mode is changed if any text is not entered before.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else
- {
- // Do not change mode, if text selection is ongoing.
- if(!iFepMan.IsCcpuFlagSet(CAknFepManager::ECcpuStateEdwinInSelectionMode))
- {
- // Input mode is incremented.
- iFepMan.TryIncrementModeL(iMode);
-
-
- iFepMan.ClearFlag(CAknFepManager::EFlagChangeInputMode);
-
- if (iMode == ELatin) // New mode after Increment.
- {
- if (editorState->Flags() & EAknEditorFlagFixedCase)
- {
- // Only one fixed case is available. Use it.
- iCaseMan->ConfigureCaseStateFromEditorState();
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (editorState->Flags() & EAknEditorFlagForceTransparentFepModes)
- {
- // Only lower case is used with find pane.
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagSupressAutoUpdate);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- else if (permittedCases & EAknEditorTextCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorTextCase);
- iCaseMan->UpdateCase(ENullNaviEvent);
- }
- else
- {
- if (permittedCases & EAknEditorUpperCase)
- {
- iCaseMan->SetCurrentCase(EAknEditorUpperCase);
- if ( !(permittedCases & EAknEditorLowerCase))
- {
- // We need to move to next input mode since only upper case
- // is permitted in Latin input mode.
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- else
- {
- iCaseMan->SetCurrentCase(EAknEditorLowerCase);
- iFepMan.SetFlag(CAknFepManager::EFlagChangeInputMode);
- }
- }
- }
- }
- }
- }
- response = EKeyWasConsumed;
- }
- return response;
- }
-// End of File