--- a/fep/aknfep/src/AknFepUiInputStateEntryHalfQwertyWesternPredictive.cpp Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,887 +0,0 @@
-/*
-* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0""
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-* Provides the TAknFepUiInputStateEntryHalfQwertyWesternPredictive methods.
-*
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-#include "AknFepUiInputStateEntryHalfQwertyWesternPredictive.h"
-#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface
-#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface
-#include "AknFepUiManagerWestern.h"
-#include "AknFepManager.h"
-#include "AknFepPanic.h"
-#include "AknFepCaseManager.h"
-
-#include <PtiEngine.h> //CPtiEngine
-#include <PtiDefs.h> //keys
-#include <PtiCompositionDataIF.h> //MPtiEngineCompositionDataInterface
-#include <featmgr.h> //FeatureManager
-#include <e32keys.h>
-#include <aknfep.rsg>
-#include <PtiUserDicEntry.h>
-// TODO: Remove this include
-#include <AvkonInternalCRKeys.h>
-#include <AknUtils.h>
-
-static const TInt KKeyMappingsLength = 63;
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-TAknFepUiInputStateEntryHalfQwertyWesternPredictive::TAknFepUiInputStateEntryHalfQwertyWesternPredictive(MAknFepUIManagerStateInterface* aOwner)
- :TAknFepInputStateBase(aOwner)
- {
- //this class insists on the existence of a case manager
- __ASSERT_DEBUG(iOwner->CaseMan(), AknFepPanic(EAknFepPanicNoCaseManager));
-
- iState = EEntry;
- CPtiEngine* ptiengine = iOwner->PtiEngine();
-
- ptiengine->SetInputMode( EPtiEngineHalfQwertyPredictive );
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
-
- TPtiTextCase caseMode = ptiengine->Case();
-
- ptiengine->SetCase(caseMode);
- TBool isUnlimitedEditor = EFalse;
- ptiengine->SetMaxLengthForAutoCompletedCandidates(fepMan->EditorFreeSpaceForAutoWordCompletion(isUnlimitedEditor ));
-
- if(fepMan->IsAutoCompleteOn())
- {
- TRAP_IGNORE( ptiengine->HandleCommandL( EPtiCommandEnableAutoCompletion ) );
- }
- else
- {
- TRAP_IGNORE( ptiengine->HandleCommandL( EPtiCommandDisableAutoCompletion ) );
- }
-
-// TPtiErrorCorrectionLevel correctionLevel = (TPtiErrorCorrectionLevel)fepMan->AdvancedPredictiveTypingCorrectionLevel();
-// TRAP_IGNORE( ptiengine->HandleCommandL( EPtiCommandSetCorrectionLevel, &correctionLevel ) );
-
- TPtiKeyboardType keyboard = fepMan->KeyboardLayout();
- ptiengine->SetKeyboardType(keyboard);
-
-
-// TBool isNumberCandidateShown = fepMan->IsAdvancedPredictiveNumberCandidateShown();
-// TRAP_IGNORE( ptiengine->HandleCommandL( EPtiCommandSetNumberCandidateStatus, &isNumberCandidateShown ) );
-//
-// TBool primaryCandidateState = fepMan->AdvancedPredictivePrimaryCandidate();
-// TRAP_IGNORE( ptiengine->HandleCommandL( EPtiCommandSetProactiveCorrection, &primaryCandidateState ) );
- }
-
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-//
-TBool TAknFepUiInputStateEntryHalfQwertyWesternPredictive::HandleKeyL(TInt aKey, TKeyPressLength aLength)
- {
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CPtiEngine* ptiengine = iOwner->PtiEngine();
-
- CAknFepFnKeyManager::TFnKeyState fnKeyState = fepMan->FnKeyState();
-
- if(fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- ptiengine->SetCase(EPtiCaseFnLower);
- }
-
- // Handle the Chr cycling
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) && aKey !=EKeyBackspace)
- {
- // if the key has no accented characters mapped to it, then just block the event
- TBuf<KKeyMappingsLength> keyMappings;
- ptiengine->MappingDataForKey( (TPtiKey)aKey, keyMappings, EPtiCaseChrLower );
- if( keyMappings.Length() == 0 )
- {
- return EFalse;
- }
- // if there is a no matches indicator remove it
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) && fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- fepMan->UpdateCbaL(NULL);
- }
- // if there is an autocompletion part rip it off
- fepMan->RemoveSuggestedAdvanceCompletionL();
-
- // now if the editor has no free space just return
- if ( !fepMan->EditorHasFreeSpace() )
- {
- return EFalse;
- }
- // if we are in inline editing, break the word
- if( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
- {
- TPtrC selectedWord = ptiengine->CurrentWord();
- if( ptiengine->CurrentWord() != KNullDesC)
- {
- fepMan->UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- ptiengine->CommitCurrentWord();
- }
- fepMan->TryCloseUiL();
- }
-
- if ( iData && (iData != aKey) )
- {
- // Chr key is still pressed down but character key was changed from previous one
- // to new one. The previous character is committed and PtiEngine starts
- // processing new key.
- ptiengine->CancelTimerActivity();
- }
- fepMan->SetFlag( CAknFepManager::EFlagInsideMultitapInlineEditingTransaction );
- }
-
- TBool response = EFalse;
-
-
- // Handle dead keys with space or backspace. These keys are not mapped in PtiEngine, so they cannot
- // be handled there.
-/* if ( ptiengine->HandleCommandL(EPtiCommandDeadKeyWaiting) == 1 )
- {
- if ( aKey == EStdKeyBackspace )
- {
- // Pending dead key is removed with backspace. No other characters are removed.
- ptiengine->HandleCommandL(EPtiCommandGetAndClearDeadKeyRootChar);
- response = ETrue;
- }
- else if ( aKey == EStdKeySpace )
- {
- // Dead key followed by space enters the dead key root character
- TText deadRoot = ptiengine->HandleCommandL(EPtiCommandGetAndClearDeadKeyRootChar);
- ptiengine->HandleCommandL( EPtiCommandAppendCharacter, &deadRoot );
-
- TPtrC newText = ptiengine->CurrentWord();
- fepMan->UpdateInlineEditL( newText, newText.Length() );
- iOwner->CaseMan()->UpdateCase(ENullNaviEvent);
-
- response = ETrue;
- }
- }
-*/
- if (!response) // key not yet handled
- {
- switch (aKey)
- {
- case EStdKeySpace:
- if( fepMan->FnKeyState()
- == CAknFepFnKeyManager::EFnKeyNone )
- {
- response = HandleWordBreakingKeysL(aKey);
- }
- else
- {
- response = HandleQwertyKeysL( aKey, aLength);
- }
- break;
- case EStdKeyFullStop:
- if( aLength == ELongKeyPress )
- {
- // first commit the word if in inline editing
- if( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
- {
- if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- fepMan->UpdateCbaL(NULL);
- }
-
- TPtrC selectedWord = ptiengine->CurrentWord();
- if( ptiengine->CurrentWord() != KNullDesC)
- {
- fepMan->UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- ptiengine->CommitCurrentWord();
- }
- fepMan->TryCloseUiL();
- }
- response = EFalse;
- }
- else
- {
- HandleShiftState(aKey);
- response = HandleQwertyKeysL( aKey, aLength);
- }
- break;
- case EStdKeyEnter:
- case EStdKeyTab:
- case EStdKeyLeftArrow:
- case EStdKeyRightArrow:
- case EStdKeyUpArrow:
- case EStdKeyDownArrow:
- response = HandleWordBreakingKeysL(aKey);
- break;
-
- // Long press of shift key start copy event.
- // Its should handle by framework.
- case EStdKeyF21:
- case EKeyF21:
- // Soft key handle by framework
- // Selection key handle by AknFepManager.
- case EStdKeyDevice0: // iCode:EKeyCBA1
- case EStdKeyDevice1: // iCode:EKeyCBA2
- case EStdKeyDevice3: // iCode:EKeyOK
- case EKeyCBA1:
- case EKeyCBA2:
- case EKeyOK:
- response = EFalse;
- break;
-
- case EKeyUpArrow:
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
- {
- // Select the exact match with the up arrow and lock it.
- // Another alternative could be to call function DoPreviousMatchL() from here
-
- TPtrC exactWord = ptiengine->FirstCandidate();
- ptiengine->HandleCommandL( EPtiCommandLockCurrentCandidate, NULL );
-
- fepMan->UpdateInlineEditL(exactWord, exactWord.Length());
-
- response = ETrue;
- break;
- }
- // fall through
- case EKeyDownArrow:
- case EKeyLeftArrow:
- case EKeyRightArrow:
- case EKeyBackspace:
- {
- response = HandleNaviKeysL(aKey, aLength);
- }
- break;
-
- case EStdKeyLeftShift:
- case EStdKeyRightShift:
- case EStdKeyLeftFunc:
- {
- if( EPtiCaseFnLower == fepMan->PtiEngine()->Case() )
- {
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- }
-
- fepMan->UpdateCbaL(NULL);
-
- /*if (fepMan->IsFlagSet(CAknFepManager::EFlagCompoundWord))
- {
- if (fepMan->IsCursorAtEndOfWord())
- {
- fepMan->AddCompoundWordToUdbL();
- }
- fepMan->ClearFlag(CAknFepManager::EFlagCompoundWord);
- }
- */
-
- fepMan->RemoveSuggestedAdvanceCompletionL();
- ptiengine->CommitCurrentWord();
- fepMan->CommitInlineEditL();
- fepMan->TryCloseUiL();
- response = EFalse;
- }
- }
- break;
-
- default:
- HandleShiftState(aKey);
- response = HandleQwertyKeysL(aKey, aLength);
-#ifdef __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
- if ( aLength == ELongKeyPress )
- {
- // Expire multitap timer after long press.
- ptiengine->CancelTimerActivity();
- }
-#endif // __ITI_LONGPRESS_NUM_SHIFT_COPYPASTE__
- break;
- }
- }
-
- if ( aKey == EStdKeyEnter)
- {
- iData = 0;
- return 0;
- }
-
- if (!iOwner->PtiEngine()->IsValidKey((TPtiKey)aKey))
- {
- iData = 0;
- fepMan->ClearFlag(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction);
- fepMan->PtiEngine()->CancelTimerActivity();
-
- return response;
- }
-
-
- iData = aKey; // store the pressed key for future reference
- return response;
- }
-
-
-//////////////////////////////////////////////////////////////////////////////////
-//
-void TAknFepUiInputStateEntryHalfQwertyWesternPredictive::HandleShiftState( TInt aKey )
- {
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CPtiEngine* ptiengine = iOwner->PtiEngine();
- CAknFepCaseManager* caseMan = iOwner->CaseMan();
- CAknFepFnKeyManager::TFnKeyState fnKeyState = fepMan->FnKeyState();
- TPtiTextCase shiftedCase;
- if(fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- shiftedCase = EPtiCaseFnLower;
- }
- else
- {
- shiftedCase= EPtiCaseLower;
- }
-
- // Find out if the key is alphabetic
- TBuf<KKeyMappingsLength> keyMappings;
- ptiengine->MappingDataForKey( (TPtiKey)aKey, keyMappings, EPtiCaseUpper );
- TBool isAlpha = ( keyMappings.Length() && TChar(keyMappings[0]).IsAlpha() );
-
- if (isAlpha && (fnKeyState == CAknFepFnKeyManager::EFnKeyNone))
- {
- switch ( caseMan->CurrentCase() )
- {
- case EAknEditorTextCase:
- {
- // Alphabetic characters are always capitalized in "Abc" mode
- // unless the shift is pressed
- if ( !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) )
- {
- shiftedCase = EPtiCaseUpper;
- }
- }
- break;
-
- case EAknEditorLowerCase:
- {
- // Pressing shift enters uppercae letters in the "abc" mode
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) )
- {
- shiftedCase = EPtiCaseUpper;
- }
- }
- break;
-
- case EAknEditorUpperCase:
- {
- // In the "ABC" mode (capslock mode) the letters are uppercased
- // unless the shift is pressed
- if ( !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) )
- {
- shiftedCase = EPtiCaseUpper;
- }
- }
- break;
-
- default:
- break;
- }
-
-
- }
- else
- {
- // non-alphabetic keys are shifted if and only if shift is pressed, no matter what is the input state
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) && (fnKeyState == CAknFepFnKeyManager::EFnKeyNone))
- {
- shiftedCase = EPtiCaseUpper;
- }
- else if ( fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) && (fnKeyState != CAknFepFnKeyManager::EFnKeyNone))
- {
- shiftedCase = EPtiCaseFnUpper;
- }
- }
-
-
- // Handle the Chr key state
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) )
- {
- // Chr key is pressed down. Chr mode is used.
- if (shiftedCase == EPtiCaseLower)
- {
- shiftedCase = EPtiCaseChrLower;
- }
- else if (shiftedCase == EPtiCaseUpper)
- {
- shiftedCase = EPtiCaseChrUpper;
- }
- }
-
- ptiengine->SetCase(shiftedCase);
-
- fepMan->ClearFlag(CAknFepManager::EFlagNoActionDuringShiftKeyPress);
- }
-
-//////////////////////////////////////////////////////////////////////////////////
-//
-
-TBool TAknFepUiInputStateEntryHalfQwertyWesternPredictive::HandleWordBreakingKeysL(TInt aKey)
- {
- TBool retVal = EFalse; // in most cases we let also the upper levels handle these key events
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CPtiEngine* ptiengine = iOwner->PtiEngine();
-
-
- // Up and down arrows break the inline word input only when shift or chr is held down
- if ( !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) &&
- !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyShiftMode) &&
- ( aKey==EStdKeyUpArrow || aKey==EStdKeyDownArrow ) )
- {
- return retVal;
- }
-
-
- if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
- {
- TBool rightToLeftLang = fepMan->IsRightToLeftLanguage();
- TInt tailLength = 0;
- ptiengine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
- switch (aKey)
- {
- case EStdKeyLeftArrow:
- case EStdKeyRightArrow:
- // In case the inline editing is ongoing and there is a word completion
- // currently shown, the first backwards tap will remove the suggested
- // completion.
- if(tailLength > 0)
- {
- if ((rightToLeftLang && aKey == EStdKeyLeftArrow)
- || (! rightToLeftLang && aKey == EStdKeyRightArrow ))
- {
- ptiengine->HandleCommandL( EPtiCommandLockCurrentCandidate);
- TPtrC selectedWord = ptiengine->CurrentWord();
- fepMan->UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- // To fix the bug: STAA-7GYBJC Suggested word is not committed when Arrow right key is pressed.
- ptiengine->CommitCurrentWord();
- fepMan->TryCloseUiL();
- // Asyncronous case update after the editor has handled the key
- fepMan->SimulateKeyEventL(EKeyF19);
- retVal = ETrue;
- }
- else if((rightToLeftLang && aKey == EStdKeyRightArrow)
- || (! rightToLeftLang && aKey == EStdKeyLeftArrow ))
- {
- fepMan->RemoveSuggestedAdvanceCompletionL();
- retVal = ETrue;
- }
- }
- else
- {
- ptiengine->CommitCurrentWord();
- retVal = EFalse;
- }
- break;
- case EStdKeyUpArrow:
- case EStdKeyDownArrow:
- case EStdKeyEnter:
- case EStdKeySpace:
- case EStdKeyTab:
- {
- //retVal = ETrue;
-
- if ( ( aKey == EStdKeySpace || aKey == EStdKeyEnter ||aKey == EStdKeyTab)
- && fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)
- && (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) )
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- fepMan->UpdateCbaL(NULL);
- }
-
- TBool wasInlineEditing = EFalse;
- wasInlineEditing = fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction);
- ptiengine->CommitCurrentWord();
- fepMan->CommitInlineEditL();
- /* Temporary Fix */
- //EFlagInsideInlineEditingTransaction flag check is not required
- //but just to make sure.
- if(aKey == EStdKeySpace && wasInlineEditing)
- {
- _LIT(KSpace," ");
- fepMan->StartInlineEditL();
- fepMan->UpdateInlineEditL(KSpace,0);
- fepMan->CommitInlineEditL();
- retVal = ETrue;
- }
- /* Temporary Fix */
- fepMan->TryCloseUiL();
- // Asyncronous case update after the editor has handled the key
- fepMan->SimulateKeyEventL(EKeyF19);
- }
- break;
- default:
- __ASSERT_DEBUG( EFalse, AknFepPanic(EAknFepPanicNotSupportKey) );
- }
-
- }
- else
- {
- iOwner->ChangeState( EInitial );
- }
-
- return retVal;
- }
-
-
-/////////////////////////////////////////////////////////////////////////////////
-//
-TBool TAknFepUiInputStateEntryHalfQwertyWesternPredictive::HandleQwertyKeysL(TInt aKey, TKeyPressLength aLength)
- {
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CPtiEngine* ptiengine = iOwner->PtiEngine();
- TBool retVal = EFalse;
- CAknFepCaseManager* caseMan = iOwner->CaseMan();
-
- CAknFepFnKeyManager::TFnKeyState fnKeyState = fepMan->FnKeyState();
-
- // Key is consumed if the PtiEngine maps it to some character
- TBuf<KKeyMappingsLength> keyMappings;
-
- if(fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- ptiengine->MappingDataForKey( (TPtiKey)aKey, keyMappings, EPtiCaseFnLower);
- }
- else
- {
- ptiengine->MappingDataForKey( (TPtiKey)aKey, keyMappings, EPtiCaseLower);
- }
- //ptiengine->MappingDataForKey( (TPtiKey)aKey, keyMappings, EPtiCaseLower);
- //ITI : Pti Engine can be asked to give the proper data for the keys under Fn Key.
- TBool keyIsMapped = ( keyMappings.Length() > 0 );
-
- // The dead key handling inside the PtiDefaultCore assumes that no other key mapping queries
- // have been made between handling the dead key and the next one (these queries change the
- // internal state of the key mapping object). For this reason, we must return the key mappings
- // to their previous state. This is quite dirty hack, but so is the dead key handling code which
- // forces us to do this.
- if(fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- ptiengine->MappingDataForKey( (TPtiKey)iData, keyMappings, EPtiCaseFnLower);
- }
- else
- {
- ptiengine->MappingDataForKey( (TPtiKey)iData, keyMappings, EPtiCaseLower);
- }
-
- if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches) && fnKeyState == CAknFepFnKeyManager::EFnKeyNone )
- {
- //no matches, so just play tone
- fepMan->PlaySound(EAvkonSIDConfirmationTone);
- return keyIsMapped;
- }
-
- if ( keyIsMapped )
- {
- if( fnKeyState != CAknFepFnKeyManager::EFnKeyNone )
- {
- //closing the UI will commit the current word and move to intial state
-
- // break the word
- if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- }
- fepMan->RemoveSuggestedAdvanceCompletionL();
- TPtrC selectedWord = ptiengine->CurrentWord();
- if( ptiengine->CurrentWord() != KNullDesC)
- {
- fepMan->UpdateInlineEditL( selectedWord, selectedWord.Length() ); //selection.iAnchorPosition
- ptiengine->CommitCurrentWord();
- }
- fepMan->TryCloseUiL();
- ptiengine->SetCase(EPtiCaseFnLower);
- }
-
- if ( !(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) )
- { // 'new' inline edit
- ptiengine->ClearCurrentWord();
- if (caseMan->CurrentCase() == EAknEditorTextCase)
- {
- ptiengine->MarkAutoCapitalized();
- }
-
- fepMan->StartInlineEditL();
- }
-
- TPtrC newText;
-
- if( aKey == EStdKeyFullStop )
- {
- TInt tailLength = 0;
- ptiengine->HandleCommandL( EPtiCommandLockCurrentCandidate, &tailLength );
-/* if( fepMan->IsAutoCompleteOn() )
- {
- TInt tailLength = 0;
- ptiengine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
- if( tailLength > 0)
- {
- // if autoword part is visible update the input sequence
- newText.Set(ptiengine->CurrentWord() );
- ptiengine->ClearCurrentWord();
- ptiengine->SetCurrentWord(newText);
- }
- }*/
- }
-
- newText.Set(ptiengine->AppendKeyPress((TPtiKey)aKey));
-
- if ( aLength == EShortKeyPress )
- {
- SetShortKeyPressText(newText);
- }
- if (ptiengine->NumberOfCandidates() > 0 )
- {
- // more good words coming in from predictive text engine so carry on
- if(newText.Length() == 1)
- {
- TDigitType digittype = fepMan->LocalDigit();
- TChar chchar(newText[0]);
- if(!chchar.IsDigit() || (chchar.IsDigit() && !digittype))
- {
- fepMan->UpdateInlineEditL(newText, newText.Length());
- }
- else
- {
- TBuf<1> tempbuf;
- tempbuf.Append(newText[0]);
- ConvertDigitToDigittype(digittype,tempbuf);
- fepMan->UpdateInlineEditL(tempbuf, tempbuf.Length());
- }
- if(fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- ptiengine->CommitCurrentWord();
- fepMan->CommitInlineEditL();
- }
- }
- else
- {
- fepMan->UpdateInlineEditL(newText, newText.Length());
- }
-
- }
-
- else
- {
- // engine has run out of matches
- // we are not in the functionized state
- fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);
- fepMan->SetFlag(CAknFepManager::EFlagNoMatches);
- fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY);
- if(newText.Length() == 1)
- {
- TDigitType digittype = fepMan->LocalDigit();
- TChar chchar(newText[0]);
- if(!chchar.IsDigit() || (chchar.IsDigit() && !digittype))
- {
- fepMan->UpdateInlineEditL(newText, newText.Length());
- }
- else
- {
- TBuf<1> tempbuf;
- tempbuf.Append(newText[0]);
- ConvertDigitToDigittype(digittype,tempbuf);
- fepMan->UpdateInlineEditL(tempbuf, tempbuf.Length());
- }
- }
- else
- {
- // Remove the autocompletion tail if present
- if (fepMan->IsAutoCompleteOn())
- {
- TInt tailLength = 0;
- ptiengine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, &tailLength );
- if(tailLength > 0)
- {
- // To remove the autocompletion part, the below function is used.
- // DeleteKeyPress was used earlier. This is removed to fix the bug :
- // enter characters to show autocompletion part. Now press a
- // character so that the no matches character is shown. Now press
- // backspace key, last character is not deleted.
- fepMan->RemoveSuggestedAdvanceCompletionL();
- fepMan->PlaySound(EAvkonSIDConfirmationTone);
- return ETrue;
- }
- }
- fepMan->UpdateInlineEditL(newText, newText.Length());
- }
- fepMan->PlaySound(EAvkonSIDConfirmationTone);
- }
-
- // Normally we update the case after key press. However, if Chr key is held down, the case update
- // must not happen until when the Chr is released or the timer expires (in both of these cases
- // the function KeyTimerExpired() will get callled).
- if ( !fepMan->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) )
- {
- iOwner->CaseMan()->UpdateCase(ENullNaviEvent);
- }
- else
- {
- fepMan->ClearFlag(CAknFepManager::EFlagNoActionDuringChrKeyPress);
- }
-
- retVal = ETrue;
- }
- else
- {
- retVal = EFalse;
- }
-
- if(ptiengine->IsValidKey((TPtiKey)aKey))
- retVal = ETrue;
-
- if( aKey!=EStdKeyBackspace && fnKeyState != CAknFepFnKeyManager::EFnKeyNone)
- {
- retVal = ETrue;
- }
- if( !fepMan->IsFlagSet( CAknFepManager::EFlagLongShiftKeyPress ) &&
- fnKeyState == CAknFepFnKeyManager::EFnKeyNext )
- {
- fepMan->SetFnKeyState(CAknFepFnKeyManager::EFnKeyNone);
- }
-
- return retVal;
- }
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-TBool TAknFepUiInputStateEntryHalfQwertyWesternPredictive::HandleNaviKeysL(TInt aKey, TKeyPressLength /*aLength*/)
- {
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CPtiEngine* ptiengine = iOwner->PtiEngine();
-
- if (!(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)))
- {
- TBuf<CAknFepManager::EMaximumFepWordLength> textToUncommit;
- TBool comsumeKey;
- if (!(fepMan->TryGetTextToUncommitL(textToUncommit, aKey, comsumeKey)))
- {
- // If T9 word length > 32, the navi key is consumed without action.
- // Maybe should navigate inside word.
- return comsumeKey;
- }
- ptiengine->ClearCurrentWord();
- ptiengine->SetCurrentWord(textToUncommit); // this set the input sequence of PtiEngine
- fepMan->StartInlineEditL(fepMan->UncommittedText(), textToUncommit,
- textToUncommit.Length(), EFalse);
- }
-
- if (aKey == EKeyBackspace)
- {
- if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
- {
- fepMan->TryRemoveNoMatchesIndicatorL();
- fepMan->UpdateCbaL(NULL);
- ptiengine->HandleCommandL(EPtiCommandSetFlagToUpdateCandidates);
- // Need to return as DeleteKeyPress should not be passed to ptiengine.
- // This is because ptiengine does not maintain the input sequence
- // if the key press does not increase the word length. So when no matches
- // character is (?) is deleted, no need to pass to ptiengine. This is to done
- // to solve the bug :enter characters till the no matches character is shown. Now press
- // backspace, last character is not deleted.
- return ETrue;
- }
-
- TPtrC newText = ptiengine->DeleteKeyPress();
- // remove autocompletion part if any
- // this has to be done before updateinlineedit to avoid flickering
- TInt tailLength = 0;
- ptiengine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength,
- &tailLength );
- if(tailLength > 0)
- {
- fepMan->RemoveSuggestedAdvanceCompletionL();
- newText.Set(ptiengine->CurrentWord());
- }
- fepMan->UpdateInlineEditL(newText, newText.Length());
-
- fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);
- if (ptiengine->NumberOfCandidates() <= 1)
- {
- fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);
- }
-
- iOwner->CaseMan()->UpdateCase(EBackspaceEvent);
- fepMan->ClearFlag(CAknFepManager::EFlagNoActionDuringChrKeyPress);
- fepMan->CloseUiIfWordDeletedL();
- }
-
- return ETrue;
- }
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-void TAknFepUiInputStateEntryHalfQwertyWesternPredictive::LastWordInSelectionList()
- {
-
- }
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-void TAknFepUiInputStateEntryHalfQwertyWesternPredictive::FirstWordInSelectionList()
- {
- }
-
-
-/////////////////////////////////////////////////////////////////
-//
-void TAknFepUiInputStateEntryHalfQwertyWesternPredictive::KeyTimerExpired()
- {
- if (iData)
- {
- MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
- CAknFepCaseManager* caseMan = iOwner->CaseMan();
- caseMan->UpdateCase(ENullNaviEvent);
- fepMan->ClearFlag( CAknFepManager::EFlagInsideMultitapInlineEditingTransaction );
- iData = 0;
- }
- }
-
-void TAknFepUiInputStateEntryHalfQwertyWesternPredictive::ConvertDigitToDigittype(TDigitType& digittype,TDes& aConvertedNumeral)
- {
- TChar chchar(aConvertedNumeral[0]);
- switch(digittype)
- {
- case EDigitTypeDevanagari:
- {
- chchar = (aConvertedNumeral[0] + KLatinToDevanagariDigitsDelta);
- }
- break;
- case EDigitTypeArabicIndic:
- {
- chchar = (aConvertedNumeral[0] + KLatinToArabicIndicDigitsDelta);
- }
- break;
- case EDigitTypeEasternArabicIndic:
- {
- chchar = (aConvertedNumeral[0] + KLatinToEasternArabicIndicDigitsDelta);
- }
- }
- aConvertedNumeral.Zero();
- aConvertedNumeral.Append(chchar);
- }
-// End of file