📄 eqtapstroke.cpp
字号:
// eQTapStroke.cpp: implementation of the CeQTapStroke class.
//
//////////////////////////////////////////////////////////////////////
#include "eQTapStroke.h"
#include "FepControl.h"
#include "String.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CeQTapStroke::CeQTapStroke()
: m_pDictionaryChinese(NULL),
m_pSentenceChinese(NULL),
m_bSelectMode(FALSE),
m_bKeyMode(ENoMove),
m_bCurrentWordIsNull(CURRENT_WORD_NOT_NULL)
{
}
CeQTapStroke::~CeQTapStroke()
{
if(m_peQTapCtrl->GetChineseDictionary()!=NULL)
{
NEXTAP_WriteStaticDic((const unsigned short *)L"c:\\udic.bin",m_peQTapCtrl->GetChineseDictionary());
PATTREE_FreeStaticDic(m_peQTapCtrl->GetChineseDictionary());
m_peQTapCtrl->SetChineseDictionary(NULL);
}
if(m_peQTapCtrl->GetChineseSentence()!=NULL)
{
free(m_peQTapCtrl->GetChineseSentence());
m_peQTapCtrl->SetChineseSentence ( NULL);
}
}
int CeQTapStroke::OnKeyEventProc(int nParameter1, int nParameter2)
{
int nReturn = KEY_RESULT_NOTPROCESSED;
TKeyResponse response = EKeyWasNotConsumed;
TKeyEvent* aKeyEvent = (TKeyEvent*)nParameter1;
TUint keyCode =0;
TEventCode aEventCode = (TEventCode)nParameter2;
if((aKeyEvent==NULL)||(m_bIsIMActive==FALSE))
{
goto FuncExit;
}
#ifndef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
keyCode = aKeyEvent->iCode;
switch (keyCode)
{
case '1':
case '2':
case '3':
case '4':
case '5':
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if(m_pSentenceChinese==NULL)
{
OpenDictionary();
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
printf( "Open Chinese Dictionary Error!\n" );
goto FuncExit;
}
ResetValue();
NEXTAP_ResetSentence(m_pSentenceChinese, m_pDictionaryChinese, PATTREE_CHS_STROKE,MAXCAND,MAXCAND);
ActiveSTKWindow(EFalse);
m_bKeyMode = ENoMove;
m_bSelectMode = ETrue;
}
#endif
if (!m_peQTapCtrl->IsInlineEditTrans())
{
m_peQTapCtrl->StartInlineEdit(KNullDesC, 0, TRUE);
}
//先判断窗口是否打开
if(m_peQTapCtrl->GetWindowVisibleState()==FALSE)
{
ActiveSTKWindow(TRUE);
}
if(m_pSentenceChinese==NULL || m_pDictionaryChinese==NULL)
{
return EKeyWasNotConsumed;
}
NEXTAP_AddDigi2Sentence(m_pSentenceChinese,m_pDictionaryChinese,keyCode);
CurrentChange ();
m_peQTapCtrl->FreshSTKWindow();
response=EKeyWasConsumed;
break;
case '6':
response = EKeyWasConsumed;
break;
case '7':
case '8':
case '9':
case '*':
case '#':
case '0':
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if(m_pSentenceChinese==NULL)
{
OpenDictionary();
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
printf( "Open Chinese Dictionary Error!\n" );
goto FuncExit;
}
ResetValue();
NEXTAP_ResetSentence(m_pSentenceChinese, m_pDictionaryChinese, PATTREE_CHS_STROKE,MAXCAND,MAXCAND);
ActiveSTKWindow(EFalse);
m_bKeyMode = ENoMove;
m_bSelectMode = ETrue;
m_peQTapCtrl->FreshSTKWindow();
nReturn = EKeyWasConsumed;
goto FuncExit;
}
#endif
if (!m_peQTapCtrl->IsInlineEditTrans())
{
m_peQTapCtrl->StartInlineEdit(KNullDesC, 0, TRUE);
}
//先判断窗口是否打开
if(m_peQTapCtrl->GetWindowVisibleState()==FALSE)
{
ActiveSTKWindow(TRUE);
}
OfferKeyEventInOKModeL(keyCode); //to be modify later
m_peQTapCtrl->FreshSTKWindow();
response=EKeyWasConsumed;
break;
case EKeyBackspace:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
if (m_bKeyMode == EMoveLRUD)
{
response = EKeyWasConsumed;
nReturn = response;
goto FuncExit;
}
if(m_pSentenceChinese->szDigi[0]==0) //没有输入
{
response=EKeyWasNotConsumed;
}
else
{
NEXTAP_DelDigiFSentence(m_pSentenceChinese,m_pDictionaryChinese);
if(m_pSentenceChinese->szDigi[0]==0)
{
NEXTAP_ResetSentence(m_pSentenceChinese, m_pDictionaryChinese, m_pSentenceChinese->IMMethod, MAXCAND , MAXCAND );
ResetValue();
m_peQTapCtrl->CommitInlineEdit(TRUE);
}
m_peQTapCtrl->FreshSTKWindow();
m_bSelectMode=TRUE;
response=EKeyWasConsumed;
}
break;
case EKeyLeftArrow:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
response=OnKeyMoveLeft(*aKeyEvent); //to be modify later
break;
case EKeyRightArrow:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
response=OnKeyMoveRight(*aKeyEvent); //to be modify later
break;
case EKeyUpArrow:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
response=OnKeyMoveUp(*aKeyEvent); //to be modify later
break;
case EKeyDownArrow:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
response=OnKeyMoveDown(*aKeyEvent); //to be modify later
break;
case EKeyOK:
#ifdef SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
goto FuncExit;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
if(m_pSentenceChinese->szDigi[0]!=0)
{
response=OfferKeyEventInOKModeL(-1);
m_peQTapCtrl->FreshSTKWindow();
m_bSelectMode=TRUE;
}
else
{
ActiveSTKWindow(FALSE);
response = EKeyWasConsumed;
}
break;
}
nReturn =response;
FuncExit:
return nReturn;
}
int CeQTapStroke::OnDrawSTkWindow()
{
int nReturn = 0;
return nReturn;
}
CeQTapStroke* CeQTapStroke::NewL(CeQTapControl* pControl)
{
CeQTapStroke* self = new(ELeave)CeQTapStroke(pControl);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(); // self
return self;
}
CeQTapStroke::CeQTapStroke(CeQTapControl* pControl)
: m_pDictionaryChinese(NULL),
m_pSentenceChinese(NULL),
m_bSelectMode(FALSE),
m_bKeyMode(ENoMove),
m_bCurrentWordIsNull(CURRENT_WORD_NOT_NULL)
{
m_peQTapCtrl = pControl;
m_bIsIMActive = FALSE;
}
void CeQTapStroke::ConstructL()
{
}
void CeQTapStroke::SwitchToStroke()
{
#ifndef SMARTCHINESE_OPENDIC_ATKEYPRESS
if(m_pSentenceChinese==NULL)
{
OpenDictionary();
}
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
printf( "Open Chinese Dictionary Error!\n" );
return;
}
#else //SMARTCHINESE_OPENDIC_ATKEYPRESS
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
ActiveSTKWindow(EFalse);
m_bKeyMode = ENoMove;
m_bSelectMode = ETrue;
return;
}
#endif //SMARTCHINESE_OPENDIC_ATKEYPRESS
ResetValue();
NEXTAP_ResetSentence( m_pSentenceChinese, m_pDictionaryChinese, PATTREE_CHS_STROKE,MAXCAND,MAXCAND);
ActiveSTKWindow(EFalse);
m_bKeyMode = ENoMove;
m_bSelectMode = ETrue;
}
void CeQTapStroke::ActiveSTKWindow(TBool bActive)
{
TPoint fepControlPos;
RWindow& window = m_peQTapCtrl->GetRWindow();
fepControlPos.iX=0;
fepControlPos.iY=162;
SetExtent(fepControlPos, TSize(176,45));
window.SetExtent(fepControlPos, TSize(176,45));
if (bActive == TRUE) //打开输入法窗口
{
window.SetVisible(ETrue);
m_peQTapCtrl->SetWindowVisibleState(TRUE);
}
else //关闭输入法窗口
{
window.SetVisible(EFalse);
m_peQTapCtrl->SetWindowVisibleState(FALSE);
}
}
TBool CeQTapStroke::CurrentChange()
{
int pnCharBegin, pnCharEnd, pnDigiBegin, pnDigiEnd;
NEXTAP_GetActiveWordInfo(m_pSentenceChinese, m_pDictionaryChinese, &pnCharBegin, &pnCharEnd, &pnDigiBegin, &pnDigiEnd);
if(pnDigiBegin==0)
{
m_bCurrentWordIsNull=CURRENT_WORD_NOT_NULL;
return FALSE;
}
else
{
m_bCurrentWordIsNull=CURRENT_WORD_NULL;
return TRUE;
}
}
void CeQTapStroke::ResetValue()
{
if(m_pSentenceChinese!=NULL)
{
m_pSentenceChinese->szPinyin [0]=0;
m_pSentenceChinese->szCurWordPinyin[0]=0;
m_pSentenceChinese->szAllInput[0] = 0;
m_pSentenceChinese->nNextPredictCharNumber = 0;
}
}
void CeQTapStroke::OpenDictionary()
{
int nSize =0;
if (NEXTAP_GetSentenceBufferSize()>NEXTAP_GetSentenceBufferSizeEN())
{
nSize=NEXTAP_GetSentenceBufferSize();
}
else
{
nSize=NEXTAP_GetSentenceBufferSizeEN();
}
if(m_peQTapCtrl->GetChineseSentence()==NULL)
{
m_pSentenceChinese = (OUTBUFFER*)malloc(nSize);
if (m_pSentenceChinese==NULL)
{
/*we should do something here*/
}
m_pSentenceChinese->szDigi[0]=0;
m_pSentenceChinese->nNextPredictCharNumber = 0;
m_pSentenceChinese->szAllInput[0] = 0;
m_peQTapCtrl->SetChineseSentence(m_pSentenceChinese);
}
else
{
m_pSentenceChinese= m_peQTapCtrl->GetChineseSentence();
}
if(m_peQTapCtrl->GetChineseDictionary()==NULL)
{
#ifdef __WINS__
m_pDictionaryChinese= (int*)PATTREE_LoadStaticDic((const unsigned short *)L"z:\\system\\fep\\dic.bin",(const unsigned short *)L"c:\\udic.bin");
#else
m_pDictionaryChinese= (int*)PATTREE_LoadStaticDic((const unsigned short *)L"c:\\system\\fep\\dic.bin",(const unsigned short *)L"c:\\udic.bin");
#endif
if (m_pDictionaryChinese==NULL) //
{
/*we should do something here*/
}
m_peQTapCtrl->SetChineseDictionary(m_pDictionaryChinese);
}
else
{
m_pDictionaryChinese = m_peQTapCtrl->GetChineseDictionary();
}
}
void CeQTapStroke::DrawStroke() const
{
//这个函数负责处理整个输入法的输出
CWindowGc& gc = SystemGc();
TRect rect = Rect();
TRect tmpRect;
TBuf<32> prompt;
TBuf<5> signalWord;
TBuf<64> sentenceWord;
TInt pos = 0;
TInt sentencePos = 0;
gc.Clear();
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.SetPenStyle(CGraphicsContext::ENullPen);
//画上面的两个部分
tmpRect.SetRect(0,0,rect.Width(),29);
gc.SetBrushColor(DISPLAYBRUSHCOLOR);
gc.DrawRect(tmpRect);
//画下面的被选
tmpRect=rect;
tmpRect.SetRect(0,30,rect.Width(),rect.Height());
tmpRect.SetHeight(16);
gc.SetBrushColor(CANDBRUSHCOLOR);
gc.DrawRect(tmpRect);
//画分割线
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenColor(LINECOLOR);
gc.DrawLine(TPoint(0,0),TPoint(rect.Width(),0));
gc.DrawLine(TPoint(0,15),TPoint(rect.Width(),15));
gc.DrawLine(TPoint(0,29),TPoint(rect.Width(),29));
if((m_pSentenceChinese==NULL)||(m_pDictionaryChinese==NULL))
{
return;
}
//画三角
DrawUpDownArrow();
//写字符
DrawSentence(DISABLETEXT);
if (m_bSelectMode==TRUE) //选择模式
{
DrawCandWithNumber();
}
else
{
DrawCand();
}
DrawPinYin();
}
void CeQTapStroke::DrawArrow(int Style) const
{
CWindowGc& aGc = SystemGc();
TRect rect = Rect();
TInt temp = rect.Width()-3;
TPoint upTriangle[3] = {TPoint(temp-8,36),TPoint(temp,36),TPoint(temp-4,32)};
TPoint downTriangle[3] = {TPoint(temp-8,38),TPoint(temp,38),TPoint(temp-4,42)};
switch (Style)
{
case DOWN_DISABLE:
aGc.SetBrushColor(ARROWCOLOR);
aGc.SetPenColor(ARROWCOLOR);
aGc.DrawPolygon(downTriangle,3);
break;
case DOWN_ENABLE:
aGc.SetBrushColor(TEXTCOLOR);
aGc.SetPenColor(TEXTCOLOR);
aGc.DrawPolygon(downTriangle,3);
break;
case UP_DISABLE:
aGc.SetBrushColor(ARROWCOLOR);
aGc.SetPenColor(ARROWCOLOR);
aGc.DrawPolygon(upTriangle,3);
break;
case UP_ENABLE:
aGc.SetBrushColor(TEXTCOLOR);
aGc.SetPenColor(TEXTCOLOR);
aGc.DrawPolygon(upTriangle,3);
break;
}
}
void CeQTapStroke::DrawUpDownArrow() const
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -