/*++ Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved Module Name: CHCAND.C ++*/ #include #include #include /**********************************************************************/ /* 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; iPrivateArea.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; }