📄 fepcontrol.cpp
字号:
#include <eikappui.h>
#include <eikenv.h> //CEikEnv
#include <bautils.h> // for BaflUtils
#include <aknedsts.h> // for CAknEdwinState
#include "haneasefep.h"
#include "fepcontrol.h"
#include "haneaseengine.h"
#include "fepindicator.h"
#include "logger.h"
//_LIT(KT9FepResourceFileName, "z:\\system\\fep\\t9fep.rsc");
const TInt KChineseSymbolNum = 42;
const TInt KEnglishSymbolNum = 38;
const TUint KChineseSymbol[KChineseSymbolNum] =
{
#include "chinesesymbol.h"
};
const TUint KEnglishSymbol[KEnglishSymbolNum] =
{
#include "englishsymbol.h"
};
CHaneaseFepControl* CHaneaseFepControl::NewL(CHaneaseFep& aFep)
{
CHaneaseFepControl* self=new(ELeave) CHaneaseFepControl(aFep);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(); //self
return self;
}
CHaneaseFepControl::CHaneaseFepControl(CHaneaseFep& aFep)
:iFep(aFep),
iInputCapabilities(TCoeInputCapabilities::ENone)
{
}
void CHaneaseFepControl::ConstructL()
{
//LOG_METHOD(_L("CHaneaseFepControl::ConstructL"));
// Set up fep key catching control - front window, null size, non-focusing
CreateWindowL();
SetNonFocusing();
DrawableWindow()->SetOrdinalPosition(0, ECoeWinPriorityFep);
TRect rect(0, 0, 0, 0);
SetRect(rect);
ActivateL();
iCand = new(ELeave) CArrayFixFlat<TUint>(1);
iOutput = new(ELeave) CArrayFixFlat<TUint>(1);
// Create status pane indicator
iIndicator = CFepIndicator::NewL();
// The reason why we need to set up the T9 resource is that, Series 60 platform integrates the
// T9 engine into the system, and some on-board applications expect this resource to be
// present, if not, those applications will not work. The T9 resource is loaded when the T9 FEP
// start up.
//
// As a workaround solution, we load the T9 resource in our own FEP.
/*
TFileName resourceName(KT9FepResourceFileName);
BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), resourceName);
iResId = iEikonEnv->AddResourceFileL(resourceName);
*/
((CCoeAppUi*)iEikonEnv->AppUi())->AddToStackL(this,
ECoeStackPriorityFep, ECoeStackFlagSharable|ECoeStackFlagRefusesFocus);
}
CHaneaseFepControl::~CHaneaseFepControl()
{
//LOG_METHOD(_L("CHaneaseFepControl::~CHaneaseFepControl"));
delete iCand;
iCand = NULL;
delete iOutput;
iOutput = NULL;
delete iEngine;
iEngine = NULL;
delete iLetterEngine;
iLetterEngine = NULL;
delete iIndicator;
iIndicator = NULL;
//iEikonEnv->DeleteResourceFile(iResId);
((CCoeAppUi*)iEikonEnv->AppUi())->RemoveFromStack(this);
}
void CHaneaseFepControl::Reset()
{
//LOG_METHOD(_L("CHaneaseFepControl::Reset"));
iHighlight = 0;
iCand->Reset();
iOutput->Reset();
iInput.Zero();
iMode =(TMode) ((TInt)iMode&0xfe);
if(iInputSymbol1)
{
iInputSymbol1 = 0;
delete iLetterEngine;
iLetterEngine = NULL;
}
}
TKeyResponse CHaneaseFepControl::ChineseHandle(TInt keyCode)
{
//LOG_METHOD(_L("CHaneaseFepControl::ChineseHandle"));
if(iEngine == NULL)
return EKeyWasNotConsumed;
TKeyResponse response = EKeyWasNotConsumed;
switch(keyCode)
{
case EKeyEnter:
case EKeyDevice3:
if(iCand->Count()>0)
{
CommitOutput();
DisplayFep();
response = EKeyWasConsumed;
}
break;
case EKeyUpArrow:
response = iEngine->OnKey('-');
break;
case EKeyDownArrow:
response = iEngine->OnKey('+');
break;
case EKeyLeftArrow:
response = iEngine->OnKey('<');
break;
case EKeyRightArrow:
response = iEngine->OnKey('>');
break;
case EKeyBackspace:
case EKeyDelete:
response = iEngine->OnKey('c');
break;
case '1':
if(iInputSymbol1==0)
{
iInputSymbol1 = 1;
iLetterEngine = CMultiTapEngine::NewL(*this, iInput, *iCand, *iOutput);
}
response = LetterHandle(keyCode);
break;
default:
if(iInputSymbol1)
response = LetterHandle(keyCode);
else
response = iEngine->OnKey(keyCode);
break;
}
return response;
}
TKeyResponse CHaneaseFepControl::LetterHandle(TInt keyCode)
{
//LOG_METHOD(_L("CHaneaseFepControl::LetterHandle"));
if(iLetterEngine == NULL)
return EKeyWasNotConsumed;
if(keyCode == EKeyBackspace||keyCode == EKeyDelete)
return iLetterEngine->OnKey('c');
return iLetterEngine->OnKey(keyCode);
}
TKeyResponse CHaneaseFepControl::SymbolHandle(TInt keyCode)
{
//LOG_METHOD(_L("CHaneaseFepControl::SymbolHandle"));
TKeyResponse response = EKeyWasNotConsumed;
switch(keyCode)
{
case EKeyEnter:
case EKeyDevice3:
if(iCand->Count()>0)
{
CommitOutput();
DisplayFep();
response = EKeyWasConsumed;
}
break;
case EKeyBackspace:
case EKeyDelete:
Reset();
DisplayFep();
response = EKeyWasConsumed;
break;
case EKeyUpArrow:
if(iHighlight>=7)
iHighlight-=7;
else if(iHighlight< iCand->Count()%7)
iHighlight = iCand->Count() - iCand->Count()%7 + iHighlight;
else
iHighlight = iCand->Count() - iCand->Count()%7 + iHighlight -7;
DisplaySymbol();
response = EKeyWasConsumed;
break;
case EKeyDownArrow:
iHighlight+=7;
if(iHighlight>iCand->Count()-1)
iHighlight %= 7;
DisplaySymbol();
response = EKeyWasConsumed;
break;
case EKeyLeftArrow:
iHighlight--;
if(iHighlight<0)
iHighlight = iCand->Count()-1;
DisplaySymbol();
response = EKeyWasConsumed;
break;
case EKeyRightArrow:
iHighlight++;
if(iHighlight>iCand->Count()-1)
iHighlight = 0;
DisplaySymbol();
response = EKeyWasConsumed;
break;
default:
break;
}
return response;
}
TKeyResponse CHaneaseFepControl::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode)
{
#if 1
TInt keyCode = aKeyEvent.iCode;
if (aEventCode != EEventKey||iFep.IsSimulatingKeyEvent())
{
return EKeyWasNotConsumed;
}
if (((keyCode == EKeyCBA1) || (keyCode == EKeyCBA2)) || (keyCode == EKeyMenu))
{
return EKeyWasNotConsumed;
}
if (iFep.IsTurnedOnByL(aKeyEvent) || iFep.IsTurnedOffByL(aKeyEvent))
{
return EKeyWasConsumed;
}
if (!iFep.IsOn())
return EKeyWasNotConsumed;
TKeyResponse response = EKeyWasNotConsumed;
if(iMode == ENoInput)
{
return response;
}
if(keyCode=='#')
{
Reset();
DisplayFep();
if(iMode&EChinese)
{
iMode = ELetter;
delete iEngine;
iEngine = NULL;
if(iLetterEngine ==NULL)
iLetterEngine = CMultiTapEngine::NewL(*this, iInput, *iCand, *iOutput);
iIndicator->SetState(CFepIndicator::EStateAlphabat);
}
else if(iMode&ELetter)
{
iMode = ENumber;
delete iEngine;
iEngine = NULL;
delete iLetterEngine;
iLetterEngine = NULL;
iIndicator->SetState(CFepIndicator::EStateNumeric);
}
else if(iMode&ENumber)
{
iMode = EChinese;
delete iLetterEngine;
iLetterEngine = NULL;
if(iEngine ==NULL)
iEngine = CHaneaseEngine::NewL(*this, iInput, *iCand, *iOutput);
iIndicator->SetState(CFepIndicator::EStateChinese);
}
response = EKeyWasConsumed;
}
else if(keyCode=='*')
{
SelectSymbol();
response = EKeyWasConsumed;
}
else if(iMode == EChinese)
{
response = ChineseHandle(keyCode);
}
else if(iMode == ELetter)
{
response = LetterHandle(keyCode);
}
else if(iMode & ESymbol)
{
response = SymbolHandle(keyCode);
}
return response;
#else
//LOG_METHOD(_L("CHaneaseFepControl::OfferKeyEventL"));
FEP_START_KEY_EVENT_HANDLER_L(iFep, aKeyEvent, aEventCode);
TKeyResponse response = EKeyWasNotConsumed;
if(iMode == ENoInput)
{
FEP_END_KEY_EVENT_HANDLER_L(iFep, aKeyEvent, response);
}
/*
TInt keyCode = aKeyEvent.iCode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -