--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/aknfepinputstatepinyinphrasecreationbase.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,1084 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+ * Provides the TAknFepInputStateEntryPinyinPhraseCreation methods.
+ *
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include <PtiEngine.h> //CPtiEngine
+#include <PtiUserDicEntry.h>
+#include <avkon.rsg>
+#include <AknFep.rsg>
+
+#include "aknfepinputstatepinyinphrasecreationbase.h"
+#include "AknFepPanic.h"
+#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface
+#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface
+#include "AknFepUiCtrlContainerChinese.h"
+#include "AknFepUICtrlPinyinPopup.h" //Pinyin phrase
+#include "aknfepuictrleditpane.h"
+#include "AknFepUICtrlCandidatePane.h"
+#include "AknFepUICtrlInputPane.h"
+
+const TUint16 KToneMarkLib[] =
+ {
+ 0x02C9, 0x02CA, 0x02C7, 0x02CB, 0x02D9
+ };
+
+const TUint16 KDelimiter =0x0027;
+const TInt KToneMarkMax = 5;
+const TInt KMaxKeystrokeCount = 31;
+const TInt KMaxPhraseCreationCount = 7;
+
+_LIT( KKey2, "2");
+_LIT( KKey3, "3");
+_LIT( KKey4, "4");
+_LIT( KKey5, "5");
+_LIT( KKey6, "6");
+_LIT( KKey7, "7");
+_LIT( KKey8, "8");
+_LIT( KKey9, "9");
+//KMaxPhraseNote means the max phrase is seven
+_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" );
+
+// ---------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------
+//
+TAknFepInputStatePinyinPhraseCreationBase::TAknFepInputStatePinyinPhraseCreationBase(
+ MAknFepUIManagerStateInterface* aOwner,
+ MAknFepUICtrlContainerChinese* aUIContainer ) :
+ TAknFepInputStateCandidateBase( aOwner, aUIContainer )
+ {
+ }
+
+// ---------------------------------------------------------
+// Add keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AddKeystroke( TInt aKey )
+ {
+ TBool result = ETrue;
+ TRAPD( ret, result = AddKeystrokeL( aKey ) );
+ if ( KErrNone != ret )
+ {
+ return EFalse;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------
+// Add tone mark.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AddToneMark()
+ {
+ TBool result = ETrue;
+ TRAPD( ret, result = AddToneMarkL() );
+ if ( KErrNone != ret )
+ {
+ return EFalse;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------
+// get the valid keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::GetValidKeystroke()
+ {
+ TBool result = ETrue;
+ TRAPD( ret, result = GetValidKeystrokeL() );
+ if ( KErrNone != ret )
+ {
+ return EFalse;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------
+// Delete current keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::DeleteCurrentKeystroke()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ TInt index = editPane->GetCursorIndexOfKeystroke();
+
+ if ( 0 == index )
+ {
+ return EFalse;
+ }
+
+ showKeystroke->Delete( index - 1 );
+ editPane->SetCursorIndexOfKeystroke( index - 1 );
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// Delete current keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::ChineseRevertKeystroke()
+ {
+ TBool result = ETrue;
+ TRAPD( ret, result = ChineseRevertKeystrokeL() );
+ if ( KErrNone != ret )
+ {
+ return EFalse;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------
+// show info to the eep ctrl.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::ShowInfo()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ CDesCArrayFlat* chinese = popup->ChooseChineseCharacterArray();
+ TInt index = editPane->GetCursorIndexOfKeystroke();
+
+ TBuf<KMaxKeystrokeCount> buf;
+
+ for ( TInt i = 0; i < chinese->Count(); ++i )
+ {
+ buf.Append( chinese->MdcaPoint( i ) );
+ }
+
+ for ( TInt i = 0; i < showKeystroke->Count(); ++i )
+ {
+ buf.Append( showKeystroke->MdcaPoint( i ) );
+ }
+
+ if ( showKeystroke->Count() == 0 )
+ {
+ editPane->SetCursorIndexOfKeystroke( 0 );
+ index = 0;
+ }
+
+ editPane->SetText( buf, chinese->Count() + index );
+ }
+
+// ---------------------------------------------------------
+// set the show info warning color.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::SetWarningColor()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ TInt showKeystrokeCount = popup->ShowKeystrokeArray()->Count();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ TInt validKeytrokeCount = popup->KeystrokeArray()->Count();
+ if ( 0 == validKeytrokeCount )
+ {
+ editPane->SetHighlight( chineseCount, chineseCount + showKeystrokeCount );
+ }
+ }
+
+// ---------------------------------------------------------
+// Get the candidate info.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::GetCandidate( TInt aSelection )
+ {
+ TRAP_IGNORE( GetCandidateL( aSelection ) );
+ }
+
+// ---------------------------------------------------------
+// Change CBA
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::ChangeCba()
+ {
+ TRAP_IGNORE( ChangeCbaL() );
+ }
+
+// ---------------------------------------------------------
+// Refresh UI
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::RefreshCandidate()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane();
+ CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+ CDesCArrayFlat* candidateArray =
+ uiContainer->CandidatePane()->CandidateArray();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ // have valid keystroke.
+ if ( validKeystroke->Count() > 0 )
+ {
+ uiContainer->SetControlInVisible( ETrue );
+ // set display page for delibrate selection
+ ClearDeliberateSelection();
+ GetCandidate( );
+ uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+ uiContainer->CandidatePane()->SetCandidateBuffer();
+ uiContainer->Enable( ETrue );
+ uiContainer->ShowHorizontalScrollArrows( EFalse );
+ uiContainer->ShowVerticalScrollArrows( ETrue );
+ }
+ else
+ {
+ candidateArray->Reset();
+ if ( KMaxPhraseCreationCount == chineseCount )
+ {
+ uiContainer->SetControlInVisible( ETrue );
+ TRAP_IGNORE( candidateArray->AppendL( KMaxPhraseNote ) );
+ }
+ else
+ {
+ uiContainer->SetControlInVisible( EFalse );
+ }
+
+ uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+ uiContainer->CandidatePane()->SetCandidateBuffer();
+ uiContainer->Enable( ETrue );
+ uiContainer->ShowHorizontalScrollArrows( EFalse );
+ uiContainer->ShowVerticalScrollArrows( EFalse );
+ }
+
+ if ( EKeySequenceEdit == iState )
+ {
+ //popup->SetNoneHighlighted();
+ }
+ uiContainer->Enable(ETrue);
+ popup->Enable( validKeystroke->Count() > 0 );
+ UpdateIndicator();
+ }
+
+// ---------------------------------------------------------
+// Refresh UI
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::RefreshUI(TInt aSelection)
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane();
+ CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+ CDesCArrayFlat* candidateArray =
+ uiContainer->CandidatePane()->CandidateArray();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ // have valid keystroke.
+ if ( validKeystroke->Count() > 0 )
+ {
+ uiContainer->SetControlInVisible( ETrue );
+ popup->SplitPhraseSpellingIntoPages();
+ inputPane->SetText( spelling->MdcaPoint( aSelection ) );
+ // set display page for delibrate selection
+ popup->SetDisplayPage(aSelection);
+ popup->SetPhraseItemTexts();
+ popup->PopupSizeChanged();
+ GetCandidate( aSelection );
+ uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+ uiContainer->CandidatePane()->SetCandidateBuffer();
+ uiContainer->Enable( ETrue );
+ uiContainer->ShowHorizontalScrollArrows( EFalse );
+ uiContainer->ShowVerticalScrollArrows( ETrue );
+ }
+ else
+ {
+ candidateArray->Reset();
+ if ( KMaxPhraseCreationCount == chineseCount )
+ {
+ uiContainer->SetControlInVisible( ETrue );
+ TRAP_IGNORE( candidateArray->AppendL( KMaxPhraseNote ) );
+ }
+ else
+ {
+ uiContainer->SetControlInVisible( EFalse );
+ }
+
+ uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+ uiContainer->CandidatePane()->SetCandidateBuffer();
+ uiContainer->Enable( ETrue );
+ uiContainer->ShowHorizontalScrollArrows( EFalse );
+ uiContainer->ShowVerticalScrollArrows( EFalse );
+ }
+
+ if ( EKeySequenceEdit == iState )
+ {
+ popup->SetNoneHighlighted();
+ }
+ uiContainer->Enable(ETrue);
+ popup->Enable( validKeystroke->Count() > 0 );
+ UpdateIndicator();
+ }
+
+// ---------------------------------------------------------
+// clear selection.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::ClearDeliberateSelection()
+ {
+ // we must have just deleted the last character,
+ // or we are starting a new pinyin session, so wipe the last deliberate selection
+ TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection();
+ oldDeliberateSelection = KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// clear the keystroke of PtiEngine.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::ClearPtiEngineKeystroke()
+ {
+ CPtiEngine* ptiengine = iOwner->PtiEngine();
+ for ( TInt i = 0; i < KMaxKeystrokeCount; ++i )
+ {
+ ptiengine->DeleteKeyPress();
+ }
+ }
+
+
+// ---------------------------------------------------------
+// Get the code of Keystroke in ITUT.
+// ---------------------------------------------------------
+//
+TInt TAknFepInputStatePinyinPhraseCreationBase::GetKeystrokeCode(
+ TPtiKey& aKey,
+ const TDesC& aKeystroke )
+ {
+ if ( aKeystroke.Length() < 1 )
+ {
+ return EKeyStrokeNull;
+ }
+
+ // the input key is delimiter the return -1.
+ if ( KDelimiter == aKeystroke[0] )
+ {
+ aKey = EPtiKey1;
+ return EKeyDelimiter;
+ }
+ // the input key is tone mark return tone mark.
+ for ( TInt i = 0; i < KToneMarkMax; ++i )
+ {
+ if ( KToneMarkLib[i] == aKeystroke[0] )
+ {
+ return i + 1;
+ }
+ }
+ // the keystroke is 2 - 9.
+ if ( 0 == aKeystroke.Compare( KKey2 ) )
+ {
+ aKey = EPtiKey2;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey3 ) )
+ {
+ aKey = EPtiKey3;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey4 ) )
+ {
+ aKey = EPtiKey4;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey5 ) )
+ {
+ aKey = EPtiKey5;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey6 ) )
+ {
+ aKey = EPtiKey6;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey7 ) )
+ {
+ aKey = EPtiKey7;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey8 ) )
+ {
+ aKey = EPtiKey8;
+ }
+ else if ( 0 == aKeystroke.Compare( KKey9 ) )
+ {
+ aKey = EPtiKey9;
+ }
+ return EkeyNumber;
+ }
+
+
+// ---------------------------------------------------------
+// Append the key to the ptiengine.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AppendKeyPressL(
+ TPtiKey& aKey,
+ TBool aAddSpellingFlag
+ )
+ {
+ CPtiEngine* ptiengine = iOwner->PtiEngine();
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* tempSpelling = popup->TempSpelling();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+ CDesCArrayFlat* afterCheck = popup->OptimizeSpelling();
+
+ tempSpelling->Reset();
+ afterCheck->Reset();
+ TInt stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length();
+ TInt stringAfterLength = ptiengine->AppendKeyPress(aKey).Length();
+ // the pti can't append key.
+ if ( stringBeforeLength == stringAfterLength )
+ {
+ return EFalse;
+ }
+ // get the spelling by pti.
+ ptiengine->GetPhoneticSpellingsL( *tempSpelling );
+ // delete the phrase spelling.
+ CheckSpellingL( tempSpelling, afterCheck );
+ if ( afterCheck->Count() > 0 )
+ {
+ if ( !aAddSpellingFlag )
+ {
+ for( TInt i = afterCheck->Count() - 1; i >= 0; --i )
+ {
+ spelling->InsertL( 0, afterCheck->MdcaPoint( i ) );
+ }
+ }
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// Append the tone mark to the ptiengine.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AppendToneMarkL( TInt& aToneMark )
+ {
+ CPtiEngine* ptiengine = iOwner->PtiEngine();
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* tempSpelling = popup->TempSpelling();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+
+ for ( TInt i = 0; i < aToneMark; ++i )
+ {
+ tempSpelling->Reset();
+ ptiengine->IncrementToneMark( ETrue );
+ // get the spelling by pti.
+ ptiengine->GetPhoneticSpellingsL( *tempSpelling );
+ if ( CheckToneMark( aToneMark ) )
+ {
+ break;
+ }
+ }
+
+ if ( tempSpelling->Count() > 0 )
+ {
+ for ( TInt i = tempSpelling->Count() - 1; i >= 0; --i )
+ {
+ spelling->InsertL( 0, tempSpelling->MdcaPoint( i ) );
+ }
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// check the spelling delete the phrase spelling.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::CheckSpellingL(
+ CDesCArrayFlat* aTempSpelling,
+ CDesCArrayFlat* aAfterCheck
+ )
+ {
+ TBuf<1> buf;
+ buf.Append( KDelimiter );
+ for (TInt i = 0; i < aTempSpelling->Count(); ++i )
+ {
+ if ( KErrNotFound == aTempSpelling->MdcaPoint(i).Find( buf ) )
+ {
+ aAfterCheck->AppendL( aTempSpelling->MdcaPoint(i) );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// check the tone mark and delete the phrase spelling.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::CheckToneMark( TInt& aToneMark )
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* tempSpelling = popup->TempSpelling();
+ TBuf<1> delimiter;
+ delimiter.Append( KDelimiter );
+
+ for ( TInt i = tempSpelling->Count() - 1; i >= 0; --i )
+ {
+ if ( KErrNotFound != tempSpelling->MdcaPoint( i ).Find( delimiter ) )
+ {
+ tempSpelling->Delete( i );
+ }
+ else
+ {
+ if ( KToneMarkLib[ aToneMark - 1 ] !=
+ tempSpelling->MdcaPoint( i ).Right( 1 )[0] )
+ {
+ tempSpelling->Delete( i );
+ }
+ }
+ }
+ tempSpelling->Compress();
+ return tempSpelling->Count();
+ }
+
+
+// ---------------------------------------------------------
+// Add keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AddKeystrokeL( TInt aKey )
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ TInt index = editPane->GetCursorIndexOfKeystroke();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ TBuf<1> key;
+
+ if ( showKeystroke->Count() + chineseCount >= KMaxKeystrokeCount )
+ {
+ return EFalse;
+ }
+
+ if ( KMaxPhraseCreationCount == chineseCount )
+ {
+ return EFalse;
+ }
+
+ switch( (TPtiKey)aKey )
+ {
+ case EPtiKey0:
+ key.Append( KDelimiter );
+ break;
+ case EPtiKey1:
+ key.Append( KDelimiter );
+ break;
+ case EPtiKey2:
+ key.Append( EPtiKey2 );
+ break;
+ case EPtiKey3:
+ key.Append( EPtiKey3 );
+ break;
+ case EPtiKey4:
+ key.Append( EPtiKey4 );
+ break;
+ case EPtiKey5:
+ key.Append( EPtiKey5 );
+ break;
+ case EPtiKey6:
+ key.Append( EPtiKey6 );
+ break;
+ case EPtiKey7:
+ key.Append( EPtiKey7 );
+ break;
+ case EPtiKey8:
+ key.Append( EPtiKey8 );
+ break;
+ case EPtiKey9:
+ key.Append( EPtiKey9 );
+ break;
+ default:
+ return EFalse;
+ }
+
+ if ( index > showKeystroke->Count() )
+ {
+ index = showKeystroke->Count();
+ }
+
+ showKeystroke->InsertL( index, key );
+ editPane->SetCursorIndexOfKeystroke( index + 1 );
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// Add tone mark.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::AddToneMarkL()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ TInt index = editPane->GetCursorIndexOfKeystroke();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ TBuf<1> key;
+ TInt toneMark( 0 );
+
+ if ( KMaxPhraseCreationCount == chineseCount )
+ {
+ return EFalse;
+ }
+
+ if ( showKeystroke->Count() + chineseCount >= KMaxKeystrokeCount )
+ {
+ if ( 0 == index )
+ {
+ return EFalse;
+ }
+ for ( TInt i = 0; i < KToneMarkMax; ++i )
+ {
+ if ( KToneMarkLib[i] == showKeystroke->MdcaPoint( index - 1 )[0] )
+ {
+ toneMark = i + 1;
+ break;
+ }
+ }
+ if ( 0 == toneMark )
+ {
+ return EFalse;
+ }
+ }
+
+ if ( 0 == index )
+ {
+ key.Append( KToneMarkLib[0] );
+ showKeystroke->InsertL( 0, key );
+ editPane->SetCursorIndexOfKeystroke( 1 );
+ return ETrue;
+ }
+
+ for ( TInt i = 0; i < KToneMarkMax; ++i )
+ {
+ if ( KToneMarkLib[i] == showKeystroke->MdcaPoint( index - 1 )[0] )
+ {
+ toneMark = i + 1;
+ break;
+ }
+ }
+
+ if ( 0 == toneMark )
+ {
+ key.Append( KToneMarkLib[0] );
+ showKeystroke->InsertL( index, key );
+ editPane->SetCursorIndexOfKeystroke( index + 1 );
+ }
+ else if ( KToneMarkMax == toneMark )
+ {
+ key.Append( KToneMarkLib[0] );
+ showKeystroke->Delete( index - 1 );
+ showKeystroke->InsertL( index - 1, key );
+ }
+ else
+ {
+ key.Append( KToneMarkLib[toneMark] );
+ showKeystroke->Delete( index - 1 );
+ showKeystroke->InsertL( index - 1, key );
+ }
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// check the keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::IsToneMark( const TDesC& aInput )
+ {
+ for ( TInt i = 0; i < KToneMarkMax; ++i )
+ {
+ if ( KToneMarkLib[i] == aInput[0] )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+// ---------------------------------------------------------
+// check the keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::CheckKeystroke()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ TBuf<1> buf;
+ buf.Append( KDelimiter );
+ // if the keystroke is null then the keystroke is invalid.
+ if ( 0 == showKeystroke->Count() )
+ {
+ return EFalse;
+ }
+ // if the first keystroke is delimiter then keytroke is invalid.
+ if ( KDelimiter == showKeystroke->MdcaPoint( 0 )[0] )
+ {
+ return EFalse;
+ }
+ // if the first keystroke is Tone mark then keytroke is invalid.
+ for ( TInt i = 0; i < KToneMarkMax; ++i )
+ {
+ if ( KToneMarkLib[i] == showKeystroke->MdcaPoint( 0 )[0] )
+ {
+ return EFalse;
+ }
+ }
+ // the first keystroke is not delimiter and tone mark, if the number of keystroke
+ // is not more than two then must the keytroke are all valid.
+ if ( showKeystroke->Count() <= 2 )
+ {
+ return ETrue;
+ }
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------
+// get the valid keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::GetValidKeystrokeL()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+ CDesCArrayFlat* allValidKeystroke = popup->KeystrokeArray();
+ CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray();
+ TInt allValidKeyLen = allValidKeystroke->Count();
+ TPtiKey key;
+ TInt retCode(0);
+ TBool nextIsToneMark = EFalse;
+ TBuf<1> delimiter;
+ TBuf<KMaxKeystrokeCount> beforeBuf;
+ TBuf<KMaxKeystrokeCount> afterBuf;
+
+ delimiter.Append( KDelimiter );
+
+ for ( TInt i = 0; i < allValidKeyLen; ++i )
+ {
+ if ( 0 == allValidKeystroke->MdcaPoint( i ).Compare( delimiter ) )
+ {
+ break;
+ }
+ beforeBuf.Append( allValidKeystroke->MdcaPoint( i ) );
+ }
+
+ spelling->Reset();
+ validKeystroke->Reset();
+ allValidKeystroke->Reset();
+
+ ClearPtiEngineKeystroke();
+ if ( !CheckKeystroke() )
+ {
+ if ( allValidKeyLen > 0 )
+ {
+ popup->SetValidKeystrokeChange( ETrue );
+ }
+ else
+ {
+ popup->SetValidKeystrokeChange( EFalse );
+ }
+ return EFalse;
+ }
+
+ // the firts keystroke is key 2 - 9.
+ for ( TInt i = 0; i < showKeystroke->Count(); ++i )
+ {
+ retCode = GetKeystrokeCode( key, showKeystroke->MdcaPoint( i ) );
+ //the keystroke is delimiter.
+ if ( -1 == retCode )
+ {
+ validKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ allValidKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ break;
+ }
+ //the keystroke is 2 - 9
+ else if ( 0 == retCode )
+ {
+ //if the next keystroke is tone mark, then current keystroke and
+ //the next keystroke need to whole check.
+ if ( i < showKeystroke->Count() - 1 )
+ {
+ TPtiKey keyTmp;
+ if ( GetKeystrokeCode( keyTmp,
+ showKeystroke->MdcaPoint( i + 1) ) > 0 )
+ {
+ nextIsToneMark = ETrue;
+ }
+ }
+ if ( AppendKeyPressL( key, nextIsToneMark ) )
+ {
+ //the next keystroke is not tone mark.
+ if ( !nextIsToneMark )
+ {
+ validKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ allValidKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ if ( AppendToneMarkL( retCode ) )
+ {
+ validKeystroke->AppendL( showKeystroke->MdcaPoint( i - 1 ) );
+ validKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ allValidKeystroke->AppendL( showKeystroke->MdcaPoint( i - 1 ) );
+ allValidKeystroke->AppendL( showKeystroke->MdcaPoint( i ) );
+ }
+ break;
+ }
+ }
+ for ( TInt i = 0; i < allValidKeystroke->Count(); ++i )
+ {
+ if ( 0 == allValidKeystroke->MdcaPoint( i ).Compare( delimiter ) )
+ {
+ break;
+ }
+ afterBuf.Append( allValidKeystroke->MdcaPoint( i ) );
+ }
+
+ if ( allValidKeystroke->Count() > 0 )
+ {
+ if ( ( 0 == allValidKeyLen ) ||
+ ( 0 != afterBuf.Compare( beforeBuf ) ) )
+ {
+ popup->SetValidKeystrokeChange( ETrue );
+ }
+ else
+ {
+ popup->SetValidKeystrokeChange( EFalse );
+ }
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// Revert the current chinse to keystroke.
+// ---------------------------------------------------------
+//
+TBool TAknFepInputStatePinyinPhraseCreationBase::ChineseRevertKeystrokeL()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+ CDesCArrayFlat* showKeystroke = popup->ShowKeystrokeArray();
+ CDesCArrayFlat* chinese = popup->ChooseChineseCharacterArray();
+ CDesCArrayFlat* chineseKeystroke =
+ popup->ChooseChineseCharacterArrayKeystroke();
+ TInt index = editPane->GetCursorIndexOfKeystroke();
+
+ if ( ( 0 != index ) || ( 0 == chinese->Count() ) )
+ {
+ return EFalse;
+ }
+
+ if ( chineseKeystroke->MdcaPoint( chineseKeystroke->Count() - 1 ).Length() < 1 )
+ {
+ return EFalse;
+ }
+
+ for( TInt i = chineseKeystroke->MdcaPoint( chineseKeystroke->Count() - 1 ).
+ Length() - 1; i >= 0 ; --i )
+ {
+ showKeystroke->InsertL( 0, chineseKeystroke->MdcaPoint(
+ chineseKeystroke->Count() - 1 ).Mid( i, 1 ) );
+ }
+
+ editPane->SetCursorIndexOfKeystroke(
+ chineseKeystroke->MdcaPoint( chineseKeystroke->Count() - 1 ).Length() );
+ chinese->Delete( chinese->Count() - 1 );
+ chineseKeystroke->Delete( chineseKeystroke->Count() - 1 );
+
+ // if the show inof's length more than KMaxKeystrokeCount, delete more inof.
+ for ( TInt i = chinese->Count() + showKeystroke->Count() - KMaxKeystrokeCount;
+ i > 0; --i )
+ {
+ showKeystroke->Delete( showKeystroke->Count() - 1 );
+ }
+
+ showKeystroke->Compress();
+ chinese->Compress();
+ chineseKeystroke->Compress();
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------
+// Get the candidate info.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::GetCandidateL( TInt aSelection )
+ {
+ CPtiEngine* ptiengine = iOwner->PtiEngine();
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+ CDesCArrayFlat* phraseCandidates =
+ uiContainer->CandidatePane()->CandidateArray();
+ CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+
+ phraseCandidates->Reset();
+ if ( ( aSelection > spelling->Count() ) || ( 0 == spelling->Count() ) )
+ {
+ return;
+ }
+ extern void CleanArray( TAny* aAny );
+ RPointerArray<HBufC> list;
+ TCleanupItem cleanitem( CleanArray, &list );
+ CleanupStack::PushL( cleanitem );
+ TPtrC curSpell = spelling->MdcaPoint( aSelection );
+ HBufC* retString = ptiengine->GetCandidatesByInputString(
+ spelling->MdcaPoint( aSelection ),
+ list,
+ EFalse );
+
+ CleanupStack::PushL( retString );
+ for (int index = 0; index < ptiengine->PhoneticSpellingCount(); index++)
+ {
+ TPtrC ptr = ptiengine->GetPhoneticSpelling(index + 1);
+ if (ptr.Length() == curSpell.Length())
+ {
+ ptiengine->SelectPhoneticSpelling(index + 1);
+ ptiengine->GetChinesePhraseCandidatesL(*phraseCandidates);
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( retString );
+ CleanupStack::PopAndDestroy(); // cleanitem
+ }
+
+// ---------------------------------------------------------
+// Change CBA
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::ChangeCbaL()
+ {
+ MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow();
+ TInt keystrokeCount = popup->ShowKeystrokeArray()->Count();
+ TInt chineseCount = popup->ChooseChineseCharacterArray()->Count();
+ TInt validKeystrokeCount = popup->InEffectKeystrokeArray()->Count();
+ TInt lastRes = popup->GetLastResouce();
+
+ if ( ( chineseCount == KMaxPhraseCreationCount ) ||
+ ( ( 0 == keystrokeCount ) && ( chineseCount > 1 ) ) )
+ {
+ if ( lastRes == R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE )
+ {
+ return;
+ }
+ //User cba done-done-cancel
+ iOwner->FepMan()->UpdateCbaL( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+ popup->SetLastResouce( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+ }
+ else if ( ( 0 != keystrokeCount ) && ( 0 != validKeystrokeCount ) )
+ {
+ if ( lastRes == R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT )
+ {
+ return;
+ }
+ //User cba select-select-cancel
+ iOwner->FepMan()->UpdateCbaL( R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT );
+ popup->SetLastResouce( R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT );
+ }
+ else
+ {
+ if ( lastRes == R_AKNFEP_SOFTKEYS__PHRASE_CREATION_EMPTY_CANCEL_EMPTY )
+ {
+ return;
+ }
+ iOwner->FepMan()->UpdateCbaL( R_AKNFEP_SOFTKEYS__PHRASE_CREATION_EMPTY_CANCEL_EMPTY );
+ popup->SetLastResouce( R_AKNFEP_SOFTKEYS__PHRASE_CREATION_EMPTY_CANCEL_EMPTY );
+ }
+ }
+
+// ---------------------------------------------------------
+// Update Indicator.
+// ---------------------------------------------------------
+//
+void TAknFepInputStatePinyinPhraseCreationBase::UpdateIndicator()
+ {
+ MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+ MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+
+ if ( candidatePane->IsFirstPage() )
+ {
+ uiContainer->CandidatePane()->ShowUpScrollArrows( EFalse );
+ }
+ else
+ {
+ uiContainer->CandidatePane()->ShowUpScrollArrows( ETrue );
+ }
+
+ if ( candidatePane->IsLastPage() )
+ {
+ uiContainer->CandidatePane()->ShowDownScrollArrows( EFalse );
+ }
+ else
+ {
+ uiContainer->CandidatePane()->ShowDownScrollArrows( ETrue );
+ }
+
+ if ( candidatePane->SelectedIndex() == 0
+ && candidatePane->IsFirstPage() )
+ {
+ uiContainer->CandidatePane()->ShowLeftScrollArrows( EFalse );
+ }
+ else
+ {
+ uiContainer->CandidatePane()->ShowLeftScrollArrows( ETrue );
+ }
+
+ if ( candidatePane->IsLastPage() && (candidatePane->SelectedIndex()
+ == candidatePane->VisibleCandidateCount() - 1 ) )
+ {
+ uiContainer->CandidatePane()->ShowRightScrollArrows( EFalse );
+ }
+ else
+ {
+ uiContainer->CandidatePane()->ShowRightScrollArrows( ETrue );
+ }
+ }
+
+// End of file