fep/aknfep/src/AknFepUiInputStateInitialVietnameseMultitap.cpp
changeset 0 eb1f2e154e89
child 11 c8fb4cf7b3ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepUiInputStateInitialVietnameseMultitap.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,228 @@
+/*
+* Copyright (c) 2005 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 TAknFepInputStateInitialVietnameseMultitap methods.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include "AknFepUIInputStateInitialVietnameseMultitap.h"
+#include "AknFepUIManagerStateInterface.h"      //MAknFepUIManagerStateInterface
+
+#include "AknFepCaseManager.h"
+#include "AknFepVietnameseToneManager.h"
+
+#include <uikon.hrh>
+
+#include <PtiEngine.h>
+#include <PtiDefs.h>
+#include <aknSctDialog.h>
+#include <avkon.rsg>
+#include <AknFep.rsg>
+
+#include "AknFepUiManagerWestern.h"
+
+TAknFepInputStateInitialVietnameseMultitap::
+TAknFepInputStateInitialVietnameseMultitap(MAknFepUIManagerStateInterface* aOwner)
+:TAknFepInputStateInitialMultitapBase(aOwner)
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    TPtiTextCase caseMode = ptiengine->Case();
+    ptiengine->SetCase(caseMode);
+    }
+
+TBool TAknFepInputStateInitialVietnameseMultitap::HandleKeyL(TInt aKey, TKeyPressLength aLength)
+    {
+    TBool bHandled = EFalse;
+
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    CAknFepUIManagerWestern* uiMan = static_cast<CAknFepUIManagerWestern*>(iOwner);
+    CAknFepVietnameseToneManager* toneMgr = uiMan->VietnameseToneManager();
+    CPtiEngine* ptiEng = fepMan->PtiEngine();
+
+    toneMgr->SetFepManager(fepMan);
+
+    if (aKey == EPtiKeyStar)
+        {
+        if (aLength == EShortKeyPress)
+            {
+            if (!toneMgr->IsLooping())
+                {
+                // Start looping status
+                if (toneMgr->StartToneMarkLooping())
+                    {
+                    // Save the vowel for undo back deletion
+                    toneMgr->SetDeletedVowel(fepMan->PreviousChar());
+                    
+                    ((CAknFepManager*)fepMan)->RemovePreviousCharacterL();    // remove previous char
+                    }
+                }
+            
+            // Process the interim looping state
+            if (toneMgr->IsLooping())
+                {
+                // Get current tone mark
+                TText toneVowel = toneMgr->GetVowelWithToneMark();
+                toneMgr->IncrementToneMark();
+
+                TBuf<CAknFepManager::ESingleCharacter> aChr;
+                aChr.Append(toneVowel);
+
+                // Update inline character(s)
+                fepMan->CancelInlineEdit();
+                fepMan->NewCharacterL(aChr);
+
+                // Reset the engine timer so that we can get timer expired message
+                // We send the * key, and clear it in the next loop
+                ptiEng->ClearCurrentWord();
+                ptiEng->AppendKeyPress((TPtiKey)aKey);
+
+                bHandled = ETrue;
+                
+                if (fepMan->EditSubmenuInUse())
+                    {
+                    // Looping tone marks, supress edit-menu.
+                    fepMan->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp);
+                    }
+                }
+            }
+        else if (aLength == ELongKeyPress)
+            {
+            // Reset the key event so that the TAknFepInputStateInitialMultitapBase will
+            // parse this event as a short key event, default reaction is to launch SCT
+            aLength = EShortKeyPress;
+
+            if (toneMgr->IsLooping())
+                {
+                // Remove the previous EShortKeyPress message
+                fepMan->CancelInlineEdit();
+                toneMgr->StopToneMarkLooping();
+
+                // Undo the backdeletion
+                TText bkChr = toneMgr->GetDeletedVowel();
+
+                TBuf<CAknFepManager::ESingleCharacter> aChr;
+                aChr.Append(bkChr);
+
+                fepMan->NewCharacterL(aChr);
+                fepMan->CommitInlineEditL();
+                
+               	if (fepMan->EditSubmenuInUse() && fepMan->IsAbleToLaunchSCT())
+        		    {
+        		    fepMan->LaunchSpecialCharacterTableL();
+        		    return ETrue;
+        		    }                         
+                }
+			else if (fepMan->EditSubmenuInUse())
+				{
+				aLength = ELongKeyPress;
+				}
+            }
+        }
+    
+    // Implementation for the Vietnamese back deletion
+    if (aKey == EKeyBackspace)
+        {
+        TBuf<2> newText;
+        // Get the last character from the current editor
+        TText prevChar = fepMan->PreviousChar();
+        
+        // Judge if the last character needs to be converted
+        if ( NeedsVietnameseBkDelSupport(prevChar, newText) )
+            {
+            // Delete the prev character and send the new character to editor
+            ((CAknFepManager*)fepMan)->RemovePreviousCharacterL();
+            fepMan->NewCharacterL(newText);
+            fepMan->CommitInlineEditL();
+			// Stop looping for backspace operation
+			if( toneMgr->IsLooping() )
+			    {
+				toneMgr->StopToneMarkLooping();
+				}
+            return ETrue;
+            }
+        else
+            {
+            if ( prevChar )
+                {
+                ((CAknFepManager*)fepMan)->RemovePreviousCharacterL();
+                }
+            else
+                {
+                return EFalse;
+                }
+                
+            bHandled = EFalse;
+            }
+        }
+    
+    if(!bHandled && toneMgr->IsLooping())
+    	{
+    	toneMgr->StopToneMarkLooping();
+    	}
+    
+    return bHandled ? ETrue : TAknFepInputStateInitialMultitapBase::HandleKeyL(aKey, aLength);
+    }
+
+void TAknFepInputStateInitialVietnameseMultitap::KeyTimerExpired()
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    CAknFepUIManagerWestern* uiMan = static_cast<CAknFepUIManagerWestern*>(iOwner);
+    CAknFepVietnameseToneManager* toneMgr = uiMan->VietnameseToneManager();  
+    CPtiEngine* ptiEng = fepMan->PtiEngine();
+
+    // Try commit inline editting and clean up for future input attemps
+    TRAP_IGNORE(fepMan->CommitInlineEditL());
+
+    toneMgr->StopToneMarkLooping();
+    ptiEng->ClearCurrentWord();
+    }
+    
+TBool TAknFepInputStateInitialVietnameseMultitap::NeedsVietnameseBkDelSupport(
+                                         TText aGlyphToDelete, TDes& aNewText)
+    {
+    TBool needBkDelSupport(EFalse);
+
+    const TInt KMatrixColumn = sizeof(VietToneMatrix) / sizeof(TText) / KNumberOfToneMarks;
+
+    aNewText.Zero();
+
+    // Loop of the ToneMatrix columns starts from 1 because the first column of the ToneMatrix stores the vowels 
+    for (TUint i = 1; (i < KMatrixColumn) && (!needBkDelSupport); ++i)
+        {
+        for (TUint j = 0; j < KNumberOfToneMarks; ++j)
+            {
+            if (VietToneMatrix[i][j] == aGlyphToDelete)
+                {
+                needBkDelSupport = ETrue;
+                aNewText.Append(VietVowelList[i - 1]);
+                break;
+                }
+            }
+        }
+
+    return needBkDelSupport;
+    }
+
+// End of file