📄 infertt.c
字号:
/********************************************************************************\
*2005.6.13
*Designed for DT
*author:zhangxy
*
\********************************************************************************/
#include "cellview.h"
#include "StrLrView.h"
#include "hzindex.h"
#include "InferTt.h"
#ifdef _WIN32
#include "Windows.h"
#else
#include <task.h>
#include <semaphor.h>
#include <main_task.h>
#include <osg.h>
#endif
/*#define TT_DEBUT 1*/
#ifndef NULL
#define NULL 0
#endif
#define HZBUF_LEN 130
#define INF_TXT_TOP 490
pLRVIEW lrview0 = NULL; /* 拼音输入区*//*应该建为内存保管型*/
pLRVIEW lrview1 = NULL; /* 选择区*//*应该开辟为内存保管型*/
pCELLVIEW cellview = NULL;/*汉字编辑区*/
static char cmatrix[7][6]; /*max matrix to hold chars*/
static char *BtnDef[] ={
" ",
",.?!:@",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
enum{
WAIT_ENTERN = 1,/*等待输入*/
ASC_ENTERNING,/*拼音输入*/
HZ_ENTERNING,/*汉字输入*/
SYMBAL_ENTERNING /*符号输入状态*/
};
static char *curpick ;/*用户当前选取字符串*/
static char picklen ;/*用户已经输入次数*/
static char *hzbuf ;/*汉字内码缓冲*/
static char tt_type = HZMODE;/*当前操作类型*/
static char tt_status = WAIT_ENTERN;/*当前输入法状态*/
static char useropt = 1;/*用户返回操作1:确定 0:取消*/
static semaphore_t * tt_semphore;
static task_t * tt_task;
typedef void (*Function)(void*);
static int FindC(char *,char );
static int InCbc6(char );
static int InCbc5(char );
static int InCbc4(char );
static int InCbc3(char );
static int InCbc2(char );
static int InCbc1(char );
static int DoStage1(char *);
static int DoStage2(char *);
static int DoStage3(char *);
static int DoStage4(char *);
static int DoStage5(char *);
static int DoStage6(char *);
static void AddHzToLr(pLRVIEW,char *);/*把内码加入某个LR*/
static int DefDic(int ,char *);/*由输入产生字典内容*/
static void AddPickToList(void);/*用户输入加入LR1或cellview*/
static int ProcessDic(void);/*处理字典,组合拼音输入LR0*/
static void InferAddToLr(void *,char *);/*当前的词以及当前词的后续添加入LR0中*/
static int ValidAtIndex(char *);/*拼写不存在但存在后续或拼写存在者返回TRUE*/
static void DrawLr1Text(void * ,int ,int ,int ,int );
static void DrawLr1Cell(void *,int ,int ,int ,int ,int ,int );
static void DrawLr0Text(void *,int ,int ,int ,int );
static void DrawLr0Cell(void *,int ,int ,int ,int ,int ,int );
/*lr0,lr1复用此绘画框架,*/
static void DrawLr0Frame(void *);
void OkOnLrView1(int );/*发生在lrview1上的OK事件处理*/
void OkOnLrView0(int );/*发生在lrview上的OK事件处理*/
void decopt(void);/*汉字输入的反向操作*/
void SetCurPick(int );/*当前用户拣选字符串*/
/*
infer tt 的UI线程
*/
static void TT_MainTask(void );/*INFERTT的主任务*/
/*
启动输入法,获得输入法的输入
*/
static void ShowTTFrame(void);
int TTEx(char *inistr,char *buf)
{
/*初始化内码缓冲区*/
/*初始化编辑及输入控件*/
CreateIndex();
cellview = CreateMultiView(120,395,240 ,24);
lrview0 = CreateLrList(120,435,240*2,80,25,0);/*建立容载型LRLIST*/
lrview1 = CreateLrList(120,435,240*2,80,60,0);
/*全局控制字,必需在这里初始化*/
curpick = NULL;/*用户当前选取字符串*/
picklen = 0;/*用户已经输入次数*/
hzbuf = NULL;/*汉字内码缓冲*/
tt_type = HZMODE;/*当前操作类型*/
tt_status = WAIT_ENTERN;/*当前输入法状态*/
useropt = 1;/*用户返回操作1:确定 0:取消*/
LockLrList(lrview1);/*将LR1置为锁定状态*/
hzbuf =(char*) malloc(HZBUF_LEN);
lrview0->OwnerDrawCell = DrawLr0Cell;
lrview0->OwnerDrawFrame = DrawLr0Frame;
lrview1->OwnerDrawCell = DrawLr1Cell;
lrview1->OwnerDrawFrame = DrawLr0Frame;
if(inistr) SetTT(inistr);
/* GFMDrawRectangle(0, 0, 680, 550, 0, TRUE);*/
ShowTTFrame();
/*启动TT进程开始接受消息*/
tt_semphore = semaphore_create_fifo (0);
tt_task = task_create((Function)TT_MainTask,NULL, 2048,6,"tt_task",0 );
semaphore_wait(tt_semphore);/*停止UI用户进程*/
task_kill(tt_task, 2, 0);
task_wait(&tt_task, 1, TIMEOUT_INFINITY);
task_delete(tt_task);
semaphore_delete(tt_semphore);
/*从编辑控件中拷贝输入字符入buf*/
/*回收缓冲及控件资源*/
if(useropt)
GetViewChars(cellview,buf);
DestroyIndex();
ReleaseMultiView(cellview);
DeleteLrList(lrview0);
DeleteLrList(lrview1);
free(hzbuf);
lrview0 = NULL;
lrview1 = NULL;
cellview = NULL;
hzbuf = NULL;
/* GFMDrawRectangle(120, 375, 510, 30, 0, TRUE);
GFMDrawRectangle(120, 375, 510, 80, 0, TRUE); /*擦除界面*/
return useropt;
}
int TT(char *buf)
{
TTEx(NULL,buf);
}
/*****************************************************************************\
TT状态机
\******************************************************************************/
extern UINT32 MainTaskQueue;
static void TT_MainTask(void)/*INFERTT的主任务*/
{
int ret;
T_FTA_Event event;
char *tbuf[] = {
"当前模式:汉字输入",
"当前模式:ABC输入",
"当前模式:123输入"
};
while (1)
{
ret = DTOS_DRV_ReceiveMessage(MainTaskQueue, &event);
if ( ret != SUCCESS )
{
continue;
}
switch(event.code)
{
case BUTTON_MENU:
DelFromCellView(cellview);
break;
case 0x2EH:
case BUTTON_F3:/*暂作为输入法之间的切换*/
{
tt_type ++;
tt_type %= 3;
/*
切换TT到别的状态
*/
tt_status = WAIT_ENTERN;
picklen = 0;
LockLrList(lrview0);
LockLrList(lrview1);
FreeLrListItems(lrview1);
FreeLrListItems(lrview0);
ShowLrList(lrview0);
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
}
break;
case BUTTON_SELECT:
{
if(tt_status == WAIT_ENTERN)
/*激发信号量退出TT*/
semaphore_signal(tt_semphore);
else
switch(tt_type)
{
case HZMODE:/*汉字操作*/
{
if(tt_status == ASC_ENTERNING)/*假如是拼音输入状态,则进入汉字输入状态*/
{
if(picklen > 0)/*正确状态判断*/
{
tt_status = HZ_ENTERNING;
/*锁定LR0*/
LockLrList(lrview0);
ShowLrList(lrview0);/*擦掉*/
/*解锁LR1,把选定的汗字负给LR1,然后显示LR1*/
UnLockLrList(lrview1);
FreeLrListItems(lrview1);
memset(hzbuf,0,HZBUF_LEN);
GetHzRangeBySpell( GetLrListData(lrview0,lrview0->coursorx + lrview0->baseindex),hzbuf);
AddHzToLr(lrview1,hzbuf);
ShowLrList(lrview1);
}else
{
tt_status = WAIT_ENTERN;
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
}
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 320, "tt_status == ASC_ENTERNING");
#endif
/*FreeLrListItems(lrview0);/*转入汉字显示时晴空拼音列表*/
}else if(tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING)
{
/*将选定的汉字交给编辑区*/
/*清空,锁定,并隐藏LR1,清空并解锁LR0*/
char *data = GetLrListData(lrview1,lrview1->coursorx + lrview1->baseindex);
AddToCellView(cellview,data);
LockLrList(lrview1);
ShowLrList(lrview1);
FreeLrListItems(lrview1);
tt_status = WAIT_ENTERN;
/*UlockLrList(lrview0);/*允许绘画LR0*/
/*****//*重设输入字长*/
picklen = 0;
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 340, "tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING)");
#endif
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
}
}break;
case ASCMODE:
{
if(tt_status == ASC_ENTERNING ||tt_status == SYMBAL_ENTERNING)
{
/*将选定的拼音交给编辑区*/
char *data = GetLrListData(lrview1,lrview1->coursorx+lrview1->baseindex);
AddToCellView(cellview,data);
/*清空,锁定,并隐藏LR1,清空并解锁LR0*/
LockLrList(lrview1);
ShowLrList(lrview1);
FreeLrListItems(lrview1);
/*UnLockLrList(lrview0);*/
tt_status = WAIT_ENTERN;
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 340, "ASCMODE:tt_status == ASC_ENTERNING ||tt_status == SYMBAL_ENTERNING");
#endif
}
}break;
}
}
break;
case BUTTON_PAGEDOWN :
{
if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
{
UnLockLrList(lrview1);
MoveLrCursor(lrview1,-lrview1->ospnum,0);
ShowLrList(lrview1);
}
if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
{
UnLockLrList(lrview0);
MoveLrCursor(lrview0,-lrview0->ospnum,0);
ShowLrList(lrview0);
}
}
break;
case BUTTON_PAGEUP:
{
if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
{
UnLockLrList(lrview1);
MoveLrCursor(lrview1,lrview1->ospnum,0);
ShowLrList(lrview1);
}
if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
{
UnLockLrList(lrview0);
MoveLrCursor(lrview0,lrview0->ospnum,0);
ShowLrList(lrview0);
}
}
break;
case BUTTON_CURSOR_UP:
{
#ifdef TT_DEBUT
FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_UP");
#endif
if(tt_status == WAIT_ENTERN)
{
MoveCursor(cellview,0,-1);
/* DrawCellFrame(cellview);*/
}
}
break;
case BUTTON_CURSOR_DOWN:
#ifdef TT_DEBUT
FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_DOWN");
#endif
if(tt_status == WAIT_ENTERN)
{
MoveCursor(cellview,0,1);
/*DrawCellFrame(cellview);*/
}
break;
case BUTTON_CURSOR_LEFT:
{
#ifdef TT_DEBUT
FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_LEFT");
#endif
if(tt_status == WAIT_ENTERN)
{
MoveCursor(cellview,-1,0);
/* DrawCellFrame(cellview);*/
}
if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
{
UnLockLrList(lrview1);
MoveLrCursor(lrview1,-1,0);
ShowLrList(lrview1);
}
if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
{
UnLockLrList(lrview0);
MoveLrCursor(lrview0,-1,0);
ShowLrList(lrview0);
}
}
break;
case BUTTON_CURSOR_RIGHT:
{
#ifdef TT_DEBUT
FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_RIGHT");
#endif
if(tt_status == WAIT_ENTERN)
{
MoveCursor(cellview,1,0);
/*DrawCellFrame(cellview);*/
}
if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
{
UnLockLrList(lrview1);
MoveLrCursor(lrview1,1,0);
ShowLrList(lrview1);
}
if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
{
UnLockLrList(lrview0);
MoveLrCursor(lrview0,1,0);
ShowLrList(lrview0);
}
}
break;
case BUTTON_EXIT :
case BUTTON_CANCEL:
{
if(tt_status == WAIT_ENTERN)/*无输入状态等待退出*/
{
useropt = 0;
/*激发信号量退出任务*/
semaphore_signal(tt_semphore);
}
if(tt_status == HZ_ENTERNING)
{
LockLrList(lrview1);
FreeLrListItems(lrview1);
ShowLrList(lrview1);/*清空隐藏LR1*/
ProcessDic();
UnLockLrList(lrview0);/*显示上次的信息*/
ShowLrList(lrview0);
tt_status = ASC_ENTERNING;
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 240, "tt_status ==HZ_ENTERNING");
#endif
}else if(tt_type == HZMODE && tt_status == ASC_ENTERNING)
{
FreeLrListItems(lrview0);/*先清空上次的内容*/
#ifdef TT_DEBUT
{
char buf[4];
sprintf(buf,"Pick len = %d",picklen);
FNTDrawText(rand() % 6, 0, 60, 340, buf);
}
#endif
decopt();/*反操作*/
UnLockLrList(lrview0);/*显示上次的信息*/
ShowLrList(lrview0);/*画出新的*/
#ifdef TT_DEBUT
{
char buf[4];
sprintf(buf,"Pick len = %d",picklen);
FNTDrawText(rand() % 6, 0, 60, 360, buf);
}
#endif
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 260, "tt_type == HZMODE && tt_status == ASC_ENTERNING");
#endif
if(picklen <= 0)
{
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
}
}
else if( tt_status == SYMBAL_ENTERNING)
{
LockLrList(lrview1);/*当前是符号输入状态就解除此状态*/
FreeLrListItems(lrview1);
ShowLrList(lrview1);
tt_status = WAIT_ENTERN;
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 280, "tt_status == SYMBAL_ENTERNING");
#endif
}/*else if(tt_type == HZTYPE && tt_status == WAIT_ENTERN)
/*激活UI退出*/ ;
if(tt_status == ASC_ENTERNING && tt_type == ASCMODE )
{
LockLrList(lrview1);
FreeLrListItems(lrview1);
ShowLrList(lrview1);
tt_status = WAIT_ENTERN;
FNTDrawText(0, 0, 270, INF_TXT_TOP, tbuf[tt_type] );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 300, "tt_status == ASC_ENTERNING && tt_type == ASCMODE");
#endif
}
}
break;
case BUTTON_0:/*空格键*/
case BUTTON_1:/*符号键*/
case BUTTON_2:
case BUTTON_3:
case BUTTON_4:
case BUTTON_5:
case BUTTON_6:
case BUTTON_7:
case BUTTON_8:
case BUTTON_9:
{
/*if(BUTTON_2 <= event.code && event.code<= BUTTON_9)*/
switch(tt_type)
{
case ASCMODE:
{
if( tt_status == WAIT_ENTERN)
{
if(event.code != 0)
{
SetCurPick(event.code);
UnLockLrList(lrview1);
FreeLrListItems(lrview1);
AddPickToList();/*把选定的字符加入LR1*/
ShowLrList(lrview1);
if(event.code == 1)
tt_status = SYMBAL_ENTERNING;
else
tt_status = ASC_ENTERNING;
}else
{
SetCurPick(event.code);
ProcessPick();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -