diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/src/AknFepUiInputStateCandidateChinesePhrase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/AknFepUiInputStateCandidateChinesePhrase.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of candidate chinese phrase state +* +*/ + + + + + + + + + + + + +#include "AknFepUiInputStateCandidateChinesePhrase.h" +#include "AknFepUiCtrlContainerChinese.h" +#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface +#include "AknFepUICtrlPinyinPopup.h" //Pinyin phrase +#include "aknfepuictrleditpane.h" +#include "AknFepUICtrlCandidatePane.h" //MAknFepUICtrlCandidatePane +#include //CPtiEngine +#include +#include "aknfepzhuyinconvertion.h" +#include "aknfepzhuyinkeyhandlerinterface.h" +#include + +const TInt KMaxBufLen = 100; +const TInt KInputPhraseMaxLength = 7; + +_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" ); +/////////////////// +// Candidate state +/////////////////// + +TAknFepInputStateCandidateChinesePhrase::TAknFepInputStateCandidateChinesePhrase( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStateCandidateBaseChinesePhrase(aOwner, aUIContainer) + { + iState = ECandidate; + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + + uiContainer->CandidatePane()->SelectFirstPhrase(); + + TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && + uiContainer->CandidatePane()->IsFirstPage()); + TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length(); + TBool showHorizontalScrollArrows = multiplePages || bufLength>1; + + uiContainer->ShowHorizontalScrollArrows(showHorizontalScrollArrows); + uiContainer->ShowVerticalScrollArrows(multiplePages); + uiContainer->FocusCandidatePane(ETrue); + uiContainer->CandidatePane()->ShowCandidateOrdinals(ETrue); + UpdateIndicator(); + UIContainer()->EditPaneWindow()->DisableCursor(); + } + +TBool TAknFepInputStateCandidateChinesePhrase::HandleKeyL(TInt aKey, TKeyPressLength aLength) + { + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow(); + + CDesCArrayFlat* zhuyinSymbols = uiContainer->PinyinPopupWindow()->ZhuyinSymbols(); + CDesCArrayFlat* chineseDisped = uiContainer->PinyinPopupWindow()->ChineseCharsDisped(); + CDesCArrayFlat* zhuyinSymbolsForChinese = uiContainer->PinyinPopupWindow()->ZhuyinSymbolsForChineseCharsDisped(); + CDesCArrayFlat* candidateList = uiContainer->CandidatePane()->CandidateArray(); + MZhuyinKeyHandler* zhuyinKeyHandler = iOwner->ZhuyinKeyHandler(); + + TInt index = MapKeyToIndex(aKey); + + if(aKey == EKeyBackspace) + { + zhuyinKeyHandler->SetStatusChgFlag(MZhuyinKeyHandler::EFromCandidateToEntry); + iOwner->ChangeState(EEntry); + return ETrue; + } + + // for fix bug when press left or right arrow play err-tone + if ( HandleVerticalNavigation( aKey ) || HandleHorizontalNavigation( aKey ) ) + { + return ETrue; + } + + if ( aLength == EShortKeyPress && ( candidatePane->SelectIndex(index,EFalse) + || aKey == EKeyOK || aKey == EKeyCBA1 )) + { + TPtrC text = candidatePane->CurrentPhraseCandidate(); + if ( text.Length() == 0 ) + { + return ETrue; + } + TBuf pinyinshown = UIContainer()->PinyinPopupWindow()->GetEEPContent(); + TInt count = TZhuyinSymbolsMethods::GetChineseCount(pinyinshown); + if ( count > text.Length() ) + { + fepMan->PhraseCreation(ETrue); + } + if ( fepMan->IsPhraseCreation( ) ) + { + TBuf buf; + buf.Copy( text ); + TBool commit = TZhuyinSymbolsMethods::AppendChineseChar( buf, + fepMan->ZhuyinAnalyser( ), zhuyinSymbols, chineseDisped, + zhuyinSymbolsForChinese ); + TBool changeState = UpdateEEPContent(); + if ( commit ) + { + TBuf commitbuf; + TZhuyinSymbolsMethods::Convert2Des(chineseDisped, commitbuf); + fepMan->NewTextL(commitbuf); + fepMan->CommitInlineEditL(); + AddPhraseToDB(commitbuf); + if ( chineseDisped->Count() < KInputPhraseMaxLength || + zhuyinSymbols->Count() == 0 ) + { + iOwner->FepMan()->TryCloseUiL(); + } + else + { + CAknWarningNote* errnote = new( ELeave ) CAknWarningNote(); + errnote->SetTone( CAknNoteDialog::EWarningTone ); + errnote->ExecuteLD( KMaxPhraseNote ); + fepMan->TryCloseUiL(); + } + popup->ResetStrokeArray(); + } + else + { + editPane->SetCursorIndexOfKeystroke( 0 ); + if ( changeState ) + { + for ( TInt i = 0; i < candidateList->Count(); i++ ) + { + if ( TZhuyinSymbolsMethods::IsZhuyinSymbol( + candidateList->MdcaPoint( i ) ) ) + { + candidateList->Delete( i, 1 ); + break; + } + } + if ( candidateList->Count() > 0 ) + { + popup->SetChangeState( ETrue ); + iOwner->ChangeState( EEntry ); + } + else + { + popup->SetChangeState( ETrue ); + iOwner->ChangeState( EZhuyinSequenceEdit ); + } + } + else + { + popup->SetChangeState( ETrue ); + iOwner->ChangeState( EZhuyinSequenceEdit ); + } + } + } + else + { + TBuf textbuf; + for ( TInt i = 0; i < chineseDisped->Count(); i++ ) + { + textbuf.Append(chineseDisped->MdcaPoint(i)); + } + textbuf.Append(text); + fepMan->NewTextL(textbuf); + fepMan->CommitInlineEditL(); + AddPhraseToDB(textbuf); + popup->ResetStrokeArray(); + if ( text.Length() <= KInputPhraseMaxLength && !fepMan->IsPhraseCreation() ) + { + if (fepMan->IsFlagSet(CAknFepManager::EFlagEditorFull)) + { + fepMan->ClearFlag(CAknFepManager::EFlagEditorFull); + iOwner->FepMan()->TryCloseUiL(); + } + else + { + iOwner->ChangeState( EPredictiveCandidate ); + } + } + else + { + fepMan->TryCloseUiL(); + } + } + } + else if ( aKey == EPtiKeyStar ) + { + return ETrue; + } + else if ( aKey == EKeyCBA2 ) + { + popup->ResetStrokeArray(); + iOwner->FepMan()->EntryPhrase( EFalse ); + iOwner->FepMan()->TryCloseUiL(); + } + else if ( !iOwner->IsValidChineseInputKey(aKey) ) + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + return ETrue; + } + +TBool TAknFepInputStateCandidateChinesePhrase::UpdateEEPContent( ) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + CDesCArrayFlat* zhuyinSymbols = UIContainer()->PinyinPopupWindow()->ZhuyinSymbols(); + CDesCArrayFlat* chineseDisped = UIContainer()->PinyinPopupWindow()->ChineseCharsDisped(); + CAknFepZhuyinAnalyser* analyser = iOwner->ZhuyinAnalyser(); + CDesCArrayFlat* candidateList = UIContainer()->CandidatePane()->CandidateArray(); + TBuf buf; + TBool isPhraseCreation = EFalse; + TBool valid = TZhuyinSymbolsMethods::UpdateEEPContent( + ptiengine, + analyser, + zhuyinSymbols, + chineseDisped, + candidateList, + buf, + isPhraseCreation + ); + + if ( chineseDisped->Count() != 0 || zhuyinSymbols->Count() > 1 ) + { + for ( TInt i = 0; i < candidateList->Count(); ++i ) + { + if ( TZhuyinSymbolsMethods::IsZhuyinSymbol( candidateList->MdcaPoint( i ) ) ) + { + candidateList->Delete( i, 1 ); + break; + } + } + } + iOwner->FepMan()->PhraseCreation(isPhraseCreation); + UIContainer()->PinyinPopupWindow()->SetEEPContent(buf); + UIContainer()->PinyinPopupWindow()->SetEEPContentValid(valid); + return valid; + } +void TAknFepInputStateCandidateChinesePhrase::AddPhraseToDB( TDes& aPhrase ) + { + TPtiUserDictionaryEntry addUdbEntry( aPhrase ); + //Add the phrase to the DB by PTI Engine + iOwner->PtiEngine()->AddUserDictionaryEntry( addUdbEntry ); + } + +// End of file