📄 selebox.c
字号:
/*
******************************************************************
* XIAMEN YAXON NETWORK CO.LTD.
* XINXI BUILDING,HULI,XIAMEN
* (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
* All Rights Reserved
*
* FileName : SELEBOX.C
* Programmer(s): YangLei
* Description : 输入法改。有中英文及数字标点输入,汉字有联想功能
******************************************************************
*/
/*
*****************************************************************
* REVISION HISTORY
*
* Date: 2003-3-20
*****************************************************************
*/
#define SELEBOX_GLOBALS
#include "includes.h"
#include "stdio.h"
#include "ctype.h"
#include "LCD.H"
#include "PINYIN.H"
#include "INFIELD.H"
#include "TOOLS.H"
#include "Timetask.h"
#include "UARTDrv.H"
#include "zprint.h"
static BOOLEAN SignFlag/*标点输入状态标记*/;
static INT8U LineLen,LineSize,SelMode;
static INT8U pinyin_string[200], chartemp[6];
static INT8U usualword[16];//="的是有了不在一个";
/*
******************************************************************
English Input Control
******************************************************************
*/
static INT8U ENG_BD[] = {",.?!:;'-@#$%^&*_+=~\\|`()<>/[]{}"};
static INT8U ENG_ABC[] = {"abcABC"};
static INT8U ENG_DEF[] = {"defDEF"};
static INT8U ENG_GHI[] = {"ghiGHI"};
static INT8U ENG_JKL[] = {"jklJKL"};
static INT8U ENG_MNO[] = {"mnoMNO"};
static INT8U ENG_PQRS[]= {"pqrsQPRS"};
static INT8U ENG_TUV[] = {"tuvTUV"};
static INT8U ENG_WXYZ[]= {"wxyzWXYZ"};
static INT8U* ENG_KEY[] = {ENG_BD,ENG_ABC,ENG_DEF,ENG_GHI,ENG_JKL,ENG_MNO,ENG_PQRS,ENG_TUV,ENG_WXYZ};
static INT8U KeyValue;
static void ChangeFlag(void)
{
DplyLetter();//将当前selebox光标内容显示到editbox,同时清空selebox
StopTmr(KeyInTmr);
KeyFlag = FirstKey;
InFieldFocusChange();//焦点切换
}
static void LetterInit(void)
{
KeyInTmr = CreateTimer(ChangeFlag, 0);
KeyFlag = FirstKey;
}
static void ReadSelectBoxPara(SELECTBOX *selectbox)
{
LineSize = selectbox->box->numcol;
SelMode = selectbox->selmode;
if (SelMode == CHINESESELECTMODE) {
LineLen = LineSize - LineSize % 2;
} else {
LineLen = LineSize;
}
if (selectbox->textlen > 0) {
selectbox->totalline = (selectbox->textlen - 1)/ LineLen;
} else {
selectbox->totalline = 0;
}
}
static void UpdateSelectBoxArrow(SELECTBOX *selectbox)
{
INT8U curline,totalline;
curline = selectbox->line;
totalline = selectbox->totalline;
if (totalline == 0) {
ShowLeftArrow(OFF);
ShowRightArrow(OFF);
} else {
if (curline == 0) {
ShowLeftArrow(OFF);
ShowRightArrow(ON);
} else if (curline == totalline ) {
ShowLeftArrow(ON);
ShowRightArrow(OFF);
} else {
ShowLeftArrow(ON);
ShowRightArrow(ON);
}
}
}
static INT8U GetCurrentLineTextLen(SELECTBOX *selectbox)
{
INT8U curline;
curline = selectbox->line;
if ((curline < selectbox->totalline) || (selectbox->textlen % LineLen == 0)) {
return LineLen;
} else {
return selectbox->textlen % LineLen;
}
}
static void ReverseSelectBoxCursor(SELECTBOX *selectbox,BOOLEAN updatelcd)
{
ReverseOutBox_ByChar(0,selectbox->cursor,SelMode);
if (updatelcd) UpdateOutBox_LCD();
}
//显示selebox中的seltext
static void ShowSelectBoxText(SELECTBOX *selectbox,BOOLEAN updatelcd)
{
INT8U curline,textlen;
INT8U *ptr;
ClearOutBox();
curline = selectbox->line;
ptr = &selectbox->seltext[curline * LineLen];
if (selectbox->textlen == 0) {
textlen = 0;
} else if (curline == selectbox->totalline) {
textlen =selectbox->textlen - curline * LineLen;
} else {
textlen = LineLen;
}
if (SelMode == CHINESESELECTMODE) {
selectbox->cursor = 0;
/*selectbox->cursor = (textlen - textlen % 4)/ 2;
if (selectbox->cursor > SelMode) {
selectbox->cursor -= SelMode;
}*/
} else {
selectbox->cursor = 0;
}
Print_Text(ptr,textlen);
UpdateOutBox_MEM();
UpdateSelectBoxArrow(selectbox);
if (updatelcd) UpdateOutBox_LCD();
}
static BOOLEAN SeleLetter(SELECTBOX *selectbox, INT8U key)
{
LockOutBox(selectbox->box);
if(IsInRange(key, KEY_2,KEY_9)==FALSE) return FALSE;
if(KeyFlag==FirstKey) {
KeyFlag = RepeatKey;
KeyValue = key;
StartTmr(KeyInTmr, SECOND, 2);
selectbox->cursor = 0;
memset(selectbox->seltext, 0x20,sizeof(selectbox->seltext));
AddDplyTextToSelectBox(selectbox,ENG_KEY[key-1],strlen((INT8S*)ENG_KEY[key-1]),selectbox->selmode);
ReadSelectBoxPara(selectbox);
ShowSelectBoxText(selectbox,1);
ReverseSelectBoxCursor(selectbox,1);
}else{
StopTmr(KeyInTmr);
StartTmr(KeyInTmr, SECOND, 2);
if(KeyValue==key) {
ReverseSelectBoxCursor(selectbox,1);
if(selectbox->cursor==(selectbox->textlen-1)) {
selectbox->cursor = 0;
}else{
selectbox->cursor++;
}
ReverseSelectBoxCursor(selectbox,1);
}else{
DplyLetter();
KeyValue = key;
selectbox->cursor = 0;
AddDplyTextToSelectBox(selectbox,ENG_KEY[key-1],strlen((INT8S*)ENG_KEY[key-1]),selectbox->selmode);
ShowSelectBoxText(selectbox,1);
ReverseSelectBoxCursor(selectbox,1);
}
}
return TRUE;
}
static void MovUpSelection(SELECTBOX *selectbox, BOOLEAN sign)//sign用来判断是否是标点状态
{
INT8U curline, tempsign;
LockOutBox(selectbox->box);
ReadSelectBoxPara(selectbox);
curline = selectbox->line;
if(sign){
tempsign = SelMode;
SelMode = 1;
}
if (selectbox->cursor == 0){
if (curline == 0) {
if(sign) SelMode = tempsign;
return;
} else {
selectbox->line--;
selectbox->cursor += (LineLen - SelMode);
ShowSelectBoxText(selectbox,0);
ReverseSelectBoxCursor(selectbox,1);
}
} else {
ReverseOutBox_ByChar(0,selectbox->cursor,SelMode);
selectbox->cursor -= SelMode;
ReverseSelectBoxCursor(selectbox,1);
}
if(sign) SelMode = tempsign;
}
static void MovDownSelection(SELECTBOX *selectbox, BOOLEAN sign)
{
INT8U len,curline,tempsign;
LockOutBox(selectbox->box);
ReadSelectBoxPara(selectbox);
curline = selectbox->line;
if(sign){
tempsign = SelMode;
SelMode = 1;
}
len = GetCurrentLineTextLen(selectbox);
if (selectbox->cursor >= len - SelMode) {
if (curline >= selectbox->totalline) {
if(sign) SelMode = tempsign;
return;
} else {
selectbox->line++;
ShowSelectBoxText(selectbox,0);
ReverseSelectBoxCursor(selectbox,1);
}
} else {
ReverseSelectBoxCursor(selectbox,0);
selectbox->cursor += SelMode;
ReverseSelectBoxCursor(selectbox,1);
}
if(sign) SelMode = tempsign;
}
static BOOLEAN InputAsciiChar(SELECTBOX *selectbox,INT8U keycode)
{
INT8U i,j;
void (*OptFunc)(void);
INT8U *addrptr;
LockOutBox(selectbox->box);
j = 0;
for(i=0;i<6;i++) {
if (selectbox->asciichar[i]!=0) j++;
}
if (IsInRange(keycode,KEY_2,KEY_9)==FALSE) return FALSE;
if (j == 6) return TRUE;//asciichar已经有6位了,那么新的输入keycode就是无效的了
addrptr = HZQuery(selectbox->asciichar,(keycode+0x30));//执行完此函数后,如果匹配,asciichar会改变
if(addrptr==NULL) {
return TRUE;
} else {
memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
INPUTSTATE = PINYININPUTSTATE;
for(i = 0;i < MatchNum;i++) {
pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]);
pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox,pinyin_string,2 * MatchNum,CHINESESELECTMODE);
OptFunc = selectbox->optfunc;
if (OptFunc != NULL) {
(*OptFunc)();
}
}
return TRUE;
}
static BOOLEAN DelAsciiChar(SELECTBOX *selectbox)
{
INT8U i,j;
BOOLEAN returnflag;
INT8U *addrptr;
void (*EmptyFunc)(void),(*OptFunc)(void);
returnflag = FALSE;
LockOutBox(selectbox->box);
j = 0;
for(i = 0;i < 6; i++) {
chartemp[i] = selectbox->asciichar[i];
if (selectbox->asciichar[i]!=0) {
returnflag = TRUE;
j++;
}
}
if (returnflag == FALSE) {
INPUTSTATE = EDITINPUTSTATE;
return FALSE;
} else {
selectbox->asciichar[j-1] = 0;
chartemp[j-1] = 0;
addrptr = HZQuery(chartemp, 0x31);//进入查找有无匹配的拼音
if (addrptr==NULL) { //一个匹配都没有,则清空
INPUTSTATE = EDITINPUTSTATE;
EmptyFunc = selectbox->emptyfunc;
if (EmptyFunc != NULL) (*EmptyFunc)();
return FALSE;
} else { //有则显示相应的拼音集合
memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
INPUTSTATE = PINYININPUTSTATE;
for(i = 0;i < MatchNum;i++) {
pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]);
pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox,pinyin_string,2 * MatchNum,CHINESESELECTMODE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -