diff -r ebd48d2de13c -r ecbabf52600f fep/aknfep/src/aknfepuiinputstateentryhalfqwertyphrase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/aknfepuiinputstateentryhalfqwertyphrase.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,1243 @@ +/* +* 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 TAknFepInputStateEntryMiniQwertyPinyinPhrase methods. +* +*/ + + + + + + + + + + + + +#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface +#include "AknFepUiCtrlContainerChinese.h" +#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface +#include "AknFepUICtrlCandidatePane.h" +#include "aknfepuiinputstateentryhalfqwertyphrase.h" + +#include "AknFepManager.h" //FepMan flag +#include "AknFepUICtrlInputPane.h" +#include "AknFepUICtrlPinyinPopup.h" //Pinyin phrase +#include "AknFepUiCtrlContainerChinese.h" +#include +#include //CPtiEngine +#include //keys +#include + +const TInt KFnMappedCharacters = 5; +const TInt KInputPaneLength = 32; +const TText KPinyinTone4Valid = 0x02D9; +const TText KPinyinTone4Invalid = 0x0020; +const TInt KMaxPhraseCount = 150; + +//For Pinyin +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::TAknFepInputStateEntryHalfQwertyPinyinPhrase +// the construt funtion +// --------------------------------------------------------------------------- +// +TAknFepInputStateEntryHalfQwertyPinyinPhrase::TAknFepInputStateEntryHalfQwertyPinyinPhrase( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStateEntryQwertyBaseChinesePhrase(aOwner,aUIContainer) + { + iState = EEntry; + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + uiContainer->FocusCandidatePane(EFalse); + uiContainer->CandidatePane()->ShowCandidateOrdinals(EFalse); + uiContainer->SetLayout(MAknFepUICtrlContainerChinese::ELayoutInput); + uiContainer->CandidatePane()->SelectFirstPhrase(); + uiContainer->ShowHorizontalScrollArrows(EFalse); + uiContainer->ShowVerticalScrollArrows(EFalse); + uiContainer->InputPane()->SetOverrideFontId(0); + // in the case that we are coming back to the input pane from the candidate pane, + // we need to ensure that the current selection is selected correctly + ImplicitlyUpdateSelection(); + UpdateIndicator(); + ClearDeliberateSelection(); + iOwner->PtiEngine()->SetInputMode(EPtiEnginePinyinPhraseHalfQwerty); + iOwner->PtiEngine()->SetCandidatePageLength(KMaxPhraseCount); + iOwner->PtiEngine()->SetCase(EPtiCaseLower); + } + +// --------------------------------------------------------------------------- +// TAknFepUiInputStateCandidateMiniQwertyZhuyinPhrase::HandleKeyL +// handle key event +// --------------------------------------------------------------------------- +// +TBool TAknFepInputStateEntryHalfQwertyPinyinPhrase::HandleKeyL(TInt aKey, TKeyPressLength aLength) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane(); + TBool state = ETrue; + TPtrC text; + TBool ret = ETrue; + if ( aLength == EShortKeyPress ) + { + switch (aKey) + { + case EPtiKeyQwerty1: + { + aKey = EPtiKeyQwertyE; + break; + } + case EPtiKeyQwerty2: + { + aKey = EPtiKeyQwertyT; + break; + } + case EPtiKeyQwerty3: + { + aKey = EPtiKeyQwertyU; + break; + } + case EPtiKeyQwerty4: + { + aKey = EPtiKeyQwertyD; + break; + } + case EPtiKeyQwerty5: + { + aKey = EPtiKeyQwertyG; + break; + } + case EPtiKeyQwerty6: + { + aKey = EPtiKeyQwertyJ; + break; + } + case EPtiKeyQwerty7: + { + aKey = EPtiKeyQwertyC; + break; + } + case EPtiKeyQwerty8: + { + aKey = EPtiKeyQwertyB; + break; + } + case EPtiKeyQwerty9: + { + aKey = EPtiKeyQwertyM; + break; + } + case EPtiKeyQwerty0: + { + aKey = EPtiKeyQwertySpace; + break; + } + } + } + + if ( aKey != EStdKeyLeftFunc && + (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) || + iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed))) + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + return ETrue; + } + if(( aKey == EStdKeyLeftFunc || aKey == EStdKeyFullStop) && aLength == EShortKeyPress) //chr and punctuation key to tone mark + { + if(ptiengine->IncrementToneMark(ETrue)) + { + ImplicitlyUpdateSelection(); + } + } + else if( CAknFepFnKeyManager::EFnKeyNext == iOwner->FepMan()->FnKeyState() || // + CAknFepFnKeyManager::EFnKeyLock == iOwner->FepMan()->FnKeyState() || + CAknFepFnKeyManager::EFnKeyDown == iOwner->FepMan()->FnKeyState()) + { + popup->SetPreStateIsPredictive( EFalse ); + iOwner->FepMan()->TryCloseUiL(); + ret = EFalse; + } + else if(aKey == EStdKeyBackspace ) + { + if ( popup->IsChangeStatet() && aLength == ELongKeyPress ) + { + state = EFalse; + } + else + { + popup->SetChangeState( EFalse ); + } + if ( state ) + { + if (iOwner->PtiEngine()->DeleteKeyPress().Length()) + { + ImplicitlyUpdateSelection(); + } + else + { + iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI. + popup->SetPreStateIsPredictive( EFalse ); + if ( aLength == ELongKeyPress ) + { + iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue); + } + } + } + } + else if(aKey ==EStdKeyDevice1)//sk2 + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + } + else if(aKey == EStdKeyRightArrow) + { + if(popup->IsEnabled()) + { + if(popup->SelectNextPhrase()) + { + DeliberatelyUpdateSelection(); + } + } + } + else if(aKey == EStdKeyLeftArrow) + { + if(popup->IsEnabled()) + { + if(popup->SelectPrevPhrase()) + { + DeliberatelyUpdateSelection(); + } + } + } + else if (aKey == EStdKeyDownArrow + || aKey == EStdKeyDevice3 + || aKey == EStdKeyDevice0 + ||aKey == EStdKeyEnter) //Downkey,sk1,selection,enter key + { + if(popup->IsEnabled()) + { + popup->Enable(EFalse); + } + iOwner->ChangeState(ECandidate); + popup->SetPreStateIsPredictive( EFalse ); + popup->SetChangeState( ETrue ); + } + else if ( aKey == EStdKeyUpArrow ) + { + if ( !candidatePane->IsFirstPage() ) + { + candidatePane->PreviousCandidatePage(); + candidatePane->SetCandidateBuffer(); + candidatePane->SelectFirst(); + UpdateIndicator(); + } + } + else if(aLength == EShortKeyPress) + { + iOwner->FepMan()->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp); + + if(iOwner->IsValidChineseInputKeyQwerty(aKey) || aKey ==EStdKeySpace ) //seperator + { + TInt stringBeforeLength(0); + TInt stringAfterLength(0); + stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length(); + stringAfterLength = ptiengine->AppendKeyPress((TPtiKey)aKey).Length(); + if (stringAfterLength==0 && aKey == EPtiKeyQwertyU ) //u,i should not as first character in pinyin + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + iOwner->FepMan()->UpdateCbaL(NULL); +// iOwner->ChangeState(EQwerty); + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + return ETrue; + } + if (stringBeforeLength != stringAfterLength) + { + if (ptiengine->GetPhoneticSpelling(1).Length() == 1) + { + iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL); + } + ImplicitlyUpdateSelection(); + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + if ( popup->PhoneticSpellingArray()->Count() > 0 && + popup->PhoneticSpellingArray()->MdcaPoint( 0 ).Length() > 1 ) + { + popup->SetPreStateIsPredictive( EFalse ); + } + } + else + { + if ( popup->GetPreStateIsPredictive() && + popup->PhoneticSpellingArray()->Count() > 0 && + popup->PhoneticSpellingArray()->MdcaPoint( 0 ).Length() == 1) //long press fn mode character should inputted + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + if (aKey == EStdKeyEnter) + { + // PtiEngine does not have mapping for the enter key. + const TText KAknFEPLineFeedSymbol = 0x21B2; + TBuf<1> lineFeed; + lineFeed.Zero(); + lineFeed.Append(KAknFEPLineFeedSymbol); + text.Set(lineFeed); + } + else + { + TBuf allFnMappedCharacters; + ptiengine->MappingDataForKey((TPtiKey)aKey, allFnMappedCharacters, EPtiCaseFnLower); + text.Set(allFnMappedCharacters); + } + if (text.Length() > 0) + { + TBuf<1> chr; + chr.Append(text[0]); + iOwner->FepMan()->NewCharacterL(chr); + iOwner->FepMan()->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + ret = ETrue; + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::DeliberatelyUpdateSelection +// DeliberatelyUpdateSelection +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::DeliberatelyUpdateSelection() + { + TPtr deliberateSelection = iOwner->GetLatestDeliberateSelection(); + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + TInt selected = popup->CurrentSelection(); + ptiengine->EnableToneMarks(EFalse); + // our index is zero based, engine index is one based + TPtrC spelling = ptiengine->GetPhoneticSpelling(selected + 1); + deliberateSelection = spelling.Left(MAknFepUICtrlInputPane::EMaxInputCharsPinyinPopupNotIncludingToneMark); + ptiengine->EnableToneMarks(ETrue); + UIContainer()->PinyinPopupWindow()->SetFlag(MAknFepUICtrlPinyinPopup::ESpellingNavigation); + RefreshUI(popup->CurrentVisibleSelection()); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::ImplicitlyUpdateSelection +// update the selection +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::ImplicitlyUpdateSelection() + { + TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection(); + TInt oldDeliberateSelectionLength = oldDeliberateSelection.Length(); + CPtiEngine* ptiengine = iOwner->PtiEngine(); + // previously selected is compared in turn to each of the new candidates + ptiengine->EnableToneMarks(EFalse); + TInt pinyinCount = ptiengine->PhoneticSpellingCount(); + TInt newSelection = 0; + for(TInt i = 0; i < pinyinCount; i++) + { + TPtrC spelling = ptiengine->GetPhoneticSpelling(i + 1); // our index is zero based, engine index is one based + TInt spellingLength = spelling.Length(); + // figure out how many characters we are comparing, this depends on the + // direction of the edit + TInt compareLength = oldDeliberateSelectionLength <= spellingLength ? + oldDeliberateSelectionLength : spellingLength; + if(oldDeliberateSelection.Left(compareLength) == spelling.Left(compareLength)) + { + // as soon as a substring match is found, the + // highlight position is set to that candidate in the new list. + // note that in the case of the first character entered, the + // oldBuf will be empty so it will always match... which is + // fine as we want to select the top one anyway, so we will + // quit the loop early. + newSelection = i; + break; + } + } + ptiengine->EnableToneMarks(ETrue); + UIContainer()->PinyinPopupWindow()->SetFlag(MAknFepUICtrlPinyinPopup::ESpellingChanged); + RefreshUI(newSelection); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::ClearDeliberateSelection +// clear the deliberate selection +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::ClearDeliberateSelection() + { + MAknFepUICtrlPinyinPopup* popup = UIContainer()->PinyinPopupWindow(); + TInt spellingCount = popup->PhoneticSpellingArray()->Count(); + // we must have just deleted the last character, + // or we are starting a new zhuyin session, so wipe the last deliberate selection + if ( 0 == spellingCount ) + { + TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection(); + oldDeliberateSelection = KNullDesC; + } + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::RefreshUI +// refresh ui +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::RefreshUI(TInt aSelection) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane(); + // get cursor 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); + } + TText toneMark; + TBool toneMarkEntered = ptiengine->ToneMark(toneMark); + TBuf<1> validToneMarkBuf; + if(toneMarkEntered) + { + // override specific invalid tonemark character only, the others are the same character + // when both valid and invalid + if(toneMark == KPinyinTone4Invalid) + toneMark = KPinyinTone4Valid; + validToneMarkBuf.Append(toneMark); + } + // to start with, disable the tone marks so we can get the list of all zhuyin matches + // later we will figure out which ones are invalid + ptiengine->EnableToneMarks(EFalse); + TInt pinyinCountWithoutToneMarks = ptiengine->PhoneticSpellingCount(); + if(pinyinCountWithoutToneMarks > 0) + { + if(popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingChanged)) + { + CDesCArrayFlat* spelling = popup->PhoneticSpellingArray(); + TRAPD(ignore, ptiengine->GetPhoneticSpellingsL(*spelling)); + if (ignore != KErrNone) + { + return; + } + popup->SplitPhraseSpellingIntoPages(); + } + // set display page for delibrate selection + popup->SetDisplayPage(aSelection); + popup->SetPhraseItemTexts(); + // fill in input pane although it's invisible + inputPane->SetText(ptiengine->GetPhoneticSpelling(popup->CurrentSelection() + 1)); + popup->PopupSizeChanged(); // phrase input + } + // turn tone marks back on so that we know where we are. + ptiengine->EnableToneMarks(ETrue); + // this is where we start to figure out whether the tonemarks are valid, + // whether the selected tonemark is valid, and what is the index of the + // selected candidate in the list of candidates with tonemarks... + TBool selectionToneMarkValid = EFalse; + TInt selectionIndexAdjustedForToneMarkValidity = popup->CurrentSelection(); + // we only need to deal with tone marks if there is one + if(toneMarkEntered) + { + if(pinyinCountWithoutToneMarks > 0) + { + for(TInt i = 0; i < pinyinCountWithoutToneMarks; i++) + { + TBool valid = EFalse; + + TBuf nextCandidateWithoutToneMark; + nextCandidateWithoutToneMark.Copy(ptiengine->GetPhoneticSpelling + (i + 1).Left(MAknFepUICtrlInputPane::EMaxInputCharsPinyinPopupNotIncludingToneMark)); + ptiengine->EnableToneMarks(EFalse); + ptiengine->SelectPhoneticSpelling(i + 1); + valid = ptiengine->IsToneMarkValidForSpelling(); + if(valid) + { + ptiengine->EnableToneMarks(ETrue); + TInt pinyinCountWithToneMarks = ptiengine->PhoneticSpellingCount(); + for(TInt j = 0; j < pinyinCountWithToneMarks; j++) + { + // use j here not i as we are looking at the list with tonemarks + TPtrC nextCandidateWithToneMark = ptiengine->GetPhoneticSpelling(j + 1); + if(nextCandidateWithToneMark == nextCandidateWithoutToneMark) + { + if(i == aSelection) + { + selectionToneMarkValid = ETrue; + + // fill in input pane even if it can't be seen, for when we have to hide popup window + inputPane->SetText(nextCandidateWithoutToneMark); + } + break; + } + } + } + } + } + } + ptiengine->EnableToneMarks(EFalse); + ptiengine->SelectPhoneticSpelling(popup->CurrentSelection() + 1); + // next two lines are for tonemark validity + ptiengine->EnableToneMarks(selectionToneMarkValid); + ptiengine->SelectPhoneticSpelling(selectionIndexAdjustedForToneMarkValidity + 1); // our index is zero based, engine index is one based + // update the candidate pane. + if(popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingChanged) + || popup->IsFlagSet(MAknFepUICtrlPinyinPopup::ESpellingNavigation)) + { + TRAPD(ignore, ptiengine->GetChinesePhraseCandidatesL(*(uiContainer->CandidatePane()->CandidateArray()))); + if (ignore != KErrNone) + { + return; + } + uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages(); + popup->ClearFlag(MAknFepUICtrlPinyinPopup::ESpellingChanged + | MAknFepUICtrlPinyinPopup::ESpellingNavigation); + } + uiContainer->CandidatePane()->SetCandidateBuffer(); + uiContainer->Enable(ETrue); + // need to enable the pinyin popup after the container so that it is raised to the front + popup->Enable(pinyinCountWithoutToneMarks > 0); + UpdateIndicator(); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::InitializeStateL +// updata the cba +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::InitializeStateL(void) + { + iOwner->FepMan()->UpdateCbaL( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL ); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::UpdateIndicator +// updata the indicator +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyPinyinPhrase::UpdateIndicator() + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + + uiContainer->CandidatePane()->ShowUpScrollArrows(EFalse); + uiContainer->CandidatePane()->ShowDownScrollArrows(EFalse); + uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse); + uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyPinyinPhrase::IsCharacterKey +// to check whether the key is character or not +// --------------------------------------------------------------------------- +// +TBool TAknFepInputStateEntryHalfQwertyPinyinPhrase::IsCharacterKey( + const TInt aKey ) + { + CPtiEngine* ptiengine = iOwner->PtiEngine( ); + // Max length doesn't matter because we'll need only the first character. + TBuf lowerdata; + ptiengine->MappingDataForKey( (TPtiKey)aKey, lowerdata, EPtiCaseLower ); + if ( lowerdata.Length( ) > 0 ) + { + TChar lower = lowerdata[0]; + TUint upper = lower.GetUpperCase( ); + if ( TUint( lower ) != upper ) + { + return ETrue; + } + } + return EFalse; + } + +//For stroke +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyStrokePhrase::TAknFepInputStateEntryHalfQwertyStrokePhrase +// the construt funtion +// --------------------------------------------------------------------------- +// +TAknFepInputStateEntryHalfQwertyStrokePhrase::TAknFepInputStateEntryHalfQwertyStrokePhrase( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStateEntryQwertyBaseChinesePhrase(aOwner,aUIContainer) + { + iState = EEntry; + iOwner->PtiEngine()->SetInputMode( EPtiEngineStrokePhraseHalfQwerty ); + iOwner->PtiEngine()->SetCase( EPtiCaseLower ); + iOwner->PtiEngine()->SetCandidatePageLength( KMaxPhraseCount ); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && + uiContainer->CandidatePane()->IsFirstPage()); + uiContainer->ShowHorizontalScrollArrows(EFalse); + uiContainer->ShowVerticalScrollArrows(multiplePages); + uiContainer->CandidatePane()->ShowCandidateOrdinals( EFalse ); + UpdateIndicator(); + } + +//For stroke +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyStrokePhrase::HandleKeyL +// handle the key event of stroke +// --------------------------------------------------------------------------- +// +TBool TAknFepInputStateEntryHalfQwertyStrokePhrase::HandleKeyL(TInt aKey, + TKeyPressLength aLength ) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane(); + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + TBuf currentText; + TPtrC text; + TBool state = ETrue; + TInt spellingLen = 0; + TBool ret = ETrue; + + if ( aKey == EPtiKeyQwerty0 ) + { + aKey = EPtiKeyQwertySpace; + } + + if ( aKey != EStdKeyLeftFunc && + (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) || + iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed))) + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + return ETrue; + } + switch (aKey) + { + case EStdKeyBackspace: + { + if (popup->IsChangeStatet() && aLength == ELongKeyPress) + { + state = EFalse; + } + else + { + popup->SetChangeState(EFalse); + } + if (state) + { + if (iOwner->PtiEngine()->DeleteKeyPress().Length()) + { + inputPane->SetFlag(MAknFepUICtrlInputPane::EPhoneticChanged); + RefreshUI(); + } + else + { + iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI. + popup->SetPreStateIsPredictive( EFalse ); + if (aLength == ELongKeyPress) + { + iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue); + } + } + } + break; + } + case EStdKeyDevice1://sk2 + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + break; + } + case EStdKeyUpArrow: + { + if ( !candidatePane->IsFirstPage() ) + { + candidatePane->PreviousCandidatePage(); + candidatePane->SetCandidateBuffer(); + candidatePane->SelectFirst(); + UpdateIndicator(); + } + break; + } + case EStdKeyRightArrow: + { + if (candidatePane->VisibleCandidateCount()!= 1) + { + iOwner->ChangeState(ECandidate); + popup->SetPreStateIsPredictive( EFalse ); + candidatePane->SelectNext(); + } + break; + } + case EStdKeyLeftArrow: + { + if (candidatePane->VisibleCandidateCount()!= 1) + { + iOwner->ChangeState(ECandidate); + popup->SetPreStateIsPredictive( EFalse ); + TInt numbertotal = UIContainer()->CandidatePane()->VisibleCandidateCount(); + UIContainer()->CandidatePane()->SelectIndex(numbertotal-1); + } + break; + } + case EStdKeyDownArrow: + { + if ( candidatePane->IsLastPage() ) + { + return ETrue; + } + 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(); + candidatePane->SetCandidateBuffer(); + candidatePane->SelectFirstPhrase(); + UpdateIndicator(); + break; + } + case EStdKeyDevice3://Select + case EStdKeyDevice0://sk1 + case EStdKeyEnter: + { + uiContainer->PinyinPopupWindow()->Enable(EFalse); + TPtrC currentPhraseText = UIContainer()->CandidatePane()->CurrentPhraseCandidate(); + if(currentPhraseText.Length()) + { + fepMan->NewTextL(currentPhraseText); + fepMan->CommitInlineEditL(); + iOwner->PtiEngine()->SetPredictiveChineseChar(currentPhraseText); + if (fepMan->IsFlagSet(CAknFepManager::EFlagEditorFull)) + { + fepMan->ClearFlag(CAknFepManager::EFlagEditorFull); + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + } + else + { + iOwner->ChangeState(EPredictiveCandidate); + popup->SetPreStateIsPredictive( EFalse ); + } + } + break; + } + default: + { + if (aLength == EShortKeyPress) + { + iOwner->FepMan()->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp); + if (iOwner->IsValidChineseInputKeyQwerty(aKey) || + aKey ==EStdKeySpace || + aKey == EStdKeyFullStop || + aKey == EStdKeyLeftFunc ) //seperator + { + TInt stringBeforeLength(0); + TInt stringAfterLength(0); + stringBeforeLength = ptiengine->GetPhoneticSpelling(1).Length(); + stringAfterLength = ptiengine->AppendKeyPress((TPtiKey)aKey).Length(); + if (stringBeforeLength != stringAfterLength) + { + if (ptiengine->GetPhoneticSpelling(1).Length() == 1) + { + iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL); + } + inputPane->SetFlag(MAknFepUICtrlInputPane::EPhoneticChanged); + RefreshUI(); + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + inputPane->GetText(currentText); + spellingLen = currentText.Length(); + if ( spellingLen > 1 ) + { + popup->SetPreStateIsPredictive( EFalse ); + } + } + else if ( popup->GetPreStateIsPredictive() && 0 == spellingLen) //long press fn mode character should inputted + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + + TBuf allFnMappedCharacters; + ptiengine->MappingDataForKey( (TPtiKey)aKey, + allFnMappedCharacters, EPtiCaseFnLower ); + text.Set( allFnMappedCharacters ); + if ( text.Length( ) > 0 ) + { + TBuf<1> chr; + chr.Append( text[0] ); + iOwner->FepMan()->NewCharacterL( chr ); + iOwner->FepMan()->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + ret = ETrue; + } + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyStrokePhrase::InitializeStateL +// change the cba +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyStrokePhrase::InitializeStateL(void) + { + iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyStrokePhrase::IsCharacterKey +// to check whether the key is character or not +// --------------------------------------------------------------------------- +// +TBool TAknFepInputStateEntryHalfQwertyStrokePhrase::IsCharacterKey( + const TInt aKey ) + { + CPtiEngine* ptiengine = iOwner->PtiEngine( ); + // Max length doesn't matter because we'll need only the first character. + TBuf lowerdata; + ptiengine->MappingDataForKey( (TPtiKey)aKey, lowerdata, EPtiCaseLower ); + if ( lowerdata.Length( ) > 0 ) + { + TChar lower = lowerdata[0]; + TUint upper = lower.GetUpperCase( ); + + if ( TUint( lower ) != upper ) + { + return ETrue; + } + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyStrokePhrase::UpdateIndicator +// updata the indicator +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyStrokePhrase::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); + } + + uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse); + uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse); + } + +//for zhuyin +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyZhuyinPhrase::TAknFepInputStateEntryHalfQwertyZhuyinPhrase +// c++ construct funtion +// --------------------------------------------------------------------------- +// +TAknFepInputStateEntryHalfQwertyZhuyinPhrase::TAknFepInputStateEntryHalfQwertyZhuyinPhrase( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStateEntryQwertyBaseChinesePhrase(aOwner, aUIContainer) + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + uiContainer->SetLayout(MAknFepUICtrlContainerChinese::ELayoutInput); + uiContainer->CandidatePane()->SelectFirstPhrase(); + uiContainer->InputPane()->SetOverrideFontId(0); + uiContainer->CandidatePane()->ShowCandidateOrdinals( EFalse ); + TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() && + uiContainer->CandidatePane()->IsFirstPage()); + uiContainer->ShowHorizontalScrollArrows(EFalse); + uiContainer->ShowVerticalScrollArrows(multiplePages); + iOwner->PtiEngine()->SetInputMode( EPtiEngineZhuyinPhraseHalfQwerty ); + iOwner->PtiEngine()->SetCase( EPtiCaseLower ); + UpdateIndicator(); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyZhuyinPhrase::HandleKeyL +// handle the key of zhuyin +// --------------------------------------------------------------------------- +// +TBool TAknFepInputStateEntryHalfQwertyZhuyinPhrase::HandleKeyL(TInt aKey, TKeyPressLength aLength) + { + CPtiEngine* ptiengine = iOwner->PtiEngine(); + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane(); + MAknFepManagerUIInterface* fepMan = iOwner->FepMan(); + TInt originalKey = aKey; + TPtrC text; + TInt spellingLen = 0; + TBool state = ETrue; + TBool ret = ETrue; + TBuf currentText; + if ( aKey != EStdKeyLeftFunc && + (iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagQwertyChrKeyDepressed) || + iOwner->FepMan()->IsFlagSet(CAknFepManager::EFlagShiftKeyDepressed))) + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + return ETrue; + } + switch (aKey) + { + case EPtiKeyQwertyE: + aKey = EPtiKey1; + break; + case EPtiKeyQwertyT: + aKey = EPtiKey2; + break; + case EPtiKeyQwertyU: + aKey = EPtiKey3; + break; + case EPtiKeyQwertyD: + aKey = EPtiKey4; + break; + case EPtiKeyQwertyG: + aKey = EPtiKey5; + break; + case EPtiKeyQwertyJ: + aKey = EPtiKey6; + break; + case EPtiKeyQwertyC: + aKey = EPtiKey7; + break; + case EPtiKeyQwertyB: + aKey = EPtiKey8; + break; + case EPtiKeyQwertyM: + aKey = EPtiKey9; + break; + case EPtiKeyQwertySpace: + aKey = EPtiKey0; + break; + } + if( (aKey == EStdKeyLeftFunc || aKey == EStdKeyFullStop )&& + aLength == EShortKeyPress ) + { + if( ptiengine->IncrementToneMark( ETrue ) ) + { + inputPane->SetFlag( MAknFepUICtrlInputPane::EPhoneticChanged ); + RefreshUI(); + return ETrue; + } + } + switch (aKey) + { + case EStdKeyBackspace: + { + if (popup->IsChangeStatet() && aLength == ELongKeyPress) + { + state = EFalse; + } + else + { + popup->SetChangeState(EFalse); + } + if (state) + { + if (iOwner->PtiEngine()->DeleteKeyPress().Length()) + { + inputPane->SetFlag(MAknFepUICtrlInputPane::EPhoneticChanged); + RefreshUI(); + } + else + { + iOwner->FepMan()->TryCloseUiL(); //no more keys, close the UI. + popup->SetPreStateIsPredictive( EFalse ); + if (aLength == ELongKeyPress) + { + iOwner->FepMan()->SetLongClearAfterCloseUI(ETrue); + } + } + } + break; + } + case EStdKeyDevice1://sk2 + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + break; + } + case EStdKeyUpArrow: + { + if ( !candidatePane->IsFirstPage() ) + { + candidatePane->PreviousCandidatePage(); + candidatePane->SetCandidateBuffer(); + candidatePane->SelectFirst(); + UpdateIndicator(); + } + break; + } + case EStdKeyRightArrow: + { + if (candidatePane->VisibleCandidateCount()!= 1) + { + iOwner->ChangeState(ECandidate); + popup->SetPreStateIsPredictive( EFalse ); + candidatePane->SelectNext(); + } + break; + } + case EStdKeyLeftArrow: + { + if (candidatePane->VisibleCandidateCount()!= 1) + { + iOwner->ChangeState(ECandidate); + popup->SetPreStateIsPredictive( EFalse ); + TInt numbertotal = UIContainer()->CandidatePane()->VisibleCandidateCount(); + UIContainer()->CandidatePane()->SelectIndex(numbertotal-1); + } + break; + } + case EStdKeyDownArrow: + { + if ( candidatePane->IsLastPage() ) + { + return ETrue; + } + 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(); + candidatePane->SetCandidateBuffer(); + candidatePane->SelectFirstPhrase(); + UpdateIndicator(); + break; + } + case EStdKeyDevice3://Select + case EStdKeyDevice0://sk1 + case EStdKeyEnter: + { + uiContainer->PinyinPopupWindow()->Enable(EFalse); + TPtrC phraseText = UIContainer()->CandidatePane()->CurrentPhraseCandidate(); + if(phraseText.Length()) + { + fepMan->NewTextL(phraseText); + fepMan->CommitInlineEditL(); + iOwner->PtiEngine()->SetPredictiveChineseChar(phraseText); + if (fepMan->IsFlagSet(CAknFepManager::EFlagEditorFull)) + { + fepMan->ClearFlag(CAknFepManager::EFlagEditorFull); + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + } + else + { + iOwner->ChangeState(EPredictiveCandidate); + popup->SetPreStateIsPredictive( EFalse ); + } + } + break; + } + case EPtiKeyQwertyQ: + case EPtiKeyQwertyA: + case EPtiKeyQwertyO: + case EPtiKeyQwertyL: + case EPtiKeyQwertyZ: + { + ret = ETrue; + break; + } + default: + { + if (aLength == EShortKeyPress) + { + iOwner->FepMan()->SetCcpuFlag(CAknFepManager::ECcpuStateIgnoreStarUp); + + if (iOwner->IsValidChineseInputKeyQwerty(aKey) || aKey + ==EStdKeySpace) //seperator + { + ptiengine->AppendKeyPress((TPtiKey)aKey); + SetInputPaneToneMark(); + if (ptiengine->GetPhoneticSpelling(1).Length() == 1) + { + iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL); + } + inputPane->SetFlag(MAknFepUICtrlInputPane::EPhoneticChanged); + RefreshUI(); + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + inputPane->GetText(currentText); + spellingLen = currentText.Length(); + if ( spellingLen > 1 ) + { + popup->SetPreStateIsPredictive( EFalse ); + } + } + else if ( popup->GetPreStateIsPredictive() && 0 == spellingLen) //long press fn mode character should inputted + { + iOwner->FepMan()->TryCloseUiL(); + popup->SetPreStateIsPredictive( EFalse ); + + TBuf allFnMappedCharacters; + ptiengine->MappingDataForKey( (TPtiKey)originalKey, + allFnMappedCharacters, EPtiCaseFnLower ); + text.Set( allFnMappedCharacters ); + if ( text.Length( ) > 0 ) + { + TBuf<1> chr; + chr.Append( text[0] ); + iOwner->FepMan()->NewCharacterL( chr ); + iOwner->FepMan()->CommitInlineEditL(); + ptiengine->ClearCurrentWord(); + ret = ETrue; + } + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyZhuyinPhrase::KeyTimerExpired +// +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyZhuyinPhrase::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(); + } + +// --------------------------------------------------------------------------- +// TAknFepInputStateEntryHalfQwertyZhuyinPhrase::UpdateIndicator +// updata the indicator +// --------------------------------------------------------------------------- +// +void TAknFepInputStateEntryHalfQwertyZhuyinPhrase::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); + } + + uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse); + uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse); + } + +//End Of File