fep/aknfep/src/AknFepUiInputStateEntryVietnamesePredictive.cpp
changeset 0 eb1f2e154e89
child 9 e6a39382bb9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepUiInputStateEntryVietnamesePredictive.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,370 @@
+/*
+* 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 TAknFepUiInputStateEntryVietnamesePredictive methods.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include "AknFepUiInputStateEntryVietnamesePredictive.h"
+#include "AknFepUIInputStateInitialVietnameseMultitap.h"
+#include "AknFepUIManagerStateInterface.h"      //MAknFepUIManagerStateInterface
+#include "AknFepCaseManager.h"
+#include "AknFepVietnameseToneManager.h"
+
+#include <uikon.hrh>
+#include <PtiEngine.h>                          //CPtiEngine
+#include <PtiDefs.h>                            //keys
+#include <aknSctDialog.h>
+#include <avkon.rsg>
+#include <AknFep.rsg>
+
+#include "AknFepUiManagerWestern.h"
+TAknFepInputStateEntryVietnamesePredictive::
+TAknFepInputStateEntryVietnamesePredictive(MAknFepUIManagerStateInterface* aOwner)
+: TAknFepInputStateEntryWesternPredictive(aOwner)   
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    if (ptiengine->CurrentLanguage()->LanguageCode() != ELangVietnamese)
+        {
+        TRAP_IGNORE(ptiengine->ActivateLanguageL(ELangVietnamese));
+        }
+#ifndef RD_INTELLIGENT_TEXT_INPUT
+        MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+        if(fepMan->IsAutoCompleteOn())
+    	{
+    	   ptiengine->SetInputMode(EPtiEngineWordCompletion);
+    	}
+    	else
+#endif
+        {
+        ptiengine->SetInputMode(EPtiEnginePredictive);
+        }
+    }
+
+TBool TAknFepInputStateEntryVietnamesePredictive::HandleKeyL(TInt aKey, TKeyPressLength aLength)
+    {
+    
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+
+    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:
+        response = HandleStandardNumericKeysL(aKey, aLength);
+        break;
+    case EPtiKey0:
+        if ( fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction) )
+            {
+            fepMan->TryRemoveNoMatchesIndicatorL();
+#ifndef RD_INTELLIGENT_TEXT_INPUT
+            if(fepMan->IsAutoCompleteOn())
+					{
+					fepMan->RemoveSuggestedCompletionL();
+					}
+#endif
+            }
+        fepMan->UpdateCbaL(NULL);
+        if (fepMan->IsFlagSet(CAknFepManager::EFlagCompoundWord))
+            { 
+            if (fepMan->IsCursorAtEndOfWord())
+                {            
+                fepMan->AddCompoundWordToUdbL();
+                }
+            fepMan->ClearFlag(CAknFepManager::EFlagCompoundWord);
+            }
+        ptiengine->CommitCurrentWord();  // commit word after calling TryCloseUiL().
+        fepMan->TryCloseUiL();
+        response = EFalse;  //pass to initial state to handle key
+        break;
+    case EKeyLeftArrow: // fall through
+    case EKeyRightArrow:
+        response = HandleNaviKeysL(aKey, aLength);
+        break;    
+    case EKeyBackspace:
+        response = HandleDeleteKeysL(aKey, aLength);
+        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;
+        break;
+        }
+    return response;
+    }
+
+TBool TAknFepInputStateEntryVietnamesePredictive::HandleStarKeyL(TKeyPressLength aLength)
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+
+    if (aLength == ELongKeyPress)
+        { 
+        if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
+            {
+            // replace with previous match
+            fepMan->TryRemoveNoMatchesIndicatorL();
+            iMatchState = EWordMatchStd;
+            TPtrC newText = ptiengine->PreviousCandidate();
+            fepMan->UpdateInlineEditL(newText, newText.Length());
+            }
+            
+#ifndef RD_INTELLIGENT_TEXT_INPUT
+        	// to rip off suggested completion when SCT is launched
+		if(fepMan->IsAutoCompleteOn()) 
+			{
+			fepMan->RemoveSuggestedCompletionL();	
+			}
+#endif
+       	if (!fepMan->EditSubmenuInUse())
+        	{
+        	fepMan->LaunchSpecialCharacterTableL();
+        	}            
+        }
+    else 
+        {
+        if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
+            {
+            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 && !(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;
+	                	switch(digittype)
+		                	{
+		                	case EDigitTypeDevanagari:
+			                	{
+			                	chchar = (newText[0] + KLatinToDevanagariDigitsDelta);
+	            		    	}
+			                	break;	
+			                case EDigitTypeArabicIndic:
+				                {
+			                	chchar = (newText[0] + KLatinToArabicIndicDigitsDelta);
+	            		        }
+				                break;
+		                	case EDigitTypeEasternArabicIndic:
+			                	{
+			                	chchar = (newText[0] + KLatinToEasternArabicIndicDigitsDelta);
+			                	}
+		                	}
+	            		tempbuf.Append(chchar);				                	
+		                fepMan->UpdateInlineEditL(tempbuf, tempbuf.Length());	
+	                	}
+           			}
+           		else 
+           			{
+           			fepMan->UpdateInlineEditL(newText, newText.Length());	
+           			}
+                }
+            }
+        else
+            {
+  			if (!fepMan->EditSubmenuInUse())
+        		{
+        		fepMan->LaunchSpecialCharacterTableL();
+        		}
+            }
+        }
+    return ETrue;
+    }
+
+TBool TAknFepInputStateEntryVietnamesePredictive::HandleDeleteKeysL(TInt aKey, TKeyPressLength /*aLength*/)
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+
+    if (!(fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction)))
+        {
+        if(fepMan->PreviousChar() == TText(0x0020))      // 0x0020 is space 
+        {
+        	return EFalse;
+        }
+        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->SetCurrentWord(textToUncommit);
+		fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);           
+        if (ptiengine->NumberOfCandidates() <= 1)
+        	{
+			fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);           	
+        	}        
+        fepMan->StartInlineEditL(fepMan->UncommittedText(), textToUncommit, 
+                                 textToUncommit.Length(), EFalse);
+        }
+  
+    if (aKey == EKeyBackspace)
+        {
+        if (fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
+            {
+            fepMan->TryRemoveNoMatchesIndicatorL();
+            fepMan->UpdateCbaL(NULL);
+            return ETrue;
+            }
+        else if (iMatchState != EWordMatchFirst)
+            {
+            //let FirstWordInSelectionList() reset the CBA
+            iMatchState = EWordMatchNone;
+            }
+        
+        TBuf<2> newText;
+        // Get the last character from the current editor
+        TText prevChar = fepMan->PreviousChar();
+        TBool vowelList = EFalse;
+        for (TInt index = 0; index < KNumberOfToneMarks; index ++)
+            {
+            if (VietToneMatrix[0][index] == prevChar)
+                {
+                vowelList = ETrue;
+                break;
+                }
+            }
+        
+        if (vowelList)
+            {
+                ((CAknFepManager*)fepMan)->RemovePreviousCharacterL();
+            }
+        else
+            {
+            if (prevChar <= 0)
+                {
+                return EFalse;
+                }
+            
+            // Judge if the last character needs to be converted
+            if ( TAknFepInputStateInitialVietnameseMultitap::NeedsVietnameseBkDelSupport(prevChar,
+                                                                                         newText) )
+                {
+                ((CAknFepManager*)fepMan)->RemovePreviousCharacterL();
+                }
+            else
+                {
+                TPtrC  updatedText = ptiengine->DeleteKeyPress();
+                if(ptiengine->InputMode() != EPtiEngineWordCompletion && newText.Length())
+                	{
+                	fepMan->UpdateInlineEditL(updatedText, newText.Length());
+                	}
+                else
+                	{
+                	fepMan->UpdateInlineEditL(updatedText, updatedText.Length());	
+                	}
+                }
+            }
+
+		fepMan->ClearFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);           
+        if (ptiengine->NumberOfCandidates() <= 1)
+        	{
+			fepMan->SetFlag(CAknFepManager::EFlagRemoveMatchesMenuItem);           	
+        	}
+
+        iOwner->CaseMan()->UpdateCase(EBackspaceEvent);
+        fepMan->CloseUiIfWordDeletedL();
+        }
+        
+    return ETrue;
+    }
+
+// End of file