fep/aknfep/src/aknfepzhuyinkeyhandler.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/aknfepzhuyinkeyhandler.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,611 @@
+/*
+* Copyright (c) 2009 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:                
+*
+*/
+
+
+
+
+#include "aknfepzhuyinkeyhandler.h"
+
+const TInt KBTLoopLength1 = 3;
+const TInt KBTLoopLength2 = 4;
+const TInt KBTLoopLength3 = 5;
+
+const TInt KBTLoopLength = 5;
+
+const TInt KCLKCount1 = 1;
+const TInt KCLKCount2 = 2;
+const TInt KCLKCount3 = 3;
+const TInt KCLKCount4 = 4;
+const TInt KCLKCount5 = 5;
+
+const TInt KTimerOut = 700000;
+
+_LIT(KPtiKey1_1, "\x3105");
+_LIT(KPtiKey1_2, "\x3106");
+_LIT(KPtiKey1_3, "\x3107");
+_LIT(KPtiKey1_4, "\x3108");
+
+_LIT(KPtiKey2_1, "\x3109");
+_LIT(KPtiKey2_2, "\x310A");
+_LIT(KPtiKey2_3, "\x310B");
+_LIT(KPtiKey2_4, "\x310C");
+
+_LIT(KPtiKey3_1, "\x310D");
+_LIT(KPtiKey3_2, "\x310E");
+_LIT(KPtiKey3_3, "\x310F");
+
+_LIT(KPtiKey4_1, "\x3110");
+_LIT(KPtiKey4_2, "\x3111");
+_LIT(KPtiKey4_3, "\x3112");
+
+_LIT(KPtiKey5_1, "\x3113");
+_LIT(KPtiKey5_2, "\x3114");
+_LIT(KPtiKey5_3, "\x3115");
+_LIT(KPtiKey5_4, "\x3116");
+
+_LIT(KPtiKey6_1, "\x3117");
+_LIT(KPtiKey6_2, "\x3118");
+_LIT(KPtiKey6_3, "\x3119");
+
+_LIT(KPtiKey7_1, "\x311A");
+_LIT(KPtiKey7_2, "\x311B");
+_LIT(KPtiKey7_3, "\x311C");
+_LIT(KPtiKey7_4, "\x311D");
+
+_LIT(KPtiKey8_1, "\x311E");
+_LIT(KPtiKey8_2, "\x311F");
+_LIT(KPtiKey8_3, "\x3120");
+_LIT(KPtiKey8_4, "\x3121");
+
+_LIT(KPtiKey9_1, "\x3122");
+_LIT(KPtiKey9_2, "\x3123");
+_LIT(KPtiKey9_3, "\x3124");
+_LIT(KPtiKey9_4, "\x3125");
+_LIT(KPtiKey9_5, "\x3126");
+
+_LIT(KPtiKey0_1, "\x3127");
+_LIT(KPtiKey0_2, "\x3128");
+_LIT(KPtiKey0_3, "\x3129");
+
+_LIT(KPtiKeyStar_1, "\x0020");
+_LIT(KPtiKeyStar_2, "\x02CA");
+_LIT(KPtiKeyStar_3, "\x02C7");
+_LIT(KPtiKeyStar_4, "\x02CB");
+_LIT(KPtiKeyStar_5, "\x02D9");
+
+
+// ---------------------------------------------------------
+// C++ constructor.
+// ---------------------------------------------------------
+//
+ZhuyinKeyTable::ZhuyinKeyTable()
+    {
+    }
+
+// ---------------------------------------------------------
+// Cancel and destroy.
+// ---------------------------------------------------------
+//
+ZhuyinKeyTable::~ZhuyinKeyTable()
+    {
+    }
+
+// ---------------------------------------------------------
+// Get butten loop length.
+// ---------------------------------------------------------
+//
+TInt ZhuyinKeyTable::GetBtLoopLength ( TPtiKey aKey )
+    {
+    switch ( aKey )
+        {
+        case EPtiKey0:
+        case EPtiKey3:
+        case EPtiKey4:
+        case EPtiKey6:
+            {
+            return KBTLoopLength1;
+            }
+        case EPtiKey1:
+        case EPtiKey2:
+        case EPtiKey5:
+        case EPtiKey7:
+        case EPtiKey8:
+            {
+            return KBTLoopLength2;
+            }
+        case EPtiKey9:
+        case EPtiKeyStar:
+            {
+            return KBTLoopLength3;
+            }
+        default:
+            return 0;
+        }
+    }
+
+// ---------------------------------------------------------
+// Get zhuyin symbol.
+// ---------------------------------------------------------
+//
+TBool ZhuyinKeyTable::GetUnicode ( TPtiKey aKey, TInt aClkCount, TDes& aOutput )
+    {
+    aOutput.Zero();
+    switch ( aKey )
+        {
+        case EPtiKey0:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey0_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey0_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey0_3);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey1:
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey1_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey1_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey1_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey1_4);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+        case EPtiKey2:
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey2_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey2_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey2_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey2_4);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+        case EPtiKey3:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey3_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey3_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey3_3);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey4:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey4_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey4_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey4_3);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey5:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey5_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey5_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey5_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey5_4);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey6:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey6_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey6_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey6_3);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey7:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey7_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey7_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey7_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey7_4);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey8:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey8_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey8_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey8_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey8_4);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKey9:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKey9_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKey9_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKey9_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKey9_4);
+                    return ETrue;
+                case KCLKCount5:
+                    aOutput.Append(KPtiKey9_5);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        case EPtiKeyStar:
+            {
+            switch ( aClkCount )
+                {
+                case KCLKCount1:
+                    aOutput.Append(KPtiKeyStar_1);
+                    return ETrue;
+                case KCLKCount2:
+                    aOutput.Append(KPtiKeyStar_2);
+                    return ETrue;
+                case KCLKCount3:
+                    aOutput.Append(KPtiKeyStar_3);
+                    return ETrue;
+                case KCLKCount4:
+                    aOutput.Append(KPtiKeyStar_4);
+                    return ETrue;
+                case KCLKCount5:
+                    aOutput.Append(KPtiKeyStar_5);
+                    return ETrue;
+                default:
+                    return EFalse;
+                }
+            }
+        default:
+            return EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------
+//
+CZhuyinKeyHandler::CZhuyinKeyHandler( ) :
+    CActive ( EPriorityStandard ), // Standard priority
+    iLastKey ( EPtiKeyNone ), 
+    iTimeOut ( ETrue ),
+    iBtClickNum ( 0 ),
+    iBtLoopLength ( 1 ),
+    iState( 0 ),
+    iStatusChgFlag(EInit)
+    {
+    }
+
+// ---------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CZhuyinKeyHandler* CZhuyinKeyHandler::NewLC()
+    {
+    CZhuyinKeyHandler* self = new ( ELeave ) CZhuyinKeyHandler();
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+CZhuyinKeyHandler* CZhuyinKeyHandler::NewL()
+    {
+    CZhuyinKeyHandler* self = CZhuyinKeyHandler::NewLC();
+    CleanupStack::Pop( self ); // self;
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::ConstructL( )
+    {
+    User::LeaveIfError( iTimer.CreateLocal( ) ); // Initialize timer
+    CActiveScheduler::Add( this ); // Add to scheduler
+    }
+
+// ---------------------------------------------------------
+// Cancel and destroy.
+// ---------------------------------------------------------
+//
+CZhuyinKeyHandler::~CZhuyinKeyHandler( )
+    {
+    Cancel( ); // Cancel any request, if outstanding
+    iTimer.Close( ); // Destroy the RTimer object
+    // Delete instance variables if any
+    }
+
+// ---------------------------------------------------------
+// How to cancel me.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::DoCancel( )
+    {
+    iTimer.Cancel( );
+    }
+
+// ---------------------------------------------------------
+// Function for making the initial request.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::Start()
+    {
+    Cancel(); // Cancel any request, just to be sure
+    iTimer.After( iStatus, KTimerOut ); // Set for later
+    SetActive(); // Tell scheduler a request is active
+    }
+
+// ---------------------------------------------------------
+// Get Zhuyin symbol according to the inputting key.
+// ---------------------------------------------------------
+//
+TInt CZhuyinKeyHandler::GetZhuyinSymbol ( TPtiKey aKey, TDes& aOutBuf )
+    {
+    TInt ret = 0;
+    Start();
+    // if the same button is pressed for many times.
+    if ( iLastKey == aKey
+        && iTimeOut == EFalse )
+        {
+        if ( iBtLoopLength != 0 )
+            {
+            iBtClickNum++;
+            if ( iBtClickNum > iBtLoopLength )
+                {
+                iBtClickNum = 1;
+                }
+            }
+        // Search for the corresponding unicode and value aOutBuf.
+        ZhuyinKeyTable::GetUnicode(aKey,iBtClickNum,aOutBuf);
+        ret = 0;
+        }
+    // if the pressed button is changed or time out event is happened.
+    else if ( iLastKey == aKey
+        && iTimeOut != EFalse )
+        {
+        // Update iBtClickNum
+        iBtClickNum = 1;
+        // Search for the corresponding unicode and value aOutBuf.
+        ZhuyinKeyTable::GetUnicode(aKey,iBtClickNum,aOutBuf);
+        ret = 1;
+        }
+    else
+        {
+        // Update iBtClickNum
+        iBtClickNum = 1;
+        // Update iBtUnicodeNum
+        iBtLoopLength = ZhuyinKeyTable::GetBtLoopLength(aKey);
+        // Search for the corresponding unicode and value aOutBuf.
+        ZhuyinKeyTable::GetUnicode(aKey,iBtClickNum,aOutBuf);
+        if ( iBtLoopLength != 0 )
+            {
+            ret = 1;
+            }
+        else
+            {
+            ret = -1;
+            }
+        }
+    iLastKey = aKey;
+    iTimeOut = EFalse;
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// Set status change flag.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::SetStatusChgFlag ( MZhuyinKeyHandler::TStatusChgFlag aChgFlag )
+    {
+    iStatusChgFlag = aChgFlag;
+    }
+
+// ---------------------------------------------------------
+// Get the status change flag.
+// ---------------------------------------------------------
+//
+MZhuyinKeyHandler::TStatusChgFlag CZhuyinKeyHandler::GetStatusChgFlag ()
+    {
+    return iStatusChgFlag;
+    }
+
+// ---------------------------------------------------------
+// Reset all the member variables.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::Reset()
+    {
+    iLastKey = EPtiKeyNone; 
+    iTimeOut = ETrue ;
+    iBtClickNum = 0;
+    iBtLoopLength = 1;
+    }
+
+
+// ---------------------------------------------------------
+// Get tonemark according to symbol in front of cursor.
+// ---------------------------------------------------------
+//
+TInt CZhuyinKeyHandler::GetToneMark ( const TDes& aBaseSymbol, TDes& aOutBuf )
+    {
+    TInt ret = 0;
+    iBtLoopLength = KBTLoopLength;
+    iTimeOut = ETrue ;
+    if ( aBaseSymbol.Compare(KPtiKeyStar_1) == 0 )
+        {
+        iBtClickNum = KCLKCount1;
+        }
+    else if ( aBaseSymbol.Compare(KPtiKeyStar_2) == 0 )
+        {
+        iBtClickNum = KCLKCount2;
+        }
+    else if ( aBaseSymbol.Compare(KPtiKeyStar_3) == 0 )
+        {
+        iBtClickNum = KCLKCount3;
+        }
+    else if ( aBaseSymbol.Compare(KPtiKeyStar_4) == 0 )
+        {
+        iBtClickNum = KCLKCount4;
+        }
+    else if ( aBaseSymbol.Compare(KPtiKeyStar_5) == 0 )
+        {
+        iBtClickNum = KCLKCount5;
+        }
+    else
+        {
+        iBtClickNum = 0;
+        ret = 1;
+        }
+    iBtClickNum++;
+    if ( iBtClickNum > iBtLoopLength )
+        {
+        iBtClickNum = 1;
+        }
+    ZhuyinKeyTable::GetUnicode(EPtiKeyStar,iBtClickNum,aOutBuf);
+    iLastKey = EPtiKeyStar;
+    iTimeOut = EFalse;
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// Get tonemark according to symbol in front of cursor.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::RunL( )
+    {
+    iTimeOut = ETrue;
+    }
+
+// ---------------------------------------------------------
+// Override to handle leaves from RunL(). Default implementation causes.
+// ---------------------------------------------------------
+//
+TInt CZhuyinKeyHandler::RunError( TInt aError )
+    {
+    return aError;
+    }
+
+// ---------------------------------------------------------
+// Set whether state change from entry to spelling editing is automatical.
+// ---------------------------------------------------------
+//
+void CZhuyinKeyHandler::SetState( TInt aState )
+    {
+    iState = aState;
+    }
+
+// ---------------------------------------------------------
+// Get state change states.
+// ---------------------------------------------------------
+//
+TInt CZhuyinKeyHandler::GetState()
+    {
+    return iState;
+    }
+
+// End of file