fep/aknfep/src/AknFepUiInputStateEntryStrokePhrase.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepUiInputStateEntryStrokePhrase.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,815 @@
+/*
+* Copyright (c) 2002-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:            Implementation of Stroke phrase entry state
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+// System includes
+#include <PtiEngine.h>
+#include <aknnotewrappers.h> //CAknWarningNote 
+
+// User includes
+#include "AknFepUiInputStateEntryStrokePhrase.h"
+#include "AknFepUIManagerStateInterface.h"
+#include "AknFepUICtrlCandidatePane.h"
+#include "AknFepUICtrlPinyinPopup.h"
+#include "AknFepUICtrlInputPane.h"
+#include "aknfepuictrleditpane.h" 
+#include "AknFepManager.h"
+
+// const param
+const TInt KMinCnadidateCount = 1;
+const TInt KMaxKeystrokeCount = 31;
+const TInt KMaxPhraseCreationCount = 7;
+const TInt KManualChangeState = 0; 
+const TInt KChangeStatebyBackSpce = 0x1000;//set popup flag for change state.
+//const TUint16 KSegment = 0x0020;
+_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" );
+_LIT( KDelimiter, "\x2022");
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhrase::
+// TAknFepInputStateEntryStrokePhrase
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TAknFepInputStateEntryStrokePhrase::TAknFepInputStateEntryStrokePhrase(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer) :
+    TAknFepInputStateStrokePhraseBase( aOwner, aUIContainer)
+    {  
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    
+    iState = EEntry;
+    uiContainer->SetLayout( MAknFepUICtrlContainerChinese::ELayoutKeystroke );
+    TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() &&
+                            uiContainer->CandidatePane()->IsFirstPage());
+    TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length();
+    TBool showHorizontalScrollArrows = multiplePages || bufLength>1;
+
+    uiContainer->ShowHorizontalScrollArrows(showHorizontalScrollArrows); 
+    uiContainer->ShowVerticalScrollArrows(multiplePages);
+    uiContainer->FocusCandidatePane(ETrue);
+    candidatePane->SetHighlighted(ETrue);
+    candidatePane->ShowCandidateOrdinals(EFalse);
+    candidatePane->SelectFirstPhrase();
+    uiContainer->InputPane()->SetOverrideFontId( 0 );
+    iOwner->FepMan()->EntryPhrase( ETrue );
+
+    RefreshUI( ETrue );
+ 	}
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhrase::HandleKeyL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateEntryStrokePhrase::HandleKeyL( 
+                                                    TInt aKey,
+                                                    TKeyPressLength aLength )
+    {
+    TBool ret = ETrue;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    switch ( aKey )
+        {
+        case EPtiKeyStar:
+            {
+            break;
+            }
+        case EKeyUpArrow:
+            {
+            if ( !candidatePane->IsFirstPage() )
+                {
+                candidatePane->PreviousCandidatePage();  
+                RefreshCandidate();
+                }
+            else
+                {
+                popup->SetState( EFalse );
+                popup->SetState( KManualChangeState );
+                popup->SetChangeState( ETrue );
+                //change state to sequence edit
+                iOwner->ChangeState( EStrokeSequenceEdit );
+                }
+            break;
+            }
+        case EKeyDownArrow:
+            {
+            if ( CheckKeyNeedRepeat( aLength ) )
+                {
+                if ( candidatePane->IsLastPage( ) )
+                    {
+                    return ETrue;
+                    }
+                if ( candidatePane->NeedGetNewCandidatePage( ) )
+                    {
+                    if ( !iOwner->PtiEngine()->NextCandidatePage( ) )
+                        {
+                        if ( candidatePane->IsLastPage( ) )
+                            {
+                            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                            return ETrue;
+                            }
+                        }
+                    else
+                        {
+                        CDesCArrayFlat* phraseCandidates =
+                            candidatePane->CandidateArray( );
+                        RPointerArray<HBufC> list;
+                        GetNewCandidatesL( iOwner->PtiEngine()->CandidatePage( ), list );
+                        for (TInt i = 0; i < list.Count( ); ++i )
+                            {
+                            phraseCandidates->AppendL( *(list[i]) );
+                            }
+                        list.ResetAndDestroy();
+                        }
+                    }
+                candidatePane->NextCandidatePage();
+                candidatePane->SetCandidateBuffer();
+                candidatePane->SelectFirstPhrase();
+                RefreshCandidate();
+                }
+            else
+                {
+                iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+                }
+            break;
+            }
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+            {
+            popup->SetChangeState( ETrue );
+            iOwner->ChangeState( ECandidate );
+            ret = EFalse;
+            break;
+            }
+        case EKeyCBA1:
+        case EKeyOK:
+            {
+            if ( CheckKeyNeedRepeat( aLength ) )
+                {
+                popup->SetChangeState( ETrue );
+                iOwner->ChangeState( ECandidate );
+                ret = EFalse;
+                }
+            else
+                {
+                iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+                }
+            break;
+            }
+        default:
+            return TAknFepInputStateStrokePhraseBase::HandleKeyL( aKey, aLength );
+        }
+    
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhrase::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateEntryStrokePhrase::HandleCommandL( TInt aCommandId )
+    {
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            HandleCommitL();
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhrase::HandleCommit 
+// Handle CBA1,ok and select candidate phrase key press.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateEntryStrokePhrase::HandleCommitL()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = popup->KeystrokeArrayForStroke();
+    CDesCArrayFlat* phrase = popup->ChooseChineseCharacterArrayForStroke();
+    TPtrC text = candidatePane->CurrentPhraseCandidate();
+    if( text.Length() ) 
+        {
+        if ( CommitInlineEEPL( text ) )
+            {
+            if ( phrase->Count() >= KMaxPhraseCreationCount )
+                {
+                if ( keystrokeArray->Count() != 0 )
+                    {
+                    CAknWarningNote* errnote = new( ELeave ) CAknWarningNote();
+                    errnote->SetTone( CAknNoteDialog::EWarningTone );
+                    errnote->ExecuteLD( KMaxPhraseNote );
+                    }
+                else
+                    {
+                    iOwner->FepMan()->PhraseCreation( EFalse );
+                    iOwner->FepMan()->EntryPhrase( EFalse );
+                    iOwner->FepMan()->PinyinPhraseCreation( EFalse );
+                    iOwner->FepMan()->EnableKeyStar( ETrue );
+                    iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
+                    }
+                }
+            else
+                {
+                if ( !iOwner->FepMan()->IsPhraseCreation() )
+                    {
+                    if (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagEditorFull))
+                        {
+                        iOwner->FepMan()->ClearFlag(CAknFepManager::EFlagEditorFull);
+                        iOwner->FepMan()->TryCloseUiL();
+                        }
+                    else
+                        {
+                        iOwner->ChangeState( EPredictiveCandidate );
+                        }
+                    }
+                else
+                    {
+                    iOwner->FepMan()->PhraseCreation( EFalse );
+                    iOwner->FepMan()->EntryPhrase( EFalse );
+                    iOwner->FepMan()->PinyinPhraseCreation( EFalse );
+                    iOwner->FepMan()->EnableKeyStar( ETrue );
+                    iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
+                    }
+                }
+            popup->ResetStrokeArray();
+            }
+        else
+            {
+            editPane->SetCursorIndexOfKeystroke( 0 );
+            if ( CheckFirstGroupStroke() )
+                {
+                popup->SetState( ETrue );
+                iOwner->ChangeState( EEntry );
+                }
+            else
+                {
+                popup->SetState( ETrue );
+                //change state to sequence edit
+                iOwner->ChangeState( EStrokeSequenceEdit );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhrase::CommitInlineEEPL 
+// Commit phrase to the EEP ctrl.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateEntryStrokePhrase::CommitInlineEEPL( 
+                                                        const TDesC& aText )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    CDesCArrayFlat* keystrokeArray = popup->KeystrokeArrayForStroke();
+    CDesCArrayFlat* phrase = popup->ChooseChineseCharacterArrayForStroke();
+    CDesCArrayFlat* phraseKeystroke = 
+        popup->ChooseChineseCharacterArrayKeystrokeForStroke();
+    
+    TBuf<KMaxPhraseCreationCount> phraseCreated;
+    
+    TInt textCount = aText.Length();
+    TInt allTextCount = 0;
+    TInt i = 0;
+    TInt j = 0;
+    // append character to chinese array
+    for ( i = 0; i < textCount; i++ )
+        {
+        phrase->AppendL( aText.Mid( i, 1 ) );
+        }
+    
+    TInt characterCount = phrase->Count();
+    
+    // if chinese character is more than 7 or not
+    // if more than 7 show a warning not
+    if ( characterCount >= KMaxPhraseCreationCount )
+        {
+        for ( i = 0; i < KMaxPhraseCreationCount; ++i )
+            {
+            phraseCreated.Append( phrase->MdcaPoint(i) );
+            }
+        AddPhraseToDB( phraseCreated );
+        iOwner->FepMan()->NewTextL( phraseCreated );
+        iOwner->FepMan()->CommitInlineEditL();
+        }
+    
+    // calculate the total number of character according to stroke
+    for ( i = 0; i < keystrokeArray->Count(); i++ )
+        {
+        if ( keystrokeArray->MdcaPoint( i ) == KDelimiter )
+            {
+            allTextCount = allTextCount + 1;
+            }
+        }
+    
+    allTextCount = allTextCount + 1;
+    if ( keystrokeArray->MdcaPoint( keystrokeArray->Count() - 1 ) ==  
+        KDelimiter )
+        {
+        allTextCount--;
+        }
+    
+    // if total number is less than the character's count which user has selected
+    // commit the character to editor and user db   
+    if ( allTextCount <= textCount && characterCount < KMaxPhraseCreationCount )
+        {
+        for ( i = 0; i < characterCount; ++i )
+            {
+            phraseCreated.Append( phrase->MdcaPoint(i) );
+            } 
+        iOwner->FepMan()->NewTextL( phraseCreated );
+        iOwner->FepMan()->CommitInlineEditL();
+        AddPhraseToDB( phraseCreated );
+        return ETrue;
+        }
+    
+    // add the stroke to chosen character array
+    // delete key stroke which charactor is corresponding
+    for ( j = 0; j < textCount; j++ )
+        {
+        TInt keyCount = 0;
+        TInt ret = keystrokeArray->Find( KDelimiter , 
+                                         keyCount, 
+                                         ECmpFolded );
+        
+        if ( ret != 0)
+            {
+            keyCount = keystrokeArray->Count();
+            j = textCount;
+            }
+        else
+            {
+            keyCount++;
+            }
+
+        TBuf<KMaxKeystrokeCount> keystroke;
+        for ( i = 0; i < keyCount; i++ )
+            {
+            keystroke.Append( keystrokeArray->MdcaPoint( 0 ) );
+            keystrokeArray->Delete( 0 );
+            }
+        phraseKeystroke->AppendL( keystroke );
+        }    
+    if ( keystrokeArray->Count() > 0 )
+        {
+        iOwner->FepMan()->PhraseCreation( ETrue );
+        }
+    if ( characterCount >= KMaxPhraseCreationCount )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// End of file
+
+// ---------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------
+//
+TAknFepInputStateEditStrokePhrase::TAknFepInputStateEditStrokePhrase(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer ) :
+    TAknFepInputStateStrokePhraseBase( aOwner, aUIContainer)
+    {
+    iState = EStrokeSequenceEdit;
+
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    uiContainer->FocusCandidatePane( EFalse );
+    uiContainer->CandidatePane()->ShowCandidateOrdinals( EFalse );
+    uiContainer->SetLayout( MAknFepUICtrlContainerChinese::ELayoutKeystroke );
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    uiContainer->ShowVerticalScrollArrows( ETrue );
+    uiContainer->ShowHorizontalScrollArrows( EFalse );
+    uiContainer->InputPane()->SetOverrideFontId( 0 );
+
+    RefreshUI();
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEditStrokePhrase::HandleKeyL
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateEditStrokePhrase::HandleKeyL( 
+                                                    TInt aKey,
+                                                    TKeyPressLength aLength )
+    {
+    return TAknFepInputStateStrokePhraseBase::HandleKeyL( 
+                                                   aKey, 
+                                                   aLength );
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateEntryStrokePhraseCreation::
+// TAknFepInputStateEntryStrokePhraseCreation
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TAknFepInputStateCandidateStrokePhrase::TAknFepInputStateCandidateStrokePhrase(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer)
+    :TAknFepInputStateStrokePhraseBase(aOwner, aUIContainer)
+    {
+    iState = ECandidate;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    
+    TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() &&
+                            uiContainer->CandidatePane()->IsFirstPage());
+    TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length();
+    TBool showHorizontalScrollArrows = multiplePages || bufLength > KMinCnadidateCount;
+
+    uiContainer->ShowHorizontalScrollArrows(showHorizontalScrollArrows); 
+    uiContainer->ShowVerticalScrollArrows(multiplePages);
+    uiContainer->FocusCandidatePane(ETrue);
+    uiContainer->CandidatePane()->ShowCandidateOrdinals(ETrue);
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    uiContainer->EditPaneWindow()->DisableCursor();
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCandidateStrokePhrase::HandleKeyL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateCandidateStrokePhrase::HandleKeyL( 
+                                        TInt aKey, 
+                                        TKeyPressLength /*aLength*/ )
+    {
+    TBool ret = ETrue;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    // it may be one of the 'valid' numbers..
+    TInt index = MapKeyToIndex(aKey);
+
+    switch( aKey )
+        {
+        case EKeyBackspace:
+            {
+            editPane->EnableCursor();
+            popup->SetChangeState( ETrue );
+            iOwner->ChangeState( EEntry );
+            popup->SetFlag( KChangeStatebyBackSpce );
+            break;
+            }
+        case EKeyDownArrow:
+            {
+            if ( candidatePane->IsLastPage() )
+                {
+                return ETrue;
+                }
+            if ( candidatePane->NeedGetNewCandidatePage( ) )
+                {
+                if ( !iOwner->PtiEngine()->NextCandidatePage( ) )
+                    {
+                    if ( candidatePane->IsLastPage() )
+                        {
+                        iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                        return ETrue;
+                        }
+                    }
+                else
+                    {
+                    CDesCArrayFlat* phraseCandidates =
+                        candidatePane->CandidateArray( );
+                    RPointerArray<HBufC> list;
+                    GetNewCandidatesL( iOwner->PtiEngine()->CandidatePage( ), list );
+                    for (TInt i = 0; i < list.Count( ); ++i )
+                        {
+                        phraseCandidates->AppendL( *(list[i]) );
+                        }
+                    list.ResetAndDestroy();
+                    }
+                }
+            candidatePane->NextCandidatePage( );
+            RefreshCandidate( );
+            break;
+            }
+        case EKeyUpArrow:
+            {
+            if( !candidatePane->IsFirstPage() )
+                {
+                candidatePane->PreviousCandidatePage();
+                RefreshCandidate();
+                }
+            else
+                {
+                popup->SetChangeState( ETrue );
+                popup->SetState( EFalse );
+                iOwner->ChangeState( EStrokeSequenceEdit );
+                }
+            break;
+            }
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+            {
+            HandleHorizontalNavigation( aKey );
+            break;
+            }
+        case EPtiKeyStar:
+            {
+            break;
+            }
+        case EKeyCBA2:
+            {
+            popup->ResetStrokeArray();
+            iOwner->FepMan()->EntryPhrase( EFalse );
+            iOwner->FepMan()->PhraseCreation( EFalse );
+            iOwner->FepMan()->TryCloseUiL();
+            break;
+            }
+        default:
+            {
+            if ( ( aKey == EKeyOK ) || aKey == EKeyCBA1 ||
+                        candidatePane->SelectIndex( index,EFalse ) )
+                {
+                HandleCommitL();
+                }
+            else
+                {
+                iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                }
+            break;
+            }
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCandidateStrokePhrase::HandleHorizontalNavigation 
+// Handle Horizontal Navigation.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateCandidateStrokePhrase::HandleHorizontalNavigation(
+                                                                   TInt aKey )
+    {
+    MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
+    // Do navigation...
+    if (aKey == EKeyLeftArrow)
+        {        
+        if(!candidatePane->SelectPrev())
+            {
+            candidatePane->SetCandidateBuffer();
+            candidatePane->SelectLastPhrase();
+            }
+        }
+    else if (aKey == EKeyRightArrow)
+        {              
+        if(!candidatePane->SelectNext())
+            {
+            candidatePane->SetCandidateBuffer();
+            candidatePane->SelectFirstPhrase();
+            }        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCandidateStrokePhrase::HandleCommit 
+// Handle CBA1,ok and select candidate phrase key press.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateCandidateStrokePhrase::HandleCommitL()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = popup->KeystrokeArrayForStroke();
+    CDesCArrayFlat* phrase = popup->ChooseChineseCharacterArrayForStroke();
+    TPtrC text = candidatePane->CurrentPhraseCandidate();
+    if( text.Length() ) 
+        {
+        if ( CommitInlineEEPL( text ) )
+            {
+            if ( phrase->Count() <= KMaxPhraseCreationCount && !iOwner->FepMan()->IsPhraseCreation() )
+                {
+                if ( !iOwner->FepMan()->IsPhraseCreation( ) )
+                    {
+                    if ( iOwner->FepMan()->IsFlagSet( CAknFepManager::EFlagEditorFull ) )
+                        {
+                        iOwner->FepMan()->ClearFlag( CAknFepManager::EFlagEditorFull );
+                        iOwner->FepMan()->TryCloseUiL( );
+                        }
+                    else
+                        {
+                        iOwner->ChangeState( EPredictiveCandidate );
+                        }
+                    }
+                else
+                    {
+                    iOwner->FepMan()->PhraseCreation( EFalse );
+                    iOwner->FepMan()->EntryPhrase( EFalse );
+                    iOwner->FepMan()->PinyinPhraseCreation( EFalse );
+                    iOwner->FepMan()->EnableKeyStar( ETrue );
+                    iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
+                    }
+                }
+            else
+                {
+                if ( keystrokeArray->Count() != 0 && phrase->Count() >= KMaxPhraseCreationCount )
+                    {
+                    CAknWarningNote* errnote = new( ELeave ) CAknWarningNote();
+                    errnote->SetTone( CAknNoteDialog::EWarningTone );
+                    errnote->ExecuteLD( KMaxPhraseNote );
+                    }
+                else
+                    {
+                    iOwner->FepMan()->PhraseCreation( EFalse );
+                    iOwner->FepMan()->EntryPhrase( EFalse );
+                    iOwner->FepMan()->PinyinPhraseCreation( EFalse );
+                    iOwner->FepMan()->EnableKeyStar( ETrue );
+                    iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
+                    }
+                }
+            popup->ResetStrokeArray();
+            }
+        else
+            {
+            editPane->SetCursorIndexOfKeystroke( 0 );
+            if ( CheckFirstGroupStroke() )
+                {
+                popup->SetState( ETrue );
+                iOwner->ChangeState( EEntry );
+                }
+            else
+                {
+                popup->SetState( ETrue );
+                //change state to sequence edit
+                iOwner->ChangeState( EStrokeSequenceEdit );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCandidateStrokePhrase::CommitInlineEEPL 
+// Commit phrase to the EEP ctrl.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputStateCandidateStrokePhrase::CommitInlineEEPL( 
+                                                        const TDesC& aText )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    CDesCArrayFlat* keystrokeArray = popup->KeystrokeArrayForStroke();
+    CDesCArrayFlat* phrase = popup->ChooseChineseCharacterArrayForStroke();
+    CDesCArrayFlat* phraseKeystroke = 
+        popup->ChooseChineseCharacterArrayKeystrokeForStroke();
+    
+    TBuf<KMaxPhraseCreationCount> phraseCreated;
+    
+    TInt textCount = aText.Length();
+    TInt allTextCount = 0;
+    TInt i = 0;
+    TInt j = 0;
+    // append character to chinese array
+    for ( i = 0; i < textCount; i++ )
+        {
+        phrase->AppendL( aText.Mid( i, 1 ) );
+        }
+    
+    TInt characterCount = phrase->Count();
+    
+    // if chinese character is more than 7 or not
+    // if more than 7 show a warning not
+    if ( characterCount >= KMaxPhraseCreationCount )
+        {
+        for ( i = 0; i < KMaxPhraseCreationCount; ++i )
+            {
+            phraseCreated.Append( phrase->MdcaPoint(i) );
+            }
+        AddPhraseToDB( phraseCreated );
+        iOwner->FepMan()->NewTextL( phraseCreated );
+        iOwner->FepMan()->CommitInlineEditL();
+        }
+    
+    // calculate the total number of character according to stroke
+    for ( i = 0; i < keystrokeArray->Count(); i++ )
+        {
+        if ( keystrokeArray->MdcaPoint( i ) == KDelimiter )
+            {
+            allTextCount = allTextCount + 1;
+            }
+        }
+    
+    allTextCount = allTextCount + 1;
+    if ( keystrokeArray->MdcaPoint( keystrokeArray->Count() - 1 ) ==  
+        KDelimiter )
+        {
+        allTextCount--;
+        }
+    
+    // if total number is less than the character's count which user has selected
+    // commit the character to editor and user db   
+    if ( allTextCount <= textCount && characterCount < KMaxPhraseCreationCount )
+        {
+        for ( i = 0; i < characterCount; ++i )
+            {
+            phraseCreated.Append( phrase->MdcaPoint(i) );
+            } 
+        iOwner->FepMan()->NewTextL( phraseCreated );
+        iOwner->FepMan()->CommitInlineEditL();
+        AddPhraseToDB( phraseCreated );
+        return ETrue;
+        }
+    
+    // add the stroke to chosen character array
+    // delete key stroke which charactor is corresponding
+    for ( j = 0; j < textCount; j++ )
+        {
+        TInt keyCount = 0;
+        TInt ret = keystrokeArray->Find( KDelimiter , 
+                                         keyCount, 
+                                         ECmpFolded );
+        
+        if ( ret != 0)
+            {
+            keyCount = keystrokeArray->Count();
+            j = textCount;
+            }
+        else
+            {
+            keyCount++;
+            }
+
+        TBuf<KMaxKeystrokeCount> keystroke;
+        for ( i = 0; i < keyCount; i++ )
+            {
+            keystroke.Append( keystrokeArray->MdcaPoint( 0 ) );
+            keystrokeArray->Delete( 0 );
+            }
+        phraseKeystroke->AppendL( keystroke );
+        }    
+    if ( keystrokeArray->Count() > 0 )
+        {
+        iOwner->FepMan()->PhraseCreation( ETrue );
+        }    
+    
+    if ( characterCount >= KMaxPhraseCreationCount )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateCandidateStrokePhrase::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputStateCandidateStrokePhrase::HandleCommandL( TInt aCommandId )
+    {
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            //    case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
+            HandleCommitL();
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+
+// End of file