diff -r 000000000000 -r eb1f2e154e89 textinput/peninputgenericitut/src/peninputitutchnuistatepredict.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputgenericitut/src/peninputitutchnuistatepredict.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,391 @@ +/* +* 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: drop-down list control +* +*/ + + +#include +#include +#include +#include +#include +#include + +#include "peninputitutchnuistatepredict.h" +#include "peninputgenericitutuimgrbase.h" +#include "peninputgenericitutdatamgr.h" +#include "peninputgenericitutlayoutcontext.h" +#include "peninputgenericitutconverter.h" +#include "peninputgenericitutwindowmanager.h" + +const TInt KInvalidIndex = -1; + +CChnItutUiStatePredict* CChnItutUiStatePredict::NewL(CGenericItutUiMgrBase* aOwner) + { + CChnItutUiStatePredict* self = new (ELeave) CChnItutUiStatePredict(aOwner); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CChnItutUiStatePredict::~CChnItutUiStatePredict() + { + } + +CChnItutUiStatePredict::CChnItutUiStatePredict(CGenericItutUiMgrBase* aOwner) + :CGenericItutUiStateBase(aOwner), + iLastOverlapIdx(KInvalidIndex) + { + } + +void CChnItutUiStatePredict::OnEntryL() + { + HBufC* puncText = NULL; + switch (iOwner->DataMgr()->InputMode()) + { + case EPinyin: + { + iOwner->DataMgr()->NotifyChangeControlLayout( + MItutPropertySubscriber::EItutPropertyKeypadResourceId, + R_FINGER_INPUT_KEYPAD_PINYIN_STANDBY_PREDICT); + puncText = CCoeEnv::Static()->AllocReadResourceL(R_ITUT_PUNC_PINYIN_ZHUYIN); + } + break; + case EStroke: + { + TInt resID; + if (iOwner->DataMgr()->InputLanguage() == ELangPrcChinese) + { + resID = R_FINGER_INPUT_KEYPAD_STROKE_STANDBY_PREDICT_PRC; + } + else + { + resID = R_FINGER_INPUT_KEYPAD_STROKE_STANDBY_PREDICT_TRA; + } + iOwner->DataMgr()->NotifyChangeControlLayout( + MItutPropertySubscriber::EItutPropertyKeypadResourceId, + resID); + puncText = CCoeEnv::Static()->AllocReadResourceL(R_ITUT_PUNC_STROKE); + } + break; + case EZhuyin: + { + iOwner->DataMgr()->NotifyChangeControlLayout( + MItutPropertySubscriber::EItutPropertyKeypadResourceId, + R_FINGER_INPUT_KEYPAD_ZHUYIN_STANDBY_PREDICT); + puncText = CCoeEnv::Static()->AllocReadResourceL(R_ITUT_PUNC_PINYIN_ZHUYIN); + } + break; + default: + { + // wrong input mode + return; + } + } + + // show punc drop list, and set candidates to it + CleanupStack::PushL( puncText ); + CFepCtrlDropdownList* punclist = + static_cast(iOwner->LayoutContext()->Control(ECtrlIdPuncCandsList)); + punclist->Hide(EFalse); + + iOwner->DataMgr()->ClearChnCandidates(EItutPuncCandidates); + RPointerArray& punccandslist = + TItutDataConverter::AnyToRptrArray(iOwner->DataMgr()->RequestData(EChnPuncCandidates)); + TItutDataConverter::ConvertNonPhraseCandidateL(*puncText, punccandslist); + + punclist->SetCandidatesL(punccandslist, CFepCtrlDropdownList::EListNoExpandableWithBubble); + CleanupStack::PopAndDestroy( puncText ); + + // show candidate drop list + CFepCtrlDropdownList* candlist = + static_cast(iOwner->LayoutContext()->Control(ECtrlIdStdCandsList)); + candlist->Hide(EFalse); + + // may need to change resource id of candidte list to predictive, change keypad resource id if need + iOwner->DataMgr()->NotifyChangeControlLayout( + MItutPropertySubscriber::EItutPropertyCandidateListResourceId, + R_AKN_FEP_NORMAL_CAND_DROP_DOWN_LIST); + + + //hide navi button + iOwner->LayoutContext()->ShowArrowBtn(0); + + //hide indicator + iOwner->LayoutContext()->Control(ECtrlIdIndicator)->Hide(ETrue); + } + +void CChnItutUiStatePredict::OnExit() + { + // hide dropdownlist & reset its status + CFepCtrlDropdownList* punclist = + static_cast(iOwner->LayoutContext()->Control(ECtrlIdPuncCandsList)); + punclist->ResetAndClear(CFepCtrlDropdownList::EListNoExpandable); + iOwner->DataMgr()->ClearChnCandidates(EItutPuncCandidates); + punclist->Hide(ETrue); + + CFepCtrlDropdownList* candlist = + static_cast(iOwner->LayoutContext()->Control(ECtrlIdStdCandsList)); + candlist->ResetAndClear(CFepCtrlDropdownList::EListExpandable); + iOwner->DataMgr()->ClearChnCandidates(EItutCandidates); + candlist->Hide(ETrue); + + //show navi button + iOwner->LayoutContext()->ShowArrowBtn(EBtnArrowLeft | EBtnArrowRight + | EBtnArrowUp| EBtnArrowDown); + + //show indicator + iOwner->LayoutContext()->Control(ECtrlIdIndicator)->Hide(EFalse); + + } + +TBool CChnItutUiStatePredict::HandleKeyL(TInt aCmd, TInt aKey) + { + TInt immode = iOwner->DataMgr()->InputMode(); + + if (IsKeyValid(aKey)) + { + iOwner->SetNumLongPressValid(ETrue); + iOwner->SetCurrentStateL(CGenericItutUiMgrBase::EStateComposition); + iOwner->CurrentState()->HandleKeyL(aCmd, aKey); + return ETrue; + } + return EFalse; + } + +CGenericItutUiMgrBase::TUiState CChnItutUiStatePredict::StateType() + { + return CGenericItutUiMgrBase::EStatePredict; + } + +TBool CChnItutUiStatePredict::IsKeyValid(TInt aKey) + { + TInt immode = iOwner->DataMgr()->InputMode(); + + return (immode == EPinyin && aKey >= EPtiKey2 && aKey <= EPtiKey9) || + (immode == EStroke && aKey >= EPtiKey1 && aKey <= EPtiKey6) || + (immode == EZhuyin && aKey >= EPtiKey0 && aKey <= EPtiKey9); + } + +TBool CChnItutUiStatePredict::HandleCtrlEventL(TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData) + { + switch (aEventType) + { + case EItutCmdCandidateSelected: + { + TPtrC buf = aEventData.Left(aEventData.Length() - 1); + + if (aCtrl->ControlId() == ECtrlIdStdCandsList) + { + // if press cell on candidate list, set predictive candidates of it + iOwner->DataMgr()->PtiEngine()->SetPredictiveChineseChar(buf); + TPtrC cands = iOwner->DataMgr()->PtiEngine()->CandidatePage(); + + iOwner->DataMgr()->ClearChnCandidates(EItutCandidates); + + RPointerArray& candslist = TItutDataConverter::AnyToRptrArray( + iOwner->DataMgr()->RequestData(EChnCandidates)); + TItutDataConverter::ConvertChnPhraseCandidateL(cands, candslist); + + // remove duplicate punctuation from predict candidate + RPointerArray& punccandslist = TItutDataConverter::AnyToRptrArray( + iOwner->DataMgr()->RequestData(EChnPuncCandidates)); + iLastOverlapIdx = RemoveDuplicateCand(punccandslist, + candslist, + 0, + 0); + + CFepCtrlDropdownList* canddroplist = + reinterpret_cast(aCtrl); + canddroplist->SetCandidatesL(candslist, CFepCtrlDropdownList::EListExpandableWithBubble); + + // input pressed candidate + iOwner->LayoutContext()->SubmitText(buf); + + return ETrue; + } + else if (aCtrl->ControlId() == ECtrlIdPuncCandsList) + { + // if press cell on punc drop list, input it directly + iOwner->LayoutContext()->SubmitText(buf); + + return ETrue; + } + } + break; + case EItutCmdGetNextCandidatePage: + { + if (aCtrl->ControlId() == ECtrlIdStdCandsList) + { + RPointerArray& candslist = TItutDataConverter::AnyToRptrArray( + iOwner->DataMgr()->RequestData(EChnCandidates)); + + if (candslist.Count() >= KMaxPredictCandCnt) + { + return ETrue; + } + + // original candidate count before fetch new candidate + TInt candscnt = candslist.Count(); + if (iOwner->DataMgr()->GetNextPageCandidateL(candslist) == KErrNone) + { + // remove duplicate punctuation from predict candidate + RPointerArray& punccandslist = TItutDataConverter::AnyToRptrArray( + iOwner->DataMgr()->RequestData(EChnPuncCandidates)); + iLastOverlapIdx = RemoveDuplicateCand(punccandslist, + candslist, + iLastOverlapIdx + 1, + candscnt); + + if (candslist.Count() >= KMaxPredictCandCnt) + { + candscnt = candslist.Count(); + for (TInt i = KMaxPredictCandCnt; i < candscnt; i++) + { + delete candslist[KMaxPredictCandCnt]; + candslist.Remove(KMaxPredictCandCnt); + } + } + + static_cast(aCtrl)->AddCandidatesL(candslist); + } + + return ETrue; + } + } + break; + case EItutCmdCandidateExisted: + { + if (aCtrl->ControlId() == ECtrlIdStdCandsList) + { + RPointerArray& candslist = TItutDataConverter::AnyToRptrArray( + iOwner->DataMgr()->RequestData(EChnCandidates)); + + if (candslist.Count() >= KMaxPredictCandCnt) + { + static_cast(aCtrl)->SetFlagCandidateExist(EFalse); + } + else + { + static_cast(aCtrl)->SetFlagCandidateExist( + iOwner->DataMgr()->NextPageCandidateExist()); + } + + return ETrue; + } + } + break; + case EEventControlFocusGained: + { + if (aCtrl->ControlId() == ECtrlIdICF) + { + iOwner->SetCurrentStateL(CGenericItutUiMgrBase::EStateStandby); + + // ui layout may also need to handle this event + return EFalse; + } + } + break; + case EEventIcfPointerUpEvent: + { + if (aCtrl->ControlId() == ECtrlIdICF) + { + iOwner->SetCurrentStateL(CGenericItutUiMgrBase::EStateStandby); + + // ui layout may also need to handle this event + return ETrue; + } + } + break; + case EEventRawKeyDownEvent: + { + TInt immode = iOwner->DataMgr()->InputMode(); + const TKeyEvent *key = reinterpret_cast(aEventData.Ptr()); + if ( ( immode == EPinyin && + ( key->iScanCode == EPtiKey0 || key->iScanCode == EPtiKey1 || key->iScanCode == EPtiKeyStar ) ) || + ( immode == EStroke && + ( key->iScanCode == EPtiKeyStar || key->iScanCode == EPtiKey0 || (key->iScanCode >= EPtiKey7 && key->iScanCode <= EPtiKey9 ))) || + ( immode == EZhuyin && key->iScanCode == EPtiKeyStar) || + ( key->iScanCode == EStdKeyBackspace)) + { + // For those special keys, simulate down key immedidately. + // to ensure to simulate down key event before up key event + iOwner->UiManager()->SimulateImmeRawEvent( key->iScanCode, TRawEvent::EKeyDown ); + iOwner->UiManager()->SetLastRawKeyDown( key->iScanCode, ETrue, aCtrl ); + return ETrue; + } + } + break; + case EEventRawKeyUpEvent: + { + TInt immode = iOwner->DataMgr()->InputMode(); + const TKeyEvent *key = reinterpret_cast(aEventData.Ptr()); + if ( ( immode == EPinyin && + ( key->iScanCode == EPtiKey0 || key->iScanCode == EPtiKey1 || key->iScanCode == EPtiKeyStar ) ) || + ( immode == EStroke && + ( key->iScanCode == EPtiKeyStar || key->iScanCode == EPtiKey0 || (key->iScanCode >= EPtiKey7 && key->iScanCode <= EPtiKey9 ))) || + ( immode == EZhuyin && key->iScanCode == EPtiKeyStar) || + ( key->iScanCode == EStdKeyBackspace)) + { + // For those special keys, simulate up key events immediately before changing state. + // The action can avoid up key event being delayed by running changing state, + // otherwise, short press will be thought as long press by window server. + iOwner->UiManager()->SimulateImmeRawEvent( key->iScanCode, TRawEvent::EKeyUp ); + iOwner->UiManager()->SetLastRawKeyDown( key->iScanCode, EFalse, aCtrl ); + iOwner->SetCurrentStateL( CGenericItutUiMgrBase::EStateStandby ); + return ETrue; + } + } + break; + default: + break; + } + + return EFalse; + } + +TInt CChnItutUiStatePredict::RemoveDuplicateCand(const RPointerArray& aSrc, + RPointerArray& aTgt, + TInt aSrcStartIdx, + TInt aTgtStartIdx) + { + TInt lastOverlapIdx = KInvalidIndex; + + // on the assumption that if candidate overlap, + // it is overlap only once + TInt srccandcnt = aSrc.Count(); + + for (TInt i = aSrcStartIdx; i < srccandcnt; i++) + { + for (TInt j = aTgtStartIdx; j < aTgt.Count(); j++) + { + if (aTgt[j]->Compare(*(aSrc[i])) == 0) + { + lastOverlapIdx = i; + delete aTgt[j]; + aTgt.Remove(j); + j--; + break; + } + } + } + + return lastOverlapIdx; + } + +// End Of File