671 lines
23 KiB
C
671 lines
23 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
COMPOSE.C
|
||
|
|
||
|
++*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <immdev.h>
|
||
|
#include <imedefs.h>
|
||
|
|
||
|
void PASCAL EngChCand(
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPCANDIDATELIST lpCandList,
|
||
|
LPPRIVCONTEXT lpImcP,
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
WORD wCharCode)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
if (MBIndex.IMEChara[0].IC_Trace) {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI);
|
||
|
} else {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI);
|
||
|
}
|
||
|
//
|
||
|
if((lpCandList->dwCount =
|
||
|
(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt)
|
||
|
== 0) {
|
||
|
} else {
|
||
|
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]),
|
||
|
(LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer);
|
||
|
for (i=1;i<lpImcP->PrivateArea.Comp_Context.Candi_Cnt;i++) {
|
||
|
|
||
|
lpCandList->dwOffset[i] = lpCandList->dwOffset[0]
|
||
|
+(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR) ;
|
||
|
|
||
|
*((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* Engine() */
|
||
|
/* Description: */
|
||
|
/* search MB and fill lpCompStr and lpCandList */
|
||
|
/**********************************************************************/
|
||
|
UINT PASCAL Engine(
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPCANDIDATELIST lpCandList,
|
||
|
LPPRIVCONTEXT lpImcP,
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
WORD wCharCode)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
if(wCharCode == VK_ESCAPE) {
|
||
|
|
||
|
lpCandList->dwCount = 0;
|
||
|
if (MBIndex.IMEChara[0].IC_Trace) {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI);
|
||
|
} else {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI);
|
||
|
}
|
||
|
return (ENGINE_ESC);
|
||
|
} else if(wCharCode == TEXT('\b')) {
|
||
|
EngChCand(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode);
|
||
|
|
||
|
return (ENGINE_BKSPC);
|
||
|
} else if((wCharCode == 0x21) || (wCharCode == 0x22)
|
||
|
|| (wCharCode == 0x23) || (wCharCode == 0x24)) {
|
||
|
|
||
|
EngChCand(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode);
|
||
|
|
||
|
return (ENGINE_CHCAND);
|
||
|
} else if ((wCharCode >= TEXT('0') && wCharCode <= TEXT('9')) &&
|
||
|
(lpImcP->iImeState == CST_CHOOSE)) {
|
||
|
|
||
|
lpCandList->dwCount = lpImcP->PrivateArea.Comp_Context.Candi_Cnt;
|
||
|
lpImcP->dwOldCandCnt = lpCandList->dwCount;
|
||
|
|
||
|
if (MBIndex.IMEChara[0].IC_Trace) {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 1, BOX_UI);
|
||
|
} else {
|
||
|
MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 1, LIN_UI);
|
||
|
}
|
||
|
|
||
|
// if LX on, set cand
|
||
|
if(!(MBIndex.IMEChara[0].IC_LX)
|
||
|
||!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
||
|
} else {
|
||
|
lpCandList->dwCount =
|
||
|
(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt;
|
||
|
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]),
|
||
|
(LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer);
|
||
|
for (i=1;i<lpImcP->PrivateArea.Comp_Context.Candi_Cnt;i++) {
|
||
|
|
||
|
lpCandList->dwOffset[i] = lpCandList->dwOffset[0]
|
||
|
+(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR);
|
||
|
|
||
|
*((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return (ENGINE_MULTISEL);
|
||
|
} else {
|
||
|
UINT MB_SUB_RET;
|
||
|
|
||
|
if(IsUsedCode(wCharCode, lpImcP)
|
||
|
|| (wCharCode == MBIndex.MBDesc[0].cWildChar)
|
||
|
|| (wCharCode == TEXT(' ')))
|
||
|
{
|
||
|
|
||
|
if((wCharCode != TEXT(' ')) && (wCharCode != TEXT('?'))
|
||
|
&& (lpImcP->PrivateArea.Comp_Status.dwSTMULCODE)) {
|
||
|
if (MBIndex.IMEChara[0].IC_Trace) {
|
||
|
MB_SUB(lpIMC->hPrivate, 0x20, 0, BOX_UI);
|
||
|
} else {
|
||
|
MB_SUB(lpIMC->hPrivate, 0x20, 0, LIN_UI);
|
||
|
}
|
||
|
// online create word
|
||
|
if(lpImcP->PrivateArea.Comp_Status.OnLineCreWord) {
|
||
|
UINT i, j;
|
||
|
|
||
|
for(i=lstrlen(CWDBCSStr), j=0; i<MAXINPUTWORD; i++, j++) {
|
||
|
CWDBCSStr[i] = lpImcP->PrivateArea.Comp_Context.CKBBuf[j];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(MBIndex.IMEChara[0].IC_INSSPC) {
|
||
|
int i,j, ilen;
|
||
|
|
||
|
ilen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[ilen + ilen/2] = 0;
|
||
|
for(i = ilen, j=3*ilen/2; i>2; i-=2, j-=3) {
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-1] = 0x20;
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-2] =
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i-1];
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-3] =
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i-2];
|
||
|
}
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i] = 0x20;
|
||
|
} else {
|
||
|
}
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
|
||
|
// calculate result string length
|
||
|
lpCompStr->dwResultStrLen =
|
||
|
lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
|
||
|
lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|
|
||
|
GCS_DELTASTART|GCS_RESULTREAD|GCS_RESULT;
|
||
|
|
||
|
#ifdef CROSSREF
|
||
|
CrossReverseConv(lpIMC, lpCompStr, lpImcP, lpCandList);
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
if (MBIndex.IMEChara[0].IC_Trace) {
|
||
|
MB_SUB_RET = MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI);
|
||
|
} else {
|
||
|
MB_SUB_RET = MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI);
|
||
|
}
|
||
|
|
||
|
switch (MB_SUB_RET)
|
||
|
{
|
||
|
|
||
|
case (ENGINE_COMP): //Engine is composeing
|
||
|
|
||
|
if((lpCandList->dwCount =
|
||
|
(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt)
|
||
|
== 0) {
|
||
|
} else {
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]),
|
||
|
(LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer);
|
||
|
for (i=1;i<lpImcP->PrivateArea.Comp_Context.Candi_Cnt;i++) {
|
||
|
|
||
|
lpCandList->dwOffset[i] = lpCandList->dwOffset[0]
|
||
|
+(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR);
|
||
|
|
||
|
*((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return (ENGINE_COMP);
|
||
|
|
||
|
case (ENGINE_ASCII): //Can't compose
|
||
|
|
||
|
return ENGINE_ASCII;
|
||
|
|
||
|
case (ENGINE_RESAULT): //Composition complete and Result string available
|
||
|
|
||
|
InitCompStr(lpCompStr);
|
||
|
// online create word
|
||
|
if(lpImcP->PrivateArea.Comp_Status.OnLineCreWord) {
|
||
|
UINT i, j;
|
||
|
|
||
|
for(i=lstrlen(CWDBCSStr), j=0; i<MAXINPUTWORD; i++, j++) {
|
||
|
CWDBCSStr[i] = lpImcP->PrivateArea.Comp_Context.CKBBuf[j];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(MBIndex.IMEChara[0].IC_INSSPC) {
|
||
|
int i,j, ilen;
|
||
|
|
||
|
ilen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[ilen + ilen/2] = 0;
|
||
|
for(i = ilen, j=3*ilen/2; i>2; i-=2, j-=3) {
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-1] = 0x20;
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-2] =
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i-1];
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[j-3] =
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i-2];
|
||
|
}
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf[i] = 0x20;
|
||
|
} else {
|
||
|
}
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),
|
||
|
lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
|
||
|
// calculate result string length
|
||
|
lpCompStr->dwResultStrLen =
|
||
|
lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
||
|
|
||
|
#ifdef CROSSREF
|
||
|
CrossReverseConv(lpIMC, lpCompStr, lpImcP, lpCandList);
|
||
|
#endif
|
||
|
|
||
|
// if LX on, set cand
|
||
|
if(!(MBIndex.IMEChara[0].IC_LX)
|
||
|
||!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
||
|
} else {
|
||
|
lpCandList->dwCount =
|
||
|
(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt;
|
||
|
|
||
|
lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]),
|
||
|
(LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer);
|
||
|
for (i=1;i<lpImcP->PrivateArea.Comp_Context.Candi_Cnt;i++) {
|
||
|
|
||
|
lpCandList->dwOffset[i] = lpCandList->dwOffset[0]
|
||
|
+(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR);
|
||
|
|
||
|
*((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0');
|
||
|
}
|
||
|
}
|
||
|
return (ENGINE_RESAULT);
|
||
|
default:
|
||
|
return (ENGINE_COMP);
|
||
|
}
|
||
|
} else {
|
||
|
return (ENGINE_COMP);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* CompEscapeKey() */
|
||
|
/**********************************************************************/
|
||
|
void PASCAL CompEscapeKey(
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPGUIDELINE lpGuideLine,
|
||
|
LPPRIVCONTEXT lpImcP)
|
||
|
{
|
||
|
// add temp
|
||
|
lpImcP->PrivateArea.Comp_Context.szInBuffer[0] = 0;
|
||
|
lpImcP->PrivateArea.Comp_Context.PromptCnt = 0;
|
||
|
lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
|
||
|
|
||
|
if (!lpGuideLine) {
|
||
|
MessageBeep((UINT)-1);
|
||
|
} else if (lpGuideLine->dwLevel == GL_LEVEL_NOGUIDELINE) {
|
||
|
} else {
|
||
|
lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE;
|
||
|
lpGuideLine->dwIndex = GL_ID_UNKNOWN;
|
||
|
lpGuideLine->dwStrLen = 0;
|
||
|
|
||
|
lpImcP->fdwImeMsg |= MSG_GUIDELINE;
|
||
|
}
|
||
|
|
||
|
if (lpImcP->iImeState == CST_CHOOSE) {
|
||
|
Finalize(lpIMC, lpCompStr, lpImcP, VK_ESCAPE);
|
||
|
} else if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION) &
|
||
|
~(MSG_START_COMPOSITION);
|
||
|
}
|
||
|
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
|
||
|
if (lpCompStr) {
|
||
|
InitCompStr(lpCompStr);
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
lpImcP->dwCompChar = VK_ESCAPE;
|
||
|
lpImcP->fdwGcsFlag |= (GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|
|
||
|
GCS_DELTASTART);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* CompBackSpaceKey() */
|
||
|
/**********************************************************************/
|
||
|
void PASCAL CompBackSpaceKey(
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPPRIVCONTEXT lpImcP)
|
||
|
{
|
||
|
|
||
|
if (lpCompStr->dwCursorPos < sizeof(BYTE)) {
|
||
|
lpCompStr->dwCursorPos = sizeof(BYTE);
|
||
|
}
|
||
|
|
||
|
// go back a compsoition char
|
||
|
lpCompStr->dwCursorPos -= sizeof(BYTE);
|
||
|
|
||
|
// clean the sequence code
|
||
|
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
lpImcP->dwCompChar = TEXT('\b');
|
||
|
lpImcP->fdwGcsFlag |= (GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|
|
||
|
GCS_DELTASTART);
|
||
|
|
||
|
if (!lpCompStr->dwCursorPos) {
|
||
|
|
||
|
if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN))
|
||
|
|| (lpImcP->PrivateArea.Comp_Status.dwInvalid)
|
||
|
|| (lpImcP->iImeState != CST_INIT)) {
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
|
||
|
ClearCand(lpIMC);
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
|
~(MSG_OPEN_CANDIDATE);
|
||
|
|
||
|
if(!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
||
|
lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen =
|
||
|
lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos;
|
||
|
|
||
|
Finalize(lpIMC, lpCompStr, lpImcP, TEXT('\b'));
|
||
|
lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
|
||
|
InitCompStr(lpCompStr);
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION)
|
||
|
& ~(MSG_START_COMPOSITION);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef EUDC
|
||
|
if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
|
||
|
}else{
|
||
|
#endif //EUDC
|
||
|
// chang candidate by backspace
|
||
|
if (MBIndex.IMEChara[0].IC_TS) {
|
||
|
lpImcP->fdwImeMsg =
|
||
|
(lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE | MSG_CHANGE_CANDIDATE) &
|
||
|
~(MSG_CLOSE_CANDIDATE);
|
||
|
} else {
|
||
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
|
~(MSG_OPEN_CANDIDATE);
|
||
|
}
|
||
|
}
|
||
|
#ifdef EUDC
|
||
|
}
|
||
|
#endif//EUDC
|
||
|
// reading string is composition string for some simple IMEs
|
||
|
// delta start is the same as cursor position for backspace
|
||
|
lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen =
|
||
|
lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos;
|
||
|
|
||
|
Finalize(lpIMC, lpCompStr, lpImcP, TEXT('\b'));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* CompStrInfo() */
|
||
|
/**********************************************************************/
|
||
|
void PASCAL CompStrInfo(
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPPRIVCONTEXT lpImcP,
|
||
|
LPGUIDELINE lpGuideLine,
|
||
|
WORD wCharCode)
|
||
|
{
|
||
|
register DWORD dwCursorPos;
|
||
|
|
||
|
// multicode
|
||
|
if(lpImcP->PrivateArea.Comp_Status.dwSTMULCODE) {
|
||
|
InitCompStr(lpCompStr);
|
||
|
}
|
||
|
//
|
||
|
dwCursorPos = lpCompStr->dwCursorPos;
|
||
|
|
||
|
// dwCrusorPos limit
|
||
|
|
||
|
if (dwCursorPos >= MBIndex.MBDesc[0].wMaxCodes) {
|
||
|
// exceed the max input key limitation
|
||
|
lpGuideLine->dwLevel = GL_LEVEL_ERROR;
|
||
|
lpGuideLine->dwIndex = GL_ID_TOOMANYSTROKE;
|
||
|
|
||
|
lpImcP->fdwImeMsg |= MSG_GUIDELINE;
|
||
|
MessageBeep(0xFFFFFFFF);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
// set MSG_START_COMPOSITION
|
||
|
if (!(lpImcP->fdwImeMsg & MSG_ALREADY_START)) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_START_COMPOSITION) &
|
||
|
~(MSG_END_COMPOSITION);
|
||
|
}
|
||
|
|
||
|
if (lpImcP->iImeState == CST_INIT) {
|
||
|
}
|
||
|
|
||
|
|
||
|
// composition/reading string - UsedCode(Full Shape)
|
||
|
lpImcP->dwCompChar = (DWORD)wCharCode;
|
||
|
|
||
|
// set reading string for lpCompStr
|
||
|
*((LPUNAWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadStrOffset +
|
||
|
dwCursorPos*sizeof(TCHAR))) = (BYTE)lpImcP->dwCompChar;
|
||
|
|
||
|
// composition/reading attribute - IME has converted these chars
|
||
|
*((LPUNAWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadAttrOffset +
|
||
|
dwCursorPos*sizeof(TCHAR))) = ((ATTR_TARGET_CONVERTED << 8)|ATTR_TARGET_CONVERTED);
|
||
|
|
||
|
// set reading string lenght for lpCompStr
|
||
|
if (lpCompStr->dwCompReadStrLen <= dwCursorPos) {
|
||
|
lpCompStr->dwCompReadStrLen += sizeof(BYTE);
|
||
|
}
|
||
|
|
||
|
// composition string is reading string for some simple IMEs
|
||
|
lpCompStr->dwCompStrLen = lpCompStr->dwCompReadStrLen;
|
||
|
|
||
|
// composition/reading attribute length is equal to reading string length
|
||
|
lpCompStr->dwCompReadAttrLen = lpCompStr->dwCompReadStrLen;
|
||
|
lpCompStr->dwCompAttrLen = lpCompStr->dwCompStrLen;
|
||
|
|
||
|
// delta start from previous cursor position
|
||
|
lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos;
|
||
|
|
||
|
// set new cursor with next to the composition string
|
||
|
lpCompStr->dwCursorPos = lpCompStr->dwCompStrLen;
|
||
|
|
||
|
// tell app, there is a composition char generated
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
|
||
|
// set lpImeP->fdwGcsFlag
|
||
|
lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|GCS_DELTASTART;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* Finalize() */
|
||
|
/* Return vlaue */
|
||
|
/* Engine Flag */
|
||
|
/* Description: */
|
||
|
/* Call Engine finalize Chinese word(s) by searching table */
|
||
|
/* (Set lpCompStr and lpCandList) */
|
||
|
/* Set lpImeP(iImeState, fdwImeMsg, fdwGcsFlag) */
|
||
|
/**********************************************************************/
|
||
|
UINT PASCAL Finalize(
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPPRIVCONTEXT lpImcP,
|
||
|
WORD wCharCode)
|
||
|
{
|
||
|
LPCANDIDATEINFO lpCandInfo;
|
||
|
LPCANDIDATELIST lpCandList;
|
||
|
UINT fEngine;
|
||
|
|
||
|
if (!lpIMC->hCandInfo) {
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
// get lpCandInfo
|
||
|
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
|
||
|
|
||
|
if (!lpCandInfo) {
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
// get lpCandList and init dwCount & dwSelection
|
||
|
lpCandList = (LPCANDIDATELIST)
|
||
|
((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
|
||
|
lpCandList->dwCount = 0;
|
||
|
lpCandList->dwSelection = 0;
|
||
|
|
||
|
// search the IME tables
|
||
|
fEngine =Engine(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode);
|
||
|
|
||
|
if (fEngine == ENGINE_COMP) {
|
||
|
lpCandInfo->dwCount = 1;
|
||
|
|
||
|
if(lpCandList->dwCount == 0) {
|
||
|
MessageBeep((UINT)-1);
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
|
~(MSG_OPEN_CANDIDATE);
|
||
|
ImmUnlockIMCC(lpIMC->hCandInfo);
|
||
|
return (fEngine);
|
||
|
} else {
|
||
|
// open composition candidate UI window for the string(s)
|
||
|
if ((MBIndex.IMEChara[0].IC_TS)
|
||
|
|| (lpImcP->PrivateArea.Comp_Status.dwSTMULCODE)) {
|
||
|
if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) ==
|
||
|
(MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CHANGE_CANDIDATE) &
|
||
|
~(MSG_CLOSE_CANDIDATE);
|
||
|
} else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
||
|
} else {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE) &
|
||
|
~(MSG_CLOSE_CANDIDATE);
|
||
|
}
|
||
|
} else {
|
||
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
|
lpImcP->fdwImeMsg =
|
||
|
(lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
|
~(MSG_OPEN_CANDIDATE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
}
|
||
|
} else if (fEngine == ENGINE_ASCII) {
|
||
|
} else if (fEngine == ENGINE_RESAULT) {
|
||
|
|
||
|
// Set lpImep! and tell application, there is a reslut string
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
lpImcP->dwCompChar = (DWORD) 0;
|
||
|
lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|
|
||
|
GCS_DELTASTART|GCS_RESULTREAD|GCS_RESULT;
|
||
|
|
||
|
if(!(MBIndex.IMEChara[0].IC_LX)
|
||
|
|| !(lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
||
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
||
|
~(MSG_OPEN_CANDIDATE);
|
||
|
}
|
||
|
// clear candidate now
|
||
|
lpCandList->dwCount = 0;
|
||
|
// set iImeState with CST_INIT
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
} else {
|
||
|
if ((MBIndex.IMEChara[0].IC_TS)
|
||
|
|| (lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
||
|
if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) ==
|
||
|
(MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CHANGE_CANDIDATE) &
|
||
|
~(MSG_CLOSE_CANDIDATE);
|
||
|
} else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
||
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
||
|
} else {
|
||
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE) &
|
||
|
~(MSG_CLOSE_CANDIDATE);
|
||
|
}
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
} else {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else if (fEngine == ENGINE_CHCAND) {
|
||
|
} else if (fEngine == ENGINE_MULTISEL) {
|
||
|
} else if (fEngine == ENGINE_ESC) {
|
||
|
} else if (fEngine == ENGINE_BKSPC) {
|
||
|
} else {
|
||
|
}
|
||
|
|
||
|
ImmUnlockIMCC(lpIMC->hCandInfo);
|
||
|
|
||
|
return fEngine;
|
||
|
}
|
||
|
|
||
|
/**********************************************************************/
|
||
|
/* CompWord() */
|
||
|
/**********************************************************************/
|
||
|
void PASCAL CompWord( // compose the Chinese word(s) according to
|
||
|
// input key
|
||
|
WORD wCharCode,
|
||
|
LPINPUTCONTEXT lpIMC,
|
||
|
LPCOMPOSITIONSTRING lpCompStr,
|
||
|
LPPRIVCONTEXT lpImcP,
|
||
|
LPGUIDELINE lpGuideLine)
|
||
|
{
|
||
|
|
||
|
// lpComStr=NULL?
|
||
|
if (!lpCompStr) {
|
||
|
MessageBeep((UINT)-1);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// escape key
|
||
|
if ((wCharCode == VK_ESCAPE) || (wCharCode == 0x0d)) {
|
||
|
lpImcP->iImeState = CST_INIT;
|
||
|
CompEscapeKey(lpIMC, lpCompStr, lpGuideLine, lpImcP);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// GuideLine
|
||
|
if (!lpGuideLine) {
|
||
|
} else if (lpGuideLine->dwLevel == GL_LEVEL_NOGUIDELINE) {
|
||
|
lpGuideLine->dwStrLen = 0;
|
||
|
} else {
|
||
|
// previous input error cause us trancate some chars
|
||
|
if (lpGuideLine->dwLevel == GL_LEVEL_ERROR) {
|
||
|
lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen =
|
||
|
lpCompStr->dwCursorPos;
|
||
|
lpCompStr->dwCompReadAttrLen = lpCompStr->dwCompReadStrLen;
|
||
|
lpCompStr->dwCompAttrLen = lpCompStr->dwCompStrLen;
|
||
|
}
|
||
|
lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE;
|
||
|
lpGuideLine->dwIndex = GL_ID_UNKNOWN;
|
||
|
lpGuideLine->dwStrLen = 0;
|
||
|
|
||
|
lpImcP->fdwImeMsg |= MSG_GUIDELINE;
|
||
|
}
|
||
|
|
||
|
// backspace key
|
||
|
if (wCharCode == TEXT('\b')) {
|
||
|
CompBackSpaceKey(lpIMC, lpCompStr, lpImcP);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
lpImcP->iImeState = CST_INPUT;
|
||
|
if(wCharCode == TEXT(' ')) {
|
||
|
#ifdef EUDC
|
||
|
}else if( lpIMC->fdwConversion & IME_CMODE_EUDC && lpCompStr->dwCompReadStrLen >= EUDC_MAX_READING ){
|
||
|
MessageBeep((UINT)-1);
|
||
|
#endif //EUDC
|
||
|
} else {
|
||
|
// build up composition string info
|
||
|
CompStrInfo(lpCompStr, lpImcP, lpGuideLine, wCharCode);
|
||
|
}
|
||
|
#ifdef EUDC
|
||
|
if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
|
||
|
if (lpCompStr->dwCompReadStrLen >= lpImeL->nMaxKey
|
||
|
|| lpCompStr->dwCompReadStrLen >= EUDC_MAX_READING
|
||
|
|| wCharCode == TEXT(' ')) {
|
||
|
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
|
||
|
lpImcP->fdwGcsFlag |= GCS_RESULTREAD|GCS_RESULTSTR;
|
||
|
}
|
||
|
} else
|
||
|
#endif //EUDC
|
||
|
Finalize(lpIMC, lpCompStr, lpImcP, wCharCode); // compsition
|
||
|
|
||
|
return;
|
||
|
}
|