fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp
branchRCL_3
changeset 50 5a1685599b76
parent 46 bd83ceabce89
child 56 8152b1f1763a
--- a/fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp	Tue Sep 14 21:59:06 2010 +0300
+++ b/fep/aknfep/src/aknfepuiinputminiqwertypinyinphrasebase.cpp	Wed Sep 15 12:34:44 2010 +0300
@@ -121,6 +121,8 @@
     {0x02D9, 5}
     };
 
+const TUid KPtiSogouCoreUid = { 0x20031DD6 };
+
 // ---------------------------------------------------------------------------
 // TAknFepInputStateStrokePhraseCreationBase::TAknFepInputStateStrokePhraseCreationBase
 // C++ default constructor
@@ -139,6 +141,18 @@
     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
     TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && uiContainer->CandidatePane()->IsFirstPage());
     uiContainer->ShowVerticalScrollArrows(multiplePages);
+    
+    // If sogou core is in use, set plugin to the state
+    // machine and enable the plugin.
+    // Get current core id. It is used to judge whether sogou core is in use.
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        TAknFepInputMiniQwertySogouPinyinPhrasePlugin plugin( aOwner, aUIContainer, iState );
+        plugin.Enable( ETrue );
+        SetPlugin( plugin );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -386,11 +400,42 @@
                 }
             }
         GetKeystrokeCode(keyCode, showKeystroke->MdcaPoint(i) );
-        stringBeforeLength = getCurrentLeastDLTSpell().Length();
+        
+        // dltBeforeCount is the dlt count before append the key.
+        // dltAfterCount is the dlt count after append the key.
+        // In sogou core, after appending a new key, the spell length
+        // may be the same, but the dlt count will change.
+        // In this situation, the appended key is valid.
+        TInt dltBeforeCount = 0;
+        TInt dltAfterCount = 0;
+        TPtrC stringBefore = getCurrentLeastDLTSpell();
+        stringBeforeLength = stringBefore.Length();
+        for ( TInt k = 0; k < stringBefore.Length(); k++ )
+            {
+            if ( CheckSpellingDLT( stringBefore.Mid( k )))
+                {
+                dltBeforeCount++;
+                }
+            }
+        
+        // Append the key.
         ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
-        stringAfterLength = getCurrentLeastDLTSpell().Length();
-        //the keystroke is invalid.
-        if (stringBeforeLength == stringAfterLength)
+        
+        // Get the dlt count after appending the key.
+        TPtrC stringAfter = getCurrentLeastDLTSpell();
+        stringAfterLength = stringAfter.Length();
+        for ( TInt l = 0; l < stringAfter.Length(); l++ )
+            {
+            if ( CheckSpellingDLT( stringAfter.Mid( l )))
+                {
+                dltAfterCount++;
+                }
+            }
+
+        // If the spell length is the same and the dlt count is 
+        // the same, the keystroke is invalid
+        if (( stringBeforeLength == stringAfterLength ) &&
+            ( dltAfterCount == dltBeforeCount ))
             {
             return EFalse;
             }
@@ -415,7 +460,23 @@
     TInt count = 0;
     TBuf<1> autoDLT;
     autoDLT.Append(KAutoDLT);
-
+    
+    // If this method is called in construction of the state machine,
+    // the plugin is not set. If sogou core is in use now, the phraseCount
+    // should be the same as the phrase characters count.
+    // For Sogou core, maybe one element of PhraseArray() contains two or more characters.
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        CDesCArrayFlat* phraseArray = editPane->PhraseArray();
+        phraseCount = 0;
+        for ( TInt i = 0; i < phraseArray->Count(); i++ )
+            {
+            phraseCount += (*phraseArray)[i].Length();
+            }
+        }
+    
     if ( 0 == index)
         {
         pos = phraseCount;
@@ -517,6 +578,26 @@
     manualDLT.Append( KManualDLT );
     autoDLT.Append( KAutoDLT );
     
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        CDesCArrayFlat* phrase = editPane->PhraseArray();
+        phraseCount = 0;
+        for ( TInt j = 0;  j < phrase->Count(); j++ )
+            {
+            phraseCount += phrase->MdcaPoint(j).Length();;
+            }
+        }
+    
+    if ( phraseCount + showKeystrokeCount >= KMaxKeystrokeCount )
+        {
+        iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+        return;
+        }
+    
     TBool firstGroup = CheckFirstGroupStroke();
 
     keystrokeArray->InsertL(index, manualDLT);
@@ -873,6 +954,12 @@
 //
 void TAknFepInputMiniQwertyPinyinPhraseBase::AnalyseL()
     {
+    // If sogou core is actived, use the plugin.
+    if ( iPlugin.IsEnable())
+        {
+        iPlugin.AnalyseL();
+        return;
+        }
     CPtiEngine* ptiengine = iOwner->PtiEngine();
     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
     MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
@@ -978,7 +1065,7 @@
         if ( ( showKeyCount > 0 ) && (cdtCount > 0 ) )
             {
             UIContainer()->EditPaneWindow()->SetChangeState(ETrue);
-            iOwner->ChangeState(ECandidate);
+            iOwner->ChangeState(EEntry);
             return;
             }
 
@@ -1049,17 +1136,15 @@
                 {
                 editPane->SetAutoChangeStateFlag(EAutoChangeStateFromCandidate);
                 }
+            //stroke to be shown
+            if ( iPlugin.IsEnable())
+                {
+                iPlugin.AnalyseL();
+                }
             iOwner->ChangeState(EMiniQwertyEdit);
             return;
             }
-        else
-            {
-            if ( iState == EEntry )
-                {
-                UIContainer()->EditPaneWindow()->SetChangeState( ETrue );
-                iOwner->ChangeState( ECandidate );
-                }
-            }
+
         AnalyseL();
         RefreshUI();
         }
@@ -1220,9 +1305,31 @@
     CDesCArrayFlat* phrase = editPane->PhraseArray();
     TBuf<KMaxKeystrokeCount> showInfo;
     TBuf<KMaxKeystrokeCount> keyBuf;
+    
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    TInt phraseCount = 0;
+    
     for (TInt i = 0; i < phrase->Count(); ++i)
         {
-        showInfo.Append(phrase->MdcaPoint(i) );
+        // If this method is called in construction of the state machine,
+        // the plugin is not set. If sogou core is in use now, we should append 
+        // each characters to showInfo.
+        // For Sogou core, maybe one element of PhraseArray() contains two or more characters.
+        if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+            {
+            for ( TInt k = 0; k < phrase->MdcaPoint(i).Length(); k++ )
+                {
+                showInfo.Append( phrase->MdcaPoint(i)[k] );
+                }
+            phraseCount += phrase->MdcaPoint(i).Length();
+            }
+        else
+            {
+            // If cpicore is in use, just append the element of phrase
+            showInfo.Append(phrase->MdcaPoint(i) );
+            }
         }
 
     for (TInt ii = 0; ii < showKeystroke->Count(); ++ii)
@@ -1234,9 +1341,22 @@
         {
         keyBuf.Append(keystrokeArray->MdcaPoint(j) );
         }
-
-    editPane->SetTextForZhuyin(showInfo, GetCursorPos(), phrase->Count(),
+    
+    // If this method is called in construction of the state machine,
+    // the plugin is not set. If sogou core is in use now, the phraseCount
+    // should be the same as the phrase characters count.
+    // For Sogou core, maybe one element of PhraseArray() contains two or more characters.
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        editPane->SetTextForZhuyin(showInfo, GetCursorPos(), phraseCount,
+                        keyBuf, editPane->GetCursorIndexOfKeystroke() );
+        }
+    else
+        {
+        // If cpicore is in use, phraseCount is the same as phrase->Count()
+        editPane->SetTextForZhuyin(showInfo, GetCursorPos(), phrase->Count(),
         keyBuf, editPane->GetCursorIndexOfKeystroke() );
+        }
 
     if (iState == ECandidate)
         {
@@ -1536,6 +1656,11 @@
 void TAknFepInputMiniQwertyPinyinPhraseBase::AddPhraseToDB(
     const TDesC& aPhraseAdd)
     {
+    if ( iPlugin.IsEnable())
+        {
+        iPlugin.AddPhrasePinyinToPti();
+        return;
+        }
     TPtiUserDictionaryEntry addUdbEntry(aPhraseAdd);
     //Add the phrase to the DB by PTI Engine
     iOwner->PtiEngine()->AddUserDictionaryEntry(addUdbEntry);
@@ -1588,6 +1713,12 @@
 TBool TAknFepInputMiniQwertyPinyinPhraseBase::CommitInlineEEPL(
     const TDesC& aDes)
     {
+    // If sogou core is actived, use the plugin.
+    if ( iPlugin.IsEnable())
+        {
+        return iPlugin.CommitInlineEEPL( aDes );
+        }
+
     TInt charCount = aDes.Length();
     MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
     MAknFepUICtrlEditPane* editpane = UIContainer()->EditPaneWindow();
@@ -1695,6 +1826,20 @@
     TInt index = editPane->GetCursorIndexOfKeystroke();
     TBuf<1> keystroke;
     
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        CDesCArrayFlat* phrase = editPane->PhraseArray();
+        phraseCount = 0;
+        for ( TInt j = 0;  j < phrase->Count(); j++ )
+            {
+            phraseCount += phrase->MdcaPoint(j).Length();;
+            }
+        }
+    
     if ( phraseCount + showKeystrokeCount >= KMaxKeystrokeCount )
         {
         return EFalse;
@@ -1707,6 +1852,7 @@
         {
         return EFalse;
         }
+    
     if ( index >= keystrokeArray->Count() )
         {
         keystrokeArray->AppendL(keystroke);
@@ -1839,6 +1985,12 @@
 //
 void TAknFepInputMiniQwertyPinyinPhraseBase::GetCandidateL()
     {
+    if ( iPlugin.IsEnable())
+        {
+        iPlugin.GetCandidateL();
+        return;
+        }
+    
     CPtiEngine* ptiengine = iOwner->PtiEngine();
     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
     MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
@@ -1860,7 +2012,7 @@
         return;
         }
 
-    if ( CheckAllGroupStroke() && ( phraseCount == 0 ) )
+    if (( phraseCount == 0 ) && CheckAllGroupStroke())
         {
         getCurrentLeastDLTSpell();
         ptiengine->GetChinesePhraseCandidatesL( *phraseCandidates ); 
@@ -1975,7 +2127,13 @@
     keystrokeArray->Compress();
     phrase->Compress();
     phraseStroke->Compress();
-
+    
+    TInt coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID );
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        // Notify sogoucore that last phrase is cancelled
+        iOwner->PtiEngine()->HandleCommandL( EPtiCommandCancelSelectElement );
+        }
     }
 
 // ---------------------------------------------------------
@@ -2001,6 +2159,11 @@
         {
         editPane->SetHighlight(aPhraseCount + aIndex, aPhraseCount
                 + aIndex + aCount - 1 );
+        if ( iPlugin.IsEnable())
+            {
+            iPlugin.CanConvertAll( EFalse );
+            iPlugin.ConvertCount( aIndex );
+            }
         }
     else
         {
@@ -2025,6 +2188,11 @@
             {
             editPane->SetHighlight( aPhraseCount + aIndex, aPhraseCount
                     + aIndex + aCount - 1);
+            if ( iPlugin.IsEnable())
+                {
+                iPlugin.CanConvertAll( EFalse );
+                iPlugin.ConvertCount( aIndex );
+                }
             }
         }
     ClearPtiEngineKeystroke();
@@ -2049,26 +2217,68 @@
     TInt start = 0;
     TInt keyCode = 0;
     TInt toneMark = KInvalidToneMark;
+    
+    if ( iPlugin.IsEnable())
+        {
+        iPlugin.CanConvertAll( ETrue );
+        }
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        CDesCArrayFlat* phrase = editPane->PhraseArray();
+        phraseCount = 0;
+        for ( TInt j = 0;  j < phrase->Count(); j++ )
+            {
+            phraseCount += phrase->MdcaPoint(j).Length();;
+            }
+        }
 
     if (showKeystroke->Count() == 0)
         {
         return;
         }
 
-    if (CheckAllGroupStroke() )
+    if ( TUid::Uid( coreID ) != KPtiSogouCoreUid )
         {
-        return;
+        if ( CheckAllGroupStroke())
+            {
+            return;
+            }
         }
+
     ClearPtiEngineKeystroke();
     if (CheckSpellingDLT(showKeystroke->MdcaPoint( 0) ) || (KInvalidToneMark
             != ToneMark(showKeystroke->MdcaPoint( 0) ) ))
         {
         start = 1;
         editPane->SetHighlight(phraseCount, phraseCount);
+
+        if ( iPlugin.IsEnable())
+            {
+            iPlugin.CanConvertAll( EFalse );
+            iPlugin.ConvertCount( index );
+            }
+        
         index = 1;
         }
+    
+    TInt end = showKeystroke->Count();
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        for ( TInt j = showKeystroke->Count() - 1; j >= 0; j-- )
+            {
+            if ( KAutoDLT == showKeystroke->MdcaPoint(j)[0] )
+                {
+                end = j + 1;
+                break;
+                }
+            }
+        }
 
-    for ( TInt i = start; i < showKeystroke->Count(); ++i )
+    for ( TInt i = start; i < end; ++i )
         {
         count = count + 1;
         // tone mark
@@ -2096,6 +2306,11 @@
                     {
                     editPane->SetHighlight(phraseCount + index, phraseCount
                             + index + count - 1);
+                    if ( iPlugin.IsEnable())
+                        {
+                        iPlugin.CanConvertAll( EFalse );
+                        iPlugin.ConvertCount( index );
+                        }
                     }
                 ClearPtiEngineKeystroke();
                 index = i + 1;
@@ -2107,10 +2322,42 @@
                 if ( valid )
                     {
                     GetKeystrokeCode(keyCode, showKeystroke->MdcaPoint(i) );
-                    stringBeforeLength = getCurrentLeastDLTSpell().Length();
-                    ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
-                    stringAfterLength = getCurrentLeastDLTSpell().Length();
-                    if ( stringBeforeLength == stringAfterLength )//the keystroke is invalid
+                    
+                    // dltBeforeCount is the dlt count before append the key.
+                    // dltAfterCount is the dlt count after append the key.
+                    // In sogou core, after appending a new key, the spell length
+                    // may be the same, but the dlt count will change.
+                    // In this situation, the appended key is valid.
+                    TInt dltBeforeCount = 0;
+                    TInt dltAfterCount = 0;
+                    TPtrC stringBefore = getCurrentLeastDLTSpell();
+                    stringBeforeLength = stringBefore.Length();
+                    for ( TInt j = 0; j < stringBefore.Length(); j++ )
+                        {
+                        if ( CheckSpellingDLT( stringBefore.Mid( j )))
+                            {
+                            dltBeforeCount++;
+                            }
+                        }
+                    
+                    // Append the key.
+                    ptiengine->AppendKeyPress(( TPtiKey )keyCode ).Length();
+                    
+                    // Get the dlt count after appending the key.
+                    TPtrC stringAfter = getCurrentLeastDLTSpell();
+                    stringAfterLength = stringAfter.Length();
+                    for ( TInt k = 0; k < stringAfter.Length(); k++ )
+                        {
+                        if ( CheckSpellingDLT( stringAfter.Mid( k )))
+                            {
+                            dltAfterCount++;
+                            }
+                        }
+                    
+                    // If the spell length is the same and the dlt count is 
+                    // the same, the keystroke is invalid
+                    if (( stringBeforeLength == stringAfterLength ) && 
+                        ( dltAfterCount == dltBeforeCount ))
                         {
                         ClearPtiEngineKeystroke();
                         valid = EFalse;
@@ -2123,6 +2370,13 @@
             editPane->SetHighlight(
                                 phraseCount + index, 
                                 phraseCount + index + count - 1 );
+
+            if ( iPlugin.IsEnable())
+                {
+                iPlugin.CanConvertAll( EFalse );
+                iPlugin.ConvertCount( index );
+                }
+
             ClearPtiEngineKeystroke();
             }
         }
@@ -2178,8 +2432,28 @@
     CDesCArrayFlat* showKeyStoke = editPane->ShowKeystrokeArray();
     TInt showKeyStokeCount = editPane->ShowKeystrokeArray()->Count();
     TInt indexOfKeystroke = editPane->GetCursorIndexOfKeystroke();
-    TInt cursorPos = editPane->GetCursor() - editPane->PhraseArray()->Count();
-
+    
+    TInt cursorPos = 0;
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    TInt phraseCount = 0;
+    
+    // For Sogou core, maybe on element of PhraseArray() contains two or 
+    // more characters.
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        for ( TInt l = 0; l < editPane->PhraseArray()->Count(); l++ )
+            {
+            phraseCount += editPane->PhraseArray()->MdcaPoint( l ).Length();
+            }
+        cursorPos = editPane->GetCursor() - phraseCount;
+        }
+    else
+        {
+        cursorPos = editPane->GetCursor() - editPane->PhraseArray()->Count();
+        }
+    
     TBuf<1> autoDLT;
     autoDLT.Append(KAutoDLT);
     const TInt offset = 2;
@@ -2233,7 +2507,28 @@
     CDesCArrayFlat* showKeyStoke = editPane->ShowKeystrokeArray();
     TInt showKeyStokeCount = editPane->ShowKeystrokeArray()->Count();
     TInt indexOfKeystroke = editPane->GetCursorIndexOfKeystroke();
-    TInt cursorPos = editPane->GetCursor() - editPane->PhraseArray()->Count();
+     
+    TInt cursorPos = 0;
+    // Get the current core id
+    TInt coreID = 0;
+    TRAP_IGNORE( coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID ));
+    TInt phraseCount = 0;
+    
+    // For Sogou core, maybe on element of PhraseArray() contains two or 
+    // more characters.
+    if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+        {
+        for ( TInt l = 0; l < editPane->PhraseArray()->Count(); l++ )
+            {
+            phraseCount += editPane->PhraseArray()->MdcaPoint( l ).Length();
+            }
+        cursorPos = editPane->GetCursor() - phraseCount;
+        }
+    else
+        {
+        cursorPos = editPane->GetCursor() - editPane->PhraseArray()->Count();
+        }
+    
     TBuf<1> autoDLT;
     autoDLT.Append(KAutoDLT);
     const TInt offset = 2;
@@ -2484,7 +2779,6 @@
 void TAknFepInputMiniQwertyPinyinPhraseBase::HandleKeyFromCandidateL(
     TInt aKey, TKeyPressLength /*aLength*/)
     {
-    TInt index = 0;
 #ifdef RD_INTELLIGENT_TEXT_INPUT
     // it may be one of the 'valid' numbers..
     TPtiKeyboardType keyboardtype = iOwner->FepMan()->KeyboardLayout();
@@ -2512,7 +2806,6 @@
                 if ( (numKeyBind.iChar >= 0x31 && numKeyBind.iChar <= 0x36)
                         &&(aKey == numKeyBind.iKey))
                     {
-                    index = numKeyBind.iChar - EPtiKey0 -1;
                     validnumkey = ETrue;
                     break;
                     }
@@ -2526,16 +2819,10 @@
             return;
             }
         }
-    else
-        {
-#endif
-        index = MapKeyToIndex(aKey);
-#ifdef RD_INTELLIGENT_TEXT_INPUT
-        }
 #endif
     MAknFepUICtrlCandidatePane* candidatePane = UIContainer()->CandidatePane();
 
-    if (candidatePane->SelectIndex(index) || aKey == EStdKeyDevice3 || aKey
+    if ( aKey == EStdKeyDevice3 || aKey
             == EStdKeyEnter)
         {
         TPtrC text = candidatePane->CurrentPhraseCandidate();
@@ -2632,10 +2919,42 @@
                 return EFalse;
                 }
             GetKeystrokeCode(keyCode, keystroke->MdcaPoint(i) );
-            stringBeforeLength = getCurrentLeastDLTSpell().Length();
-            ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
-            stringAfterLength = getCurrentLeastDLTSpell().Length();
-            if ( stringBeforeLength == stringAfterLength )
+            
+            // dltBeforeCount is the dlt count before append the key.
+            // dltAfterCount is the dlt count after append the key.
+            // In sogou core, after appending a new key, the spell length
+            // may be the same, but the dlt count will change.
+            // In this situation, the appended key is valid.
+            TInt dltBeforeCount = 0;
+            TInt dltAfterCount = 0;
+            TPtrC stringBefore = getCurrentLeastDLTSpell();
+            stringBeforeLength = stringBefore.Length();
+            for ( TInt k = 0; k < stringBefore.Length(); k++ )
+                {
+                if ( CheckSpellingDLT( stringBefore.Mid( k )))
+                    {
+                    dltBeforeCount++;
+                    }
+                }
+
+            // Append the key.
+            ptiengine->AppendKeyPress(( TPtiKey )keyCode );
+            
+            // Get the dlt count after appending the key.
+            TPtrC stringAfter = getCurrentLeastDLTSpell();
+            stringAfterLength = stringAfter.Length();
+            for ( TInt l = 0; l < stringAfter.Length(); l++ )
+                {
+                if ( CheckSpellingDLT( stringAfter.Mid( l )))
+                    {
+                    dltAfterCount++;
+                    }
+                }
+            
+            // If the spell length is the same and the dlt count is 
+            // the same, the keystroke is invalid
+            if (( stringBeforeLength == stringAfterLength ) && 
+                ( dltAfterCount == dltBeforeCount ))
                 {
                 return EFalse;
                 }
@@ -2690,8 +3009,27 @@
             }
         else
             {
+            // For sogou core, the predictive is not endless, so when there
+            // is no predictive candidates, we should call TryCloseUiL().
+            TBool noCandidates = EFalse;
+            
+            TInt coreID = iOwner->PtiEngine()->HandleCommandL( EPtiCommandGetCoreID );
+            if ( TUid::Uid( coreID ) == KPtiSogouCoreUid )
+                {
+                // Get the predictive candidates.
+                CDesCArrayFlat* phraseCandidates = new(ELeave) CDesCArrayFlat( 1 );
+                CleanupStack::PushL ( phraseCandidates );
+                phraseCandidates->Reset();
+                iOwner->PtiEngine()->GetChinesePhraseCandidatesL( *phraseCandidates );
+                if ( phraseCandidates->Count() == 0 )
+                    {
+                    noCandidates = ETrue;
+                    }
+                CleanupStack::PopAndDestroy( phraseCandidates );
+                }
+        
             UIContainer()->EditPaneWindow()->ResetAllArray();
-            if ( !UIContainer()->EditPaneWindow()->GetPhraseCreationFlag() )
+            if ( !UIContainer()->EditPaneWindow()->GetPhraseCreationFlag() && !noCandidates )
                 {
                 UIContainer()->EditPaneWindow()->SetPhraseCreationFlag(EFalse);
                 UIContainer()->EditPaneWindow()->SetChangeState(ETrue);