fep/aknfep/src/aknfepuiinputstateminiqwertyzhuyinphrase.cpp
branchRCL_3
changeset 44 ecbabf52600f
child 46 bd83ceabce89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/aknfepuiinputstateminiqwertyzhuyinphrase.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,1325 @@
+/*
+* Copyright (c) 2007 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  TAknFepInputStateEntryMiniQwertyZhuyinPhrase,
+ *       TAknFepInputStateEditingMiniQwertyZhuyinPhrase,
+ *       TAknFepUiInputStateCandidateMiniQwertyZhuyinPhrase methods.
+ *
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+// System includes
+#include <PtiEngine.h>  
+#include <PtiUserDicEntry.h>
+#include <aknnotewrappers.h> //CAknWarningNote
+#include <aknfep.rsg>  
+
+// User includes
+#include "AknFepUiCtrlContainerChinese.h"
+#include "AknFepUICtrlCandidatePane.h"
+#include "AknFepUICtrlInputPane.h"
+#include "aknfepuictrleditpane.h"           //phrase creation
+#include "AknFepUICtrlPinyinPopup.h"        //Pinyin phrase
+#include "AknFepUIManagerStateInterface.h"  
+#include "AknFepManager.h" 
+#include "aknfepuiinputstateminiqwertyzhuyinphrase.h"
+#include "aknfepinputstateminiqwertyzhuyinkeymap.h"
+
+const TInt KMaxKeystrokeCount = 31;
+const TInt KMaxKeystrokeSize = 130;
+const TInt KMaxPhraseLength = 7;
+const TInt KMinCandidateCount = 1;
+const TInt KKeystrokeMaxLength = 4;
+const TInt KMaxSpellLength = 7;//max zhuyin length for one chinese Zi
+const TInt KMaxPhraseCreationCount = 7;
+//const TInt KTonemarkCount = 5;
+
+const TUint16 KToneMark1 = 0x0020;
+const TUint16 KToneMark2 = 0x02CA;
+const TUint16 KToneMark3 = 0x02c7;
+const TUint16 KToneMark4 = 0x02CB;
+const TUint16 KToneMark5 = 0x02D9;
+
+_LIT(KLeftBracket, "(");
+_LIT(KRightBracket, ")");
+_LIT(KReplace, "");
+
+_LIT( KDelimiter, "'");
+struct TToneZhuYinMap
+    {
+    TUint16 iValue;
+    TInt iInputTone;
+    };
+const TToneZhuYinMap ZhuyinToneMap[] =
+    {
+        {KToneMark1, 1},
+        {KToneMark2, 2},
+        {KToneMark3, 3},
+        {KToneMark4, 4},
+        {KToneMark5, 5}
+    };
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::TAknFepInputStateEditingMiniQwertyZhuyinPhrase
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+TAknFepInputStateEditingMiniQwertyZhuyinPhrase::TAknFepInputStateEditingMiniQwertyZhuyinPhrase(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer ) :
+    TAknFepInputMiniQwertyZhuyinPhraseBase( aOwner, aUIContainer)
+    {
+    iState = EMiniQwertyEdit;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    uiContainer->FocusCandidatePane( EFalse );
+    uiContainer->CandidatePane()->ShowCandidateOrdinals( EFalse );
+    uiContainer->SetLayout( MAknFepUICtrlContainerChinese::ELayoutPhraseCreation );
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    uiContainer->ShowVerticalScrollArrows( ETrue );
+    uiContainer->ShowHorizontalScrollArrows( EFalse );
+    uiContainer->InputPane()->SetOverrideFontId( 0 );
+    // in the case that we are coming back to the input pane from the candidate pane, 
+    // we need to ensure that the current selection is selected correctly
+    ImplicityShowInfo( ETrue );
+    // so that it could handle EKeyCBA1
+    iOwner->FepMan()->EntryPhrase( ETrue );
+    RefreshEditPane();
+    uiContainer->PinyinPopupWindow()->SetNoneHighlighted();
+    TRAP_IGNORE( ChangeCbaL() );
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleKeyL
+// Handle system key press event.
+// ---------------------------------------------------------------------------
+// 
+TBool TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleKeyL( TInt aKey,
+    TKeyPressLength aLength )
+    {
+    TBool ret = ETrue;
+    TBool state = ETrue;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    CDesCArrayFlat* phraseArray = editPane->PhraseArray();
+    
+    if ( iOwner->FepMan()->GetComposChrFlag() && aKey == EStdKeyLeftFunc )
+        {
+        iOwner->FepMan()->SetComposChrFlag( EFalse );
+        return ret;
+        }
+    
+    switch ( aKey )
+        {
+        case EStdKeyLeftShift:
+        case EStdKeyRightShift:
+        case EStdKeyLeftCtrl:
+        case EStdKeyRightCtrl:
+        case EStdKeyRightFunc://fn 
+        case EStdKeyLeftFunc: //chr key
+        case EStdKeyUpArrow:
+        case EKeyRightFunc:
+        case EKeyLeftFunc:
+            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+            break;
+            //if the canidate is empty ,inactive;else candiniate selecting state
+        case EStdKeyDownArrow:
+            {
+            if ( 0 != candidatePane->VisibleCandidateCount() && phraseArray->Count() < 7 )
+                {
+                uiContainer->EditPaneWindow()->SetChangeState( ETrue );
+                iOwner->ChangeState( EZhuyinSpelling );
+                }
+            }
+            break;
+        case EStdKeyRightArrow:
+            MoveCursorRight();
+            break;
+        case EStdKeyLeftArrow:
+            MoveCursorLeft();
+            break;
+        case EStdKeyDevice1: //"cancle" key
+            iOwner->FepMan()->TryCloseUiL();
+            break;
+        case EStdKeyEnter:
+            CommitContentL( EFalse );
+            break;
+        case EStdKeyDevice0:
+        case EStdKeyDevice3:
+        	
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                HandleCommitL();
+                }
+            break;
+        case EStdKeyBackspace:
+            {
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                HandleKeyBackspaceL( aLength );
+                }
+            }
+            break;
+        default:
+            {
+            if ( aLength == EShortKeyPress && keystrokeArray->Count() < KMaxKeystrokeCount && 
+                !iOwner->FepMan()->IsFlagSet( CAknFepManager::EFlagQwertyChrKeyDepressed ) && 
+                phraseArray->Count() < KMaxPhraseLength &&
+                ( iOwner->IsValidChineseInputKeyQwerty( aKey ) || aKey == EStdKeySpace ) )
+                {
+                AddKeystrokeL( aKey );
+                RefreshUI();
+                ShowEEPInfo();
+                ChangeCbaL();
+                }
+            else
+                {
+                iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                }
+            }
+            break;
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::AddKeystrokeL
+// Add key stroke.
+// ---------------------------------------------------------------------------
+// 
+TBool TAknFepInputStateEditingMiniQwertyZhuyinPhrase::AddKeystrokeL( TInt aKey )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    TInt showKeystrokeCount = editPane->ShowKeystrokeArray()->Count();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+
+    if ( phraseCount + showKeystrokeCount >= KMaxKeystrokeCount - 1 )
+        {
+        return EFalse;
+        }
+    TBuf<KKeystrokeMaxLength> keystroke;
+    
+    TAknFepInputStateMiniQwertyZhuyinKeyMap::GetKeyStroke(
+            iOwner->PtiEngine(), aKey, keystroke );
+    
+    if ( index >= keystrokeArray->Count() )
+        {
+        keycodeArray->Append( aKey );
+        keystrokeArray->AppendL( keystroke );
+        editPane->SetCursorIndexOfKeystroke( keystrokeArray->Count() );
+        }
+    else
+        {
+        keycodeArray->Insert( aKey, index );
+        keystrokeArray->InsertL( index, keystroke );
+        editPane->SetCursorIndexOfKeystroke( index + 1 );
+        }
+    editPane->SetNeedClearDeliberateSelection( ETrue );
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::RevertPhraseToKeystrokeL
+// Revert the phrase to keystroke.
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::RevertPhraseToKeystrokeL()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    RArray<TInt>* phraseKeycode = editPane->PhraseKeycodeArray();
+    CDesCArrayFlat* phraseStroke = editPane->PhraseShowKeyStrokeArray();
+    TBuf<KMaxKeystrokeCount> buf;
+
+    if ( (phrase->Count() == 0 ) || (phraseStroke->Count() == 0 ) )
+        {
+        return;
+        }
+    
+    buf.Append( phraseStroke->MdcaPoint( phraseStroke->Count() - 1 ) );
+    
+    TInt insertIndex = 0;
+    while ( buf.Length() != 0 )
+        {
+        TBuf<KKeystrokeMaxLength> strokeBuf;
+        TInt index = buf.Find( KRightBracket );
+        if ( index != KErrNotFound )
+            {
+            strokeBuf.Copy( buf.Left( index + 1 ) );
+            keystrokeArray->InsertL( insertIndex, strokeBuf );
+            buf.Replace( 0, index + 1, KNullDesC );
+            }
+        else
+            {
+            keystrokeArray->InsertL( insertIndex, buf );
+            insertIndex = insertIndex + 1;
+            break;
+            }
+        insertIndex = insertIndex + 1;
+        }
+    phrase->Delete( phrase->Count() - 1 );
+    phraseStroke->Delete( phraseStroke->Count() - 1 );
+    
+    if ( insertIndex > phraseKeycode->Count() )
+        {
+        insertIndex = keycodeArray->Count();
+        }
+    
+    for ( TInt i = 0; i < insertIndex ; ++i )
+        {
+        keycodeArray->Insert( (*phraseKeycode)[phraseKeycode->Count() - 1 ],0 );
+        phraseKeycode->Remove( phraseKeycode->Count() - 1 );
+        }
+    
+    TInt keystrokeCount = keystrokeArray->Count();
+    TInt lenth = phrase->Count() + keystrokeCount;
+    TInt deleteCount = lenth - KMaxKeystrokeCount;
+
+    for (TInt i = 0; i < deleteCount; ++i )
+        {
+        keycodeArray->Remove( keycodeArray->Count() - 1 );
+        keystrokeArray->Delete( keystrokeArray->Count() - 1 );
+        }
+    editPane->SetCursorIndexOfKeystroke( insertIndex );
+    keystrokeArray->Compress();
+    phrase->Compress();
+    phraseStroke->Compress();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::AddPhraseToDB
+// Add phrase to DB.
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::AddPhraseToDB(
+    const TDesC& aPhraseAdd )
+    {
+    TPtiUserDictionaryEntry addUdbEntry(aPhraseAdd);
+    //Add the phrase to the DB by PTI Engine
+    iOwner->PtiEngine()->AddUserDictionaryEntry( addUdbEntry );
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::MoveCursorLeft
+// Move the cursor to Left.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStateEditingMiniQwertyZhuyinPhrase::MoveCursorLeft()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keyStrokeArray = editPane->KeystrokeArray();
+    TInt keystrokeCount = keyStrokeArray->Count();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+
+    if ( EMiniQwertyEdit != iState )
+        {
+        return EFalse;
+        }
+    if ( 0 == keystrokeCount )
+        {
+        return EFalse;
+        }
+
+    if ( 0 == index )
+        {
+        editPane->SetCursorIndexOfKeystroke( keystrokeCount );
+        ShowEEPInfo();
+        }
+    else if ( phraseCount > 0 && 1 == index )
+        {
+        editPane->SetCursorIndexOfKeystroke( 0 );
+        ShowEEPInfo();
+        }
+    else
+        {
+        TInt stride = keyStrokeArray->MdcaPoint( index - 1 ).Length();
+        editPane->MoveCursorLeft( stride );
+        editPane->SetCursorIndexOfKeystroke( index - 1 );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::MoveCursorRight
+// Move the cursor to Right.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStateEditingMiniQwertyZhuyinPhrase::MoveCursorRight()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    TInt keystrokeCount = keystroke->Count();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+
+    if ( EMiniQwertyEdit != iState )
+        {
+        return EFalse;
+        }
+    if ( 0 == keystrokeCount )
+        {
+        return EFalse;
+        }
+    if ( index >= keystrokeCount )
+        {
+        editPane->SetCursorIndexOfKeystroke( 0 );
+        ShowEEPInfo();
+        }
+    else
+        {
+        TInt stride = editPane->KeystrokeArray()->MdcaPoint( index ).Length();
+        editPane->MoveCursorRight( stride );
+        editPane->SetCursorIndexOfKeystroke( index + 1 );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleKeyBackspace
+// Handle Key Backspace
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleKeyBackspaceL( 
+                                                     TKeyPressLength aLength )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+
+    CDesCArrayFlat* keyStrokeArray = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt keystrokeCount = keyStrokeArray->Count();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+
+    TInt cursorOfkeystrokeIndex = editPane->GetCursorIndexOfKeystroke();
+
+    if ( 1 == cursorOfkeystrokeIndex )
+        {
+        editPane->Reset();
+        }
+    
+    if ( cursorOfkeystrokeIndex > 0 && 
+        ( keystrokeCount > 1 || phraseCount > 0 ) )
+        {
+        keycodeArray->Remove( cursorOfkeystrokeIndex - 1 );
+        keyStrokeArray->Delete( cursorOfkeystrokeIndex - 1 );
+        editPane->SetCursorIndexOfKeystroke( cursorOfkeystrokeIndex - 1 );
+        }
+    else if ( phraseCount > 0 && 0 == cursorOfkeystrokeIndex )
+        {
+        RevertPhraseToKeystrokeL();
+        }
+    else if ( 1 == cursorOfkeystrokeIndex )
+        {
+        iOwner->FepMan()->TryCloseUiL();
+        if ( aLength == ELongKeyPress )
+            {
+            iOwner->FepMan()->SetLongClearAfterCloseUI( ETrue );
+            }
+        return;
+        }
+    else
+        {
+        return;
+        }
+    editPane->SetNeedClearDeliberateSelection( ETrue );
+    RefreshUI();
+    ShowEEPInfo();
+    ChangeCbaL();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::CommitContentL
+// Commit content
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::CommitContentL(
+    TBool aAddUDB )
+    {
+    TBuf<KMaxKeystrokeSize> currentText;
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    MAknFepUICtrlEditPane* editpane = UIContainer()->EditPaneWindow();
+    CDesCArrayFlat* phraseArray = editpane->PhraseArray();
+    CDesCArrayFlat* keystrokeArray = editpane->KeystrokeArray();
+    TInt phraseCount = phraseArray->Count();
+    TInt keyStrokeCount = keystrokeArray->Count();
+
+    for (TInt i = 0; i < phraseCount; i++ )
+        {
+        currentText.Append( phraseArray->MdcaPoint( i ) );
+        }
+    for (TInt i = 0; i < keyStrokeCount; i++ )
+        {
+        currentText.Append( keystrokeArray->MdcaPoint( i ) );
+        }
+
+    if ( currentText.Length() )
+        {
+        while (currentText.Find( KLeftBracket ) >= 0 )
+            {
+            currentText.Replace( currentText.Find( KLeftBracket ), 1,
+                KReplace );
+            }
+        while (currentText.Find( KRightBracket ) > 0 )
+            {
+            currentText.Replace( currentText.Find( KRightBracket ), 1,
+                KReplace );
+            }
+        fepMan->NewTextL( currentText );
+        fepMan->CommitInlineEditL();
+        }
+    UIContainer()->EditPaneWindow()->ResetAllArray();
+    UIContainer()->EditPaneWindow()->SetPhraseCreationFlag( EFalse );
+    if ( fepMan->IsFlagSet( CAknFepManager::EFlagEditorFull ) )
+        {
+        fepMan->ClearFlag( CAknFepManager::EFlagEditorFull );
+        }
+    if ( aAddUDB )
+        {
+		//here,we pass zhuyin-spelling to db together with phrase.
+		CDesCArrayFlat* phraseZhuYinSpellingArray = UIContainer()->EditPaneWindow()->PhraseZhuYinSpellingArray();
+		TBuf<(1+KMaxSpellLength)*KMaxPhraseCreationCount> phraseCreatedWithZhuYin;//(Zi+Zhuyin)* max_Zi
+		phraseCreatedWithZhuYin.FillZ();
+		for (TInt ii = 0; ii < phraseCount; ++ii)
+			{
+			TPtrC ptrZi = phraseArray->MdcaPoint(ii);
+			phraseCreatedWithZhuYin.Append(ptrZi);
+			
+			TPtrC ptrZhuYin = phraseZhuYinSpellingArray->MdcaPoint(ii);
+			phraseCreatedWithZhuYin.Append(ptrZhuYin);
+			
+			TInt zeroTail = (1+KMaxSpellLength)-(ptrZi.Length()+ptrZhuYin.Length());
+			phraseCreatedWithZhuYin.AppendFill(0,zeroTail);
+			
+			}
+		AddPhraseToDB( phraseCreatedWithZhuYin );
+        }
+    fepMan->TryCloseUiL();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleCommitL
+// Handle commit action
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleCommitL()
+    {
+    TBuf<KMaxKeystrokeSize> currentText;
+    MAknFepUICtrlEditPane* editpane = UIContainer()->EditPaneWindow();
+    MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
+    CDesCArrayFlat* phraseArray = editpane->PhraseArray();
+    CDesCArrayFlat* keystrokeArray = editpane->KeystrokeArray();
+    TInt phraseCount = phraseArray->Count();
+    TInt keyStrokeCount = keystrokeArray->Count();
+
+    if ( 0 == candidatePane->VisibleCandidateCount() && ( 1 == phraseCount
+        || keyStrokeCount > 0 ) )
+        {
+        return;
+        }
+    if ( 0 != candidatePane->VisibleCandidateCount() && phraseCount < KMaxPhraseLength )
+        {
+        UIContainer()->EditPaneWindow()->SetChangeState( ETrue );
+        iOwner->ChangeState( EZhuyinSpelling );
+        return;
+        }
+    CommitContentL( ETrue );
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::RefreshUI
+// Refresh UI if necessary
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::RefreshUI()
+    {
+    MAknFepUICtrlEditPane* editpane = UIContainer()->EditPaneWindow();
+    MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow();
+    CDesCArrayFlat* showKeystroke = editpane->ShowKeystrokeArray();
+    TBuf<KMaxKeystrokeCount> preValidKeystroke;
+    TInt preValidKeystrokeCount = showKeystroke->Count();
+    for (TInt i=0; i < preValidKeystrokeCount; i++ )
+        {
+        preValidKeystroke.Append( showKeystroke->MdcaPoint( i ) );
+        }
+    GetValidKeystroke();
+    TBuf<KMaxKeystrokeCount> validKeystroke;
+    TInt validKeystrokeCount = showKeystroke->Count();
+    for (TInt i=0; i < validKeystrokeCount; i++ )
+        {
+        validKeystroke.Append( showKeystroke->MdcaPoint( i ) );
+        }
+    if ( preValidKeystroke.Compare( validKeystroke ) != 0 )
+        {
+        RefreshSpellingPane( ETrue );
+        RefreshCandidatePane();
+        }
+    else if ( popup->CurrentSelection() != 0 )
+        {
+        RefreshCandidatePane();
+        }
+    UpdateIndicator();
+    }
+
+// ---------------------------------------------------------
+// Init the show info
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::ImplicityShowInfo(
+    TBool aGetScreenCoordinates )
+    {
+    TRAP_IGNORE( ImplicityShowInfoL( aGetScreenCoordinates ) );
+    }
+
+// ---------------------------------------------------------
+// Init the show info
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::ImplicityShowInfoL(
+    TBool aGetScreenCoordinates )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    // get cursor position
+    TPoint baseLine = TPoint( 0, 0 );
+    TInt height = 0;
+    TInt ascent = 0;
+    if ( aGetScreenCoordinates )
+        {
+        iOwner->FepMan()->GetScreenCoordinatesL( baseLine, height, ascent );
+        uiContainer->SetContainerPosition( baseLine, height );
+        }
+    editPane->ActiveCursor();
+    }
+
+// ---------------------------------------------------------
+// Init the show info
+// ---------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::ShowEEPInfo()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    TInt cursorPosInKeystroke = 0;
+
+    TBuf<KMaxKeystrokeSize> buf;
+
+    for (TInt i = 0; i < phrase->Count(); ++i )
+        {
+        buf.Append( phrase->MdcaPoint( i ) );
+        }
+
+    for (TInt i = 0; i < keystroke->Count(); ++i )
+        {
+        buf.Append( keystroke->MdcaPoint( i ) );
+        }
+
+    for (TInt i = 0; i < index; ++i )
+        {
+        cursorPosInKeystroke = cursorPosInKeystroke + keystroke->MdcaPoint( i ).Length();
+        }
+
+    editPane->SetText( buf, phrase->Count() + cursorPosInKeystroke, ETrue );
+    if ( editPane->GetEffictiveLength() == 0 )
+        {
+        editPane->SetHighlight( phrase->Count(), buf.Length() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateSpellingMiniQwertyZhuyin::TAknFepInputStateSpellingMiniQwertyZhuyin
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+TAknFepInputStateSpellingMiniQwertyZhuyin::TAknFepInputStateSpellingMiniQwertyZhuyin(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer ) :
+    TAknFepInputMiniQwertyZhuyinPhraseBase( aOwner, aUIContainer)
+    {
+    iState = EZhuyinSpelling;
+
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    uiContainer->FocusCandidatePane( EFalse );
+    uiContainer->CandidatePane()->ShowCandidateOrdinals( EFalse );
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    uiContainer->ShowVerticalScrollArrows( ETrue );
+    uiContainer->ShowHorizontalScrollArrows( EFalse );
+    uiContainer->InputPane()->SetOverrideFontId( 0 );
+    uiContainer->SetLayout( MAknFepUICtrlContainerChinese::ELayoutPhraseCreation );
+    uiContainer->EditPaneWindow()->DeactiveCursor();
+    RefreshUI();
+    // however we also need to clear the deliberate selection, in case we are not
+    // coming back to the input pane from the candidate pane
+    ClearDeliberateSelection();
+    UpdateIndicator();
+
+    iOwner->PtiEngine()->SetInputMode( EPtiEngineZhuyinPhraseQwerty );
+    iOwner->PtiEngine()->SetCase( EPtiCaseLower );
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateSpellingMiniQwertyZhuyin::HandleKeyL
+// Handle system key press event.
+// ---------------------------------------------------------------------------
+// 
+TBool TAknFepInputStateSpellingMiniQwertyZhuyin::HandleKeyL( TInt aKey,
+    TKeyPressLength aLength )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TBool ret = ETrue;
+
+    if ( CAknFepFnKeyManager::EFnKeyNext == iOwner->FepMan()->FnKeyState() || CAknFepFnKeyManager::EFnKeyLock
+        == iOwner->FepMan()->FnKeyState() || CAknFepFnKeyManager::EFnKeyDown
+        == iOwner->FepMan()->FnKeyState() )
+        {
+        iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+        return ETrue;
+        }
+    else if ( iOwner->FepMan()->IsFlagSet( CAknFepManager::EFlagShiftKeyDepressed )
+        || iOwner->FepMan()->IsFlagSet( CAknFepManager::EFlagQwertyChrKeyDepressed ) )
+        {
+        return ETrue;
+        }
+
+    switch ( aKey )
+        {
+        case EPtiKeyQwertyE:
+        case EPtiKeyQwertyR:
+        case EPtiKeyQwertyY:
+        case EPtiKeyQwertyU:
+        case EStdKeyLeftFunc:
+            {
+            if ( aLength == EShortKeyPress )
+                {
+                iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                }
+            }
+            break;
+        case EKeyRightFunc:
+        case EKeyLeftShift:
+        case EKeyLeftCtrl:
+        case EKeyRightCtrl:
+        case EStdKeyEnter:
+            {
+            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+            }
+            break;
+        case EStdKeyBackspace:
+        case EStdKeyUpArrow:
+            {
+            TBool state = ETrue;
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( EMiniQwertyEdit );
+                }
+            }
+            break;
+        case EStdKeyDevice1:
+            {
+            iOwner->FepMan()->TryCloseUiL();
+            }
+            break;
+        case EStdKeyRightArrow:
+            {
+            if ( popup->IsEnabled() )
+                {
+                if ( popup->SelectNextPhrase() )
+                    {
+                    RefreshVaildKeyStroke();
+                    RefreshCandidatePane();
+                    RefreshSpellingPane();
+                    RefreshEditPane();
+                    UpdateIndicator();
+                    }
+                }
+            }
+            break;
+        case EStdKeyLeftArrow:
+            {
+            if ( popup->IsEnabled() )
+                {
+                if ( popup->SelectPrevPhrase() )
+                    {
+                    RefreshVaildKeyStroke();
+                    RefreshCandidatePane();
+                    RefreshSpellingPane();
+                    RefreshEditPane();
+                    UpdateIndicator();
+                    }
+                }
+            }
+            break;
+        case EStdKeyDownArrow:
+        case EStdKeyDevice3:
+        case EStdKeyDevice0:
+            {
+            TBool state = ETrue;
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                if ( popup->IsEnabled() )
+                    {
+                    popup->Enable( EFalse );
+                    }
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( EZhuyinCandidate );
+                }
+            }
+            break;
+        default:
+            {
+            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+            return TAknFepInputMiniQwertyZhuyinPhraseBase::HandleKeyL(
+                aKey, aLength );
+            }
+//            break;
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateSpellingMiniQwertyZhuyin::RefreshUI
+// Refresh UI if necessary
+// ---------------------------------------------------------
+//
+void TAknFepInputStateSpellingMiniQwertyZhuyin::RefreshUI()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    // get cursor position
+    TPoint baseLine = TPoint( 0, 0 );
+    TInt height = 0;
+    TInt ascent = 0;
+
+    TRAPD(ret,iOwner->FepMan()->GetScreenCoordinatesL(baseLine,height,ascent));
+    if ( ret == KErrNone )
+        {
+        uiContainer->SetContainerPosition( baseLine, height );
+        }
+    
+    GetValidKeystroke( );
+    TBool needClearDeliberateSelection = editPane->NeedClearDeliberateSelection();
+    if ( needClearDeliberateSelection )
+        {
+        editPane->SetNeedClearDeliberateSelection( EFalse );
+        }
+    else
+        {
+        RefreshVaildKeyStroke();
+        }
+    RefreshEditPane();
+    RefreshCandidatePane( needClearDeliberateSelection );
+    RefreshSpellingPane( needClearDeliberateSelection );
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputStateSpellingMiniQwertyZhuyin::RefreshUI
+// Refresh vaild key stroke length
+// ---------------------------------------------------------
+//
+void TAknFepInputStateSpellingMiniQwertyZhuyin::RefreshVaildKeyStroke()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+    TInt currentSel = popup->CurrentSelection();
+    if ( currentSel >= spelling->Count() )
+        {
+        currentSel = 0;
+        }
+    TPtrC ptr = spelling->MdcaPoint( currentSel );
+    TInt currentLength = ptr.Length();
+    editPane->SetEffictiveLength( currentLength );
+    }
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::TAknFepInputStateCanindateSelectingMiniQwertyZhuyin
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::TAknFepInputStateCanindateSelectingMiniQwertyZhuyin(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer ) :
+    TAknFepInputMiniQwertyZhuyinPhraseBase( aOwner, aUIContainer)
+    {
+    iState = EZhuyinCandidate;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+
+    TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && uiContainer->CandidatePane()->IsFirstPage());
+    TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length();
+    TBool showHorizontalScrollArrows = multiplePages || bufLength
+        > KMinCandidateCount;
+
+    uiContainer->ShowHorizontalScrollArrows( showHorizontalScrollArrows );
+    uiContainer->ShowVerticalScrollArrows( multiplePages );
+    uiContainer->FocusCandidatePane( ETrue );
+    uiContainer->CandidatePane()->ShowCandidateOrdinals( ETrue );
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    UpdateIndicator();
+    }
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::HandleKeyL
+// Handle system key press event.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::HandleKeyL(
+    TInt aKey, TKeyPressLength aLength )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt selected = uiContainer->CandidatePane()->SelectedIndex();
+    TInt numbertotal = uiContainer->CandidatePane()->VisibleCandidateCount();
+    TBool ret = ETrue;
+
+    if (iOwner->FepMan()->GetComposChrFlag() )
+        {
+        iOwner->FepMan()->SetComposChrFlag(EFalse);
+        return ETrue;
+        }
+    switch ( aKey )
+        {
+        case EStdKeySpace:
+        case EStdKeyEnter:
+            {
+            iOwner->FepMan()->PlaySound( EAvkonSIDDefaultSound );
+            }
+            break;
+        case EStdKeyLeftArrow:
+            {
+            if ( selected == 0 )
+                {
+                UIContainer()->CandidatePane()->SelectIndex( numbertotal-1 );
+                }
+            else
+                {
+                UIContainer()->CandidatePane()->SelectIndex( selected - 1 );
+                }
+            }
+            break;
+        case EStdKeyRightArrow:
+            {
+            if ( selected == numbertotal-1 )
+                {
+                UIContainer()->CandidatePane()->SelectIndex( 0 );
+                }
+            else
+                {
+                UIContainer()->CandidatePane()->SelectIndex( selected + 1 );
+                }
+            break;
+            }
+        case EStdKeyDevice1: // cancel key
+            {
+            iOwner->FepMan()->TryCloseUiL();
+            break;
+            }
+        case EStdKeyUpArrow:
+            {
+            if ( uiContainer->CandidatePane()->IsFirstPage() ) // same as the backspace
+                {
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( EZhuyinSpelling );
+                }
+            else // just move to the last page 
+                {
+                uiContainer->CandidatePane()->PreviousCandidatePage();
+                uiContainer->CandidatePane()->SetCandidateBuffer();
+                uiContainer->CandidatePane()->SelectFirstPhrase();
+                UpdateIndicator();
+                }
+            break;
+            }
+        case EStdKeyDownArrow:
+            {
+            ret = TAknFepInputStateCandidateQwertyBaseChinesePhrase::HandleKeyL( aKey, aLength );
+            }
+            break;
+        case EStdKeyBackspace: // 
+            {
+            TBool state = ETrue;
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( EZhuyinSpelling );
+                }
+            }
+            break;
+        case EStdKeyDevice0: //commit to editor
+        case EStdKeyDevice3:
+            {
+            TBool state = ETrue;
+            if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                editPane->SetNeedClearDeliberateSelection( ETrue );
+                CommitCandidateL();
+                }
+            }
+            break;
+        default:
+            if (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed))
+                {
+                iOwner->FepMan()->PlaySound(EAvkonSIDDefaultSound);
+                break;
+                }
+            if ( SelectCandidate( aKey ) ) // is 1-6 key 
+                {
+                editPane->SetNeedClearDeliberateSelection( ETrue );
+                CommitCandidateL();
+                }
+            else
+                {
+                return TAknFepInputMiniQwertyZhuyinPhraseBase::HandleKeyL(
+                    aKey, aLength );
+                }
+            break;
+        }
+    return ret;
+    }
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::CommitCandidate
+// commint the charater to the editor pane 
+// ---------------------------------------------------------------------------
+
+TInt TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::GetIndexOfToneMark( const TDesC& aText)
+    {
+    TInt indexOfToneMark = -1;
+    TInt num = sizeof(ZhuyinToneMap )/( sizeof(ZhuyinToneMap[0]));
+    TInt len = aText.Length();
+    for( TInt j = 0; j< len ;j++ )
+        {
+        indexOfToneMark = j;
+        TBuf<1> keyStorkeBuf = aText.Mid( j ,1 );
+        for (TInt i = 0; i<num; i++ )
+            {
+            if (  keyStorkeBuf[0] == ZhuyinToneMap[i].iValue  )
+                {
+                return indexOfToneMark;
+                }
+            }
+        }
+    return -1;
+    }
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::CommitCandidate
+// commint the charater to the editor pane 
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::CommitCandidateL()
+    {
+    CDesCArrayFlat* keyStrokeArray = UIContainer()->EditPaneWindow()->KeystrokeArray();
+    CDesCArrayFlat* phraseKeyStrokeArray = UIContainer()->EditPaneWindow()->PhraseShowKeyStrokeArray();
+    CDesCArrayFlat* phraseArray = UIContainer()->EditPaneWindow()->PhraseArray();
+    CDesCArrayFlat* phraseZhuYinSpellingArray = UIContainer()->EditPaneWindow()->PhraseZhuYinSpellingArray();
+    TPtrC candidate = UIContainer()->CandidatePane()->CurrentPhraseCandidate();
+    
+    RArray<TInt>* keyCodeArray = UIContainer()->EditPaneWindow()->KeycodeArray();
+    RArray<TInt>* keyCodePhraseArray = UIContainer()->EditPaneWindow()->PhraseKeycodeArray();
+    TBuf<KMaxKeystrokeCount> spellingText;
+    
+    UIContainer()->InputPane()->GetText( spellingText );
+    
+    //phraseZhuYinSpellingArray must keep same count with phraseArray
+    TInt delCount = phraseZhuYinSpellingArray->Count()-phraseArray->Count();//we can sure delCount>=0,impossible <0
+	if(delCount>0)
+		{
+		phraseZhuYinSpellingArray->Delete(phraseArray->Count(),delCount);//delete from tail 
+		}
+	phraseZhuYinSpellingArray->AppendL(spellingText); 
+    phraseArray->AppendL( candidate );
+    
+    TBuf<KMaxKeystrokeCount> keyStoke;
+    TInt replaceCount = 0;
+    TInt delimiterIndex = spellingText.Find( KDelimiter );
+    if ( KErrNotFound ==delimiterIndex )
+        {
+        delimiterIndex = -1;
+        }
+    TInt indexOfToneMark = GetIndexOfToneMark( spellingText );
+    if ( delimiterIndex != KErrNotFound && indexOfToneMark >= 0 )
+        {
+        replaceCount = Min( delimiterIndex, indexOfToneMark );
+        if ( delimiterIndex > indexOfToneMark )
+            {
+            replaceCount++;
+            }
+        }
+    else if ( delimiterIndex != KErrNotFound && indexOfToneMark == -1 )
+        {
+        replaceCount = delimiterIndex;
+        }
+    else if ( delimiterIndex == KErrNotFound && indexOfToneMark != -1 )
+        {
+        replaceCount = indexOfToneMark + 1;
+        }
+    else
+        {
+        replaceCount = spellingText.Length();
+        } 
+    for (TInt i = 0; i < replaceCount; i++ )
+        {
+        TPtrC ptr = keyStrokeArray->MdcaPoint( 0 );
+        keyStoke.Append( ptr );
+        keyStrokeArray->Delete( 0 );
+        // added for the keycode
+        TInt keyCodeValue = ( *keyCodeArray )[0];
+        keyCodePhraseArray->AppendL( keyCodeValue );
+        keyCodeArray->Remove( 0 );
+        }
+    phraseKeyStrokeArray->AppendL( keyStoke );
+
+    if ( GetValidKeystroke() )
+        {
+        iOwner->ChangeState( EZhuyinSpelling );
+        }
+    else
+        {
+        iOwner->ChangeState( EMiniQwertyEdit );
+        }
+    UIContainer()->EditPaneWindow()->SetChangeState(ETrue);
+    RefreshSpellingPane();
+    RefreshCandidatePane();
+    ChangeCbaL();
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::CommitCandidate
+// to check the select number is valid or not 
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::SelectCandidate(
+    TInt aKey )
+    {
+    TInt index = 0;
+    MPtiLanguage *lang= NULL;
+    RArray <TPtiNumericKeyBinding> keybinding;
+    TBool validnumkey = EFalse;
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    TPtiKeyboardType keyboardtype = iOwner->FepMan()->KeyboardLayout();
+    
+    if( ptiengine != NULL )
+        {
+        lang = ptiengine->CurrentLanguage();
+        }
+    if ( ptiengine && lang  )
+        {
+        TRAP_IGNORE(ptiengine->GetNumericModeKeysForQwertyL(lang->LanguageCode(), keybinding, keyboardtype));
+        TInt numericKeysCount = keybinding.Count();
+        while (numericKeysCount-- )
+            {
+            TPtiNumericKeyBinding numKeyBind = keybinding[numericKeysCount];
+            if ( (numKeyBind.iChar >= 0x31 && numKeyBind.iChar <= 0x36)
+                &&(aKey == numKeyBind.iKey) )
+                {
+                index = numKeyBind.iChar - EPtiKey0 -1;
+                if ( UIContainer()->CandidatePane()->SelectIndex( index, EFalse ) )
+                    {
+                    validnumkey = ETrue;
+                    }
+                break;
+                }
+            }
+        }
+    keybinding.Reset();
+    return validnumkey;
+    }
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateEditingMiniQwertyZhuyinPhrase::HandleCommandL(
+    TInt aCommandId )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane =
+        UIContainer()->CandidatePane();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    TBool state = ETrue;
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
+            if ( editPane->IsChangeState() )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                HandleCommitL();
+                }
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateSpellingMiniQwertyZhuyin::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateSpellingMiniQwertyZhuyin::HandleCommandL(
+    TInt aCommandId )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane =
+        UIContainer()->CandidatePane();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    TBool state = ETrue;
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
+            if ( editPane->IsChangeState() )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                if ( popup->IsEnabled() )
+                    {
+                    popup->Enable( EFalse );
+                    }
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( EZhuyinCandidate );
+                }
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateCanindateSelectingMiniQwertyZhuyin::HandleCommandL(
+    TInt aCommandId )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane =
+        UIContainer()->CandidatePane();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    TBool state = ETrue;
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
+            if ( editPane->IsChangeState() )
+                {
+                state = EFalse;
+                }
+            else
+                {
+                editPane->SetChangeState( EFalse );
+                }
+            if ( state )
+                {
+                editPane->SetNeedClearDeliberateSelection( ETrue );
+                CommitCandidateL();
+                }
+
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+//End of File