fep/aknfep/src/aknfepuiinputminiqwertystrokephrasebase.cpp
branchRCL_3
changeset 44 ecbabf52600f
child 50 5a1685599b76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/aknfepuiinputminiqwertystrokephrasebase.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,1469 @@
+/*
+* Copyright (c) 2008 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 TAknFepInputStateStrokePhraseCreationBase definition.
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+// System includes
+#include <e32cmn.h>
+#include <PtiEngine.h>
+#include <PtiDefs.h>
+#include <avkon.rsg>
+#include <aknfep.rsg>
+#include <PtiUserDicEntry.h>
+#include <aknnotewrappers.h> //CAknWarningNote 
+
+// User includes
+#include "AknFepUIManagerStateInterface.h"
+#include "AknFepUICtrlInputPane.h"
+#include "aknfepuictrleditpane.h"           //Stroke phrase creation
+#include "AknFepUICtrlCandidatePane.h"
+#include "AknFepManager.h"
+#include "aknfepuiinputminiqwertystrokephrasebase.h"
+
+// CONSTANTS
+
+const TInt KMaxPhraseCount = 50;
+const TInt KMaxPhraseCreationCount = 7;
+const TInt KMaxKeystrokeCount = 31;
+const TInt16 KStrokeDelimiter = 0x2022;
+const TInt16  KStrokeUnicode = 0x2461;
+const TInt16 KKey1 = 0x31;
+const TInt16 KKey6 = 0x36;
+
+_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" );
+
+// ---------------------------------------------------------------------------
+// TAknFepInputStateStrokePhraseCreationBase::TAknFepInputStateStrokePhraseCreationBase
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+TAknFepInputMiniQwertyStrokePhraseBase::TAknFepInputMiniQwertyStrokePhraseBase(
+    MAknFepUIManagerStateInterface* aOwner,
+    MAknFepUICtrlContainerChinese* aUIContainer)
+    :TAknFepInputStateCandidateQwertyBaseChinesePhrase(aOwner, aUIContainer)
+    {
+    iOwner->PtiEngine()->SetInputMode(EPtiEngineStrokePhraseQwerty);
+    iOwner->PtiEngine()->SetCase(EPtiCaseLower);
+    iOwner->PtiEngine()->SetCandidatePageLength( KMaxPhraseCount );
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    TBool multiplePages = !(candidatePane->IsLastPage() &&
+                            candidatePane->IsFirstPage());
+    uiContainer->ShowVerticalScrollArrows(multiplePages);
+    }
+    
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyL
+// Handle system key press event.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyL( 
+                                        TInt aKey, 
+                                        TKeyPressLength aLength )
+    {
+    TBool ret = ETrue;
+    const TPtiKeyboardType keyboardType = iOwner->PtiEngine()->KeyboardType();
+    
+    switch( aKey )
+        {
+        case EKeyLeftShift:
+        case EKeyLeftCtrl:
+        case EKeyRightCtrl:
+        case EStdKeyLeftFunc:    
+            {
+            iOwner->FepMan()->TryCloseUiL();
+            ret = EFalse;
+            break;
+            }
+        case EStdKeyDevice1:// CBA2
+            {
+            iOwner->FepMan()->TryCloseUiL();
+            break;
+            }
+        case EStdKeyUpArrow:
+        case EStdKeyDownArrow:    
+        case EKeyRightFunc:
+        case EStdKeyEnter:     
+            {
+            iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+            break;
+            }
+        case EStdKeyBackspace:
+            {
+            HandleKeyBackspaceL( aLength );
+            break;
+            }
+        case EStdKeyDevice0:// CBA1
+        case EStdKeyDevice3:// CBASelect
+            {
+            HandleCommitL( aLength );
+            break;
+            }
+        case EStdKeyLeftArrow:
+            {
+            if ( !MoveCursorLeft() )
+                {
+                iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                }
+            break;
+            }    
+        case EStdKeyRightArrow:
+            {            
+            if ( !MoveCursorRight() )
+                {
+                iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+                }            
+            break;
+            }
+        default:
+            {
+            ret = HandleDefaultL( aKey, aLength );
+            break;
+            }
+        }
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::RefreshUI
+// Update input window.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::RefreshUI()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    // get cursor position
+    if ( ( uiContainer->EditPaneWindow()->KeystrokeArray()->Count() == 0 ) && 
+        ( uiContainer->EditPaneWindow()->PhraseArray()->Count() == 0 ) )
+        {
+        TPoint baseLine;
+        TInt height(0);
+        TInt ascent(0);
+        TRAPD(ret,iOwner->FepMan()->GetScreenCoordinatesL(baseLine,height,ascent));
+        if (ret == KErrNone)
+            {
+            uiContainer->SetContainerPosition(baseLine, height);    
+            }
+        }
+    if ( ( uiContainer->EditPaneWindow()->KeystrokeArray()->Count() > 0 ) ||
+        ( uiContainer->EditPaneWindow()->PhraseArray()->Count() > 0 ) )
+        {
+        ShowInfoOnEEPPane();
+        SetWarningColor();
+        ShowInfoOnCandidatePane();
+        UpdateIndicator();
+        TRAP_IGNORE( ChangeCbaL() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::CheckFirstGroupStroke
+// check the first group stroke of keystroke.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::CheckFirstGroupStroke()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt stringBeforeLength = 0;
+    TInt stringAfterLength = 0;
+    TInt keyCode = 0;
+    TInt pos = 0;
+    TBuf<1> delimiter;
+    
+    if ( 0 == keystroke->Count() )
+        {
+        return EFalse;
+        }
+    
+    delimiter.Append( KStrokeDelimiter );
+    
+    //the keystroke is not delimiter the all keystroke is first group keystroke.
+    if ( 0 != keystroke->Find( delimiter, pos ) )
+        {
+        pos = keystroke->Count();
+        }
+    //first keystroke is delimiter then first group keystroke is invalid.
+    if ( 0 == pos )
+        {
+        return EFalse;
+        }
+    
+    ClearPtiEngineKeystroke();
+    
+    for ( TInt i = 0; i < pos; ++i )
+        {
+        //GetKeystrokeCode( keyCode, keystroke->MdcaPoint( i ) );
+        keyCode = (*keycodeArray)[i];
+        stringBeforeLength = 
+            ptiengine->GetPhoneticSpelling(1).Length();
+        stringAfterLength = 
+            ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
+        //the keystroke is invalid.
+        if ( stringBeforeLength == stringAfterLength )
+            {
+            return EFalse;
+            }
+        } 
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleCommitL
+// Handle CBA1 or select event.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::HandleCommitL( 
+                                                     TKeyPressLength aLength )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt keyCount = editPane->KeystrokeArray()->Count();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    TInt cdtCount = uiContainer->CandidatePane()->CandidateArray()->Count(); 
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    
+    if ( !CheckKeyNeedRepeat( aLength ) )
+        {
+        iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+        return;
+        }
+    
+    if ( EMiniQwertyEdit == iState )
+        {
+        if ( cdtCount > 0 )
+            {
+            UIContainer()->EditPaneWindow()->SetChangeState( ETrue );
+            iOwner->ChangeState( ECandidate );            
+            return;
+            }
+        
+        if ( keyCount > 0 )
+            {
+            fepMan->PlaySound( EAvkonSIDErrorTone );
+            return;
+            }
+        }
+    
+    if ( phrase->Count( ) <= 1 )
+        {
+        fepMan->PlaySound( EAvkonSIDErrorTone );
+        return;
+        }
+
+    TBuf<KMaxPhraseCreationCount> phraseCreated;
+    for (TInt i = 0; i < phrase->Count( ); ++i )
+        {
+        phraseCreated.Append( phrase->MdcaPoint( i ) );
+        }
+    fepMan->NewTextL( phraseCreated );
+    fepMan->CommitInlineEditL( );
+    AddPhraseToDB( phraseCreated );
+    fepMan->TryCloseUiL( );
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleAutoChangeState
+// Auto change state.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::HandleAutoChangeState()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    TBool FirstStrokeValid = CheckFirstGroupStroke();
+    //Auto change from EMiniQwertyEdit state to EEntry state. 
+    if ( EMiniQwertyEdit == iState )
+        {
+        if ( FirstStrokeValid )
+            {
+            if ( EAutoChangeStateFromInput == editPane->GetAutoChangeStateFlag() )
+                {
+                editPane->SetChangeState( EFalse );
+                iOwner->ChangeState( EEntry );
+                return ETrue;
+                }
+            else if ( EAutoChangeStateFromCandidate == editPane->GetAutoChangeStateFlag() )
+                {
+                editPane->SetChangeState( ETrue );
+                iOwner->ChangeState( ECandidate );
+                return ETrue;
+                }
+            }
+        }
+    
+    //Auto change from EEntry state to EMiniQwertyEdit state.
+    if ( EEntry == iState )
+        {
+        if ( ( 0 <= index ) && ( !FirstStrokeValid ) )
+            {
+            editPane->SetChangeState( EFalse );
+            editPane->SetAutoChangeStateFlag( EAutoChangeStateFromInput );
+            iOwner->ChangeState( EMiniQwertyEdit );
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyBackspaceL
+// Handle KeyBackspace event.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyBackspaceL(
+                                                    TKeyPressLength aLength )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+
+    if ( !CheckKeyNeedRepeat( aLength ) )
+        {
+        iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+        return;
+        }
+    
+    if ( ( 0 == index ) && ( phraseCount != 0 ) )
+        {
+        RevertPhraseToKeystrokeL();
+        }
+    else if ( ( 0 == index ) && ( keystroke->Count() > 0 ) )
+        {
+        iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+        return;
+        }
+    else
+        {
+        if ( !DeleteKeystroke() )
+            {
+            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+            return;
+            }
+        }
+    
+    //if the keystroke is null and phrase is null then close input window.
+    if ( ( 0 == phraseCount ) && ( keystroke->Count() == 0 ) )
+        {
+        iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
+        if ( aLength == ELongKeyPress )
+            {
+            iOwner->FepMan()->SetLongClearAfterCloseUI( ETrue );
+            }
+        return;
+        }
+    
+    if ( !HandleAutoChangeState() )
+        {
+        RefreshUI();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleDefaultL
+// Handle default event.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::HandleDefaultL( 
+                                                     TInt aKey,
+                                                     TKeyPressLength aLength )
+    {
+    TBool ret = ETrue;
+    if( CAknFepFnKeyManager::EFnKeyNext == iOwner->FepMan()->FnKeyState() ||
+             CAknFepFnKeyManager::EFnKeyLock == iOwner->FepMan()->FnKeyState() ||
+             ( CAknFepFnKeyManager::EFnKeyDown == iOwner->FepMan()->FnKeyState() && iState != ECandidate ))
+        {
+        iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+        }
+    else if (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed) ||
+             iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed))
+        {
+        iOwner->FepMan()->TryCloseUiL();
+        ret = EFalse;
+        }
+    else if ( ( EShortKeyPress == aLength ) && 
+        ( iOwner->IsValidChineseInputKeyQwerty( aKey ) ) )
+        {
+        if ( iState == ECandidate )
+            {
+            HandleKeyFromCandidateL( aKey, aLength );
+            }
+        else
+            {
+            HandleDefaultKeyL( aKey );
+            }
+        }
+    else
+        {
+        iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+        }
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleDefaultKeyL
+// Handle default key press event.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::HandleDefaultKeyL( TInt aKey )
+    {
+    if ( !AddKeystrokeL( aKey ) )
+        {
+        iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+        return;
+        }
+    
+    if ( !HandleAutoChangeState() )
+        {
+        RefreshUI();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::ShowInfoOnEEP
+// Show the showinfo on the EEP ctrl.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::ShowInfoOnEEPPane()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    TBuf<KMaxKeystrokeCount> showInfo;
+    
+    for ( TInt i = 0; i < phrase->Count(); ++i )
+        {
+        showInfo.Append( phrase->MdcaPoint( i ) );
+        }
+
+    for ( TInt ii = 0; ii < keystroke->Count(); ++ii )
+        {
+        showInfo.Append( keystroke->MdcaPoint( ii ) );
+        }
+    
+    editPane->SetText( showInfo, index + phrase->Count() );
+    
+    switch ( iState )
+        {
+        case ECandidate:
+            editPane->DisableCursor();
+            break;
+        case EEntry:
+            editPane->EnableCursor();
+            editPane->DeactiveCursor();
+            break;
+        case EMiniQwertyEdit:
+            editPane->EnableCursor();
+            editPane->ActiveCursor();
+            break;
+        default:
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::ShowInfoOnEEP
+// Show the showinfo on the EEP ctrl.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::ShowInfoOnCandidatePane()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    CDesCArrayFlat* phrase = uiContainer->CandidatePane()->CandidateArray();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    if ( KMaxPhraseCreationCount == editPane->PhraseArray()->Count() )
+        {
+        phrase->Reset();
+        TRAP_IGNORE( phrase->AppendL( KMaxPhraseNote ) );
+        uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+        uiContainer->CandidatePane()->SetCandidateBuffer();
+        uiContainer->Enable( ETrue );
+        uiContainer->ShowHorizontalScrollArrows( EFalse );
+        uiContainer->ShowVerticalScrollArrows( EFalse );
+        }
+    
+    TRAP_IGNORE( GetCandidateL() );
+    if ( phrase->Count() > 0 )
+        {
+        // layout candidate and fill candidate buffer for first display page
+        uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+        uiContainer->CandidatePane()->SetCandidateBuffer();
+        uiContainer->Enable( ETrue );
+        TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() &&
+                                uiContainer->CandidatePane()->IsFirstPage());
+        uiContainer->ShowVerticalScrollArrows( multiplePages );
+        if ( iState == EMiniQwertyEdit )
+            {
+            UIContainer()->FocusCandidatePane( EFalse );
+            }
+        else
+            {
+            UIContainer()->FocusCandidatePane( ETrue );
+            UIContainer()->CandidatePane()->SelectFirstPhrase();
+            }
+        }
+    else
+        {
+        uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+        uiContainer->CandidatePane()->SetCandidateBuffer();
+        uiContainer->Enable( ETrue );
+        uiContainer->ShowHorizontalScrollArrows( EFalse );
+        uiContainer->ShowVerticalScrollArrows( EFalse );
+        uiContainer->SetControlInVisible( EFalse );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleHorizontalNavigation
+//Handle horizontal navigation.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::HandleHorizontalNavigation(
+                                                                   TInt aKey )
+    {
+    MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
+    TBool response = EFalse;
+
+    // Do navigation...
+    if ( aKey == EStdKeyLeftArrow )
+        {        
+        if(!candidatePane->SelectPrev())
+            {
+            candidatePane->SetCandidateBuffer();
+            candidatePane->SelectLastPhrase();
+            }
+        response = ETrue;
+        }
+    else if ( aKey == EStdKeyRightArrow )
+        {              
+        if(!candidatePane->SelectNext())
+            {
+            candidatePane->SetCandidateBuffer();
+            candidatePane->SelectFirstPhrase();
+            }
+        response = ETrue;
+        }
+        
+    if (response)
+        {
+        UpdateIndicator();
+        }   
+             
+    return response;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::UpdateIndicator
+// Update Indicator.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::UpdateIndicator()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+
+    if (candidatePane->IsFirstPage())
+        {
+        uiContainer->CandidatePane()->ShowUpScrollArrows(EFalse);
+        }
+    else
+        {
+        uiContainer->CandidatePane()->ShowUpScrollArrows(ETrue);
+        }
+
+    if (candidatePane->IsLastPage())
+        {
+        uiContainer->CandidatePane()->ShowDownScrollArrows(EFalse);
+        }
+    else
+        {
+        uiContainer->CandidatePane()->ShowDownScrollArrows(ETrue);
+        }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    if (iOwner->FepMan()->KeyboardLayout() == EPtiKeyboardQwerty4x10)
+        {
+        if (candidatePane->VisibleCandidateCount()==1)
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse);
+            uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(ETrue);
+            uiContainer->CandidatePane()->ShowRightScrollArrows(ETrue);
+            }
+        }
+    else
+        {
+#endif
+        if (candidatePane->SelectedIndex() == 0
+                && candidatePane->IsFirstPage() )
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(ETrue);
+            }
+
+        if (candidatePane->IsLastPage() && (candidatePane->SelectedIndex()
+                == candidatePane->VisibleCandidateCount() - 1))
+            {
+            uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowRightScrollArrows(ETrue);
+            }
+        }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    }
+#endif    
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::DeleteKeystroke
+// Delete current keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::DeleteKeystroke()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    
+    if ( ( 0 == index ) || ( keystroke->Count() == 0 ) )
+        {
+        return EFalse;
+        }
+
+    if ( 1 == index )
+        {
+        editPane->Reset();
+        }
+    
+    if ( index >= keystroke->Count() )
+        {
+        keystroke->Delete( keystroke->Count() - 1 );
+        keycodeArray->Remove( keycodeArray->Count() - 1 );
+        editPane->SetCursorIndexOfKeystroke( keystroke->Count() );
+        }
+    else
+        {
+        keystroke->Delete( index - 1 );
+        keycodeArray->Remove( index - 1 );
+        editPane->SetCursorIndexOfKeystroke( index - 1 );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::AddPhraseToDB
+// Add phrase to DB.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::AddPhraseToDB( 
+                                                     const TDesC& aPhraseAdd )
+    {   
+    TPtiUserDictionaryEntry addUdbEntry( aPhraseAdd );
+    //Add the phrase to the DB by PTI Engine
+    iOwner->PtiEngine()->AddUserDictionaryEntry( addUdbEntry );
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::RefreshCandidate
+// Refresh candidate
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::RefreshCandidate()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    uiContainer->CandidatePane()->SetCandidateBuffer();
+    uiContainer->Enable( ETrue );
+
+    TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && 
+            uiContainer->CandidatePane()->IsFirstPage());
+    uiContainer->ShowVerticalScrollArrows( multiplePages );
+
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+    UpdateIndicator();
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::CheckKeyNeedRepeat
+//  Check key whether need repeat.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::CheckKeyNeedRepeat( TKeyPressLength aLength )
+    {
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    if ( editPane->IsChangeState() && aLength == ELongKeyPress )
+        {
+        return EFalse;
+        }
+    else
+        {
+        editPane->SetChangeState( EFalse );
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::CommitInlineEEPL
+// Commint text to EEP or editor
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::CommitInlineEEPL( const TDesC& aDes )
+    {
+    TInt charCount = aDes.Length();
+	MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+	MAknFepUICtrlEditPane* editpane = UIContainer()->EditPaneWindow();
+	CDesCArrayFlat* keyStoke = editpane->KeystrokeArray();
+	RArray<TInt>* keycode = editpane->KeycodeArray();
+	CDesCArrayFlat* phraseArray = editpane->PhraseArray();
+	CDesCArrayFlat* phraseShowKeyStroke = editpane->PhraseShowKeyStrokeArray();
+	RArray<TInt>* phraseKeycode = editpane->PhraseKeycodeArray();
+	TBuf<KMaxKeystrokeCount> buf;
+	TBuf<1> strokeDLT;
+	strokeDLT.Append( KStrokeDelimiter );
+
+	phraseArray->AppendL( aDes );
+
+	TInt phraseCount = phraseArray->Count();
+	TInt index = 0;
+	TInt isFound = keyStoke->Find( strokeDLT, index );
+
+	//phrase creation state
+	if ( phraseCount > 1 || ( 0 == isFound && charCount <= 1 ))
+		{
+		editpane->SetPhraseCreationFlag( ETrue );
+		if ( 0 == isFound && phraseCount < 7 && index < keyStoke->Count() - 1 )
+			{
+			for ( TInt i = 0; i <= index; i++ )
+				{
+				TPtrC ptr = keyStoke->MdcaPoint( 0 );
+				buf.Append( ptr );
+				keyStoke->Delete( 0);
+				phraseKeycode->AppendL( (*keycode)[0]);
+				keycode->Remove( 0 );
+				}
+			phraseShowKeyStroke->AppendL( buf );
+			editpane->SetCursorIndexOfKeystroke( 0 );
+			editpane->DisableCursor();			
+			return ETrue;
+			}
+		else
+			{
+			TBuf<KMaxPhraseCreationCount> phraseCreated;
+			for ( TInt ii = 0; ii < phraseCount; ++ii )
+				{
+				phraseCreated.Append( phraseArray->MdcaPoint(ii) );
+				}
+			if ( 0 != isFound || ( 0 == isFound && index == keyStoke->Count() - 1 ) )
+				{
+				editpane->ResetAllArray();
+				}
+			fepMan->NewTextL( phraseCreated );
+			fepMan->CommitInlineEditL();
+			AddPhraseToDB( phraseCreated );
+			return EFalse;
+			}
+		}
+	else
+		{
+		TBuf<KMaxPhraseCreationCount> phraseCreated;
+		for ( TInt ii = 0; ii < phraseCount; ++ii )
+			{
+			phraseCreated.Append( phraseArray->MdcaPoint( ii ) );
+			}
+		editpane->ResetAllArray();
+		editpane->SetPhraseCreationFlag( EFalse );
+		fepMan->NewTextL( phraseCreated );
+		fepMan->CommitInlineEditL();
+		iOwner->PtiEngine()->SetPredictiveChineseChar( phraseCreated );
+		return EFalse;
+		}
+	}
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::ClearPtiEngineKeystroke
+// clear the ptiengine keystroke;
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::ClearPtiEngineKeystroke()
+    {
+    iOwner->PtiEngine()->ClearCurrentWord();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::AddKeystrokeL
+// Add keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::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 keystrokeCount = keystrokeArray->Count();
+    TInt index = editPane->GetCursorIndexOfKeystroke();
+    
+    if ( phraseCount + keystrokeCount >= KMaxKeystrokeCount )
+        {
+        return EFalse;
+        }
+    
+    
+    TBuf<1> keystroke;
+    GetShowKeystroke( aKey, keystroke );
+    if ( index >= keystrokeCount )
+        {
+        keystrokeArray->AppendL( keystroke );
+        keycodeArray->AppendL( aKey );
+        editPane->SetCursorIndexOfKeystroke( keystrokeCount + 1 );
+        }
+    else
+        {
+        keystrokeArray->InsertL( index, keystroke );
+        keycodeArray->InsertL( aKey, index );
+        editPane->SetCursorIndexOfKeystroke( index + 1 );
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::GetCandidateL
+// Get the candidate info.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::GetCandidateL()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* phraseCandidates = 
+        uiContainer->CandidatePane()->CandidateArray();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    phraseCandidates->Reset();
+
+    if ( keystrokeArray->Count() == 0 )
+        {
+        return;
+        }
+    
+    if ( ( 0 == phraseCount ) && editPane->GetAllValidFlag() )
+        {
+        ptiengine->GetChinesePhraseCandidatesL( *phraseCandidates ); 
+        return;
+        }
+    
+    if ( !CheckFirstGroupStroke() )
+        {
+        return;
+        }
+    
+    ptiengine->GetChinesePhraseCandidatesL( *phraseCandidates );    
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::GetShowKeystroke
+// get the show keystroke.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::GetShowKeystroke(
+                                                      TInt aKey,
+                                                      TDes& aKeystroke
+                                                          )
+    {
+    CPtiEngine* ptiEngine = iOwner->PtiEngine();
+    TBuf<KMaxName> lowerdata;   
+    ptiEngine->MappingDataForKey((TPtiKey)aKey, lowerdata, EPtiCaseLower);  
+    TInt StrokeUnicodePosition =0;
+   
+    if(lowerdata.Length()>0)
+        {
+        for(TInt i=0;i<lowerdata.Length()-1;i++)
+            {
+            if(lowerdata[i]==KStrokeUnicode)
+                {
+                StrokeUnicodePosition = i+1;
+                break;
+                }
+            }
+        if ( StrokeUnicodePosition < lowerdata.Length() )
+            {
+            aKeystroke.Copy( lowerdata.Mid( StrokeUnicodePosition, 1 ) );
+            }
+        }
+    
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::RevertPhraseToKeystrokeL
+// Revert the phrase to keystroke.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::RevertPhraseToKeystrokeL()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    RArray<TInt>* phraseKeycodeArray = editPane->PhraseKeycodeArray();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    CDesCArrayFlat* phraseStroke = editPane->PhraseShowKeyStrokeArray();
+    
+    TBuf<KMaxKeystrokeCount> buf;
+    
+    if ( ( phrase->Count() == 0 ) || ( phraseStroke->Count() == 0 ) )
+        {
+        return;
+        }
+    
+    buf.Append( phraseStroke->MdcaPoint( phraseStroke->Count() - 1 ) );
+    
+    for ( TInt i = buf.Length() - 1; i >= 0; --i )
+        {
+        keystrokeArray->InsertL( 0, buf.Mid( i, 1 ) );
+        keycodeArray->Insert( (*phraseKeycodeArray)[phraseKeycodeArray->Count()-1], 0 );
+        phraseKeycodeArray->Remove( phraseKeycodeArray->Count()-1 );
+        }
+    phrase->Delete( phrase->Count() - 1 );
+    phraseStroke->Delete( phraseStroke->Count() - 1 );
+    
+    TInt leng = phrase->Count() + keystrokeArray->Count();
+    if ( leng > KMaxKeystrokeCount )
+        {
+        for ( TInt i = 0; i < leng - KMaxKeystrokeCount; ++i )
+            {
+            if (  keystrokeArray->Count() == 0 )
+                {
+                break;
+                }
+            keystrokeArray->Delete( keystrokeArray->Count() - 1 );
+            keycodeArray->Remove( keycodeArray->Count() - 1 );
+            }
+        }
+    
+    editPane->SetCursorIndexOfKeystroke( buf.Length() );
+    keystrokeArray->Compress();
+    phrase->Compress();
+    phraseStroke->Compress();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::SetWarningColor
+// Set warning color.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::SetWarningColor()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    CDesCArrayFlat* keystrokeArray = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt keystrokeCount = keystrokeArray->Count();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    TBool valid = ETrue;
+    TInt index = 0;
+    TInt count = 0;
+    TInt stringBeforeLength = 0;
+    TInt stringAfterLength = 0;
+    TInt keyCode = 0;
+    TInt invalidPos = 0;
+    TBuf<1> delimiter;
+    delimiter.Append( KStrokeDelimiter );
+    
+    //set warning color stroke after 7th group when it's more than 7 groups.
+    if ( 0 == keystrokeCount )
+        {
+        return;
+        }
+    
+    if ( CheckAllGroupStroke() )
+        {
+        return;
+        }
+    
+    TInt delimiterCount = phraseCount + editPane->GetDelimiterCount();
+    invalidPos = editPane->GetInvalidIndex();
+    index = invalidPos;
+    ClearPtiEngineKeystroke();
+    for ( TInt i = invalidPos; i < keystrokeCount; ++i )
+        {
+        count = count + 1;
+        //GetKeystrokeCode( keyCode, keystrokeArray->MdcaPoint( i ) );
+        keyCode = (*keycodeArray)[i];
+        if ( EPtiKeyQwertySpace == keyCode )
+            {
+            delimiterCount = delimiterCount + 1;
+            if ( delimiterCount == KMaxPhraseCreationCount )
+                {
+                if ( !valid )
+                    {
+                    editPane->SetHighlight( 
+                            phraseCount + index, 
+                            phraseCount + keystrokeCount - 1 );
+                    }
+                else
+                    {
+                    editPane->SetHighlight( 
+                            phraseCount + i, 
+                            phraseCount + keystrokeCount - 1 );
+                    }
+                break;
+                }
+            if ( ( !valid ) || ( 0 == i ) )
+                {
+                editPane->SetHighlight( 
+                        phraseCount + index, 
+                        phraseCount + index + count - 1 );
+                }
+            else if ( i > 0 )
+                {
+                if ( 0 == keystrokeArray->MdcaPoint( i - 1 ).Compare( delimiter ) )
+                    {
+                    editPane->SetHighlight( 
+                            phraseCount + index, 
+                            phraseCount + index + count - 1 );
+                    }
+                }
+            valid = ETrue;
+            index = i + 1;
+            count = 0;
+            ClearPtiEngineKeystroke();
+            }
+        else if ( valid )
+            {
+            stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length();
+            stringAfterLength = 
+                ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
+            if ( stringBeforeLength == stringAfterLength )
+                {
+                valid = EFalse;
+                }  
+            }
+        
+        if ( ( !valid ) && 
+            ( keystrokeCount == i + 1 ) && 
+            ( EPtiKeyQwertySpace != keyCode ) )
+            {
+            editPane->SetHighlight( 
+                    phraseCount + index, 
+                    phraseCount + index + count - 1 );
+            }
+        }
+    
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::SetWarningColor
+// Set warning color.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::ChangeCbaL()
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    TInt candidateCount = UIContainer()->CandidatePane()->CandidateArray()->Count();
+    TInt keyStrokeCount = editPane->KeystrokeArray()->Count();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    TInt currentCBAResId = editPane->GetCurrentCBAResID();
+    if ( ( candidateCount == 0 && keyStrokeCount != 0 ) || 
+        ( phraseCount == 1 && keyStrokeCount == 0 ) )
+        {
+        if (R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY != currentCBAResId )
+            {
+            fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY );
+            editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY );
+            }
+
+        }
+    else if ( keyStrokeCount == 0 )
+        {
+        if ( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE != currentCBAResId )
+            {
+            fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+            editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+            }
+        }
+    else if ( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL != currentCBAResId )
+        {
+        fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL );
+        editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL );
+        }
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::MoveCursorLeft
+// Move the cursor to Left.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::MoveCursorLeft()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt keystrokeCount = editPane->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 );
+        ShowInfoOnEEPPane();
+        SetWarningColor();        
+        }
+    else if ( ( phraseCount > 0 ) && ( 1 == index ) )
+        {
+        editPane->SetCursorIndexOfKeystroke( 0 );
+        ShowInfoOnEEPPane();
+        SetWarningColor();    
+        }
+    else
+        {
+        editPane->MoveCursorLeft();
+        editPane->SetCursorIndexOfKeystroke( index - 1 );
+        }
+    
+    editPane->SetAutoChangeStateFlag( EManualChangeState );
+    
+    return ETrue;    
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::MoveCursorRight
+// Move the cursor to Right.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::MoveCursorRight()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt keystrokeCount = editPane->KeystrokeArray()->Count();
+    TInt index = editPane->GetCursorIndexOfKeystroke();  
+    
+    if ( EMiniQwertyEdit != iState )
+        {
+        return EFalse;
+        }
+    if ( 0 == keystrokeCount )
+        {
+        return EFalse;
+        }
+    if ( index >= keystrokeCount )
+        {
+        editPane->SetCursorIndexOfKeystroke( 0 );
+        ShowInfoOnEEPPane();
+        SetWarningColor(); 
+        }
+    else
+        {
+        editPane->MoveCursorRight();
+        editPane->SetCursorIndexOfKeystroke( index + 1 );
+        }
+    
+    editPane->SetAutoChangeStateFlag( EManualChangeState );
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyFromCandidateL
+// Handle key from candidate.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::HandleKeyFromCandidateL(
+    TInt aKey, TKeyPressLength /*aLength*/ )
+    {
+    TInt index = 0;
+    MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    // it may be one of the 'valid' numbers..
+    TPtiKeyboardType keyboardtype = iOwner->FepMan()->KeyboardLayout();
+    if ( EPtiKeyboardQwerty4x10 == keyboardtype || EPtiKeyboardQwerty3x11
+        == keyboardtype || EPtiKeyboardHalfQwerty == keyboardtype
+        || EPtiKeyboardCustomQwerty == keyboardtype )
+        {
+        MPtiLanguage *lang= NULL;
+        RArray < TPtiNumericKeyBinding > keybinding;
+        TBool validnumkey = EFalse;
+        CPtiEngine* ptiengine = iOwner->PtiEngine();
+        
+        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 >= KKey1 && numKeyBind.iChar <= KKey6)
+                    &&(aKey == numKeyBind.iKey) )
+                    {
+                    index = numKeyBind.iChar - EPtiKey0 -1;
+                    if ( candidatePane->SelectIndex( index ) )
+                        {
+                        validnumkey = ETrue;
+                        }
+                    break;
+                    }
+                }
+            }
+        keybinding.Reset();
+        keybinding.Close();
+        if ( !validnumkey )
+            {
+            iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone );
+            return;
+            }
+        }
+    else
+        {
+#endif
+        index = MapKeyToIndex( aKey );
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+        }
+#endif
+    TPtrC text = candidatePane->CurrentPhraseCandidate();
+    if ( text.Length( ) )
+        {
+        if ( !CommitInlineEEPL( text ) )
+            {
+            DoActionAfterCommit( );
+            }
+        else
+            {
+            if ( CheckFirstGroupStroke( ) )
+                {
+                RefreshUI( );
+                UIContainer()->CandidatePane()->SelectFirstPhrase( );
+                }
+            else
+                {
+                UIContainer()->EditPaneWindow()->SetAutoChangeStateFlag( EAutoChangeStateFromCandidate );
+                iOwner->ChangeState( EMiniQwertyEdit );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::CheckAllGroupStroke
+// check the all group stroke of keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::CheckAllGroupStroke()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    TInt keystrokeCount = keystroke->Count();
+    TInt keyCode = 0;
+    TInt stringBeforeLength = 0;
+    TInt stringAfterLength = 0;
+    TInt lastDLTPos = 0;
+    TBool check = ETrue;
+    TInt delimiterCount = 0;
+    //If has phrase on the entry pane then the all keystroke is invalid.
+    if ( ( phraseCount > 0 ) || ( 0 == keystrokeCount ) )
+        {
+        editPane->SetAllValidFlag( EFalse );
+        editPane->SetDelimiterCount( 0 );
+        editPane->SetInvalidIndex( 0 );
+        return EFalse;
+        }
+    
+    ClearPtiEngineKeystroke();
+    for ( TInt i = 0; i < keystrokeCount; ++i )
+        {
+        //GetKeystrokeCode( keyCode, keystroke->MdcaPoint( i ) );
+        keyCode = (*keycodeArray)[i];
+        if ( EPtiKeyQwertySpace == keyCode )
+            {
+            //If first keystroke is delimiter then all keystroke is not valid.
+            if ( i == 0 )
+                {
+                editPane->SetAllValidFlag( EFalse );
+                editPane->SetDelimiterCount( 0 );
+                editPane->SetInvalidIndex( 0 );
+                return EFalse;
+                }
+            //If two delimiter is border upon then the check evaluate EFalse.
+            else if ( lastDLTPos == ( i - 1 ) )
+                {
+                check = EFalse;
+                }
+            //lastDLTPos evaluate last delimiter that has not border upon deliminter. 
+            else if ( check )
+                {
+                delimiterCount = delimiterCount + 1;
+                lastDLTPos = i;
+                }
+            }
+        stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length();
+        stringAfterLength = 
+            ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
+        if ( stringBeforeLength == stringAfterLength )
+            {
+            editPane->SetAllValidFlag( EFalse );
+            if ( 0 == lastDLTPos )
+                {
+                editPane->SetDelimiterCount( 0 );
+                editPane->SetInvalidIndex( 0 );
+                }
+            else
+                {
+                editPane->SetDelimiterCount( delimiterCount );
+                editPane->SetInvalidIndex( lastDLTPos + 1 );
+                }            
+            return EFalse;
+            }          
+        }
+    
+    editPane->SetAllValidFlag( ETrue );
+    editPane->SetDelimiterCount( 0 );
+    editPane->SetInvalidIndex( 0 );
+    return ETrue;
+    }
+
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::DoActionAfterCommit
+// Do action afer commit, change state to predictive or not.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::DoActionAfterCommit()
+    {
+    TRAP_IGNORE( DoActionAfterCommitL() ); 
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::DoActionAfterCommitL
+// Do action afer commit, change state to predictive or not.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::DoActionAfterCommitL( )
+    {
+    if ( UIContainer()->EditPaneWindow()->KeystrokeArray()->Count( ) != 0 )
+        {
+        UIContainer()->EditPaneWindow()->ResetAllArray( );
+        CAknWarningNote* errnote = new( ELeave ) CAknWarningNote();
+        errnote->SetTone( CAknNoteDialog::EWarningTone );
+        errnote->ExecuteLD( KMaxPhraseNote );
+        }
+    else if ( !UIContainer()->EditPaneWindow()->GetPhraseCreationFlag( ) )
+        {
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+        TBool isEditorFull = iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagEditorFull);
+        if ( !isEditorFull )
+            {
+            iOwner->ChangeState( EPredictiveCandidate );
+            UIContainer()->EditPaneWindow()->SetChangeState(ETrue);
+            }
+        else
+            {
+            iOwner->FepMan()->ClearFlag(CAknFepManager::EFlagEditorFull);
+            iOwner->FepMan()->TryCloseUiL();
+            }
+#endif
+        }
+    else
+        {
+        iOwner->FepMan()->TryCloseUiL( );
+        }
+    }
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::CheckSpellingDLT
+// Check the delimiter of spelling.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyStrokePhraseBase::CheckSpellingDLT( const TDesC& aKeystroke )
+    {
+    if ( aKeystroke.Length() == 0 )
+        {
+        return EFalse;
+        }
+    if (  KStrokeDelimiter == aKeystroke[0]  )
+        {
+        return ETrue;
+        }    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyStrokePhraseBase::HandleCommandL
+// Handling Command
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyStrokePhraseBase::HandleCommandL( TInt aCommandId )
+    {
+    switch ( aCommandId )
+        {
+        // Handle the event frome command.
+        case EAknSoftkeySelect:
+            //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
+            HandleCommitL( EShortKeyPress );
+            break;
+        default:
+            TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
+            break;
+        }
+    }
+// End of file