231 lines
6.5 KiB
C
231 lines
6.5 KiB
C
/*++
|
|
|
|
Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
|
|
|
|
Module Name:
|
|
|
|
CHCAND.C
|
|
|
|
++*/
|
|
|
|
#include <windows.h>
|
|
#include <immdev.h>
|
|
#include <imedefs.h>
|
|
|
|
/**********************************************************************/
|
|
/* SelectOneCand() */
|
|
/**********************************************************************/
|
|
void PASCAL SelectOneCand(
|
|
LPINPUTCONTEXT lpIMC,
|
|
LPCOMPOSITIONSTRING lpCompStr,
|
|
LPPRIVCONTEXT lpImcP,
|
|
LPCANDIDATELIST lpCandList)
|
|
{
|
|
if (!lpCompStr) {
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
|
|
if (!lpImcP) {
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
|
|
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];
|
|
}
|
|
}
|
|
|
|
// calculate result string length
|
|
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;
|
|
}
|
|
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),
|
|
(LPTSTR)lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
|
|
|
// calculate result string length
|
|
lpCompStr->dwResultStrLen =
|
|
lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf);
|
|
|
|
// 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;
|
|
|
|
lpImcP->iImeState = CST_INIT;
|
|
|
|
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);
|
|
}
|
|
|
|
// no candidate now, the right candidate string already be finalized
|
|
lpCandList->dwCount = 0;
|
|
lpCandList->dwSelection = 0;
|
|
} else {
|
|
// chang candidate by LX state
|
|
lpImcP->fdwImeMsg =
|
|
(lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE | MSG_CHANGE_CANDIDATE) &
|
|
~(MSG_CLOSE_CANDIDATE);
|
|
lpCandList->dwSelection = 0;
|
|
}
|
|
|
|
#ifdef CROSSREF
|
|
if (!CrossReverseConv(lpIMC, lpCompStr, lpImcP, lpCandList))
|
|
// CHP
|
|
// No refence code, not a fussy char
|
|
#ifdef FUSSYMODE
|
|
MBIndex.IsFussyCharFlag =0;
|
|
#endif FUSSYMODE
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
/**********************************************************************/
|
|
/* CandEscapeKey() */
|
|
/**********************************************************************/
|
|
void PASCAL CandEscapeKey(
|
|
LPINPUTCONTEXT lpIMC,
|
|
LPPRIVCONTEXT lpImcP)
|
|
{
|
|
LPCOMPOSITIONSTRING lpCompStr;
|
|
LPGUIDELINE lpGuideLine;
|
|
|
|
// clean all candidate information
|
|
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
|
|
ClearCand(lpIMC);
|
|
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
|
|
~(MSG_OPEN_CANDIDATE);
|
|
}
|
|
|
|
// if it start composition, we need to clean composition
|
|
if (!(lpImcP->fdwImeMsg & MSG_ALREADY_START)) {
|
|
return;
|
|
}
|
|
|
|
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
|
|
if(!lpCompStr){
|
|
return;
|
|
}
|
|
lpGuideLine = (LPGUIDELINE)ImmLockIMCC(lpIMC->hGuideLine);
|
|
if(!lpGuideLine){
|
|
return;
|
|
}
|
|
|
|
CompEscapeKey(lpIMC, lpCompStr, lpGuideLine, lpImcP);
|
|
|
|
ImmUnlockIMCC(lpIMC->hGuideLine);
|
|
ImmUnlockIMCC(lpIMC->hCompStr);
|
|
|
|
return;
|
|
}
|
|
|
|
/**********************************************************************/
|
|
/* ChooseCand() */
|
|
/**********************************************************************/
|
|
void PASCAL ChooseCand( // choose one of candidate strings by
|
|
// input char
|
|
WORD wCharCode,
|
|
LPINPUTCONTEXT lpIMC,
|
|
LPCANDIDATEINFO lpCandInfo,
|
|
LPPRIVCONTEXT lpImcP)
|
|
{
|
|
LPCANDIDATELIST lpCandList;
|
|
LPCOMPOSITIONSTRING lpCompStr;
|
|
|
|
if ((wCharCode == VK_ESCAPE)
|
|
|| (wCharCode == VK_RETURN)) { // escape key or return key
|
|
CandEscapeKey(lpIMC, lpImcP);
|
|
return;
|
|
}
|
|
|
|
if (wCharCode == VK_NEXT) { // next selection
|
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
|
return;
|
|
}
|
|
|
|
if (wCharCode == VK_PRIOR) { // previous selection
|
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
|
return;
|
|
}
|
|
|
|
if (wCharCode == VK_HOME) { // Home selection
|
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
|
return;
|
|
}
|
|
|
|
if (wCharCode == VK_END) { // End selection
|
|
lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE;
|
|
return;
|
|
}
|
|
|
|
if (!lpCandInfo) {
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
|
|
lpCandList = (LPCANDIDATELIST)
|
|
((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
|
|
|
|
if ((wCharCode >= TEXT('0')) && wCharCode <= TEXT('9')) {
|
|
|
|
DWORD dwSelCand;
|
|
|
|
dwSelCand = wCharCode - TEXT('0');
|
|
if(wCharCode == TEXT('0')) {
|
|
dwSelCand = 10;
|
|
}
|
|
|
|
if(!(MBIndex.IMEChara[0].IC_LX)
|
|
||!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) {
|
|
if ((lpCandList->dwSelection + dwSelCand) >
|
|
lpCandList->dwCount) {
|
|
// out of range
|
|
return;
|
|
}
|
|
} else {
|
|
if ((lpCandList->dwSelection + dwSelCand) >
|
|
lpImcP->dwOldCandCnt) {
|
|
// out of range
|
|
return;
|
|
}
|
|
}
|
|
|
|
lpCandList->dwSelection = lpCandList->dwSelection + dwSelCand;
|
|
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
|
|
if(!lpCompStr){
|
|
return;
|
|
}
|
|
|
|
|
|
// translate into translate buffer
|
|
SelectOneCand(lpIMC, lpCompStr, lpImcP, lpCandList);
|
|
ImmUnlockIMCC(lpIMC->hCompStr);
|
|
|
|
return;
|
|
}
|
|
|
|
return;
|
|
}
|