diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/src/AknFepUiInputStateEntryZhuyinPhrase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/AknFepUiInputStateEntryZhuyinPhrase.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2004 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 CAknFepUIInputStateZhuyinPhrase methods. +* +*/ + + + + + + + + + + + + +#include "AknFepUiInputStateEntryZhuyinPhrase.h" +#include "AknFepUIManagerStateInterface.h" +#include + +#include +#include //keys +#include +#include "AknFepUICtrlInputPane.h" +#include "AknFepUICtrlCandidatePane.h" +#include "AknFepManager.h" +#include "aknfepuictrleditpane.h" +#include "AknFepUICtrlPinyinPopup.h" +#include "aknfepzhuyinconvertion.h" +#include "aknfepzhuyinkeyhandlerinterface.h" +#include "AknFepZhuyinAnalyserDb.h" +#include "AknFepZhuyinAnalyser.h" +#include + +const TInt KMaxPhraseCount = 50; +const TInt KInputPaneLength = 32; +const TUint16 KSegment = 0x0020; + +const TInt KMaxBufLen = 100; +const TInt KInputPhraseMaxLength = 7; +_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" ); + +TAknFepInputStateEntryZhuyinPhrase::TAknFepInputStateEntryZhuyinPhrase( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStateZhuyinPhraseCreationBase(aOwner, aUIContainer) + { + iState = EEntry; + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + uiContainer->SetLayout(MAknFepUICtrlContainerChinese::ELayoutKeystroke); + uiContainer->CandidatePane()->SelectFirstPhrase(); + uiContainer->InputPane()->SetOverrideFontId(0); + + if (iOwner->PtiEngine()->InputMode() != EPtiEngineZhuyinByPhrase) + { + iOwner->PtiEngine()->SetInputMode(EPtiEngineZhuyinByPhrase); + } + iOwner->PtiEngine()->SetCandidatePageLength(KMaxPhraseCount); + iOwner->FepMan()->EntryPhrase(ETrue); + uiContainer->SetFepMan(iOwner->FepMan()); + uiContainer->EditPaneWindow()->DeactiveCursor(); + UpdateEEPContent(); + RefreshUI(); + UpdateIndicator(); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryZhuyinPhrase::HandleCommandL +// Handling Command +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryZhuyinPhrase::HandleCommandL( TInt aCommandId ) + { + switch ( aCommandId ) + { + // Handle the event frome command. + case EAknSoftkeyCancel: + // case (TUint16)EAknSoftkeyCancel: //the Cancle in soft CBA + TAknFepInputStateChineseBase::HandleCommandL( aCommandId ); + break; + case EAknSoftkeySelect: + //case (TUint16)EAknSoftkeySelect: //the Selected in soft CBA + HandleCommitL(); + break; + default: + TAknFepInputStateZhuyinPhraseCreationBase::HandleCommandL( + aCommandId ); + break; + } + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryZhuyinPhrase::HandleCommit +// Handle CBA1,ok and select candidate phrase key press. +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryZhuyinPhrase::HandleCommitL() + { + 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(); + + TPtrC text = candidatePane->CurrentPhraseCandidate(); + if ( text.Length() == 0 ) + { + return; + } + 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(); + } + } + } + +void TAknFepInputStateEntryZhuyinPhrase::AddPhraseToDB( TDes& aPhrase ) + { + TPtiUserDictionaryEntry addUdbEntry( aPhrase ); + //Add the phrase to the DB by PTI Engine + iOwner->PtiEngine()->AddUserDictionaryEntry( addUdbEntry ); + } + +TBool TAknFepInputStateEntryZhuyinPhrase::HandleKeyL(TInt aKey, TKeyPressLength aLength) + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MZhuyinKeyHandler* zhuyinKeyHandler = iOwner->ZhuyinKeyHandler(); + + CDesCArrayFlat* zhuyinSymbols = uiContainer->PinyinPopupWindow()->ZhuyinSymbols(); + CDesCArrayFlat* chineseDisped = uiContainer->PinyinPopupWindow()->ChineseCharsDisped(); + + iOwner->FepMan()->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp); + + if((aKey == EPtiKeyStar) && (aLength == EShortKeyPress)) + { + AddToneMarkL(); + if ( !UpdateEEPContent( ) ) + { + RefreshUI(); + ChangeCbaL(); + popup->SetChangeState( ETrue ); + iOwner->ZhuyinKeyHandler()->SetState(1); + iOwner->ChangeState(EZhuyinSequenceEdit); + return ETrue; + } + RefreshUI(); + ChangeCbaL(); + return ETrue; + } + else if (aKey == EKeyLeftArrow ) + { + iOwner->ChangeState(ECandidate); + return EFalse; + } + else if (aKey == EKeyRightArrow) + { + iOwner->ChangeState(ECandidate); + return EFalse; + } + else + { + if(aKey == EKeyBackspace) + { + if ( aLength == ELongKeyPress + && zhuyinKeyHandler->GetStatusChgFlag() == MZhuyinKeyHandler::EFromCandidateToEntry ) + { + return ETrue; + } + else + { + zhuyinKeyHandler->SetStatusChgFlag(MZhuyinKeyHandler::EInit); + } + + DeleteZhuyinSymbolOrChinese(); + + if ( !UpdateEEPContent( ) ) + { + RefreshUI(); + popup->SetChangeState( ETrue ); + iOwner->ZhuyinKeyHandler()->SetState(1); + ChangeCbaL(); + iOwner->ChangeState(EZhuyinSequenceEdit); + if ( zhuyinSymbols->Count() == 0 + && chineseDisped->Count() == 0 ) + { + iOwner->FepMan()->TryCloseUiL(); + if (aLength == ELongKeyPress) + { + iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue); + } + } + if ( 0 == chineseDisped->Count() ) + { + iOwner->FepMan()->PhraseCreation( EFalse ); + } + return ETrue; + } + ChangeCbaL(); + RefreshUI(); + if ( zhuyinSymbols->Count() == 0 + && chineseDisped->Count() == 0 ) + { + iOwner->FepMan()->TryCloseUiL(); + if (aLength == ELongKeyPress) + { + iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue); + } + } + if ( 0 == chineseDisped->Count() ) + { + iOwner->FepMan()->PhraseCreation( EFalse ); + } + } + else if((aLength == EShortKeyPress) && iOwner->IsValidChineseInputKey(aKey)) + { + if ( AddKeystrokeL( aKey ) ) + { + if ( !UpdateEEPContent( ) ) + { + RefreshUI(); + popup->SetChangeState( ETrue ); + iOwner->ZhuyinKeyHandler()->SetState(1); + iOwner->ChangeState(EZhuyinSequenceEdit); + return ETrue; + } + RefreshUI(); + ChangeCbaL(); + } + else + { + iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone ); + } + return ETrue; + } + else if(aKey == EKeyDownArrow) + { + if ( aLength == ELongKeyPress + && zhuyinKeyHandler->GetStatusChgFlag() == MZhuyinKeyHandler::EFromSpellingEditingToEntry ) + { + return ETrue; + } + else if (!candidatePane->IsLastPage()) + { + zhuyinKeyHandler->SetStatusChgFlag(MZhuyinKeyHandler::EInit); + if ( candidatePane->NeedGetNewCandidatePage() ) + { + if ( !iOwner->PtiEngine()->NextCandidatePage( ) ) + { + if ( candidatePane->IsLastPage() ) + { + iOwner->FepMan()->PlaySound( EAvkonSIDErrorTone ); + return ETrue; + } + } + else + { + CDesCArrayFlat* phraseCandidates = candidatePane->CandidateArray(); + RPointerArray list; + GetNewCandidatesL( iOwner->PtiEngine()->CandidatePage( ), list ); + for (TInt i = 0; i < list.Count( ); ++i ) + { + phraseCandidates->AppendL( *(list[i]) ); + } + list.ResetAndDestroy(); + } + } + candidatePane->NextCandidatePage(); + RefreshUI(); + } + } + else if(aKey == EKeyUpArrow) + { + if(!candidatePane->IsFirstPage()) + { + candidatePane->PreviousCandidatePage(); + RefreshUI(); + } + else + { + iOwner->ZhuyinKeyHandler()->SetState(0); + popup->SetState( EFalse ); + iOwner->ChangeState(EZhuyinSequenceEdit); + return EFalse; + } + } + else if ( (aKey == EKeyOK || aKey == EKeyCBA1 || aKey == EKeyRightArrow || aKey == EKeyLeftArrow) + && aLength == EShortKeyPress ) + { + iOwner->ChangeState(ECandidate); + return EFalse; + } + return ETrue; + } + } + +void TAknFepInputStateEntryZhuyinPhrase::KeyTimerExpired() + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane(); + + // set container's position + TPoint baseLine = TPoint(0,0); + TInt height = 0; + TInt ascent = 0; + TRAPD(ret,iOwner->FepMan()->GetScreenCoordinatesL(baseLine,height,ascent)); + if (ret == KErrNone) + { + uiContainer->SetContainerPosition(baseLine, height); + } + + TPtrC ptr = ptiengine->GetPhoneticSpelling(1); + inputPane->SetText(ptr); + TBuf currentText; + inputPane->GetText(currentText); + if (ptr.Length() < currentText.Length()) + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + UpdateIndicator(); + } + +void TAknFepInputStateEntryZhuyinPhrase::GetNewCandidatesL(const TDesC& aSource, + RPointerArray& aList) + { + TInt start = 0; + TInt length = 0; + + for (TInt ii = 0; ii < aSource.Length(); ii++) + { + if (aSource[ii] == KSegment) + { + TPtrC segment(aSource.Ptr() + start, length); + aList.AppendL(segment.AllocL()); + start += (length + 1); + length = 0; + } + else + { + length++; + } + } + + if (length) + { + TPtrC segm(aSource.Ptr() + start, length); + aList.AppendL(segm.AllocL()); + } + } + +// End of file