fep/aknfep/src/AknFepUiInputStateEntryPinyinPhrase.cpp
changeset 40 2cb9bae34d17
parent 31 f1bdd6b078d1
child 49 37f5d84451bd
equal deleted inserted replaced
31:f1bdd6b078d1 40:2cb9bae34d17
     1 /*
       
     2 * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0""
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:           
       
    15 *       Provides the CAknFepUIInputStatePinyinPhrase methods.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 
       
    26 
       
    27 
       
    28 
       
    29 
       
    30 #include "AknFepPanic.h"
       
    31 #include "AknFepUiInputStateEntryPinyinPhrase.h"
       
    32 #include "AknFepUIManagerStateInterface.h"      //MAknFepUIManagerStateInterface
       
    33 #include "AknFepManagerUIInterface.h"           //MAknFepManagerUIInterface
       
    34 #include "AknFepUiCtrlContainerChinese.h"
       
    35 #include "AknFepUICtrlInputPane.h"
       
    36 #include "AknFepUICtrlCandidatePane.h"
       
    37 #include "AknFepUICtrlPinyinPopup.h"		//Pinyin phrase
       
    38 #include "AknFepManager.h"
       
    39 
       
    40 #include <PtiEngine.h>                          //CPtiEngine
       
    41 #include <PtiDefs.h>                            //keys
       
    42 #include <avkon.rsg>
       
    43 #include <aknfep.rsg>
       
    44 #include <aknnotewrappers.h>
       
    45 
       
    46 const TText KPinyinTone0Valid = 0x02C9;
       
    47 const TText KPinyinTone1Valid = 0x02CA;
       
    48 const TText KPinyinTone2Valid = 0x02C7;
       
    49 const TText KPinyinTone3Valid = 0x02CB;
       
    50 const TText KPinyinTone4Valid = 0x02D9;
       
    51 const TText KPinyinTone4Invalid = 0x0020;
       
    52 
       
    53 const TInt KMaxPhraseCount = 100;
       
    54 const TInt KMaxKeystrokeCount = 100;
       
    55 const TInt KMaxShowKeystrokeCount = 31;
       
    56 
       
    57 const TInt KMaxPinyinLength = 60;
       
    58 
       
    59 const TInt KMaxStarCount = 5;
       
    60 
       
    61 const TInt KKey0Code = 48;
       
    62 const TInt KKey1Code = 49;
       
    63 const TInt KKey2Code = 50;
       
    64 const TInt KKey3Code = 51;
       
    65 const TInt KKey4Code = 52;
       
    66 const TInt KKey5Code = 53;
       
    67 const TInt KKey6Code = 54;
       
    68 const TInt KKey7Code = 55;
       
    69 const TInt KKey8Code = 56;
       
    70 const TInt KKey9Code = 57;
       
    71 
       
    72 _LIT( KPinyinListSeparator, "'" );
       
    73 _LIT( KPinyinStar, "*" );
       
    74 _LIT( KPinyinNote,"\x9020\x65B0\x8BCD" );
       
    75 _LIT( KPinyinManualSeparator, "\x002E");
       
    76 
       
    77 TAknFepInputStateEntryPinyinPhrase::TAknFepInputStateEntryPinyinPhrase(
       
    78                                 MAknFepUIManagerStateInterface* aOwner,
       
    79                                 MAknFepUICtrlContainerChinese* aUIContainer)
       
    80     :TAknFepInputStateChineseBase(aOwner, aUIContainer)
       
    81     {
       
    82     iState = EEntry;
       
    83 
       
    84     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
    85     uiContainer->FocusCandidatePane(EFalse);
       
    86     uiContainer->CandidatePane()->ShowCandidateOrdinals(EFalse);
       
    87     uiContainer->SetLayout(MAknFepUICtrlContainerChinese::ELayoutInput);
       
    88     uiContainer->CandidatePane()->SelectFirstPhrase(); 
       
    89     uiContainer->ShowVerticalScrollArrows(ETrue);
       
    90     uiContainer->ShowHorizontalScrollArrows(EFalse);
       
    91     uiContainer->InputPane()->SetOverrideFontId(0);
       
    92 
       
    93     iOwner->PtiEngine()->SetInputMode(EPtiEnginePinyinByPhrase);
       
    94     iOwner->PtiEngine()->SetCandidatePageLength(KMaxPhraseCount);
       
    95     uiContainer->PinyinPopupWindow()->SetTonemarkState( ETrue );
       
    96     // set the state is in input state,
       
    97     // so that it could handle EKeyCBA1
       
    98     iOwner->FepMan()->EntryPhrase( ETrue );
       
    99     uiContainer->SetFepMan( iOwner->FepMan() );
       
   100     
       
   101     ClearKeystrokeBuf();
       
   102     // in the case that we are coming back to the input pane from the candidate pane, 
       
   103     // we need to ensure that the current selection is selected correctly
       
   104     ImplicitlyUpdateSelection();
       
   105     // however we also need to clear the deliberate selection, in case we are not
       
   106     // coming back to the input pane from the candidate pane
       
   107     if ( uiContainer->PinyinPopupWindow()->GetFromCandidateChangeStateFlag() )
       
   108         {
       
   109         uiContainer->PinyinPopupWindow()->SetFromCandidateChangeStateFlag( EFalse );
       
   110         }
       
   111     else
       
   112         {
       
   113         ClearDeliberateSelection();
       
   114         }
       
   115     
       
   116     UpdateIndicator();
       
   117     TRAP_IGNORE( ChangeCbaL() );
       
   118     }
       
   119 
       
   120 void TAknFepInputStateEntryPinyinPhrase::HandleCommandL( TInt aCommandId)
       
   121     {
       
   122     CPtiEngine* ptiengine = iOwner->PtiEngine( );
       
   123     MAknFepUICtrlContainerChinese* uiContainer = UIContainer( );
       
   124     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow( );
       
   125     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray( );
       
   126     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray( );
       
   127     CDesCArrayFlat* showKeystrokeArray = popup->ShowKeystrokeArray( );
       
   128     TInt currentSelect = popup->CurrentSelection( );
       
   129     TInt inEffectSpellingCount = ptiengine->PhoneticSpellingCount( );
       
   130     TBuf<KMaxKeystrokeCount> keystrokeBuf;
       
   131     switch ( aCommandId )
       
   132         {
       
   133         // Handle the event frome command.
       
   134         case EAknSoftkeyCancel:
       
   135             //  case (TUint16)EAknSoftkeyCancel: //the Cancle in soft CBA
       
   136             TAknFepInputStateChineseBase::HandleCommandL( aCommandId );
       
   137             break;
       
   138         case EAknSoftkeySelect:
       
   139             //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA
       
   140             if ( (currentSelect < inEffectSpellingCount)
       
   141                 && (keystrokeArray->Count( )
       
   142                     == inEffectKeystrokeArray->Count( ) )
       
   143                 && (popup->GetTonemarkState( ) ) )
       
   144                 {
       
   145                 if ( popup->IsEnabled( ) )
       
   146                     {
       
   147                     popup->Enable( EFalse );
       
   148                     }
       
   149                 iOwner->FepMan()->PinyinPhraseCreation( EFalse );
       
   150                 popup->SetChangeState( ETrue );
       
   151                 iOwner->ChangeState( ECandidate );
       
   152                 }
       
   153             else
       
   154                 {
       
   155                 GetKeystrokeBuf( *keystrokeArray, keystrokeBuf );
       
   156                 iOwner->FepMan()->PinyinPhraseCreation( ETrue );
       
   157                 popup->SetChangeState( ETrue );
       
   158                 popup->SetPhraseCreationState( ETrue );
       
   159                 if ( GetChangeState( ) )
       
   160                     {
       
   161                     ClearDeliberateSelection( );
       
   162                     popup->Enable( EFalse );
       
   163                     iOwner->ChangeState( ESpellingSelection );
       
   164                     }
       
   165                 else
       
   166                     {
       
   167                     ClearDeliberateSelection( );
       
   168                     popup->Enable( EFalse );
       
   169                     iOwner->ChangeState( EKeySequenceEdit );
       
   170                     }
       
   171                 }
       
   172             break;
       
   173         default:
       
   174             DeliberatelyUpdateSelection( );
       
   175             break;
       
   176         }
       
   177 
       
   178     }
       
   179 
       
   180 TBool TAknFepInputStateEntryPinyinPhrase::HandleKeyL( TInt aKey, TKeyPressLength aLength )
       
   181     {
       
   182     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   183     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   184     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   185     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
   186     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
   187     CDesCArrayFlat* showKeystrokeArray = popup->ShowKeystrokeArray();
       
   188     TInt currentSelect = popup->CurrentSelection();
       
   189     TInt inEffectSpellingCount = ptiengine->PhoneticSpellingCount();
       
   190     TInt offset = 0;
       
   191     
       
   192     TBuf<1> keyBuf;
       
   193     TBuf<1> keyShow;
       
   194     TBuf<KMaxKeystrokeCount> keystrokeBuf;
       
   195     
       
   196     if(aKey == EKeyBackspace)
       
   197         {
       
   198         TBool state = ETrue;
       
   199         if ( popup->IsChangeStatet() && aLength == ELongKeyPress )
       
   200             {
       
   201             state = EFalse;
       
   202             }
       
   203         else
       
   204             {
       
   205             popup->SetChangeState( EFalse );
       
   206             }
       
   207         if ( state )
       
   208             {
       
   209             DeleteCurrentKeystroke();
       
   210             showKeystrokeArray->Delete( showKeystrokeArray->Count() - 1 );
       
   211             showKeystrokeArray->Compress();
       
   212             if ( inEffectKeystrokeArray->Count()> 0 )
       
   213                 {
       
   214                 ImplicitlyUpdateSelection();
       
   215                 }
       
   216             else
       
   217                 {
       
   218                 ClearDeliberateSelection();
       
   219                 iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI.
       
   220                 if (aLength == ELongKeyPress)
       
   221                     {
       
   222                     iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue);
       
   223                     }
       
   224                 }
       
   225             }
       
   226         }
       
   227     else if(aKey == EKeyRightArrow)
       
   228         {
       
   229         if(popup->IsEnabled())
       
   230             {
       
   231             if(popup->SelectNextPhrase())
       
   232                 {
       
   233                 DeliberatelyUpdateSelection();
       
   234                 }
       
   235             }
       
   236         }
       
   237     else if(aKey == EKeyLeftArrow)
       
   238         {
       
   239         if(popup->IsEnabled())
       
   240             {
       
   241             if(popup->SelectPrevPhrase())
       
   242                 {
       
   243                 DeliberatelyUpdateSelection();
       
   244                 }
       
   245             }
       
   246         }
       
   247     else if( ( aKey == EKeyOK || aKey == EKeyDownArrow || aKey == EKeyCBA1)
       
   248         && aLength == EShortKeyPress)
       
   249         {
       
   250         if ( ( currentSelect < inEffectSpellingCount) && 
       
   251             ( keystrokeArray->Count() == inEffectKeystrokeArray->Count() ) &&
       
   252             ( popup->GetTonemarkState() ) )
       
   253             {
       
   254             if(popup->IsEnabled())
       
   255                 {
       
   256                 popup->Enable(EFalse);
       
   257                 }
       
   258             iOwner->FepMan()->PinyinPhraseCreation( EFalse );
       
   259             popup->SetChangeState( ETrue );
       
   260             iOwner->ChangeState(ECandidate);              
       
   261             }
       
   262         else
       
   263             {
       
   264             GetKeystrokeBuf( *keystrokeArray, keystrokeBuf );
       
   265             iOwner->FepMan()->PinyinPhraseCreation( ETrue );
       
   266             popup->SetChangeState( ETrue );
       
   267             popup->SetPhraseCreationState( ETrue );
       
   268             if ( GetChangeState() )
       
   269                 {
       
   270                 ClearDeliberateSelection();
       
   271                 popup->Enable( EFalse );
       
   272                 iOwner->ChangeState(ESpellingSelection);
       
   273                 }
       
   274             else
       
   275                 {
       
   276                 ClearDeliberateSelection();
       
   277                 popup->Enable( EFalse );
       
   278                 iOwner->ChangeState(EKeySequenceEdit);
       
   279                 }
       
   280             }
       
   281         }
       
   282     else if (aLength == EShortKeyPress) // don't want repeats on these keys
       
   283         {
       
   284     	iOwner->FepMan()->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp);            
       
   285         
       
   286         if ( ( iOwner->IsValidChineseInputKey(aKey) ) &&
       
   287              ( CheckKeystroke( aKey, *keystrokeArray ) ) )
       
   288             {
       
   289             TInt stringBeforeLength(0);
       
   290             TInt stringAfterLength(0);
       
   291             GetKeystrokeNum( aKey, keyBuf );
       
   292             keystrokeArray->AppendL( keyBuf );
       
   293             showKeystrokeArray->AppendL( keyBuf );
       
   294             
       
   295             if ( popup->GetTonemarkState() )
       
   296                 {
       
   297             stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length();
       
   298             stringAfterLength = ptiengine->AppendKeyPress((TPtiKey)aKey).Length();
       
   299                 if (stringBeforeLength != stringAfterLength)
       
   300                     {
       
   301                     if (ptiengine->GetPhoneticSpelling(1).Length() == 1)
       
   302                         {
       
   303                         iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT);
       
   304                         }
       
   305                     inEffectKeystrokeArray->AppendL(keyBuf);
       
   306                     ImplicitlyUpdateSelection();
       
   307                     }
       
   308                 else
       
   309                     {
       
   310                     ptiengine->EnableToneMarks(ETrue);
       
   311                     UIContainer()->PinyinPopupWindow()->SetFlag(MAknFepUICtrlPinyinPopup::ESpellingChanged);
       
   312                     RefreshUI(0);
       
   313                     } 
       
   314                 }
       
   315             else
       
   316                 {
       
   317                 ImplicitlyUpdateSelection();
       
   318                 }
       
   319             }
       
   320         else if ( ( aKey == EPtiKeyStar ) &&  
       
   321                   ( CheckKeystroke( aKey, *keystrokeArray ) ) ) // we increment the tone mark.
       
   322             {
       
   323             keyBuf.Append( EPtiKeyStar );
       
   324             
       
   325             if ( keystrokeArray->Count() == inEffectKeystrokeArray->Count() )
       
   326                 {
       
   327                 inEffectKeystrokeArray->AppendL(keyBuf);
       
   328                 keystrokeArray->AppendL( keyBuf );
       
   329                 GetPinyinToneMark( *keystrokeArray, keyShow );
       
   330                 ShowKeystrokeAppendL( *showKeystrokeArray, *keystrokeArray, keyShow );
       
   331                 CheckTonemarkL();
       
   332                 }
       
   333             else
       
   334                 {
       
   335                 keystrokeArray->AppendL( keyBuf );
       
   336                 GetPinyinToneMark( *keystrokeArray, keyShow );
       
   337                 ShowKeystrokeAppendL( *showKeystrokeArray, *keystrokeArray, keyShow );
       
   338                 for ( TInt i = keystrokeArray->Count() - 1; i >= 0; i-- )
       
   339                     {
       
   340                     if ( 0 == keystrokeArray->MdcaPoint( i ).
       
   341                             Compare( KPinyinStar ) )
       
   342                         {
       
   343                         offset = offset + 1;
       
   344                         }
       
   345                     else
       
   346                         {
       
   347                         break;
       
   348                         }
       
   349                     }
       
   350                 if ( offset > KMaxStarCount )
       
   351                     {
       
   352                     for ( TInt j = 0; j < KMaxStarCount; ++j )
       
   353                         {
       
   354                         keystrokeArray->Delete( keystrokeArray->Count() - 1 );
       
   355                         }
       
   356                     keystrokeArray->Compress();
       
   357                     }
       
   358                 }
       
   359             ImplicitlyUpdateSelection();
       
   360             }
       
   361         else
       
   362             {
       
   363             iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
       
   364             }
       
   365         }
       
   366     return ETrue;
       
   367     }
       
   368 
       
   369 // ---------------------------------------------------------
       
   370 // Optimize spelling
       
   371 // ---------------------------------------------------------
       
   372 //
       
   373 void TAknFepInputStateEntryPinyinPhrase::OptimizeSpellingL( CDesCArrayFlat& aOptimizeBefore, CDesCArrayFlat& aOptimizeAfter )
       
   374     {
       
   375     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   376     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   377     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
   378     TBool checkSeparator = EFalse;
       
   379     TBuf<KMaxPinyinLength> spellingBuf;
       
   380     TInt bufLength = 0;
       
   381     TInt countSeparator = 0;
       
   382 
       
   383     TInt countBuf[KMaxPhraseCount];
       
   384     memset( countBuf, 0, sizeof( countBuf ) );
       
   385     
       
   386     TInt position = 0;
       
   387     TInt i = 0;
       
   388     TInt j = 0;
       
   389     
       
   390     if ( 0 == inEffectKeystrokeArray->Count() )
       
   391         {
       
   392         return;
       
   393         }
       
   394     
       
   395     for ( i = 0 ; i < inEffectKeystrokeArray->Count(); ++i )
       
   396         {
       
   397         if ( 0 == inEffectKeystrokeArray->MdcaPoint( i ).Compare( KPinyinListSeparator ) )
       
   398             {
       
   399             checkSeparator = ETrue;
       
   400             countBuf[countSeparator] = j;
       
   401             countSeparator = countSeparator + 1;
       
   402             }
       
   403         else
       
   404             {
       
   405             if (  0 == i  )
       
   406                 {
       
   407                 j = j + 1;
       
   408                 }
       
   409             else
       
   410                 {
       
   411                 if ( ( 0 == inEffectKeystrokeArray->MdcaPoint( i ).Compare( KPinyinStar ) ) &&
       
   412                     ( 0 != inEffectKeystrokeArray->MdcaPoint( i - 1 ).Compare( KPinyinStar ) ))
       
   413                     {
       
   414                     j = j + 1;
       
   415                     }
       
   416                 else if ( 0 != inEffectKeystrokeArray->MdcaPoint( i ).Compare( KPinyinStar ) )
       
   417                     {
       
   418                     j = j + 1;
       
   419                     }
       
   420                 }
       
   421             }
       
   422         }
       
   423   
       
   424     j = 0;
       
   425     for ( i = 0; i < aOptimizeBefore.Count(); ++i )
       
   426         {
       
   427         j = 0;
       
   428         bufLength = 0;
       
   429         position = 0;
       
   430         spellingBuf.Size();
       
   431         spellingBuf.Copy( aOptimizeBefore.MdcaPoint( i ) );
       
   432         bufLength = spellingBuf.Length();
       
   433         while( j < bufLength )
       
   434             {
       
   435             position = spellingBuf.Find( KPinyinListSeparator );
       
   436             if ( position != KErrNotFound )
       
   437                 {
       
   438                 spellingBuf.Replace( position, 1, KPinyinManualSeparator );
       
   439                 j = position + 1;
       
   440                 }
       
   441             else
       
   442                 {
       
   443                 break;
       
   444                 }
       
   445             }
       
   446         aOptimizeAfter.AppendL( spellingBuf );
       
   447         }    
       
   448     
       
   449     if ( !checkSeparator )
       
   450         {
       
   451         return;
       
   452         }
       
   453     
       
   454     aOptimizeBefore.Reset();
       
   455     aOptimizeBefore.Compress();
       
   456     
       
   457     for ( i = 0; i < aOptimizeAfter.Count(); ++i )
       
   458         {
       
   459         aOptimizeBefore.AppendL( aOptimizeAfter.MdcaPoint( i ) );
       
   460         }
       
   461     
       
   462     aOptimizeAfter.Reset();
       
   463     aOptimizeAfter.Compress();
       
   464     
       
   465 
       
   466     for ( TInt k = 0; k < aOptimizeBefore.Count(); ++k )
       
   467         {
       
   468         j = 0;
       
   469         bufLength = 0;
       
   470         position = 0;
       
   471         spellingBuf.Size();
       
   472         spellingBuf.Copy( aOptimizeBefore.MdcaPoint( k ) );
       
   473         bufLength = spellingBuf.Length();
       
   474         for ( TInt kk = 0; kk < bufLength; ++kk )
       
   475             {
       
   476             if ( 0 == spellingBuf.Mid( kk, 1 ).Compare( KPinyinManualSeparator ) )
       
   477                 {
       
   478                 for ( TInt kkk = 0; kkk < countSeparator; ++kkk)
       
   479                     {
       
   480                     if ( j == countBuf[kkk] )
       
   481                         {
       
   482                         spellingBuf.Replace( kk, 1, KPinyinListSeparator );
       
   483                         }
       
   484                     }
       
   485                 }
       
   486             else
       
   487                 {
       
   488                 j = j + 1;
       
   489                 }
       
   490             }
       
   491         aOptimizeAfter.AppendL( spellingBuf );
       
   492         }
       
   493     }
       
   494 void TAknFepInputStateEntryPinyinPhrase::DeliberatelyUpdateSelection()
       
   495     {
       
   496     TPtr deliberateSelection = iOwner->GetLatestDeliberateSelection();
       
   497     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   498     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   499     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   500 
       
   501     TInt selected = popup->CurrentSelection();
       
   502     ptiengine->EnableToneMarks(EFalse);
       
   503     TPtrC spelling = ptiengine->GetPhoneticSpelling(selected + 1); // our index is zero based, engine index is one based
       
   504     deliberateSelection = spelling.Left(
       
   505                         MAknFepUICtrlInputPane::EMaxInputCharsPinyinPopupNotIncludingToneMark);
       
   506     ptiengine->EnableToneMarks(ETrue);
       
   507     UIContainer()->PinyinPopupWindow()->SetFlag(MAknFepUICtrlPinyinPopup::ESpellingNavigation);    
       
   508     RefreshUI(popup->CurrentVisibleSelection());
       
   509     }
       
   510 
       
   511 void TAknFepInputStateEntryPinyinPhrase::ImplicitlyUpdateSelection()
       
   512     {
       
   513     TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection();
       
   514     TInt oldDeliberateSelectionLength = oldDeliberateSelection.Length();
       
   515     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   516 
       
   517     // previously selected is compared in turn to each of the new candidates
       
   518     ptiengine->EnableToneMarks(EFalse);
       
   519     TInt pinyinCount = ptiengine->PhoneticSpellingCount();
       
   520     TInt newSelection = 0;
       
   521     for(TInt i = 0; i < pinyinCount; i++)
       
   522         {
       
   523         TPtrC spelling = ptiengine->GetPhoneticSpelling(i + 1);  // our index is zero based, engine index is one based
       
   524         TInt spellingLength = spelling.Length();
       
   525 
       
   526         // figure out how many characters we are comparing, this depends on the 
       
   527         // direction of the edit
       
   528         TInt compareLength = oldDeliberateSelectionLength <= spellingLength ? 
       
   529             oldDeliberateSelectionLength : spellingLength;
       
   530 
       
   531         if(oldDeliberateSelection.Left(compareLength) == spelling.Left(compareLength))
       
   532             {
       
   533             // as soon as a substring match is found, the 
       
   534             // highlight position is set to that candidate in the new list. 
       
   535             // note that in the case of the first character entered, the
       
   536             // oldBuf will be empty so it will always match... which is 
       
   537             // fine as we want to select the top one anyway, so we will
       
   538             // quit the loop early.
       
   539             newSelection = i;
       
   540             break;
       
   541             }
       
   542         }
       
   543     
       
   544         ptiengine->EnableToneMarks(ETrue);
       
   545         UIContainer()->PinyinPopupWindow()->SetFlag(MAknFepUICtrlPinyinPopup::ESpellingChanged);
       
   546     	RefreshUI(newSelection);
       
   547     }
       
   548 
       
   549 void TAknFepInputStateEntryPinyinPhrase::ClearDeliberateSelection()
       
   550     {
       
   551     // we must have just deleted the last character, 
       
   552     // or we are starting a new pinyin session, so wipe the last deliberate selection
       
   553     TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection();
       
   554     oldDeliberateSelection = KNullDesC;
       
   555     }
       
   556 
       
   557 void TAknFepInputStateEntryPinyinPhrase::RefreshUI(TInt aSelection)
       
   558     {
       
   559     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   560     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   561     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   562     MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane();
       
   563     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
   564     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
   565     CDesCArrayFlat* showKeystrokeArray = popup->ShowKeystrokeArray();
       
   566     CDesCArrayFlat* optimizeSpelling = popup->PhoneticSpellingArray();
       
   567     CDesCArrayFlat* spelling = popup->OptimizeSpelling();
       
   568         
       
   569     TBuf<KMaxKeystrokeCount> keystrokeBuf;
       
   570     
       
   571     // get cursor position
       
   572     TPoint baseLine = TPoint(0,0);
       
   573     TInt height = 0;
       
   574     TInt ascent = 0;
       
   575 
       
   576     TBool checkTonemark = popup->GetTonemarkState();
       
   577     TRAPD(ret,iOwner->FepMan()->GetScreenCoordinatesL(baseLine,height,ascent));
       
   578     if (ret == KErrNone)
       
   579         {
       
   580         uiContainer->SetContainerPosition(baseLine, height);    
       
   581         }
       
   582 
       
   583     TText toneMark;
       
   584     TBool toneMarkEntered = ptiengine->ToneMark(toneMark);
       
   585     TBuf<1> validToneMarkBuf;
       
   586     if(toneMarkEntered)
       
   587         {
       
   588         // override specific invalid tonemark character only, the others are the same character 
       
   589         // when both valid and invalid
       
   590         if(toneMark == KPinyinTone4Invalid)
       
   591             toneMark = KPinyinTone4Valid;
       
   592         validToneMarkBuf.Append(toneMark);
       
   593         }
       
   594 
       
   595     // to start with, disable the tone marks so we can get the list of all pinyin matches
       
   596     // later we will figure out which ones are invalid
       
   597     ptiengine->EnableToneMarks(EFalse);
       
   598     TInt pinyinCountWithoutToneMarks = ptiengine->PhoneticSpellingCount();
       
   599     if(pinyinCountWithoutToneMarks > 0)
       
   600         {
       
   601         if(popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingChanged))
       
   602             {
       
   603             if ( ( inEffectKeystrokeArray->Count() < keystrokeArray->Count() ) ||
       
   604                 ( !checkTonemark ) )
       
   605                 {
       
   606                 spelling->Reset();
       
   607                 optimizeSpelling->Reset();
       
   608                 spelling->Compress();
       
   609                 optimizeSpelling->Compress();
       
   610                 }
       
   611             else
       
   612                 {
       
   613                 spelling->Reset();
       
   614                 optimizeSpelling->Reset();
       
   615                 spelling->Compress();
       
   616                 optimizeSpelling->Compress();
       
   617             TRAPD(ignore, ptiengine->GetPhoneticSpellingsL(*spelling));
       
   618             if (ignore != KErrNone)
       
   619                     {
       
   620                     return;
       
   621                     }
       
   622                 
       
   623                 TRAPD( iOptimize, OptimizeSpellingL( *spelling, *optimizeSpelling ) );
       
   624                 if ( KErrNone != iOptimize )
       
   625                     {
       
   626                     return;
       
   627                     }
       
   628                 }
       
   629             
       
   630             GetKeystrokeBuf( *showKeystrokeArray, keystrokeBuf );
       
   631             
       
   632             TRAPD( retOptimize, optimizeSpelling->AppendL( keystrokeBuf ) );
       
   633             if ( KErrNone != retOptimize )
       
   634                 {
       
   635                 return;
       
   636                 }
       
   637             popup->SplitPhraseSpellingIntoPages(); 
       
   638             }
       
   639 
       
   640         // set display page for delibrate selection
       
   641         popup->SetDisplayPage(aSelection);
       
   642         popup->SetPhraseItemTexts();
       
   643  
       
   644         // fill in input pane although it's invisible
       
   645         if ( inEffectKeystrokeArray->Count() < keystrokeArray->Count() )
       
   646             {
       
   647             inputPane->SetText( keystrokeBuf );    
       
   648             }
       
   649         else
       
   650             {
       
   651             if ( optimizeSpelling->Count() > popup->CurrentSelection() )
       
   652                 {
       
   653                 inputPane->SetText( optimizeSpelling->MdcaPoint( popup->CurrentSelection() ) );
       
   654                 }
       
   655             else
       
   656                 {
       
   657                 inputPane->SetText( KNullDesC );
       
   658                 }
       
   659             }
       
   660         popup->PopupSizeChanged(); // phrase input
       
   661         }
       
   662     // turn tone marks back on so that we know where we are.
       
   663     ptiengine->EnableToneMarks(ETrue);
       
   664 
       
   665     // this is where we start to figure out whether the tonemarks are valid,
       
   666     // whether the selected tonemark is valid, and what is the index of the 
       
   667     // selected candidate in the list of candidates with tonemarks...
       
   668     TBool selectionToneMarkValid = EFalse;
       
   669     TInt selectionIndexAdjustedForToneMarkValidity = popup->CurrentSelection();
       
   670     
       
   671     // we only need to deal with tone marks if there is one
       
   672     if(toneMarkEntered)
       
   673         {
       
   674         if(pinyinCountWithoutToneMarks > 0)
       
   675             {
       
   676             for(TInt i = 0; i < pinyinCountWithoutToneMarks; i++)
       
   677                 {
       
   678                 TBool valid = EFalse;
       
   679                 
       
   680                 TBuf<MAknFepUICtrlInputPane::EMaxInputCharsPinyinPopupNotIncludingToneMark> nextCandidateWithoutToneMark;
       
   681                 nextCandidateWithoutToneMark.Copy(ptiengine->GetPhoneticSpelling(i + 1).Left(
       
   682                       MAknFepUICtrlInputPane::EMaxInputCharsPinyinPopupNotIncludingToneMark));
       
   683                 
       
   684                 ptiengine->EnableToneMarks(EFalse); 
       
   685                 ptiengine->SelectPhoneticSpelling(i + 1);
       
   686 
       
   687                 valid = ptiengine->IsToneMarkValidForSpelling();
       
   688                 if(valid)
       
   689                     {
       
   690                     ptiengine->EnableToneMarks(ETrue); 
       
   691                     TInt pinyinCountWithToneMarks = ptiengine->PhoneticSpellingCount();
       
   692 
       
   693                     for(TInt j = 0; j < pinyinCountWithToneMarks; j++)
       
   694                         {
       
   695                         // use j here not i as we are looking at the list with tonemarks
       
   696                         TPtrC nextCandidateWithToneMark = ptiengine->GetPhoneticSpelling(j + 1);  
       
   697                         if(nextCandidateWithToneMark == nextCandidateWithoutToneMark)
       
   698                             {
       
   699                             if(i == aSelection)
       
   700                                 {
       
   701                                 selectionToneMarkValid = ETrue;
       
   702                                 
       
   703                                 // fill in input pane even if it can't be seen, for when we have to hide popup window
       
   704                                 inputPane->SetText(nextCandidateWithoutToneMark);
       
   705                                 }
       
   706                             break;
       
   707                             }
       
   708                         }
       
   709                     }
       
   710                 }
       
   711             }
       
   712         }
       
   713     ptiengine->EnableToneMarks(EFalse); 
       
   714     ptiengine->SelectPhoneticSpelling(popup->CurrentSelection() + 1); 
       
   715     // next two lines are for tonemark validity
       
   716     ptiengine->EnableToneMarks(selectionToneMarkValid); 
       
   717     ptiengine->SelectPhoneticSpelling(selectionIndexAdjustedForToneMarkValidity + 1); // our index is zero based, engine index is one based
       
   718 
       
   719     // update the candidate pane.
       
   720     if(popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingChanged) 
       
   721         || popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingNavigation))
       
   722         {
       
   723         CDesCArrayFlat* phraseCandidates = uiContainer->CandidatePane()->CandidateArray();
       
   724         if ( ( pinyinCountWithoutToneMarks > popup->CurrentSelection() ) && 
       
   725              ( inEffectKeystrokeArray->Count() == keystrokeArray->Count() ) && 
       
   726              checkTonemark )      
       
   727             {
       
   728             TRAPD(ignore, ptiengine->GetChinesePhraseCandidatesL(*phraseCandidates));
       
   729             if (ignore != KErrNone)
       
   730                 {
       
   731                 return;
       
   732                 }            
       
   733             }        
       
   734         else if ( keystrokeArray->Count() != 0 )
       
   735             {
       
   736             phraseCandidates->Reset();
       
   737             TRAPD( retAddPinyinNote, phraseCandidates->AppendL( KPinyinNote ) );
       
   738             if ( KErrNone != retAddPinyinNote )
       
   739                 {
       
   740                 return;
       
   741                 }
       
   742             }
       
   743         uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages(); 
       
   744         popup->ClearFlag(MAknFepUICtrlPinyinPopup::ESpellingChanged 
       
   745                         | MAknFepUICtrlPinyinPopup::ESpellingNavigation);
       
   746         }
       
   747     uiContainer->CandidatePane()->SetCandidateBuffer();
       
   748     uiContainer->Enable(ETrue);
       
   749     // need to enable the pinyin popup after the container so that it is raised to the front
       
   750     popup->Enable(pinyinCountWithoutToneMarks > 0);
       
   751     UpdateIndicator();
       
   752     }
       
   753 
       
   754 void TAknFepInputStateEntryPinyinPhrase::InitializeStateL(void)
       
   755     {
       
   756     iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT);
       
   757     }
       
   758     
       
   759 void TAknFepInputStateEntryPinyinPhrase::UpdateIndicator()
       
   760     {
       
   761     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   762     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();        
       
   763     TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length();
       
   764     MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
       
   765         
       
   766     if (candidatePane->IsFirstPage())
       
   767         {
       
   768         uiContainer->CandidatePane()->ShowUpScrollArrows(EFalse);    
       
   769         }
       
   770     else
       
   771         {
       
   772         uiContainer->CandidatePane()->ShowUpScrollArrows(ETrue);    
       
   773         }
       
   774    
       
   775     if (candidatePane->IsLastPage())
       
   776         {
       
   777         uiContainer->CandidatePane()->ShowDownScrollArrows(EFalse);     
       
   778         }
       
   779     else
       
   780    	    {
       
   781    	    uiContainer->CandidatePane()->ShowDownScrollArrows(ETrue);      
       
   782    	    }
       
   783         
       
   784     if (candidatePane->SelectedIndex() == 0 && 
       
   785         candidatePane->IsFirstPage() )
       
   786         {
       
   787         uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse);
       
   788         }
       
   789     else
       
   790         {
       
   791         uiContainer->CandidatePane()->ShowLeftScrollArrows(ETrue);
       
   792         }
       
   793         
       
   794     if (candidatePane->IsLastPage() && 
       
   795         (candidatePane->SelectedIndex() == candidatePane->VisibleCandidateCount() - 1))
       
   796         {
       
   797         uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse);        
       
   798         }
       
   799     else
       
   800         {
       
   801         uiContainer->CandidatePane()->ShowRightScrollArrows(ETrue);
       
   802         }
       
   803     } 
       
   804 // ---------------------------------------------------------
       
   805 // Delete current keystroke.
       
   806 // ---------------------------------------------------------
       
   807 //
       
   808 void TAknFepInputStateEntryPinyinPhrase::DeleteCurrentKeystroke()
       
   809     {
       
   810     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   811     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   812     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
   813     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
   814     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
   815     TInt i = keystrokeArray->Count() - 1;
       
   816     TInt count = keystrokeArray->Count() - 1;
       
   817     TInt inECTKeystrokeCount = inEffectKeystrokeArray->Count();
       
   818     TInt validCount = 0;
       
   819     
       
   820     if ( keystrokeArray->Count() > inEffectKeystrokeArray->Count() )
       
   821         {
       
   822         for ( i = keystrokeArray->Count() - 1; i >= 0; i-- )
       
   823             {
       
   824             if ( 0 == keystrokeArray->MdcaPoint( i ).Compare( KPinyinStar ) )
       
   825                 {
       
   826                 keystrokeArray->Delete( i );
       
   827                 }
       
   828             else
       
   829                 {
       
   830                 if ( i == count )
       
   831                     {
       
   832                     keystrokeArray->Delete( i );
       
   833                     break;
       
   834                     }
       
   835                 break;
       
   836                 }
       
   837            }
       
   838         }
       
   839     else
       
   840         {
       
   841         for ( TInt j = 0; j < inECTKeystrokeCount; ++j )
       
   842             {            
       
   843             if ( 0 != inEffectKeystrokeArray->
       
   844                 MdcaPoint( j ).Compare( KPinyinStar ) )
       
   845                  {
       
   846                  validCount = validCount + 1;
       
   847                  }
       
   848             if ( j > 1 )
       
   849                 {
       
   850                 if ( ( 0 != inEffectKeystrokeArray->MdcaPoint( j ).
       
   851                     Compare( KPinyinStar ) ) && 
       
   852                     ( 0 == inEffectKeystrokeArray->MdcaPoint( j - 1).
       
   853                         Compare( KPinyinStar ) ) )
       
   854                      {
       
   855                      validCount = validCount + 1;
       
   856                      }
       
   857                 if  ( ( j == inECTKeystrokeCount - 1 ) && 
       
   858                     ( 0 == inEffectKeystrokeArray->MdcaPoint( j ).
       
   859                         Compare( KPinyinStar ) ) )
       
   860                     {
       
   861                     validCount = validCount + 1;
       
   862                     }
       
   863                 }
       
   864             }
       
   865         
       
   866         if ( inEffectKeystrokeArray->Count() > 0 )
       
   867             {
       
   868             if ( 0 == inEffectKeystrokeArray->MdcaPoint( 
       
   869                 inEffectKeystrokeArray->Count() - 1 ).Compare( KPinyinStar ) )
       
   870                 {
       
   871                 popup->SetTonemarkState( ETrue );
       
   872                 }
       
   873             }
       
   874         
       
   875         if ( 0 == keystrokeArray->MdcaPoint( keystrokeArray->Count() - 1 ).
       
   876             Compare( KPinyinStar ) )
       
   877             {
       
   878             ptiengine->DeleteKeyPress();
       
   879             for ( i = keystrokeArray->Count() - 1; i >= 0; i-- )
       
   880                 {
       
   881                 if ( 0 == keystrokeArray->MdcaPoint( i ).Compare( KPinyinStar ) )
       
   882                     {
       
   883                     keystrokeArray->Delete( i );
       
   884                     inEffectKeystrokeArray->Delete(i);
       
   885                     }
       
   886                 else
       
   887                     {
       
   888                     break;
       
   889                     }
       
   890                 }
       
   891             }
       
   892         else
       
   893             {
       
   894             keystrokeArray->Delete( i );
       
   895             inEffectKeystrokeArray->Delete(i);
       
   896             ptiengine->DeleteKeyPress();
       
   897             }
       
   898         }
       
   899     keystrokeArray->Compress();
       
   900     inEffectKeystrokeArray->Compress();
       
   901     }
       
   902 
       
   903 // ---------------------------------------------------------
       
   904 // Add current keystroke.
       
   905 // ---------------------------------------------------------
       
   906 void TAknFepInputStateEntryPinyinPhrase::AddCurrentKeystrokeL( const TDesC& keystroke )
       
   907     {
       
   908     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
   909     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
   910     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
   911     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
   912     const TInt offsetSize = 4;
       
   913     TInt count = keystrokeArray->Count();
       
   914     TInt offset = 0;
       
   915     TInt i = count - 1;
       
   916     
       
   917     if ( 0 != keystroke.Compare( KPinyinStar ) )
       
   918         {
       
   919         if ( keystrokeArray->Count() > inEffectKeystrokeArray->Count() )
       
   920             {
       
   921             keystrokeArray->AppendL( keystroke );
       
   922             keystrokeArray->Compress();
       
   923             return;
       
   924             }
       
   925         else
       
   926             {
       
   927             keystrokeArray->AppendL( keystroke );
       
   928             keystrokeArray->Compress();
       
   929             inEffectKeystrokeArray->AppendL( keystroke );
       
   930             inEffectKeystrokeArray->Compress();
       
   931             return;
       
   932             }
       
   933         }
       
   934     
       
   935     for ( i = count - 1; i >= 0; i-- )
       
   936         {
       
   937         if ( 0 == keystrokeArray->MdcaPoint( i ).Compare( KPinyinStar ) )
       
   938             {
       
   939             offset = offset + 1;
       
   940             }
       
   941         else
       
   942             {
       
   943             break;
       
   944             }
       
   945         }     
       
   946     if ( ( 0 <= offset ) && ( offset <= offsetSize ) )
       
   947         {
       
   948         if ( keystrokeArray->Count() > inEffectKeystrokeArray->Count() )
       
   949             {
       
   950             keystrokeArray->AppendL( keystroke );
       
   951             keystrokeArray->Compress();
       
   952             }
       
   953         else
       
   954             {
       
   955             keystrokeArray->AppendL( keystroke );
       
   956             keystrokeArray->Compress();
       
   957             inEffectKeystrokeArray->AppendL( keystroke );
       
   958             inEffectKeystrokeArray->Compress();
       
   959             }
       
   960         }
       
   961     else
       
   962         {
       
   963         if ( keystrokeArray->Count() > inEffectKeystrokeArray->Count() )
       
   964             {
       
   965             for ( TInt ii = 0; ii < offsetSize; ++ii )
       
   966             {
       
   967                 keystrokeArray->Delete( count - 1 -ii );
       
   968             }
       
   969             keystrokeArray->Compress();
       
   970             }
       
   971         else
       
   972             {
       
   973             for ( TInt ii = 0; ii < offsetSize; ++ii )
       
   974             {
       
   975                 keystrokeArray->Delete( count - 1 -ii );
       
   976                 inEffectKeystrokeArray->Delete( count - 1 -ii );
       
   977             }
       
   978             keystrokeArray->Compress();
       
   979             inEffectKeystrokeArray->Compress();
       
   980             }
       
   981         }    
       
   982     }
       
   983 
       
   984 
       
   985 // ---------------------------------------------------------
       
   986 // Get the keystroke.
       
   987 // ---------------------------------------------------------
       
   988 //
       
   989 void TAknFepInputStateEntryPinyinPhrase::GetKeystrokeNum( TInt aKey, TDes& aKeystroke ) 
       
   990     {
       
   991     switch(aKey)
       
   992         {
       
   993         case KKey0Code:
       
   994             aKeystroke.Append( KPinyinListSeparator );
       
   995             break;
       
   996         case KKey1Code:
       
   997             aKeystroke.Append( KPinyinListSeparator );
       
   998             break;
       
   999         case KKey2Code:
       
  1000             aKeystroke.Append(EPtiKey2);
       
  1001             break;
       
  1002         case KKey3Code:
       
  1003             aKeystroke.Append(EPtiKey3);
       
  1004             break;
       
  1005         case KKey4Code:
       
  1006             aKeystroke.Append(EPtiKey4);
       
  1007             break;
       
  1008         case KKey5Code:
       
  1009             aKeystroke.Append(EPtiKey5);
       
  1010             break;
       
  1011         case KKey6Code:
       
  1012             aKeystroke.Append(EPtiKey6);
       
  1013             break;
       
  1014         case KKey7Code:
       
  1015             aKeystroke.Append(EPtiKey7);
       
  1016             break;
       
  1017         case KKey8Code:
       
  1018             aKeystroke.Append(EPtiKey8);
       
  1019             break;
       
  1020         case KKey9Code:
       
  1021             aKeystroke.Append(EPtiKey9);
       
  1022             break;
       
  1023         default:
       
  1024             aKeystroke.Append(EPtiKeyStar);
       
  1025             break;
       
  1026         }
       
  1027     }
       
  1028 
       
  1029 // ---------------------------------------------------------
       
  1030 // Get the keystroke buf.
       
  1031 // ---------------------------------------------------------
       
  1032 //
       
  1033 void TAknFepInputStateEntryPinyinPhrase::GetKeystrokeBuf(const CDesCArrayFlat& aKeystrokeArray, TDes& aKeystrokeBuf )
       
  1034     {
       
  1035     for ( TInt i = 0; i < aKeystrokeArray.Count(); ++i )
       
  1036         {
       
  1037         aKeystrokeBuf.Append(aKeystrokeArray.MdcaPoint(i));
       
  1038         }
       
  1039     }
       
  1040 
       
  1041 // ---------------------------------------------------------
       
  1042 // clear keystroke.
       
  1043 // ---------------------------------------------------------
       
  1044 //
       
  1045 void TAknFepInputStateEntryPinyinPhrase::ClearKeystrokeBuf()
       
  1046     {
       
  1047     MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
       
  1048     MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
       
  1049     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
  1050     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
  1051     CDesCArrayFlat* showKeystrokeArray = popup->ShowKeystrokeArray();
       
  1052     CDesCArrayFlat* chooseChineseArray = popup->ChooseChineseCharacterArray();
       
  1053     CDesCArrayFlat* chooseChienseKeystroke = popup->ChooseChineseCharacterArrayKeystroke();
       
  1054     
       
  1055     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
  1056     TInt pinyinCount = ptiengine->PhoneticSpellingCount();
       
  1057     chooseChineseArray->Reset();
       
  1058     chooseChienseKeystroke->Reset();
       
  1059     
       
  1060     if ( 0 == pinyinCount )
       
  1061         {
       
  1062         keystrokeArray->Reset();
       
  1063         inEffectKeystrokeArray->Reset();
       
  1064         showKeystrokeArray->Reset();
       
  1065         }
       
  1066     }
       
  1067 
       
  1068 // ---------------------------------------------------------
       
  1069 // Get tome mark.
       
  1070 // ---------------------------------------------------------
       
  1071 //
       
  1072 void TAknFepInputStateEntryPinyinPhrase::GetPinyinToneMark( const CDesCArrayFlat& aKeystrokeArray, TDes& aPinyinToneMark )
       
  1073     {
       
  1074     TInt starCount = 0;
       
  1075     TInt pinyinToneMark;
       
  1076     TBuf<1> buf;
       
  1077     TInt count = aKeystrokeArray.Count();
       
  1078     const TInt toneMark0 = 0;
       
  1079     const TInt toneMark1 = 1;
       
  1080     const TInt toneMark2 = 2;
       
  1081     const TInt toneMark3 = 3;
       
  1082     const TInt toneMark4 = 4;
       
  1083     
       
  1084     if ( 0 == count )
       
  1085         {
       
  1086         aPinyinToneMark.Append( KPinyinTone0Valid );
       
  1087         return;
       
  1088         }
       
  1089     
       
  1090     for ( TInt i = count - 1; i >= 0; --i )
       
  1091         {
       
  1092         buf = aKeystrokeArray.MdcaPoint( i );
       
  1093         if ( 0 == buf.Compare( KPinyinStar ) )
       
  1094             {
       
  1095             starCount = starCount + 1; 
       
  1096             }
       
  1097         else
       
  1098             {
       
  1099             break;
       
  1100             }
       
  1101         }
       
  1102     
       
  1103     if ( 0 == starCount )
       
  1104         {
       
  1105         aPinyinToneMark.Append( KPinyinTone0Valid );
       
  1106         }
       
  1107     else
       
  1108         {
       
  1109         pinyinToneMark = starCount % KMaxStarCount;
       
  1110         switch ( pinyinToneMark )
       
  1111             {
       
  1112             case toneMark0:
       
  1113                 aPinyinToneMark.Append( KPinyinTone4Valid );
       
  1114                 break;
       
  1115             case toneMark1:
       
  1116                 aPinyinToneMark.Append( KPinyinTone0Valid );
       
  1117                 break;
       
  1118             case toneMark2:
       
  1119                 aPinyinToneMark.Append( KPinyinTone1Valid );
       
  1120                 break;
       
  1121             case toneMark3:
       
  1122                 aPinyinToneMark.Append( KPinyinTone2Valid );
       
  1123                 break;
       
  1124             case toneMark4:
       
  1125                 aPinyinToneMark.Append( KPinyinTone3Valid );
       
  1126                 break;
       
  1127             default:
       
  1128                break;
       
  1129             }
       
  1130         }
       
  1131     }
       
  1132 
       
  1133 // ---------------------------------------------------------
       
  1134 // Check keystroke.
       
  1135 // ---------------------------------------------------------
       
  1136 //
       
  1137 TBool TAknFepInputStateEntryPinyinPhrase::CheckKeystroke( TInt aKey, const CDesCArrayFlat& aKeystrokeArray )
       
  1138     {
       
  1139     CDesCArrayFlat* showKeystrokeArray = UIContainer()->
       
  1140         PinyinPopupWindow()->ShowKeystrokeArray();
       
  1141     
       
  1142     TInt count = showKeystrokeArray->Count();
       
  1143     TBuf<1> keyBuf;
       
  1144     
       
  1145     if ( count >= KMaxShowKeystrokeCount )
       
  1146         {
       
  1147         if ( ( 0 != aKeystrokeArray.MdcaPoint( aKeystrokeArray.Count() - 1 ).
       
  1148             Compare( KPinyinStar ) ) || ( aKey != EPtiKeyStar )  )
       
  1149             {
       
  1150             return EFalse;
       
  1151             }
       
  1152         }
       
  1153     
       
  1154     GetKeystrokeNum( aKey, keyBuf );
       
  1155 
       
  1156     if ( 0 == aKeystrokeArray.Count() )
       
  1157         {        
       
  1158         if ( ( 0 == keyBuf.Compare ( KPinyinStar ) ) || ( 0 == keyBuf.Compare ( KPinyinListSeparator ) ) )
       
  1159             {
       
  1160             return EFalse;
       
  1161             }        
       
  1162         }
       
  1163     else
       
  1164         {
       
  1165         if ( 0 == aKeystrokeArray.MdcaPoint( aKeystrokeArray.Count() - 1 ).Compare( KPinyinStar ) && 
       
  1166             ( 0 == keyBuf.Compare ( KPinyinListSeparator ) ) )
       
  1167             {
       
  1168             return EFalse;
       
  1169             }
       
  1170         
       
  1171         if ( 0 == aKeystrokeArray.MdcaPoint( aKeystrokeArray.Count() - 1 ).Compare( KPinyinListSeparator ) && 
       
  1172             ( 0 == keyBuf.Compare ( KPinyinStar ) ) )
       
  1173             {
       
  1174             return EFalse;
       
  1175             }
       
  1176         }
       
  1177     return ETrue;
       
  1178     }
       
  1179 
       
  1180 // ---------------------------------------------------------
       
  1181 // Check tome mark.
       
  1182 // ---------------------------------------------------------
       
  1183 //
       
  1184 void TAknFepInputStateEntryPinyinPhrase::CheckTonemarkL()
       
  1185     {
       
  1186     CPtiEngine* ptiengine = iOwner->PtiEngine();
       
  1187     MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow();
       
  1188     CDesCArrayFlat* keystrokeArray = popup->KeystrokeArray();
       
  1189     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
  1190     CDesCArrayFlat* showKeystrokeArray = popup->ShowKeystrokeArray();
       
  1191     CDesCArrayFlat* spelling = popup->OptimizeSpelling();
       
  1192 
       
  1193     TInt tonemarkCount = 0;
       
  1194     TInt spellTonemarkCount = 0;
       
  1195     TInt keystrokeStarCount = 0;
       
  1196 
       
  1197     TInt offset = 0;
       
  1198     TInt i = 0;
       
  1199     TBool checkReturn = EFalse;
       
  1200     
       
  1201     TBuf<1> buf;
       
  1202     TBuf<1> lastTonemark;
       
  1203     TBuf<1> lastSpellTonemark;
       
  1204     TBuf<1> tonmarkBuf0;
       
  1205     TBuf<1> tonmarkBuf1;
       
  1206     TBuf<1> tonmarkBuf2;
       
  1207     TBuf<1> tonmarkBuf3;
       
  1208     TBuf<1> tonmarkBuf4;
       
  1209     TBuf<KMaxPinyinLength> spellBuf;
       
  1210     
       
  1211     tonmarkBuf0.Append( KPinyinTone0Valid );
       
  1212     tonmarkBuf1.Append( KPinyinTone1Valid );
       
  1213     tonmarkBuf2.Append( KPinyinTone2Valid );
       
  1214     tonmarkBuf3.Append( KPinyinTone3Valid );
       
  1215     tonmarkBuf4.Append( KPinyinTone4Valid );
       
  1216     
       
  1217     if ( 0 == inEffectKeystrokeArray->Count() )
       
  1218         {
       
  1219         popup->SetTonemarkState( EFalse );
       
  1220         return;
       
  1221         }
       
  1222     
       
  1223     if ( keystrokeArray->Count() > inEffectKeystrokeArray->Count() )
       
  1224         {
       
  1225         popup->SetTonemarkState( EFalse );
       
  1226         return;
       
  1227         }
       
  1228     
       
  1229     for ( i = 0; i < showKeystrokeArray->Count(); ++i )
       
  1230         {
       
  1231         buf.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1232         if ( 0 == buf.Compare( tonmarkBuf0 ) )
       
  1233             {
       
  1234             tonemarkCount = tonemarkCount + 1;
       
  1235             lastTonemark.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1236             }
       
  1237         else if ( 0 == buf.Compare( tonmarkBuf1 ) )
       
  1238             {
       
  1239             tonemarkCount = tonemarkCount + 1;
       
  1240             lastTonemark.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1241             }
       
  1242         else if ( 0 == buf.Compare( tonmarkBuf2 ) )
       
  1243             {
       
  1244             tonemarkCount = tonemarkCount + 1;
       
  1245             lastTonemark.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1246             }
       
  1247         else if ( 0 == buf.Compare( tonmarkBuf3 ) )
       
  1248             {
       
  1249             tonemarkCount = tonemarkCount + 1;
       
  1250             lastTonemark.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1251             }
       
  1252         else if ( 0 == buf.Compare( tonmarkBuf4 ) )
       
  1253             {
       
  1254             tonemarkCount = tonemarkCount + 1;
       
  1255             lastTonemark.Copy( showKeystrokeArray->MdcaPoint( i ) );
       
  1256             }
       
  1257         }
       
  1258     
       
  1259     if ( 0 == tonemarkCount )
       
  1260         {
       
  1261         popup->SetTonemarkState( ETrue );
       
  1262         return;
       
  1263         }
       
  1264 
       
  1265     for( i = 0; i < inEffectKeystrokeArray->Count(); ++i )
       
  1266         {
       
  1267         if ( 0 == inEffectKeystrokeArray->MdcaPoint( 
       
  1268             inEffectKeystrokeArray->Count() - 1 - i ).Compare( KPinyinStar ) )
       
  1269             {
       
  1270             keystrokeStarCount = keystrokeStarCount + 1;
       
  1271             }
       
  1272         else
       
  1273             {
       
  1274             break;
       
  1275             }
       
  1276         }
       
  1277     if ( keystrokeStarCount > 1 )
       
  1278         {
       
  1279         ptiengine->DeleteKeyPress();
       
  1280         }
       
  1281     
       
  1282     if ( keystrokeStarCount > KMaxStarCount )
       
  1283         {
       
  1284         offset = 1;
       
  1285         for ( i = 0; i < KMaxStarCount; ++i )
       
  1286             {
       
  1287             keystrokeArray->Delete( keystrokeArray->Count() - 1 );
       
  1288             inEffectKeystrokeArray->Delete( inEffectKeystrokeArray->Count() - 1 );
       
  1289             }
       
  1290         }
       
  1291     else
       
  1292         {
       
  1293         offset = keystrokeStarCount;
       
  1294         }
       
  1295     
       
  1296     if ( 0 == offset )
       
  1297         {
       
  1298         popup->SetTonemarkState( ETrue );
       
  1299         return;
       
  1300         }
       
  1301     else
       
  1302         {
       
  1303         for( i = 0; i < offset; ++i )
       
  1304             {
       
  1305             ptiengine->IncrementToneMark( ETrue );
       
  1306             spelling->Reset();
       
  1307             spelling->Compress();
       
  1308             ptiengine->GetPhoneticSpellingsL(*spelling);
       
  1309             for ( TInt j = 0; j < spelling->Count(); ++j )
       
  1310                 {
       
  1311                 spellTonemarkCount = 0;
       
  1312                 spellBuf.Copy( spelling->MdcaPoint( j ) );
       
  1313                 for ( TInt jj = 0; jj < spellBuf.Length(); ++jj )
       
  1314                     {
       
  1315                     if ( 0 == spellBuf.Mid( jj, 1 ).Compare( tonmarkBuf0 ) )
       
  1316                         {
       
  1317                         spellTonemarkCount = spellTonemarkCount + 1;
       
  1318                         lastSpellTonemark.Copy( tonmarkBuf0 );
       
  1319                         }
       
  1320                     else if ( 0 == spellBuf.Mid( jj, 1 ).Compare( tonmarkBuf1 ) )
       
  1321                         {
       
  1322                         spellTonemarkCount = spellTonemarkCount + 1;
       
  1323                         lastSpellTonemark.Copy( tonmarkBuf1 );
       
  1324                         }
       
  1325                     else if ( 0 == spellBuf.Mid( jj, 1 ).Compare( tonmarkBuf2 ) )
       
  1326                         {
       
  1327                         spellTonemarkCount = spellTonemarkCount + 1;
       
  1328                         lastSpellTonemark.Copy( tonmarkBuf2 );
       
  1329                         }
       
  1330                     else if ( 0 == spellBuf.Mid( jj, 1 ).Compare( tonmarkBuf3 ) )
       
  1331                         {
       
  1332                         spellTonemarkCount = spellTonemarkCount + 1;
       
  1333                         lastSpellTonemark.Copy( tonmarkBuf3 );
       
  1334                         }
       
  1335                     else if ( 0 == spellBuf.Mid( jj, 1 ).Compare( tonmarkBuf4 ) )
       
  1336                         {
       
  1337                         spellTonemarkCount = spellTonemarkCount + 1;
       
  1338                         lastSpellTonemark.Copy( tonmarkBuf4 );
       
  1339                         }
       
  1340                     }
       
  1341                 
       
  1342                 if ( ( tonemarkCount != spellTonemarkCount ) ||
       
  1343                     ( 0 != lastSpellTonemark.Compare( lastTonemark ) ))
       
  1344                     {
       
  1345                     checkReturn = EFalse;
       
  1346                     break;
       
  1347                     }
       
  1348                 else
       
  1349                     {
       
  1350                     checkReturn = ETrue;
       
  1351                     }
       
  1352                 }
       
  1353             if ( checkReturn )
       
  1354                 {
       
  1355                 break;
       
  1356                 }
       
  1357             }
       
  1358         }
       
  1359     
       
  1360     spelling->Reset();
       
  1361     spelling->Compress();
       
  1362     
       
  1363     if ( checkReturn )
       
  1364         {
       
  1365         popup->SetTonemarkState( ETrue );
       
  1366         return;
       
  1367         }
       
  1368     else
       
  1369         {
       
  1370         popup->SetTonemarkState( EFalse );
       
  1371         return;
       
  1372         }
       
  1373     
       
  1374     }
       
  1375 
       
  1376 // ---------------------------------------------------------
       
  1377 // Get change state.
       
  1378 // ---------------------------------------------------------
       
  1379 //
       
  1380 TBool TAknFepInputStateEntryPinyinPhrase::GetChangeState()
       
  1381     {
       
  1382     MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow();
       
  1383     CDesCArrayFlat* KeystrokeArray = popup->KeystrokeArray();
       
  1384     CDesCArrayFlat* inEffectKeystrokeArray = popup->InEffectKeystrokeArray();
       
  1385     TInt firstIndex = -1;
       
  1386     TInt count = inEffectKeystrokeArray->Count() - 1;
       
  1387     
       
  1388 
       
  1389     
       
  1390     if ( 2 > inEffectKeystrokeArray->Count() )
       
  1391         {
       
  1392         return ETrue;
       
  1393         }
       
  1394     
       
  1395     for ( TInt i = count; i >= 0; i-- )
       
  1396         {
       
  1397         if ( 0 != inEffectKeystrokeArray->MdcaPoint( i ).
       
  1398             Compare( KPinyinStar ) )
       
  1399             {
       
  1400             firstIndex = i;
       
  1401             break;
       
  1402             }
       
  1403         }
       
  1404     
       
  1405     if ( ( 0 == firstIndex ) && ( !popup->GetTonemarkState() ) )
       
  1406         {
       
  1407         return EFalse;
       
  1408         }
       
  1409     
       
  1410     return ETrue;
       
  1411     }
       
  1412 
       
  1413 // ---------------------------------------------------------
       
  1414 // Append show keystroke.
       
  1415 // ---------------------------------------------------------
       
  1416 //
       
  1417 void TAknFepInputStateEntryPinyinPhrase::ShowKeystrokeAppendL( 
       
  1418                                           CDesCArrayFlat& aShowKeystrokeArray, 
       
  1419                                           const CDesCArrayFlat& aKeystrokeArray, 
       
  1420                                           const TDesC& aPinyinToneMark )
       
  1421     {
       
  1422     TInt showCount = 0;
       
  1423     TInt count = 0;
       
  1424     TBuf<1> buf;
       
  1425     count = aKeystrokeArray.Count();
       
  1426     showCount = aShowKeystrokeArray.Count();
       
  1427     
       
  1428     if ( ( count > 2 ) && ( showCount > 1 ) )
       
  1429         {
       
  1430         if ( 0 == aKeystrokeArray.MdcaPoint( count - 2 ).Compare( KPinyinStar ) )
       
  1431             {
       
  1432             aShowKeystrokeArray.Delete( showCount - 1 );
       
  1433             aShowKeystrokeArray.Compress();
       
  1434             aShowKeystrokeArray.AppendL( aPinyinToneMark );
       
  1435             }
       
  1436         else
       
  1437             {
       
  1438             aShowKeystrokeArray.AppendL( aPinyinToneMark );
       
  1439             }
       
  1440         }
       
  1441     else
       
  1442         {
       
  1443         aShowKeystrokeArray.AppendL( aPinyinToneMark );
       
  1444         }
       
  1445     }
       
  1446 
       
  1447 // ---------------------------------------------------------
       
  1448 // change  CBA.
       
  1449 // ---------------------------------------------------------
       
  1450 //
       
  1451 void TAknFepInputStateEntryPinyinPhrase::ChangeCbaL()
       
  1452     {
       
  1453     MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow();
       
  1454     TInt lastRes = popup->GetLastResouce();
       
  1455     if ( lastRes == R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT )
       
  1456         {
       
  1457         return;
       
  1458         }
       
  1459     iOwner->FepMan()->UpdateCbaL( R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT );
       
  1460     popup->SetLastResouce( R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT );
       
  1461     }
       
  1462 
       
  1463 // End of file