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

📄 multitapengine.cpp

📁 Symbian平台 数字键盘手机输入法源码
💻 CPP
字号:
#include "multitapengine.h"
#include "multitaptimer.h"
#include "FepControl.h"

const TInt KMaxNumOfKeys = 10;
const TInt KMultiTapTimeout = 1000000; // 1.0s

struct TKeymap 
	{
	char*	iKeyString;
	TInt	iSize;
	};

const struct TKeymap KKeymap[KMaxNumOfKeys] = {
	{ " 0",		2 }, 
	{ "1+#.",	4 },
	{ "abc2",	4 },
	{ "def3",	4 },
	{ "ghi4",	4 },
	{ "jkl5",	4 },
	{ "mno6",	4 },
	{ "pqrs7",	5 },
	{ "tuv8",	4 },
	{ "wxyz9",	5 }
	};
const struct TKeymap KKeymapUpCase[KMaxNumOfKeys] = {
	{ " 0",		2 }, 
	{ "1+#.",	4 },
	{ "ABC2",	4 },
	{ "DEF3",	4 },
	{ "GHI4",	4 },
	{ "JKL5",	4 },
	{ "MNO6",	4 },
	{ "PQRS7",	5 },
	{ "TUV8",	4 },
	{ "WXYZ9",	5 }
	};

//////////////////////////////////////////////////////////////////////
//
// Class CExampleFepMultiTapEngine
//
//////////////////////////////////////////////////////////////////////
CExampleFepMultiTapEngine* CExampleFepMultiTapEngine::NewL(CeQTapControl& aControl)
	{
	CExampleFepMultiTapEngine* self = new(ELeave)CExampleFepMultiTapEngine(aControl);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop();	// self
	return self;
	}

CExampleFepMultiTapEngine::CExampleFepMultiTapEngine(CeQTapControl& aControl)
	: m_peQTapCtrl(NULL),
	iBuffer(KNullDesC),
	iKeyPos(0),
	iPreviousMultiTapKeyCode(EKeyNull),
	m_bIsUpper(FALSE)
	{
		m_peQTapCtrl = &aControl;
	}

void CExampleFepMultiTapEngine::ConstructL()
	{
	TCallBack timerTimeout(TimerTimeout, this);
	iMultiTapTimer = CExampleFepMultiTapTimer::NewL(timerTimeout, KMultiTapTimeout);
	}

CExampleFepMultiTapEngine::~CExampleFepMultiTapEngine()
	{
	if(iMultiTapTimer)
		delete iMultiTapTimer;
	}

TInt CExampleFepMultiTapEngine::TimerTimeout(TAny* aPtr)
	{
	return REINTERPRET_CAST(CExampleFepMultiTapEngine*, aPtr)->DoTimerTimeout();
	}

TInt CExampleFepMultiTapEngine::DoTimerTimeout()
	{
	iMultiTapTimer->DoCancel();
	iPreviousMultiTapKeyCode = EKeyNull;
	if(m_peQTapCtrl!=NULL)
	{
		m_peQTapCtrl->CommitInlineEdit(TRUE);
	}
	return ETrue;
	}

TPtrC CExampleFepMultiTapEngine::AppendCharacter(TUint aKeyCode)
	{
	TInt offset = aKeyCode - '0';

	if (iMultiTapTimer->IsActive() && aKeyCode == iPreviousMultiTapKeyCode)
	{
		// Delete the previous letter in iBuffer
		DeleteCharacter();

		iKeyPos++;
		if(m_bIsUpper==TRUE)
		{
			if ( iKeyPos >= KKeymapUpCase[offset].iSize )
			{
				iKeyPos = 0;
			}
		}
		else
		{
			if ( iKeyPos >= KKeymap[offset].iSize )
			{
				iKeyPos = 0;
			}
		}
	}
	else
	{
		iKeyPos = 0;
	}

	char ch=0;

	if(m_bIsUpper==TRUE)
	{
		ch = KKeymapUpCase[offset].iKeyString[iKeyPos];
	}
	else
	{
		ch = KKeymap[offset].iKeyString[iKeyPos];
	}

	TBuf<1> buffer = KNullDesC();

	buffer.Append(ch);
	iBuffer += buffer;

	iPreviousMultiTapKeyCode = aKeyCode;

	// Start the multitap timer
	iMultiTapTimer->IssueRequest();

	return iBuffer.Ptr();
}

TPtrC CExampleFepMultiTapEngine::DeleteCharacter(void)
	{
	TInt len = iBuffer.Length();
	if(len >0)
	{
		iBuffer = iBuffer.Left (len - 1);
	}
	return iBuffer.Ptr();
	}

void CExampleFepMultiTapEngine::ClearBuffer(void)
	{
	iBuffer.SetLength(0);
	}

TPtrC CExampleFepMultiTapEngine::Buffer(void)
	{
	return iBuffer.Ptr();
	}

TBool CExampleFepMultiTapEngine::IsActive()
	{
	return iMultiTapTimer->IsActive();	
	}

void CExampleFepMultiTapEngine::Cancel()
	{
	iMultiTapTimer->Cancel();	
	}
// end of file

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -