textinput/peninputgenericitut/src/peninputitutchnuistatepinyincomposition.cpp
changeset 0 eb1f2e154e89
child 7 6defe5d1bd39
--- /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