📄 afce_zi.c
字号:
/***************************************************************************
*
* TPL GSM Phase 2 Application Layer
*
* Copyright (c) 1999 ZTE
*
***************************************************************************
*
* $Workfile: afCE_zi.c
* $Revision:
* $Date: June 2000
*
***************************************************************************
*
* Designed by :
* Coded by : wangtianhong
* Tested by :
*
***************************************************************************
*
* File Description
* ----------------
* Application Layer Foreground ChineseInput- edit handler
*
*
*V2.0 林涛 2003-8-7 11:16 每页显示8个,输入下一个时不退出
v3.0 林涛 2003-8-28 12:50 代码重新整理
AFCE_ZI000 林涛 2003-9-24 15:02 设置一个标志位,只有处理完一个按键信号以后,才去真正处理下一个按键信号。
如果没有处理完上一个按键信号就收到下一个就直接返回。
同时在dlpad.c中让L1不要发送按键信号。双保险。
原因:由于ZI取字的函数比较耗时,如果在笔画输入时连续按9键,
每次取字的时间较长(尤其时输入9的长度大于17以后),其他的按键信号就
可能一直排在队列里等待处理,就可能溢出导致死机。
AFCE_ZI001 林涛 2003-9-25 10:02 E输入法下,一键也有内容,可以输入.com,.edu等。
AFCE_ZI002 林涛 2003-9-28 9:23 优化代码,由于字源取字的速度比较慢,应该减少字源取字的频率。
AFCE_ZI003 林涛 2003-10-8 10:23 maxPyCountInThisPage函数修改,有一个BUG。
AFCE_ZI004 林涛 2003-10-10 10:23 对于按键输入错误的处理方式修改,使得ZI取字更少,而且REFRESH更加保证正确
AFCE_ZI005 林涛 2004-3-3 9:24 智能英语输入的时候,如果输入一个字符,会显示*,按照徐颖的修改解决这一问题
AFCE_ZI006 林涛 2004-3-23 16:46 更新为V6以后,发现ZI的返回有些问题,按照徐颖的修改解决打些补丁
****************************************************************************/
/***************************************************************************
* Include Files
***************************************************************************/
#if !defined(APPLAYER_H)
# include "applayer.h"
#endif
#if !defined(AFSIGNAL_H)
# include "afsignal.h"
#endif
#if !defined(AFSH_FNC_H)
# include "afsh_fnc.h"
#endif
#if !defined(AFGL_FNC_H)
# include "afgl_fnc.h"
#endif
#if !defined(AFLC_FNC_H)
# include"aflc_fnc.h"
#endif
#if !defined(AFCE_LCL_H)
# include "afce_lcl.h"
#endif
#if !defined (AGDM_FNC_H)
#include "agdm_fnc.h"
#endif
#if !defined (AGCS_LCL_H)
#include "agcs_lcl.h"
#endif
#if !defined (ENTER_M_H)
#include "enter_m.h"
#endif
#if !defined (UT_UCS2_H)
#include "ut_ucs2.h"
#endif
#if !defined (AGSH_FNC_H)
#include "agsh_fnc.h"
#endif
#if !defined(AGIMELEM_H)
# include "agimelem.h"
#endif
#if !defined (AFTL_LCL_H)
#include "aftl_lcl.h"
#endif
#if defined (UPGRADE_AUDIO_MANAGER)
#if !defined (AGAU_FNC_H)
# include "agau_fnc.h"
#endif
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Zi provided include files */
#include "zi8api.h"
#if !defined(GDDI2FNC_H)
# include "gddi2fnc.h"
#endif
#include "afsh_sig.h"
/******************************************************************************
* macro
*******************************************************************************/
#define ZI8_BASE_ALPHA 0x00f0
#define ZI8_ALPHA_KEY1 1
#define ZI8_ALPHA_KEY2 2
#define ZI8_ALPHA_KEY3 3
#define ZI8_ALPHA_KEY4 4
#define ZI8_ALPHA_KEY5 5
#define ZI8_ALPHA_KEY6 6
#define ZI8_ALPHA_KEY7 7
#define ZI8_ALPHA_KEY8 8
#define ZI8_ALPHA_KEY9 9
#define ZI8_ALPHA_KEYSTAR 10
#define ZI8_ALPHA_KEY0 11
#define ZI8_ALPHA_KEYHASH 12
#define MAX_PY_PAGE_NUM 20 /*最多支持20页拼音和SE*/
#define MAX_PY_PAGE_SIZE 5 /*每页显示的最多5个拼音*/
#define MAX_HZ_PAGE_SIZE 8 /*每页最多显示8个汉字*/
//#define MAX_CANDIDATES_BUFFER_SIZE 8 /*得到的候选字最大个数*/
//#define MAX_PINYIN_CANDIDATES_BUFFE_SIZE 4 /*ONLY DISPLAY 4 PINYIN IN PINYIN DISPLAY AREA*/
#define MAX_WORD_LENGTH_SIZE 16 /*最多16级联想,这个现在没有做,只支持单字联想*/
#define MAX_ELEMENT_BUFFER_SIZE 24
/*根据谢震春和ZI商议的结果,这个值取64,因为这个BUFFER被ZI的库用做别的用途了*/
#define MAX_CANDIDATES_BUFFER_SIZE 64
/*#define SCRATCH_SIZE 250*/
extern GddiRgb gddiDefaultForegroundCol;
/******************************************************************************
* types
*******************************************************************************/
typedef enum ImeStateTag
{
IME_STATE_PY_INPUT, /*拼音输入状态*/
IME_STATE_PY_HZ_SELECT, /*拼音输入后汉字选择状态*/
IME_STATE_BISHUN_INPUT, /*笔顺输入状态,和汉字选择状态在一起*/
IME_STATE_COMPONENT_INPUT, /*部件输入状态,和汉字选择状态在一起*/
IME_STATE_SE_INPUT, /*智能英语状态*/
IME_STATE_ASSOCIATION_SELECT, /*选字以后的联想状态*/
NUMBER_OF_IME_STATE
}ImeState;
typedef struct PyOrSEGroupInfoTag /* 当前的一组拼音信息*/
{
Int16 firstPosInLib; /*这组的第一个拼音是LIB中的第几个*/
Int16 lastPosInLib; /*这组的最后一个拼音是LIB中的第几个*/
Int16 currentPosInLib; /*当前选中拼音是LIB中的第几个*/
/*从ZI库里取出的一组拼音或SE,保存在全局变量里,这样在左右键选下一个拼音或SE的时候就不用再取值了,
最多的英文字母是32个吧*/
ZI8WCHAR groupData[MAX_PY_PAGE_SIZE+1][33];
Boolean noNextPage; /*判断一下后面还有没有拼音了,用来显示上下箭头*/
}PyOrSEGroupInfo;
typedef struct HzGroupInfoTag /*根据拼音取得的一组汉字信息*/
{
Int16 beginHzInLib; /*这组的第一个汉字是LIB中的第几个*/
Int16 currentHzIndex; /*这组的最后一个汉字是LIB中的第几个*/
Int16 endHzInLib; /*这组的最后一个汉字是LIB中的第几个*/
Int8 pageNo; /*当前这一组是第几页*/
AgCharCode currentSelHz[MAX_HZ_PAGE_SIZE+1]; /*将当前一组汉字全都保存在这里,用于显示*/
Boolean bNoNextPage; /*判断一下后面还有没有汉字了,用来决定按向下箭头是否还要取字*/
}HzGroupInfo;
/* ChineseInput Handler's local data structure */
typedef struct chiEditContextTag
{
HandlerId myHandlerId; /* own handler Id */
HandlerId parentHandlerId; /* parent handler Id */
HandlerId childHandlerId; /* child handler Id */
HandlerId signinputHandlerId;/*符号输入*/
AfChineseInputMethod chineseInputMethod;/*输入法*/
AfChineseInputSigBody dataFromParent;/*从编辑HANDLER传来的东西,其实就是一个KEY EVENT*/
Int8 inputSerial; /*输入了几个符号?????????*/
Int8 inputValue[31]; /*用户输入的东西保存在这里*/
AgCharCode currentPyBsh[43]; /*显示在屏幕上的py或笔顺*/
HzGroupInfo currentHzGroupInfo; /*根据拼音取得的一组汉字信息*/
PyOrSEGroupInfo currentPyOrSEGroupInfo; /* 当前的一组拼音信息*/
ImeState imeState; /*当前的输入状态*/
/*WJ 2001/5/30 add*/
/*AFCE_ZI002,将非法的按键组合保存在这里,以后就可以直接在这个里面比较,而不用总去库里比较了*/
Int8 invalidSEkeyTable[10];
/*WJ 2001/5/30 end*/
Int8 pyOrSEgroupNumTable[MAX_PY_PAGE_NUM]; /*记录了每一组显示的拼音和SE有多少个*/
Int8 pyOrSEcurrentPageNo; /*记录当前的拼音或SE是第几页*/
AgElementId arrowicon;/*上下箭头的hole*/
/*判断是否选择了汉字,这是为了通知EDITOR那边刷新编辑区,将我们选择的hz显示在屏幕上*/
AgCharCode prompString[31];/*显示在屏幕上的py或笔顺*/
Boolean keyValid;
Boolean updateCompleted;/*刷新完成的标志位。然后才可以再响应按键*/
}
chiEditContext;
static Boolean ziGetCompleted= TRUE;/*字源取字完成的标志位。然后才可以再响应按键*/
static AfHzExitDataBody hzExitDataBody;
/***********************************************************************
* global variable
************************************************************************/
extern EnterMethod currentEnterMethod;
/* static variables */
ZI8GETPARAM zi8param; /* structure that controls the candidate selection
process */
/* roughly decide the size */
ZI8WCHAR candidatesBuffer[MAX_CANDIDATES_BUFFER_SIZE];/*64*/
ZI8WCHAR wordBuffer[MAX_WORD_LENGTH_SIZE];/*这个值有问题????????*/
ZI8WCHAR elementBuffer[MAX_ELEMENT_BUFFER_SIZE]; /*24*/
ZI8UCHAR SelectedLanguage;
ZI8UCHAR SelectedSubLanguage;
ZI8UCHAR SelectedInputMethod;
/*************************************************************************
* function prototypes
**************************************************************************/
PRIVATE void
afHandlerIme (SignalBuffer *signalBuffer_p,
HandlerId handlerId,
HandlerMemoryRecord *handlerMemoryRecord_p);
static void
afImeRefresh (chiEditContext *chiContext_p);
static void
afImeEvents ( chiEditContext *chiContext_p,
SignalBuffer *signalBuffer_p);
static Boolean
afImeInputEvents ( chiEditContext *chiContext_p,
AgshEventInd *eventInd_p);
static Int8 maxPyCountInThisPage(chiEditContext *chiContext_p);/*计算可以返回几个拼音或SE*/
static Boolean afGetPyGroup(chiEditContext *chiContext_p); /*取一组拼音*/
static Boolean afGetPyHzGroup(chiEditContext *chiContext_p);/*根据当前选择的拼音取汉字*/
static Boolean afGetBhHzInfo(chiEditContext *chiContext_p);
static Boolean afGetStrokeHzInfo(chiEditContext *chiContext_p);
static Boolean afGetSmartEnGroup(chiEditContext *chiContext_p);
static Boolean
afImeClearEvent ( chiEditContext *chiContext_p,SignalBuffer *signalBuffer_p);
static Boolean
afImeSelectEvent ( chiEditContext *chiContext_p,SignalBuffer *signalBuffer_p);
static Boolean
afImeScrollUpEvent ( chiEditContext *chiContext_p, SignalBuffer *signalBuffer_p);
static Boolean
afImeScrollDownEvent ( chiEditContext *chiContext_p, SignalBuffer *signalBuffer_p);
static Boolean
afImeScrollRightEvent( chiEditContext *chiContext_p, SignalBuffer *signalBuffer_p);
static Boolean
afImeScrollLeftEvent( chiEditContext *chiContext_p, SignalBuffer *signalBuffer_p);
static void afConvertWmToPy(chiEditContext *chiContext_p);
static void afConvertWmToBh(chiEditContext *chiContext_p);
static void afConvertWmToEn(chiEditContext *chiContext_p);
static void afSelHz(chiEditContext *chiContext_p);
static Boolean afClearInput(chiEditContext *chiContext_p);
static void afInitContext(chiEditContext *chiContext_p);
ZI8UCHAR Zi8GetCandidates(PZI8GETPARAM pGetParam);
/*ZI8BOOL Zi8SetMaxLength(ZI8UCHAR length);*/
ZI8BOOL Zi8IsComponent(ZI8WCHAR Character);
void Zi8GetAlphaWord(ZI8UCHAR language, ZI8WCHAR wc,
PZI8UCHAR szString, ZI8UCHAR size);
ZI8FUNCTION ZI8BOOL Zi8SetMaxNamesInUse ( ZI8USHORT usMaxSize );/*wth 2001-03-14*/
void afUpdateEnterMethod(AfHanziInputState * afHanziInputState_p);
Boolean afglExtendedAddUniCodeEvents(Int16 charUniCode,
AfglDisplayDesc *displayDesc_p);
static Int8 GetGlyphWidth(AgCharCode agchar);
/**************************************************************************
* Chinese Input Screen refresh
***************************************************************************/
static void
afImeRefresh (chiEditContext *chiContext_p)
{
GddiRect clipRect;
AgElementLabel elementLabel = nullElementLabel;
Int8 index;
GddiCoOrd abs,abs2; /*绝对坐标*/
GddiRgb savedFgColour,savedBgColour; /*原来前景,背景颜色都是全局变量*/
AgfoGlyphInfo *glyph_p;
int i ,blankcount,xInvertPos;
Int8 refreshFlag;
/*按键有效才会刷新屏幕,否则不变*/
/* AFCE_ZI004,如果按键错误干脆不发刷新信号*/
//if (chiContext_p->keyValid == TRUE)
{
agdmSetDoUpdate (FALSE);
/* Stop physical updates to prevent flickering */
/*显示拼音、笔划、英语*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -