📄 mmichineseinput.c
字号:
ZI8WCHAR Uni_strlen(PZI8WCHAR String);
/* 2003/10/13 sunsj/ onekey press pinyin method */
void Zi_onekey_keypress(pIME_DATA pIME , PZI8WCHAR key_map); /* enter the key and get pinyin and candidate */
int Zi_GetElementCandidates(pIME_DATA pIME); /* getcandidate through element */
void UnicodeConver(USHORT* inputString, USHORT* outputString);
void Zi_onekey_clear(pIME_DATA pIME); /* clear element or text */
void IMECandidatePageUp(pIME_DATA pIME); /* page up candidate */
void IMECandidatePageDown(pIME_DATA pIME); /* page down candidate */
void ElementHighlightDisplayContorl(pIME_DATA pIME); /* display highlight element */
/*************************************************************************
Start: Fummy functions. This is to be removed when eZiText code is received
/*************************************************************************/
//ZI8UCHAR Zi8GetCandidates(PZI8GETPARAM pGetParam);
//void Zi8Initialize(void);
/* End */
UBYTE LatinChar(ZI8WCHAR char_code)
{ //if last byte is 0x00 and first byte is between 0x20 and 0x7E
if ( (char_code% 0x100 == 0)&&(char_code>=0x2000) && (char_code<0x7F00) )
return TRUE;
else
return FALSE;
}
/*******************************************************************************
$Function: chinese_input
$Description:
$Returns:
$Arguments:
*******************************************************************************/
T_MFW_HND chinese_input (T_MFW_HND parent_win, T_CHINESE_DATA* chinese_data, SHORT kc)
{
T_MFW_HND win;
//MfwEdt *edit = ((MfwHdr *) myHandle)->data;
win = chinese_input_create (parent_win);
if ( win NEQ NULL )
{
//SEND_EVENT (win, CHINESE_INPUT_INIT, 0, chinese_data);
SEND_EVENT (win, CHINESE_INPUT_INIT, kc, chinese_data);
}
return win;
}
/*******************************************************************************
$Function: chinese_input_create
$Description:
$Returns: Dialogue info win
$Arguments: parent win
*******************************************************************************/
static T_MFW_HND chinese_input_create (T_MFW_HND parent_win)
{
T_MFW_WIN * win_data;
T_chinese_input * data = (T_chinese_input *)ALLOC_MEMORY (sizeof (T_chinese_input));
//TRACE_EVENT ("chinese_input_create()");
data->input_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)chinese_input_win_cb);
if ( data->input_win EQ 0 )
return 0;
/* Create window handler */
data->mmi_control.dialog = (T_DIALOG_FUNC)chinese_input_exec;
data->mmi_control.data = data;
data->parent_win = parent_win;
win_data = ((T_MFW_HDR *)data->input_win)->data;
win_data->user = (void *)data;
/*return window handle */
return data->input_win;
}
/*******************************************************************************
$Function: chinese_input_destroy
$Description: Destruction of an information dialog
$Returns: void
$Arguments: win
*******************************************************************************/
void chinese_input_destroy (T_MFW_HND own_window)
{
T_MFW_WIN * win = ((T_MFW_HDR *)own_window)->data;
T_chinese_input * data = (T_chinese_input *)win->user;
//TRACE_EVENT ("chinese_input_destroy()");
/* 2003/11/10 sunsj */
T_MFW_HND parent_win = mfw_parent (own_window);
T_MFW_WIN * parent_win_data = ((T_MFW_HDR *)parent_win)->data;
T_EDITOR_INFO * parent_data = (T_EDITOR_INFO *)parent_win_data->user;
MfwHdr *edit_hdr = (MfwHdr *)parent_data->edt_edt;
MfwEdt *edit_controll = (MfwEdt *)edit_hdr->data;
if ( data )
{
/* 2003/11/1 sunsj */
if ( data->Ime.pTextBuffer == NULL )
return;
if ( data->Ime.pTextBuffer[0] )
{
//UnicodeConver((USHORT*)data->Ime.pTextBuffer, (USHORT*)data->Ime.pTextBuffer);
/* 2003/11/27 sunsj */
memcpy(&data->Callback_Data.TextString[1], chinese_input_buffer, TEXT_BUFFER_EDIT_SIZE);
/* 2003/11/10 sunsj add text cursor */
edit_controll->cp = data->Ime.TextCursor;
}
/* Exit TIMER & KEYBOARD Handle */
kbd_delete (data->input_kbd);
/* Delete WIN Handler */
win_delete (data->input_win);
/* Free Memory */
FREE_MEMORY ((void *)data, sizeof (T_chinese_input));
}
}
/*******************************************************************************
$Function: chinese_input
$Description:
$Returns: void
$Arguments: win, window handle event, value, parameter
*******************************************************************************/
void chinese_input_exec (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
T_chinese_input * data = (T_chinese_input *)win_data->user;
T_CHINESE_DATA * chinese_data = (T_CHINESE_DATA *)parameter;
T_EDIT_CB Callback = data->Callback_Data.Callback;
T_MFW_HND parent_win = data->parent_win;
USHORT Identifier = data->Callback_Data.Identifier;
char debug[20];
PZI8WCHAR temp_ZiKeyMap;
//TRACE_EVENT ("chinese_input_exec()");
switch ( event )
{
case CHINESE_INPUT_INIT:
data->Callback_Data = *chinese_data;
/* 2003/11/27 sunsj */
TEXT_BUFFER_EDIT_SIZE = (data->Callback_Data.EditorSize - 3);
/* Initialize dialog */
/* Create timer and keyboard handler */
data->input_kbd = kbd_create (win, KEY_ALL, (T_MFW_CB)chinese_input_kbd_cb);
/* Initialize all data structure and veriables to zero */
memset(&data->Ime, 0, sizeof(data->Ime));
//memset(&data->wszTextBuffer, 0, sizeof(data->wszTextBuffer));
memset(&data->GetParam, 0, sizeof(data->Ime));
memset(&data->wcCandidates, 0, sizeof(data->wcCandidates));
memset(&data->HighlightedCandidate, 0, sizeof(data->HighlightedCandidate));
memset(&data->CursorPosition, 0, sizeof(data->CursorPosition));
memset(&data->DisplayElementBuffer, 0,sizeof(data->DisplayElementBuffer));
data->StartOfDisplayIndex = 0;
data->NumberOfKeyPress = 0;
data->PerviousKeyPress = -1;
/* 2003/10/26 sunsj add for select input mode */
editor_input_mode = chinese_data->InputMode;
/* 2003/11/10 sunsj set text cursor */
data->Ime.TextCursor = chinese_data->Cursor;
/* Now intitialize the Zi8 Core Engine */
Zi8Initialize();
/* Now initialize the IME */
/*
memset(chinese_input_buffer, 0x0000, 70);
memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], 140);
*/
if ( (data->Callback_Data.TextString[0] & 0x80) != 0 )
{
data->Callback_Data.TextString[0] = 0x80;
//data->wszTextBuffer = (PZI8WCHAR)(data->Callback_Data.TextString+1); //ignore first char (Unicode marker)
data->wszTextBuffer = chinese_input_buffer;
/* 2003/11/27 sunsj */
memset(chinese_input_buffer, 0x00, 140);
memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], TEXT_BUFFER_EDIT_SIZE-3);
}
else
{
int i=0;
while ( data->Callback_Data.TextString[i] )
{
i++;
}
data->wszTextBuffer = chinese_input_buffer;
//data->wszTextBuffer++;
/* 2003/11/27 sunsj convert ascii to unicode */
for ( ; i>0; i-- )
{
data->Callback_Data.TextString[i*2] = data->Callback_Data.TextString[i-1];
data->Callback_Data.TextString[i*2-1] = 0x00;
}
data->Callback_Data.TextString[0] = 0x80;
/* 2003/11/27 sunsj */
memset(chinese_input_buffer, 0x00, 140);
memcpy(chinese_input_buffer, &data->Callback_Data.TextString[1], TEXT_BUFFER_EDIT_SIZE);
}
IMEInitialize(&data->Ime, &data->GetParam, data->wszTextBuffer, TEXT_BUFFER_EDIT_SIZE,
sizeof(data->wszTextBuffer), data->wcCandidates, data->wszElementBuffer, data->DisplayElementBuffer);
/* Store any other data */
/* 2003/10/13 sunsj/ the first key press */
switch ( value )
{
case KCD_8:
switch ( data->Ime.EditorMode )
{
case STROKE_INPUT_MODE:
data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
IMEMore(&data->Ime);
data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
winShow(win);
break;
case PINYIN_INPUT_MODE:
data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;
temp_ZiKeyMap = (PZI8WCHAR )ZiPinYinKeyMap[value-1];
Zi_onekey_keypress(&data->Ime, temp_ZiKeyMap);
/* due to not able to receive key press count, it is assume the first letter assign to the key is selected when key */
/* is pressed. */
data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
winShow(win);
break;
default:
break;
}
break;
case KCD_1:
switch ( data->Ime.EditorMode )
{
case STROKE_INPUT_MODE:
data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
IMEKeyPress( &data->Ime, (ZI8WCHAR) (ZiStrokeKeyMap[value][1] + ZI8_BASE_STROKES) );
data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
winShow(win);
break;
case PINYIN_INPUT_MODE:
{
int candidate_num;
/* 2003/11/1 sunsj */
data->Ime.InputScreenType = WORD_ASSOCIATION_SCREEN;
data->Ime.pGetParam->ElementCount = 1;
data->Ime.pGetParam->pElements[data->Ime.pGetParam->ElementCount-1] = ZI8_CODE_MORE;
data->Ime.pGetParam->FirstCandidate = data->Ime.moreCount * CANDIDATES_PER_GROUP;
data->Ime.pGetParam->MaxCandidates = 2 * CANDIDATES_PER_GROUP;
data->Ime.candidates = Zi8GetCandidates(data->Ime.pGetParam);
if ( data->Ime.candidates > 0 )
{
/* Convert the data storage format for display purpose */
DataConvert(&data->Ime);
/* initialize the candidate cursor to zero */
data->Ime.CandidateCursor = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -