--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputgenericitut/src/peninputitutchnuistatepinyincomposition.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,320 @@
+/*
+* 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 <peninputdropdownlist.h>
+#include <PtiEngine.h>
+#include <peninputgeneralitutnew.rsg>
+#include <peninputitutconfig_chinese.rsg>
+
+#include "peninputitutchnuistatepinyincomposition.h"
+#include "peninputgenericitutuimgrbase.h"
+#include "peninputgenericitutdatamgr.h"
+#include "peninputgenericitutlayoutcontext.h"
+#include "peninputgenericitutconverter.h"
+
+CChnItutUiStatePinyinComposition* CChnItutUiStatePinyinComposition::NewL(
+ CGenericItutUiMgrBase* aOwner)
+ {
+ CChnItutUiStatePinyinComposition* self =
+ new (ELeave) CChnItutUiStatePinyinComposition(aOwner);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CChnItutUiStatePinyinComposition::~CChnItutUiStatePinyinComposition()
+ {
+ }
+
+CChnItutUiStatePinyinComposition::CChnItutUiStatePinyinComposition(
+ CGenericItutUiMgrBase* aOwner):CGenericItutUiStateBase(aOwner)
+ {
+ }
+
+void CChnItutUiStatePinyinComposition::OnEntryL()
+ {
+ // update resource id of keypad, candidate drop list
+ iOwner->DataMgr()->NotifyChangeControlLayout(
+ MItutPropertySubscriber::EItutPropertyKeypadResourceId,
+ R_FINGER_INPUT_KEYPAD_PINYIN_COMPOSITION);
+ iOwner->DataMgr()->NotifyChangeControlLayout(
+ MItutPropertySubscriber::EItutPropertyCandidateListResourceId,
+ R_AKN_FEP_PINYIN_CAND_DROP_DOWN_LIST);
+
+ // show spell drop list
+ CFepCtrlDropdownList* spelllist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdSpellCandsList));
+ spelllist->Hide(EFalse);
+
+ // show candidate drop list
+ CFepCtrlDropdownList* candlist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdStdCandsList));
+ candlist->Hide(EFalse);
+
+ //hide navi button
+ iOwner->LayoutContext()->ShowArrowBtn(0);
+
+ //hide indicator
+ iOwner->LayoutContext()->Control(ECtrlIdIndicator)->Hide(ETrue);
+ }
+
+void CChnItutUiStatePinyinComposition::OnExit()
+ {
+ // hide dropdownlist & reset its status
+ CFepCtrlDropdownList* spelllist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdSpellCandsList));
+ spelllist->ResetAndClear(CFepCtrlDropdownList::EListExpandableRollWithIcon);
+ iSpellCands.ResetAndDestroy();
+ iSpellCands.Close();
+ spelllist->Hide(ETrue);
+
+ CFepCtrlDropdownList* candlist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdStdCandsList));
+ candlist->ResetAndClear(CFepCtrlDropdownList::EListExpandable);
+ iOwner->DataMgr()->ClearChnCandidates(EItutCandidates);
+ candlist->Hide(ETrue);
+
+ iOwner->DataMgr()->PtiEngine()->ClearCurrentWord();
+
+ //show navi button
+ iOwner->LayoutContext()->ShowArrowBtn(EBtnArrowLeft | EBtnArrowRight
+ | EBtnArrowUp| EBtnArrowDown);
+
+ //show indicator
+ iOwner->LayoutContext()->Control(ECtrlIdIndicator)->Hide(EFalse);
+
+ iOwner->DataMgr()->PtiEngine()->ClearCurrentWord();
+
+ }
+
+TBool CChnItutUiStatePinyinComposition::HandleKeyL(TInt /*aCmd*/, TInt aKey)
+ {
+ if (!(aKey == EKeyBackspace ||
+ (aKey >= EPtiKey0 && aKey <= EPtiKey9) ||
+ (aKey == EPtiKeyStar)))
+ {
+ return EFalse;
+ }
+
+ if (aKey >= EPtiKey0 && aKey <= EPtiKey9)
+ {
+ // append keypress
+ iOwner->DataMgr()->PtiEngine()->AppendKeyPress(TPtiKey(aKey));
+ }
+ else if (aKey == EKeyBackspace)
+ {
+ if (!iOwner->DataMgr()->PtiEngine()->DeleteKeyPress().Length())
+ {
+ iOwner->SetCurrentStateL(CGenericItutUiMgrBase::EStateStandby);
+
+ iOwner->SetClrConsume(ETrue);
+
+ return ETrue;
+ }
+ }
+ else{
+ // input tonemark
+ if (!iOwner->DataMgr()->PtiEngine()->IncrementToneMark(ETrue))
+ {
+ // tonemark did not set correctly, everything unchanged
+ return ETrue;
+ }
+ }
+
+ // get all spelling
+ TInt spellcnt = iOwner->DataMgr()->PtiEngine()->PhoneticSpellingCount();
+
+ iSpellCands.ResetAndDestroy();
+ iSpellCands.Close();
+
+ // note: ptiengine's phonetic spelling start index is 1, not 0
+ for (TInt i = 1; i < (spellcnt + 1); i++)
+ {
+ HBufC* spellbuf = (iOwner->DataMgr()->PtiEngine()->GetPhoneticSpelling(i)).AllocL();
+
+ CleanupStack::PushL(spellbuf);
+ iSpellCands.Append(spellbuf);
+ CleanupStack::Pop(spellbuf);
+ }
+
+ TInt nearestIdx = 0;
+
+ /*
+ if (iLastSelSpell)
+ {
+ nearestIdx = GetNearestSpell(iLastSelSpell->Length());
+
+ delete iLastSelSpell;
+ iLastSelSpell = NULL;
+ }
+
+ iLastSelSpell = (iOwner->DataMgr()->PtiEngine()->GetPhoneticSpelling(nearestIdx + 1)).AllocL();
+ */
+
+ // set spell, set highlight of spelling candidate list
+ CFepCtrlDropdownList* spelldroplist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdSpellCandsList));
+ spelldroplist->SetCandidatesL(iSpellCands, CFepCtrlDropdownList::EListExpandableRollWithIconWithBubble);
+ spelldroplist->SetHighlightCell(nearestIdx);
+
+ // get candidates of nearest spell
+ iOwner->DataMgr()->PtiEngine()->SelectPhoneticSpelling(nearestIdx + 1);
+ TPtrC cands = iOwner->DataMgr()->PtiEngine()->CandidatePage();
+
+ iOwner->DataMgr()->ClearChnCandidates(EItutCandidates);
+ RPointerArray<HBufC>& candslist =
+ TItutDataConverter::AnyToRptrArray(iOwner->DataMgr()->RequestData(EChnCandidates));
+ TItutDataConverter::ConvertChnPhraseCandidateL(cands, candslist);
+
+ // set candidate
+ CFepCtrlDropdownList* canddroplist =
+ static_cast<CFepCtrlDropdownList*>(iOwner->LayoutContext()->Control(ECtrlIdStdCandsList));
+ canddroplist->SetCandidatesL(candslist, CFepCtrlDropdownList::EListExpandableWithBubble);
+
+ return ETrue;
+ }
+
+/*
+TInt CChnItutUiStatePinyinComposition::GetNearestSpell(TInt aValidLastSpellLen)
+ {
+ if (aValidLastSpellLen <= 0)
+ {
+ return 0;
+ }
+
+ for (TInt i = 0; i < iSpellCands.Count(); i++)
+ {
+ if ((iSpellCands[i]->Left(aValidLastSpellLen)).Compare(iLastSelSpell->Left(aValidLastSpellLen)) == 0)
+ {
+ return i;
+ }
+ }
+
+ return GetNearestSpell(aValidLastSpellLen-1);
+ }
+*/
+
+TBool CChnItutUiStatePinyinComposition::HandleCtrlEventL(
+ TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData)
+ {
+ switch (aEventType)
+ {
+ case EItutCmdCandidateSelected:
+ {
+ // press cell on spelling list
+ if (aCtrl->ControlId() == ECtrlIdSpellCandsList &&
+ aEventData.Length() > 0)
+ {
+ TInt selCandIdx = aEventData[aEventData.Length() - 1];
+
+ // note for ptiengine, spelling index start from 1, not 0
+ iOwner->DataMgr()->PtiEngine()->SelectPhoneticSpelling(selCandIdx + 1);
+
+ CFepCtrlDropdownList* spelldroplist = static_cast<CFepCtrlDropdownList*>(aCtrl);
+ spelldroplist->SetHighlightCell(selCandIdx);
+
+ /*
+ delete iLastSelSpell;
+ iLastSelSpell = NULL;
+ iLastSelSpell = (iOwner->DataMgr()->PtiEngine()->GetPhoneticSpelling(selCandIdx + 1)).AllocL();
+ */
+
+ TPtrC cands = iOwner->DataMgr()->PtiEngine()->CandidatePage();
+
+ iOwner->DataMgr()->ClearChnCandidates(EItutCandidates);
+ RPointerArray<HBufC>& candslist = TItutDataConverter::AnyToRptrArray(
+ iOwner->DataMgr()->RequestData(EChnCandidates));
+ TItutDataConverter::ConvertChnPhraseCandidateL(cands, candslist);
+
+ CFepCtrlDropdownList* canddroplist = static_cast<CFepCtrlDropdownList*>(
+ iOwner->LayoutContext()->Control(ECtrlIdStdCandsList));
+ canddroplist->SetCandidatesL(candslist, CFepCtrlDropdownList::EListExpandableWithBubble);
+
+ return ETrue;
+ }
+ else if (aCtrl->ControlId() == ECtrlIdStdCandsList)
+ {
+ iOwner->SetCurrentStateL(CGenericItutUiMgrBase::EStatePredict);
+ return iOwner->CurrentState()->HandleCtrlEventL(aEventType, aCtrl, aEventData);
+ }
+ }
+ break;
+ case EItutCmdGetNextCandidatePage:
+ {
+ if (aCtrl->ControlId() == ECtrlIdStdCandsList)
+ {
+ RPointerArray<HBufC>& candslist = TItutDataConverter::AnyToRptrArray(
+ iOwner->DataMgr()->RequestData(EChnCandidates));
+
+ // original candidate count before fetch new candidate
+ TInt candscnt = candslist.Count();
+ if (iOwner->DataMgr()->GetNextPageCandidateL(candslist) == KErrNone)
+ {
+ static_cast<CFepCtrlDropdownList*>(aCtrl)->AddCandidatesL(candslist);
+ }
+
+ return ETrue;
+ }
+ }
+ break;
+ case EItutCmdCandidateExisted:
+ {
+ if (aCtrl->ControlId() == ECtrlIdStdCandsList)
+ {
+ static_cast<CFepCtrlDropdownList*>(
+ aCtrl)->SetFlagCandidateExist(iOwner->DataMgr()->NextPageCandidateExist());
+ return ETrue;
+ }
+ }
+ break;
+ // consume star key at pinyin composition state
+ case EEventRawKeyDownEvent:
+ {
+ const TKeyEvent *key = reinterpret_cast<const TKeyEvent*>(aEventData.Ptr());
+
+ if (key->iScanCode == EStdKeyNkpAsterisk)
+ {
+ HandleKeyL(ECmdPenInputFingerKeyPress, EPtiKeyStar);
+ return ETrue;
+ }
+ }
+ break;
+ case EEventRawKeyUpEvent:
+ {
+ const TKeyEvent *key = reinterpret_cast<const TKeyEvent*>(aEventData.Ptr());
+
+ if (key->iScanCode == EStdKeyNkpAsterisk)
+ {
+ return ETrue;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return EFalse;
+ }
+
+CGenericItutUiMgrBase::TUiState CChnItutUiStatePinyinComposition::StateType()
+ {
+ return CGenericItutUiMgrBase::EStateComposition;
+ }
+
+// End Of File