fep/aknfep/src/aknfepuiinputstateinitialindicphoneticmultitap.cpp
changeset 36 a7632c26d895
parent 35 0f326f2e628e
child 42 b3eaa440ab06
--- a/fep/aknfep/src/aknfepuiinputstateinitialindicphoneticmultitap.cpp	Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +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 TAknFepInputStateInitialIndicPhoneticMultitap methods.
-*
-*/
-
-
-
-
-
-
-
-
-
-
-
-#include "aknfepuiinputstateinitialindicphoneticmultitap.h"
-#include "AknFepUIManagerStateInterface.h"      //MAknFepUIManagerStateInterface
-#include "AknFepUIManagerWestern.h"
-#include "AknFepUiIndicEnums.h"
-#include "AknFepCaseManager.h"
-#include "AknFepUiIndicInputManager.h"
-
-#include <uikon.hrh>
-#include <PtiEngine.h>
-#include <PtiDefs.h>
-#include <aknsctdialog.h>
-#include <avkon.rsg>
-#include <aknfep.rsg>
-#include <EikEnv.h>
-#include <Aknutils.h>
-#define PHONETIC_SEPARATOR 0x2e
-
-const TUint KSpaceChar = 0x0020;
-const TUint KQuestionMark = 0x003F;
-
-#define PTI_CLEAR_CURRENTWORD( A, B ) \
-		( A )->ClearCurrentWord(); \
-		( B ) = ETrue; \
-
-const TText KAknFEPLineFeedSymbol = 0x21B2;
-const TText KAknFEPMirroredLineFeedSymbol = 0x21B3;
-	
-// -----------------------------------------------------------------------------
-// TAknFepInputStateInitialIndicPhoneticMultitap::TAknFepInputStateInitialIndicPhoneticMultitap
-
-// C++ default constructor can NOT contain any code, that
-// might leave or if it is absolutely necessary then MUST be trapped.
-// -----------------------------------------------------------------------------
-
-TAknFepInputStateInitialIndicPhoneticMultitap::
-TAknFepInputStateInitialIndicPhoneticMultitap( MAknFepUIManagerStateInterface* aOwner,
-																			TInt aLanguage )
-																			:TAknFepInputStateInitialMultitapBase( aOwner )
-    {
-    CPtiEngine* ptiengine = iOwner->PtiEngine();
-    iIsStarKeyPressed = EFalse;
-    iIndicLanguage = TLanguage(aLanguage);
-    iIndicPhoneticBuffer.Zero();
-    TRAP_IGNORE( ptiengine->ActivateLanguageL(KLangHindiPhonetic,
-                 EPtiEngineInputModeIndicPhoneticMultitap))
-    ptiengine->SetCase( EPtiCaseLower );
-    iPreviousCommittedChar = NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// TAknFepInputStateInitialIndicPhoneticMultitap::HandleKeyL
-
-// Handles the logic of Indic multitap input. This function first checks the validity
-// of the inputed text and then enters it.
-// -----------------------------------------------------------------------------
-
-TBool TAknFepInputStateInitialIndicPhoneticMultitap::HandleKeyL( TInt aKey, 
-                                                                 TKeyPressLength aLength )
-	{
-	TBool                      result       	= ETrue;
-	MAknFepManagerUIInterface* fepMan       	= iOwner->FepMan();
-	CPtiEngine* 			   ptiengine 		= iOwner->PtiEngine();
-	
-	if(aKey == EKeyBackspace)
-		{
-		iIndicPhoneticBuffer.Zero();
-		iPhoneticLatinChar = 0;	
-    	iPreviousCommittedChar = 0;						
-		}
-	else if(fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches) 
-           && aKey != EPtiKey0 && aLength != ELongKeyPress)
-		{
-		//no matches, so just play tone
-        fepMan->PlaySound(EAvkonSIDConfirmationTone);
-		}
-	else
-		{
-		if ( iData && ( iData != aKey ) && (!iIsStarKeyPressed ))
-	    	{
-	    	//iPrevCharacter = 
-	    	TransliterateFromLatinL();
-		    PTI_CLEAR_CURRENTWORD( ptiengine, iIsKeyTimerExpired )
-		    // = ;
-	   		}
-		iIsStarKeyPressed = EFalse;
-		if ( aLength == EShortKeyPress )
-			{
-		    if ( aKey == EPtiKeyStar ) // Overriding Key
-	            {
-		    	ptiengine->HandleCommandL(EPtiCommandBreakSyllable, NULL );	
-		    	iIsStarKeyPressed = ETrue;
-	    		}
-			else
-				{
-				TPtrC ptiText = ptiengine->AppendKeyPress( ( TPtiKey )aKey );
-				iPhoneticLatinChar = ptiText[0];
-				
-				if (IsToTransliterate(iPhoneticLatinChar) 
-				&& (!fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)))
-			    	{
-			    	TBuf<CAknFepManager::EMaximumFepWordLength> buf;
-		            buf.Copy(iIndicPhoneticBuffer);
-		            buf.Append(ptiText);
-					fepMan->NewCharacterSequenceL(buf,EIndicInputResponsePhoneticMultitapText);
-			    	}
-				else if(!IsToTransliterate(iPhoneticLatinChar))
-					{
-					TChar prevcharacter(fepMan->PreviousChar());
-					
-					if((fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches)) && (KQuestionMark == prevcharacter))
-						{
-						fepMan->RemovePreviousCharacterL();		
-						fepMan->ClearFlag(CAknFepManager::EFlagNoMatches);	
-						ptiengine->HandleCommandL(EPtiCommandBreakSyllable, NULL );
-						}
-					iIndicPhoneticBuffer.Zero();
-					if(IsToTransliterate(prevcharacter) && prevcharacter != '0')
-						fepMan->CommitInlineEditL();	
-					fepMan->NewCharacterSequenceL(ptiText,EIndicInputResponseNone);
-					}
-				}
-			}
-	   	else
-	    	{
-	    	if(fepMan->PreviousChar() == KQuestionMark)
-				{
-				fepMan->RemovePreviousCharacterL();		
-				}
-			fepMan->ClearFlag(CAknFepManager::EFlagNoMatches);
-
-	        /* Long press of a Key */
-	        if ( aKey == EPtiKeyStar)
-		        {
-	        	
-	            /* Launch the SCT For Indic */
-	   			if( fepMan->EditorHasFreeSpace() )
-					{
-					if (fepMan->IsAbleToLaunchSCT() && !fepMan->EditSubmenuInUse())
-	        			{        			
-		            	fepMan->LaunchSpecialCharacterTableL();	
-		            	}
-					}
-			    }
-	        else
-		        {
-		        //commit the inline text
-		        fepMan->CommitInlineEditL();
-		        //Remove one character, to remove the Latin character
-		        //appended because of the short key press. This is 
-		        //because long key press results  in short key press 
-		        //and then long key press.
-		        fepMan->RemovePreviousCharacterL();
-		        //Reset the phonetic state in FEP. So, that any further 
-		        //phonetic conversion will start from fresh.
-		        iIndicPhoneticBuffer.SetLength(0);
-		        iPhoneticLatinChar = 0;	
-    	        iPreviousCommittedChar = 0;
-    	        
-		        ptiengine->HandleCommandL(EPtiCommandBreakSyllable, NULL );
-		        TUint prevchar = fepMan->PreviousChar(ETrue);
-	            if(!((aKey == EPtiKey1) && ((0x0031 == prevchar) || (0x0967 == prevchar)) ))
-			        {
-					TChar ch( aKey );
-			        TBuf<1> buf;
-			        buf.Append( ch );
-			        fepMan->NewCharacterSequenceL( buf, EIndicInputResponseNumber );
-					fepMan->CommitInlineEditL();			
-					PTI_CLEAR_CURRENTWORD( ptiengine, iIsKeyTimerExpired )				
-					}
-		        }
-	    	}
-	    iData = aKey;
-		}
-   //hindi phonetic changes
-   if(iPhoneticLatinChar.IsUpper())
-	{
-		fepMan->HandleIndicCaseL();
-	}
-    return( result );
-	}
-
-// -----------------------------------------------------------------------------
-// TAknFepInputStateInitialIndicPhoneticMultitap::KeyTimerExpired
-
-// Handles the logic of post keytimerexpired event. This function commits 
-// the inline editing text to the editor.
-// -----------------------------------------------------------------------------
-
-void TAknFepInputStateInitialIndicPhoneticMultitap::KeyTimerExpired()
-	{
-	TRAP_IGNORE(HandleKeyTimerExpiryL())
-	iData = 0;	
-	iOwner->PtiEngine()->ClearCurrentWord();
-	if((iPreviousCommittedChar = iOwner->FepMan()->PreviousChar()) == 0x002E)
-		iPreviousCommittedChar = iOwner->FepMan()->PreviousToPreviousChar(ETrue);
-	iIsKeyTimerExpired = ETrue;
-	}
-	
-void TAknFepInputStateInitialIndicPhoneticMultitap::HandleKeyTimerExpiryL()
-	{
-	CPtiEngine* ptiengine = iOwner->PtiEngine();
-	MAknFepManagerUIInterface* fepMan = iOwner->FepMan();	
-	if ( !(fepMan->EditorHasFreeSpace() 
-       || fepMan->IsFlagSet(CAknFepManager::EFlagInsideMultitapInlineEditingTransaction)))
-	    {
-	    return;
-	    }
-	if(iData && ( IsToTransliterate(iPhoneticLatinChar) &&  iData != EPtiKeyStar) 
-     && !fepMan->IsFlagSet(CAknFepManager::EFlagNoMatches))
-		{
-		TransliterateFromLatinL();
-		}
-	else if ( !IsToTransliterate (iPhoneticLatinChar))
-        {
-		MPtiLanguage* ptilang = ptiengine->CurrentLanguage();
-	    TInt languageCode = (ptilang)? ptilang->LanguageCode() : 0;
-		// Space clears Explicite halant for North Indian Languages.
-		if(IsToRemoveHalantForLanguage(languageCode))
-			{
-			RemoveHalantL(TLanguage(languageCode));
-			}	
-		ptiengine->HandleCommandL(EPtiCommandBreakSyllable, NULL );
-		fepMan->CommitInlineEditL();
-		iIndicPhoneticBuffer.Zero();
-        }	
-	else
-		{
-		iOwner->FepMan()->CommitInlineEditL();
-    	iIndicPhoneticBuffer.Zero();
-		}	
-	}
-
-void TAknFepInputStateInitialIndicPhoneticMultitap :: TransliterateFromLatinL() 
-	{
-	TPhoneticArg arg;
-    TBuf<CAknFepManager::EMaximumFepWordLength> destinationbuf;
-    destinationbuf.Zero();               
-	TInt errorcode = 0; 
-	CPtiEngine* ptiengine = iOwner->PtiEngine();
-	MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
-	MPtiLanguage* ptilang = iOwner->PtiEngine()->CurrentLanguage();
-    TInt languageCode = (ptilang)? ptilang->LanguageCode() : 0;
-	    
-	arg.iChar = iPhoneticLatinChar;
-	arg.iDest = & destinationbuf;
-	errorcode = ptiengine->HandleCommandL(EPtiCommandGetPhoneticText,REINTERPRET_CAST( TAny*, &arg));
-	AknTextUtils::LanguageSpecificNumberConversion(destinationbuf);
-	switch(errorcode)
-    	{
-    	case KErrNone:
-    		{
-    		if(arg.iState == EIndicSyllableStateSyllableBroken)
-    			{
-				if(iIndicPhoneticBuffer.Length())
-					{
-					fepMan->CommitInlineEditL(iIndicPhoneticBuffer, iIndicPhoneticBuffer.Length());
-					iPreviousCommittedChar = fepMan->PreviousChar(ETrue);
-					iIndicPhoneticBuffer.Zero();
-					}
-      			}
-
-			if (destinationbuf.Length())
-	            {
-	            	if(! ValidatePhoneticInputL(destinationbuf, TLanguage(languageCode)))
-	            		{
-	            		break;	
-	            		}
-	            	
-	            fepMan->NewCharacterSequenceL(destinationbuf,
-	                                          EIndicInputResponsePhoneticMultitapText);
-
-        		if(TAknFepUiIndicInputManager::IsCharOther(destinationbuf[0],
-        		     TLanguage(languageCode)) && 0x002E != destinationbuf[0])
-        			{
-        			fepMan->CommitInlineEditL();
-        			iIndicPhoneticBuffer.Zero();
-        			}
-				else
-					{
-        			iIndicPhoneticBuffer.Copy(destinationbuf);
-					}
-	            }
-    		}
-    	break;
-    	case KErrOverflow:
-    		{
-			fepMan->NewCharacterSequenceL(destinationbuf,EIndicInputResponsePhoneticMultitapText);    		
-    		fepMan->CommitInlineEditL();
-        	ptiengine->HandleCommandL(EPtiCommandClearPhoneticBuffer,NULL);
-    		}
-    	break;
-    	default:
-    	break;
-    	}
-    iPhoneticLatinChar = 0;	
-	}
-
-TBool TAknFepInputStateInitialIndicPhoneticMultitap::IsToRemoveHalantForLanguage(TInt aLanguage)
-	{
-	TBool ret = EFalse;
-	switch(aLanguage)
-		{
-		case KLangHindiPhonetic:
-			ret = ETrue;
-		break;
-		}
-	return ret;	
-	}
-	
-inline TBool TAknFepInputStateInitialIndicPhoneticMultitap::IsToTransliterate(TChar& aChar)
-	{
-	return !(KAknFEPLineFeedSymbol == aChar || KSpaceChar == aChar);
-	}
-	
-TBool TAknFepInputStateInitialIndicPhoneticMultitap::ValidatePhoneticInputL(const TDes& aBuf, 
-                                                                            TLanguage aLanguage)
-	{
-	TBool ret = ETrue;
-    TUint curChar = 0;
-    TUint prevChar=0;
-    TUint len=aBuf.Length();
-    TPtr buffer(const_cast<TText*>( aBuf.Ptr() ),len,len);
-	MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
-	TPtiTextCase newCase = iOwner->PtiEngine()->Case();
-	if(! iPreviousCommittedChar)
-		{
-		iPreviousCommittedChar = fepMan->PreviousChar(ETrue);	
-		}
-       while(len)
-                {
-                if(buffer[len-1] == 0x94d)
-                    {
-                    len--;
-                    buffer.SetLength(len);
-                    continue;
-                    }
-                else if(!curChar)
-                    {
-                    curChar = buffer[len-1] ;
-                    len--;
-                    }
-                else if(!prevChar)
-                    {
-                    prevChar = buffer[len-1] ;
-                    len--;
-                    }
-                else
-                    break;
-                }
-       if(!prevChar)
-            prevChar = iPreviousCommittedChar;
-       /*
-       Multitap does not allow any fall back characters. The phonetic engine does not
-       check for the fallback characters and FEP has to do it.
-       */
-       //fallback character if Nukta is entered after Nukta
-       if((TAknFepUiIndicInputManager::IsCharNukta(prevChar,aLanguage) && 
-        TAknFepUiIndicInputManager::IsCharNukta(curChar,aLanguage)) ||
-        
-        //fallback character if Nukta is entered after Modifier or
-        //Modifier is entered after Modifier
-        (TAknFepUiIndicInputManager::IsCharModifier(prevChar,aLanguage) && 
-        (TAknFepUiIndicInputManager::IsCharNukta(curChar,aLanguage) ||
-        TAknFepUiIndicInputManager::IsCharModifier(curChar,aLanguage))) ||
-        
-        //fallback character if Nukta is entered after Vowel or
-        //Nukta is entered after matra
-       ((TAknFepUiIndicInputManager::IsCharAnVowel(prevChar,aLanguage) ||
-       TAknFepUiIndicInputManager::IsCharMatra(prevChar,aLanguage)) && 
-        TAknFepUiIndicInputManager::IsCharNukta(curChar,aLanguage))  ||
-        //fallback character if Nukta is entered after Nukta Consonant
-        (TAknFepUiIndicInputManager::IsCharNuktaConsonant(prevChar,aLanguage) &&
-        TAknFepUiIndicInputManager::IsCharNukta(curChar,aLanguage)) ||
-        
-        //fallback character if Nukta entered in an empty editor
-        (prevChar == PHONETIC_SEPARATOR &&
-        TAknFepUiIndicInputManager::IsCharNukta(curChar,aLanguage))
-        )
-           {
-            TBuf<1> buffer;
-            fepMan->CommitInlineEditL(iIndicPhoneticBuffer, iIndicPhoneticBuffer.Length());
-	        buffer.Append(KQuestionMark);
-		if(!fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
-			{
-			fepMan->StartInlineEditL();	
-			}
-        fepMan->UpdateInlineEditL(buffer,CAknFepManager::ESingleCharacter);
-        fepMan->SetFlag(CAknFepManager::EFlagNoMatches);
-		ret = EFalse;
-		}
-	return ret;
-	}
-	
-TBool TAknFepInputStateInitialIndicPhoneticMultitap::IsInvalidPhoneticCharacter( 
-                                              TUint aChar, TLanguage aLanguage )
-	{
-	TBool ret = EFalse;
-	if(TAknFepUiIndicInputManager::IsCharNukta( aChar, aLanguage )
-	   || TAknFepUiIndicInputManager::IsCharMatra( aChar,  aLanguage )
-	   || TAknFepUiIndicInputManager::IsCharModifier( aChar,  aLanguage )
-	   || TAknFepUiIndicInputManager::IsCharVirama( aChar,  aLanguage ))
-		{	
-		ret = ETrue;
-		}
-	return ret;	
-	}
-
-void TAknFepInputStateInitialIndicPhoneticMultitap::RemoveHalantL(TLanguage aLanguage)
-	{
-	MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
-	TBool isLineFeedEntered = fepMan->IsFlagSet(CAknFepManager::EFlagLineFeedCharacter);
-	if (fepMan->IsFlagSet(CAknFepManager::EFlagInsideInlineEditingTransaction))
-        {
-        fepMan->CommitInlineEditL();
-        }
-
-	TInt position = 0;
-	
-    if(TAknFepUiIndicInputManager::IsCharVirama(fepMan->PreviousChar(ETrue), aLanguage))
-    	{
-    	position = 1;
-    	}
-    else if(!isLineFeedEntered && 
-    TAknFepUiIndicInputManager::IsCharVirama(fepMan->PreviousToPreviousChar(ETrue), aLanguage))
-    	{
-    	position = 2;	
-    	}
-    if(position)	
-    	fepMan->RemoveTextFromEditorL( 1, position-1, EFalse );
-   	if(fepMan->NextChar() == KSpaceChar)
-   		{
-   		fepMan->AlignLogicalAndVisualCursorL(TTmDocPosSpec::ELeading, EFalse);	
-   		}
-	}
-
-void TAknFepInputStateInitialIndicPhoneticMultitap::GetPhoneticLatinChar(TChar& aChar)const
-	{
-		aChar = iPhoneticLatinChar;
-	}
-//End of File