⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fepcontrol.cpp

📁 三字经输入法源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -