diff -r f1bdd6b078d1 -r 2cb9bae34d17 fep/aknfep/src/aknfepuiinputstateentryhalfqwertyphrase.cpp --- a/fep/aknfep/src/aknfepuiinputstateentryhalfqwertyphrase.cpp Tue Jul 06 14:38:41 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1243 +0,0 @@ -/* -* 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