--- /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