diff -r f1bdd6b078d1 -r 2cb9bae34d17 fep/aknfep/src/AknFepUiInputStateEntryWesternPredictive.cpp --- a/fep/aknfep/src/AknFepUiInputStateEntryWesternPredictive.cpp Tue Jul 06 14:38:41 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,938 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0"" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* Provides the TAknFepInputStateEntryWesternPredictive methods. -* -*/ - - - - - - - - - - - - -#include "AknFepUiInputStateEntryWesternPredictive.h" -#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface -#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface -#include "AknFepManager.h" -#include "AknFepPanic.h" -#include "AknFepCaseManager.h" -#include "AknFepPluginManager.h" -#include "AknFepManagerInterface.h" // MAknFepManagerInterface - -#include -#include //CPtiEngine -#include //keys -#include //FeatureManager -#include -#include -#include - -// The Maximum world size -const TInt KMaxWordSize = 63; -TAknFepInputStateEntryWesternPredictive:: -TAknFepInputStateEntryWesternPredictive(MAknFepUIManagerStateInterface* aOwner) - :TAknFepInputStateBase(aOwner) - { - //this class insists on the existence of a case manager - __ASSERT_DEBUG(iOwner->CaseMan(), AknFepPanic(EAknFepPanicNoCaseManager)); - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - iState = EEntry; - iMatchState = EWordMatchNone; - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - TPtiTextCase caseMode = ptiengine->Case(); - ptiengine->SetInputMode(EPtiEnginePredictive); - -#ifdef RD_SCALABLE_UI_V2 - - if (fepMan->PluginUIManager()->MatchCandidateList().Count() > 0) - { - fepMan->PluginUIManager()->ResetCandidateList(); - } - - iIsLastWord = EFalse; -/* - if (fepMan->PluginUIManager()->GetSpellText()) - { - TBuf textToUncommit; - textToUncommit.Zero(); - textToUncommit.Copy(*fepMan->PluginUIManager()->GetSpellText()); - ptiengine->SetCurrentWord(textToUncommit); - } -*/ -#ifdef RD_INTELLIGENT_TEXT_INPUT - ptiengine->SetInputMode(EPtiEnginePredictive); - TBool isUnlimitedEditor = EFalse; - ptiengine->SetMaxLengthForAutoCompletedCandidates( - fepMan->EditorFreeSpaceForAutoWordCompletion(isUnlimitedEditor )); - // To set the input mode - if(fepMan->IsAutoCompleteOn()) - { - TRAP_IGNORE(ptiengine->HandleCommandL(EPtiCommandEnableAutoCompletion)); - } - else - { - TRAP_IGNORE(ptiengine->HandleCommandL(EPtiCommandDisableAutoCompletion)); - } - - TPtiKeyboardType keyboard = fepMan->KeyboardLayout(); - ptiengine->SetKeyboardType(keyboard); - - TBool isNumberCandidateShown = fepMan->IsAdvancedPredictiveNumberCandidateShown(); - TRAP_IGNORE(ptiengine->HandleCommandL( EPtiCommandSetNumberCandidateStatus, - &isNumberCandidateShown )); -#endif - -#else - - ptiengine->ClearCurrentWord(); - -#ifndef RD_INTELLIGENT_TEXT_INPUT - - // To set the input mode - if(fepMan->IsAutoCompleteOn()) - { - ptiengine->SetInputMode(EPtiEngineWordCompletion); - } -#endif // RD_PRED_AW_COMPLETION -#endif //RD_SCALABLE_UI_V2 - ptiengine->SetCase(caseMode); - } - -TBool TAknFepInputStateEntryWesternPredictive::HandleKeyL(TInt aKey, TKeyPressLength aLength) - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - -#ifdef RD_SCALABLE_UI_V2 - - if (fepMan->PluginUIManager()->GetSpellText()) - { - fepMan->PluginUIManager()->SpellText(NULL); - } -#endif // - - TBool response = ETrue; - - switch (aKey) - { - case EPtiKey1: //fall through - case EPtiKey2: - case EPtiKey3: - case EPtiKey4: - case EPtiKey5: - case EPtiKey6: - case EPtiKey7: - case EPtiKey8: - case EPtiKey9: -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - - response = HandleStandardNumericKeysL(aKey, aLength); - break; - case EPtiKey0: - if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) ) - { - fepMan->TryRemoveNoMatchesIndicatorL(); -#ifndef RD_INTELLIGENT_TEXT_INPUT - // To rip off suggested word completion when user presses SPACE - if(fepMan->IsAutoCompleteOn()) - { - fepMan->RemoveSuggestedCompletionL(); - } -#endif - } - fepMan->UpdateCbaL(NULL); - if (fepMan->IsFlagSet(CAknFepManager::EFlagCompoundWord)) - { - if (fepMan->IsCursorAtEndOfWord()) - { - fepMan->AddCompoundWordToUdbL(); - } - fepMan->ClearFlag(CAknFepManager::EFlagCompoundWord); - } -#ifdef RD_INTELLIGENT_TEXT_INPUT - if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) ) - { - ptiengine->CommitCurrentWord(); - fepMan->CommitInlineEditL(); - fepMan->TryCloseUiL(); - response = EFalse; - } - else - { -#endif - fepMan->SetDelayedCommit(); // Delayed 'commit'. - fepMan->TryCloseUiL(); - response = EFalse; //pass to initial state to handle key -#ifdef RD_INTELLIGENT_TEXT_INPUT - } -#endif -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - break; - case EKeyLeftArrow: // fall through - case EKeyRightArrow: - case EKeyBackspace: - response = HandleNaviKeysL(aKey, aLength); -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - break; - case EPtiKeyStar: - { - response = HandleStarKeyL(aLength); - } - break; - case EKeyDownArrow: // Japanese input required - if (fepMan->IsAbleScrollLatinPredictive()) - { - if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) - { - DoNextMatch(); - } - else - { - response = EFalse; - } - } - else - { - response = EFalse; - } - break; - case EKeyUpArrow: // Japanese input required - if (fepMan->IsAbleScrollLatinPredictive()) - { - if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) - { - DoPreviousMatchL(); - } - else - { - response = EFalse; - } - } - else - { - response = EFalse; - } - break; - default: - response = EFalse; -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - break; - } - return response; - } - -void TAknFepInputStateEntryWesternPredictive::HandleCommandL(TInt aCommandId) - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - if (aCommandId == EAknFepSoftkeyPrevious) - { - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - __ASSERT_DEBUG(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction), - AknFepPanic(EAknFepPanicNotInsideInlineEdit)); - - if (iMatchState == EWordMatchLast || iMatchState == EWordMatchAfterLast) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_EMPTY_PREVIOUS); - } - iMatchState = EWordMatchStd; - TPtrC prevText = ptiengine->PreviousCandidate(); - if(prevText.Length() == 1) - { - TDigitType digittype = fepMan->LocalDigit(); - TChar chchar(prevText[0]); - if(!chchar.IsDigit() || (chchar.IsDigit() && !digittype)) - { - fepMan->UpdateInlineEditL(prevText, prevText.Length()); - } - else - { - TBuf<1> tempbuf; - tempbuf.Append(prevText[0]); - ConvertDigitToDigittype(digittype,tempbuf); - fepMan->UpdateInlineEditL(tempbuf, tempbuf.Length()); - } - } - else - { - fepMan->UpdateInlineEditL(prevText, prevText.Length()); - } - } - else if (aCommandId == ESignalSelectMatchSelectionText) - { - //fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_FINGER); -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - iOwner->ChangeState(EInitial); - } - else if (aCommandId == ESignalNaviLeftMatchSelectionText) - { - //fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_FINGER); -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - iOwner->ChangeState(EEntry); - - TRawEvent event; - event.Set(TRawEvent::EKeyDown, EStdKeyLeftArrow); - CCoeEnv::Static()->WsSession().SimulateRawEvent(event); - - event.Set(TRawEvent::EKeyUp, EStdKeyLeftArrow); - CCoeEnv::Static()->WsSession().SimulateRawEvent(event); - } - else if (aCommandId == ESignalNaviRightMatchSelectionText) - { - //fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_FINGER); -#ifdef RD_SCALABLE_UI_V2 - fepMan->PluginUIManager()->SetFingerMatchSelectionState(EFalse); -#endif //RD_SCALABLE_UI_V2 - iOwner->ChangeState(EEntry); - - TRawEvent event; - event.Set(TRawEvent::EKeyDown, EStdKeyRightArrow); - CCoeEnv::Static()->WsSession().SimulateRawEvent(event); - - event.Set(TRawEvent::EKeyUp, EStdKeyRightArrow); - CCoeEnv::Static()->WsSession().SimulateRawEvent(event); - } - } - -TBool TAknFepInputStateEntryWesternPredictive::HandleStandardNumericKeysL(TInt aKey, - TKeyPressLength aLength) - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - TBool response = ETrue; - - if (aLength == ELongKeyPress) - { - if (!fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) - { - // No edit transaction going on, we have ended here because of long - // key press created editor on UI or some other similar non-standard situation. - // We can't handle key press, so just consume it. - return ETrue; - } - - // try and insert a digit - if (!fepMan->TryRemoveNoMatchesIndicatorL()) - { - // remove last character - TPtrC newText = ptiengine->DeleteKeyPress(); -#ifndef RD_INTELLIGENT_TEXT_INPUT - if(ptiengine->InputMode() == EPtiEngineWordCompletion - && (newText.Length() > ptiengine->CurrentInputSequence().Length())) - { - fepMan->RemoveSuggestedCompletionL(); - } - else -#endif - { - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - } - //closing the UI will commit the current word and move to intial state - fepMan->TryCloseUiL(); - //this flag to ensures that initial state does not send us back - //to this state as it would normally do for numeric keys - fepMan->SetFlag(CAknFepManager::EFlagSuppressInputStateChange); - response = EFalse; - } - else // short keypress - { - //To restrict up to 32 character.. - - if(ptiengine->CurrentInputSequence().Length() >= KMaxWordSize) - { - fepMan->SetFlag(CAknFepManager::EFlagNoMatches); - - // Enter word reach to max inline edit state - // if we call upadte inline edit, it will insert '?' mark - // which would be the 64th/33rd character - - // Not need to call appedkeypress/ updateinlineedit - // ignore the current key press - - //fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY); - //TPtrC newText = ptiengine->CurrentWord(); - //fepMan->UpdateInlineEditL(newText, newText.Length()); - } - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - //no matches, so just play tone - fepMan->PlaySound(EAvkonSIDConfirmationTone); - } - else //insert a letter - { - fepMan->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp | - CAknFepManager::ECcpuStateNewPredictiveWord); - if (iMatchState == EWordMatchLast || iMatchState == EWordMatchAfterLast) - { - iMatchState = EWordMatchNone; - } - if (!(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))) - { // 'new' inline edit - ptiengine->ClearCurrentWord(); - fepMan->StartInlineEditL(); - fepMan->TryStartCompoundWord(); - } -#ifndef RD_INTELLIGENT_TEXT_INPUT - TInt prevSeqLength = ptiengine->CurrentInputSequence().Length(); -#endif - TPtrC newText = ptiengine->AppendKeyPress((TPtiKey)aKey); - - fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - -#ifdef RD_INTELLIGENT_TEXT_INPUT - if (ptiengine->NumberOfCandidates() > 0) -#else - if ((fepMan->IsMoreGoodWordsComing(newText.Length()) -#ifndef RD_INTELLIGENT_TEXT_INPUT - && (ptiengine->InputMode() != EPtiEngineWordCompletion)) - || fepMan->IsMoreGoodAutoCompleteWordsComing(ptiengine->InputMode(), - prevSeqLength, ptiengine->CurrentInputSequence().Length() -#endif - )) -#endif - { - // 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()); - } - } - else - { - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - - TBool lastEnteredDigitOne = (ptiengine->LastEnteredKey() == EPtiKey1); - if (!lastEnteredDigitOne) - { - iOwner->CaseMan()->UpdateCase(ENullNaviEvent); - } - fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - if (ptiengine->NumberOfCandidates() <= 1) - { - fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - } - } - else - { - // engine has run out of matches - 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 - { -#ifdef RD_INTELLIGENT_TEXT_INPUT - // 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 response; - } - } -#endif - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - fepMan->PlaySound(EAvkonSIDConfirmationTone); - } - } - } - return response; - } - -TBool TAknFepInputStateEntryWesternPredictive::HandleNaviKeysL(TInt aKey, TKeyPressLength /*aLength*/) - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - if (!(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))) - { - TBuf 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; - } -#ifdef RD_INTELLIGENT_TEXT_INPUT - ptiengine->ClearCurrentWord(); // Clear the buffer or setting input may fail -#endif - ptiengine->SetCurrentWord(textToUncommit); - if( ptiengine->CurrentWord().Length() != textToUncommit.Length()) - { - TPtiUserDictionaryEntry newUdbEntry(textToUncommit); - ptiengine->AddUserDictionaryEntry(newUdbEntry); - ptiengine->SetCurrentWord(textToUncommit); - } - -#ifdef __ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT__ - // First generation ITUT support loops through candidate list on star key press. When we bring - // a word in inline edit by navigating with arrow keys, we need to fetch the candidate list in order - // to navigate through the predictive list if any or get spell CBA. - CDesCArrayFlat* matchesList=new(ELeave)CDesCArrayFlat(1); - CleanupStack::PushL(matchesList); - ptiengine->GetCandidateListL(*matchesList); - CleanupStack::PopAndDestroy();//matchesList -#endif - - fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - if (ptiengine->NumberOfCandidates() <= 1) - { - fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - } - if (ptiengine->NumberOfCandidates() < 1) - { - fepMan->SetFlag(CAknFepManager::EFlagNoMatches); - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY); - } - - fepMan->StartInlineEditL(fepMan->UncommittedText(), textToUncommit, - textToUncommit.Length(), EFalse); - } - - if (aKey == EKeyBackspace) - { - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - fepMan->TryRemoveNoMatchesIndicatorL(); - fepMan->UpdateCbaL(NULL); -#ifdef RD_INTELLIGENT_TEXT_INPUT - ptiengine->HandleCommandL(EPtiCommandSetFlagToUpdateCandidates); -#endif //RD_INTELLIGENT_TEXT_INPUT - // 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; - } - else if (iMatchState != EWordMatchFirst) - { - //let FirstWordInSelectionList() reset the CBA - iMatchState = EWordMatchNone; - } - - TPtrC newText = ptiengine->DeleteKeyPress(); -#ifdef RD_INTELLIGENT_TEXT_INPUT - TPtiEngineInputMode inputMode = ptiengine->InputMode(); - if((inputMode != EPtiEngineWordCompletion && inputMode != EPtiEnginePredictive ) - && newText.Length() != ptiengine->CurrentInputSequence().Length()) -#else - if((ptiengine->InputMode() != EPtiEngineWordCompletion ) - && newText.Length() != ptiengine->CurrentInputSequence().Length()) -#endif - { - TBuf textToUncommit; - TBool comsumeKey; - fepMan->TryGetTextToUncommitL(textToUncommit, aKey, comsumeKey); - textToUncommit.SetLength(textToUncommit.Length() - 1); - ptiengine->SetCurrentWord(textToUncommit); - newText.Set(textToUncommit); - } - - -#ifdef RD_INTELLIGENT_TEXT_INPUT - if (!fepMan->IsAutoCompleteOn()) - { - // rip-off the autocompletion part if any, do this before updating the editor content - // this is done to avoid any flickering - TInt tailLength = 0; - ptiengine->HandleCommandL( EPtiCommandGetAutoCompletionTailLength, - &tailLength ); - if(tailLength > 0) - { - fepMan->RemoveSuggestedAdvanceCompletionL(); - // text would have changed after ripping off the autocompletion part - newText.Set(ptiengine->CurrentWord()); - } - } -#endif - - fepMan->UpdateInlineEditL(newText, newText.Length()); - fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - if (ptiengine->NumberOfCandidates() <= 1) - { - fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem); - } - - iOwner->CaseMan()->UpdateCase(EBackspaceEvent); - fepMan->CloseUiIfWordDeletedL(); - } - return ETrue; - } - -TBool TAknFepInputStateEntryWesternPredictive::HandleStarKeyL(TKeyPressLength aLength) - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - if (aLength == ELongKeyPress) - { -// Fix for BSAN-7G5944. -// In non-ITI mode, during long star key press, initially it is treated as short key press -// and the next candidate word is shown. So before displaying the SCT, we revert to -// the previous candidate. In ITI, long star key press does not result in showing the next -// candidate, as short key press only launches the candidate list. -// So reverting to the previous candidate is not needed in ITI mode. -#ifndef RD_INTELLIGENT_TEXT_INPUT - if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) - { - // replace with previous match - fepMan->TryRemoveNoMatchesIndicatorL(); - iMatchState = EWordMatchStd; - TPtrC newText = ptiengine->PreviousCandidate(); - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - // to rip off suggested completion when SCT is launched - if(fepMan->IsAutoCompleteOn()) - { - fepMan->RemoveSuggestedCompletionL(); - } -#endif - - fepMan->LaunchSpecialCharacterTableL(); - } - else - { -#ifdef RD_INTELLIGENT_TEXT_INPUT -#ifndef FF_ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT - // Short key presses get filtered in AknFepKeyCatcher, so that short star - // key press only gets through when the key is lifted. This means we can - // launch the candidate popup without worrying about long keypress - if (fepMan->WesternPredictive() && aLength == EShortKeyPress && !fepMan->IsQwerty() - && fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) - && ptiengine->NumberOfCandidates() > 0 - && fepMan->PluginUIManager()->PluginInputMode() == EPluginInputModeNone ) - { - // With short * key press and candidates remaining, override normal behaviour - // and function like arrow down - TInt wordIndexToSelect = 0; - TInt lastCandidateIndex = ptiengine->NumberOfCandidates()-1; - ptiengine->HandleCommandL( EPtiCommandUserActionGetCurrentIndexOfCandidates, - &wordIndexToSelect ); - wordIndexToSelect < lastCandidateIndex ? wordIndexToSelect++ : wordIndexToSelect = 0; - fepMan->LaunchCandidatePopupListL( wordIndexToSelect ); - return ETrue; - } -#endif // FF_ITI_VIRTUAL_TOUCH_FIRST_GENERATION_SUPPORT -#endif // RD_INTELLIGENT_TEXT_INPUT - if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)) - { -#ifdef RD_SCALABLE_UI_V2 - if ( (iIsLastWord || ptiengine->NumberOfCandidates() == 1) - && ( fepMan->PluginUIManager()->PluginInputMode() == EPluginInputModeItut ) ) - { - fepMan->PluginUIManager()->SetFingerMatchSelectionState(ETrue); - fepMan->PluginUIManager()->ShowAllCandidates(); - iMatchState = EWordMatchNone; - iIsLastWord = EFalse; - return ETrue; - } - -#endif //RD_SCALABLE_UI_V2 - - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - CAknFepManager* fepMgr = static_cast(fepMan); - if(( fepMgr->EditorState()->Flags() & EAknEditorFlagEnablePartialScreen ) && - ( fepMgr->PluginUIManager()->PluginInputMode() == EPluginInputModeItut )) - { - // launch full screen query for split itut - fepMgr->LaunchEditWordQueryL(); - } - else - { - //no more matches - fepMan->PlaySound(EAvkonSIDWarningTone); - } - } - else if (ptiengine->NumberOfCandidates() <= 1) //1 - { - // only one match - if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY); - iMatchState = EWordMatchLast; - } - } - else - { - if (iMatchState == EWordMatchLast && !(ptiengine->LastEnteredKey() == EPtiKey1)) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_PREVIOUS); - } - else if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_EMPTY_PREVIOUS); - iMatchState = EWordMatchStd; - } - - TPtrC newText = ptiengine->NextCandidate(); - 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 - { - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - } - } - else - { - if (!fepMan->EditSubmenuInUse()) - { - fepMan->LaunchSpecialCharacterTableL(); - } - } - } - return ETrue; - } - -void TAknFepInputStateEntryWesternPredictive::LastWordInSelectionList() - { - CPtiEngine* ptiengine = iOwner->PtiEngine(); - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - - iIsLastWord = ETrue; - - if (iMatchState != EWordMatchAfterLast) - { - TInt newResource = R_AKNFEP_SOFTKEYS_SPELL_PREVIOUS; - if (ptiengine->LastEnteredKey() == EPtiKey1) - { - newResource=R_AKNFEP_SOFTKEYS_SYMBOL_PREVIOUS; - } - TRAP_IGNORE(fepMan->UpdateCbaL(newResource)); - iMatchState = EWordMatchLast; - } - } - -void TAknFepInputStateEntryWesternPredictive::FirstWordInSelectionList() - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - - iIsLastWord = EFalse; - - if (iMatchState == EWordMatchLast) - { - //have cycled past the last word back to the beginning - iMatchState = EWordMatchAfterLast; - } - else if (iMatchState == EWordMatchNone || iMatchState == EWordMatchStd) // called on every new keypress so checked to stop constant update - { - //have started/restarted a word or - //have got back to the beginning using previous - TRAP_IGNORE(fepMan->UpdateCbaL(NULL)); - iMatchState = EWordMatchFirst; - } - } - -void TAknFepInputStateEntryWesternPredictive::DoPreviousMatchL() - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - //no more matches - fepMan->PlaySound(EAvkonSIDWarningTone); - } - else if (ptiengine->NumberOfCandidates()<=1) - { - // only one match - if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY); - iMatchState = EWordMatchLast; - } - } - else - { - // > 1 match - if (iMatchState == EWordMatchLast || iMatchState == EWordMatchAfterLast) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_EMPTY_PREVIOUS); - } - else if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_EMPTY_PREVIOUS); - } - iMatchState = EWordMatchStd; - TPtrC newText = ptiengine->PreviousCandidate(); - fepMan->UpdateInlineEditL(newText, newText.Length()); - } - } - -void TAknFepInputStateEntryWesternPredictive::DoNextMatch() - { - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - //no more matches - fepMan->PlaySound(EAvkonSIDWarningTone); - } - else if (ptiengine->NumberOfCandidates()<=1) - { - // only one match - if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - TRAP_IGNORE(fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_EMPTY)); - iMatchState = EWordMatchLast; - } - } - else - { - // > 1 match - if (iMatchState == EWordMatchLast && !(ptiengine->LastEnteredKey() == EPtiKey1)) - { - TRAP_IGNORE(fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_SPELL_PREVIOUS)); - } - else if (iMatchState == EWordMatchFirst || iMatchState == EWordMatchNone) - { - TRAP_IGNORE(fepMan->UpdateCbaL(R_AKNFEP_SOFTKEYS_EMPTY_PREVIOUS)); - iMatchState = EWordMatchStd; - } - TPtrC newText = ptiengine->NextCandidate(); - TRAP_IGNORE(fepMan->UpdateInlineEditL(newText, newText.Length())); - } - } - -void TAknFepInputStateEntryWesternPredictive::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); - } - -TBool TAknFepInputStateEntryWesternPredictive::IsMoreCandidate() - { - TBool ret = ETrue; - MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); - CPtiEngine* ptiengine = iOwner->PtiEngine(); - - if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) - { - ret = EFalse; - } - - if (ptiengine->NumberOfCandidates() < 1) - { - ret = EFalse; - } - else if (ptiengine->NextCandidate().Length() == 0) - { - ret = EFalse; - } - else - { - ptiengine->PreviousCandidate(); - } - - return ret; - } - -// End of file