diff -r 000000000000 -r eb1f2e154e89 textinput/peninputsplititut/src/peninputsplititutchnuimgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputsplititut/src/peninputsplititutchnuimgr.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,413 @@ +/* +* 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 "peninputsplititutchnuimgr.h" +#include "peninputsplititutlayout.h" +#include "peninputsplititutlayoutcontext.h" +#include "peninputsplititutdatamgr.h" +#include "peninputsplititutchnuistatestandby.h" +#include "peninputsplititutchnuistatepredict.h" +#include "peninputsplititutchnuistatestrokezhuyincomposition.h" +#include "peninputsplititutchnuistatepinyincomposition.h" +#include "peninputsplititutwesternuistatenonpredict.h" +#include "peninputsplititutwindowmanager.h" + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::NewL +// --------------------------------------------------------------------------- +// +CChnSplitItutUiMgr* CChnSplitItutUiMgr::NewL(MSplitItutLayoutContext* aContext, + CSplitItutDataMgr* aDataMgr, + CSplitItutWindowManager* aUiManager) + { + CChnSplitItutUiMgr* self = new (ELeave) CChnSplitItutUiMgr(aContext, aDataMgr,aUiManager); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::~CChnSplitItutUiMgr +// --------------------------------------------------------------------------- +// +CChnSplitItutUiMgr::~CChnSplitItutUiMgr() + { + if (iCurrentState) + { + iCurrentState->OnExit(); + } + + delete iStandbyState; + delete iPinyinComp; + delete iStoZhuComp; + delete iPredictState; + + delete iNormalState; + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::CChnSplitItutUiMgr +// --------------------------------------------------------------------------- +// +CChnSplitItutUiMgr::CChnSplitItutUiMgr(MSplitItutLayoutContext* aContext, + CSplitItutDataMgr* aDataMgr, + CSplitItutWindowManager* aUiManager) + :CSplitItutUiMgrBase(aContext, aDataMgr,aUiManager) + { + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::ConstructL +// --------------------------------------------------------------------------- +// +void CChnSplitItutUiMgr::ConstructL() + { + CSplitItutUiMgrBase::ConstructL(); + + iStandbyState = CChnSplitItutUiStateStandby::NewL(this); + iPinyinComp = CChnSplitItutUiStatePinyinComposition::NewL(this); + iStoZhuComp = CChnSplitItutUiStateStrokeZhuyinComposition::NewL(this); + iPredictState = CChnSplitItutUiStatePredict::NewL(this); + + iNormalState = CWesternSplitItutUiStateNonPredict::NewL(this); + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::HandleCommandL +// --------------------------------------------------------------------------- +// +TInt CChnSplitItutUiMgr::HandleCommandL(TInt aCmd, TUint8* aData) + { + if (aCmd == ECmdPenInputFingerMatchSelection ) + { + if (!(*(reinterpret_cast(aData)))) + { + // state not on + if (!IsChineseMode()) + { + SetCurrentStateL(CSplitItutUiMgrBase::EStateWesternStandby); + } + return KErrNone; + } + } + + TUint* data = (TUint*) aData; + + switch (aCmd) + { + case ECmdPenInputFingerKeyPress: + { + if (iCurrentState && iCurrentState->HandleKeyL(aCmd, *data)) + { + return KErrNone; + } + + return KErrNotSupported; + } + case ECmdPenInputFingerLongKeyPress: + { + if (!IsChineseMode()) + { + return KErrNone; + } + + if (*data >= EPtiKey0 && *data <= EPtiKey9) + { + HandleLongPressNumberKeyL(TPtiKey(*data)); + + // long key press + if (iCurrentState->StateType() == CSplitItutUiMgrBase::EStateComposition) + { + return KErrNone; + } + } + else if (iCurrentState && iCurrentState->HandleKeyL(aCmd, *data)) + { + return KErrNone; + } + + // means not handled by ui + return KErrNotSupported; + } + case ECmdPenInputDeActive: + { + if (!iCurrentState) + { + return KErrNone; + } + + TBool changeState = EFalse; + TUiState state; + + if (IsChineseMode()) + { + iCurrentState->StateType() != CSplitItutUiMgrBase::EStateStandby ? + changeState = ETrue : changeState = EFalse; + + state = CSplitItutUiMgrBase::EStateStandby; + } + + if (changeState) + { + SetCurrentStateL(state); + } + } + break; + case ECmdPenInputNoFreeSpace: + { + if (!iCurrentState) + { + return KErrNone; + } + + if (IsChineseMode() && + iCurrentState->StateType() != CSplitItutUiMgrBase::EStateStandby) + { + SetCurrentStateL(CSplitItutUiMgrBase::EStateStandby); + } + } + break; + case ECmdPenInputCase: + { + if (iCurrentState)// && !IsChineseMode()) + { + iLayoutContext->DataMgr()->SetCase(*((TUint*) aData)); + return KErrNone; + } + } + break; + case ECmdPenInputFingerMatchList: + { + if (iCurrentState) + { + iCurrentState->HandleCommandL(aCmd, aData); + } + } + break; + case ECmdPenInputIsSecretText: + { + if (iCurrentState) + { + iCurrentState->HandleCommandL(aCmd, aData); + } + } + break; + default: + break; + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::HandleCtrlEventL +// --------------------------------------------------------------------------- +// +TBool CChnSplitItutUiMgr::HandleCtrlEventL(TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData) + { + if (!iCurrentState) + { + return EFalse; + } + + if (!IsChineseMode()) + { + return iCurrentState->HandleCtrlEventL(aEventType, aCtrl, aEventData); + } + + if (!iCurrentState->HandleCtrlEventL(aEventType, aCtrl, aEventData)) + { + switch (aEventType) + { + case EEventRawKeyUpEvent: + { + if (aCtrl->ControlId() == ECtrlIdBackspace) + { + // if clear key released + SetClrConsume(EFalse); + } + else + { + // if number key released + const TKeyEvent *key = reinterpret_cast(aEventData.Ptr()); + + if ((key->iScanCode >= EPtiKey0) && (key->iScanCode <= EPtiKey9)) + { + SetNumLongPressValid(EFalse); + } + } + } + break; + default: + break; + } + + return EFalse; + } + else + { + // handled by state + return ETrue; + } + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::SetCurrentStateL +// --------------------------------------------------------------------------- +// +void CChnSplitItutUiMgr::SetCurrentStateL(TUiState aNewStateType) + { + if (iCurrentState && + aNewStateType == iCurrentState->StateType()) + { + return; + } + + CSplitItutUiStateBase* newState = NULL; + + switch (aNewStateType) + { + case CSplitItutUiMgrBase::EStateStandby: + { + newState = iStandbyState; + } + break; + case CSplitItutUiMgrBase::EStateComposition: + { + newState = (DataMgr()->InputMode() == EPinyin) ? + iPinyinComp : iStoZhuComp; + } + break; + case CSplitItutUiMgrBase::EStatePredict: + { + newState = iPredictState; + } + break; + case CSplitItutUiMgrBase::EStateWesternStandby: + { + newState = iNormalState; + } + break; + default: + return; + } + + if (iCurrentState) + { + iCurrentState->OnExit(); + } + + iCurrentState = newState; + if(DataMgr()->IsUpdate()) + { + DataMgr()->SetUpdate(EFalse); + CSplitItutUiLayout* itutLayout = + static_cast( LayoutContext()->UiLayout() ); + itutLayout->SizeChanged( NULL ); + } + + iCurrentState->OnEntryL(); + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::ActivateUiL +// --------------------------------------------------------------------------- +// +void CChnSplitItutUiMgr::ActivateUiL() + { + + if (iCurrentState && !IsChineseMode()) + { + iCurrentState->OnEntryL(); + return; + } + + switch (DataMgr()->InputMode()) + { + case EPinyin: + case EStroke: + case EZhuyin: + SetCurrentStateL(CSplitItutUiMgrBase::EStateStandby); + break; + default: + SetCurrentStateL(CSplitItutUiMgrBase::EStateWesternStandby); + break; + } + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::DeactivateUI +// --------------------------------------------------------------------------- +// +void CChnSplitItutUiMgr::DeactivateUI() + { + if (iCurrentState) + { + iCurrentState->OnExit(); + iCurrentState = NULL; + } + + SetNumLongPressValid(EFalse); + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::HandleLongPressNumberKeyL +// --------------------------------------------------------------------------- +// +void CChnSplitItutUiMgr::HandleLongPressNumberKeyL(TPtiKey /*aKey*/) + { + if (NumLongPressValid()) + { + // go to standby state + SetCurrentStateL(CSplitItutUiMgrBase::EStateStandby); + + DataMgr()->PtiEngine()->ClearCurrentWord(); + + SetNumLongPressValid(EFalse); + } + } + +// --------------------------------------------------------------------------- +// CChnSplitItutUiMgr::IsChineseMode +// --------------------------------------------------------------------------- +// +TBool CChnSplitItutUiMgr::IsChineseMode() + { + TInt immode = DataMgr()->InputMode(); + TBool chineseMode = EFalse; + + if (immode == EPinyin || immode == EStroke || immode == EZhuyin) + { + chineseMode = ETrue; + } + + return chineseMode; + } + +// End Of File