00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
#include "precomp.h"
00020 
#pragma hdrstop
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 VOID ImeOpenClose( HWND hWnd, BOOL fFlag )
00031 {
00032     HIMC            hIMC;
00033 
00034     
00035     
00036     
00037 
00038     
if ( !( hIMC = 
ImmGetContext( 
hWnd ) ) )
00039         
return;
00040 
00041     
ImmSetOpenStatus( hIMC, fFlag );
00042 
00043     
ImmReleaseContext( 
hWnd, hIMC );
00044 
00045 }
00046 
00047 
#ifdef DEBUG_MODE
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
VOID VirtualKeyHandler( HWND hWnd, UINT wParam, UINT lParam )
00059 {
00060     
PCONSOLE_TABLE ConTbl;
00061     
int i;
00062     
static int delta ;
00063 
00064     ConTbl = 
SearchConsole(LastConsole);
00065     
if (ConTbl == 
NULL) {
00066         
DBGPRINT((
"CONIME: Error! Cannot found registed Console\n"));
00067         
return;
00068     }
00069 
00070     
if ( ConTbl->
fInCandidate ||
00071          ( ConTbl->
fInComposition && !MoveCaret( hWnd ) )
00072        )
00073         
return;
00074 
00075     
switch( wParam )
00076     {
00077     
case VK_HOME:   
00078         xPos = 
FIRSTCOL;
00079         
break;
00080 
00081     
case VK_END:    
00082         xPos = xPosLast ;
00083         
break;
00084 
00085     
case VK_RIGHT:
00086         
if ( 
IsUnicodeFullWidth( ConvertLine[xPos] ) ){
00087             
if (xPos > xPosLast - 2 ) 
break;  
00088             xPos += 2;                     
00089         }
00090         
else
00091             xPos = 
min( xPos+1, xPosLast );
00092         
break;
00093 
00094     
case VK_LEFT:
00095 
00096         xPos = 
max( xPos-1, FIRSTCOL );
00097 
00098         
if ( 
IsUnicodeFullWidth( ConvertLine[xPos] ) )
00099             xPos--;
00100         
break;
00101 
00102     
case VK_BACK:   
00103 
00104         
if ( xPos > 
FIRSTCOL ) {
00105             delta = 1 ;
00106 
00107             
00108             
00109             
00110             
if ( 
IsUnicodeFullWidth( ConvertLine[xPos] ) )
00111                 delta = 2 ;
00112             
00113             
00114             
00115             xPos -= delta ;
00116             
for ( i = xPos ; i < xPosLast+2 ; i++) {
00117                 ConvertLine[i] = ConvertLine[i+delta] ;
00118                 ConvertLineAtr[i] = ConvertLineAtr[i+delta] ;
00119             }
00120             xPosLast -= delta ;
00121         }
00122         
else     
00123            
break;
00124         
goto Repaint ;
00125         
break;
00126     
case VK_DELETE:
00127         
if ( !
IsUnicodeFullWidth( ConvertLine[xPos] ) ) {
00128 
00129             
00130             
00131             
00132 
00133             
for ( i = xPos; i < xPosLast; i++ ) {
00134                 ConvertLine[i] = ConvertLine[i+1];
00135                 ConvertLineAtr[i] = ConvertLineAtr[i+1];
00136             }
00137             xPosLast-- ;
00138 
00139         } 
else {
00140 
00141             
00142             
00143             
00144 
00145             
for ( i = xPos; i < xPosLast; i++ ) {
00146                 ConvertLine[i] = ConvertLine[i+2];
00147                 ConvertLineAtr[i] = ConvertLineAtr[i+2];
00148             }
00149             xPosLast -= 2 ;
00150         }
00151 
00152         
goto Repaint ;
00153         
break;
00154 
00155     
case VK_TAB:    
00156         {
00157          
int xTabMax = xPos + 
TABSTOP;
00158          
int xPosPrev;
00159 
00160          
do {
00161              xPosPrev = xPos;
00162             
if ( 
IsUnicodeFullWidth( ConvertLine[xPos] ) ){
00163                 
if (xPos > xPosLast - 2 ) 
break;  
00164                 xPos += 2;                     
00165             }
00166             
else
00167                 xPos = 
min( xPos+1, xPosLast );
00168 
00169          } 
while ( (xPos % 
TABSTOP) &&
00170                    (xPos < xTabMax) &&
00171                    (xPos != xPosPrev));
00172 
00173         }
00174         
goto Repaint ;
00175         
break;
00176 
00177     
case VK_RETURN: 
00178         
for (i = 
FIRSTCOL ; i < 
MAXCOL ; i++) {
00179             ConvertLine[i] = 
' ' ;
00180             ConvertLineAtr[i] = 0 ;
00181         }
00182         xPos = 
FIRSTCOL;
00183         xPosLast = 
FIRSTCOL;
00184 Repaint:
00185         {
00186         
00187         
00188         
00189         HDC hdc;
00190 
00191         hdc = 
GetDC( hWnd );
00192         HideCaret( hWnd );
00193         DisplayConvInformation( hWnd ) ;
00194         
ReleaseDC( hWnd, hdc );
00195         }
00196         
break;
00197     }
00198     ResetCaret( hWnd );
00199 }
00200 
#endif
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 VOID CharHandlerFromConsole( HWND hWnd, UINT Message, ULONG wParam, ULONG lParam)
00209 {
00210     
UINT TmpMessage ;
00211     
DWORD dwImmRet ;
00212     
UINT uVKey ;
00213     
UINT wParamSave ;
00214 
00215     
if (HIWORD(wParam) == 0){
00216         wParamSave = wParam ;
00217     }
00218     
else {
00219         
if (Message == WM_KEYDOWN   +
CONIME_KEYDATA || Message == WM_KEYUP   +
CONIME_KEYDATA ||
00220             Message == WM_SYSKEYDOWN+
CONIME_KEYDATA || Message == WM_SYSKEYUP+
CONIME_KEYDATA){
00221             wParamSave = 0 ;
00222         }
00223         
else if(HIWORD(wParam) > 0x00ff){
00224             WCHAR WideChar ;
00225             UCHAR MultiChar ;
00226             WideChar = HIWORD(wParam) ;
00227             WideCharToMultiByte(CP_OEMCP, 0, &WideChar, 1, &MultiChar, 1, 
NULL, 
NULL) ;
00228             wParamSave = MultiChar ;
00229         }
00230         
else {
00231             wParamSave = HIWORD(wParam) ;
00232         }
00233     }
00234 
00235     
if (HIWORD(lParam) & KF_UP) 
00236         TmpMessage = WM_KEYUP ;
00237     
else
00238         TmpMessage = WM_KEYDOWN ;
00239 
00240 
00241     
00242     
00243     
00244     
00245     dwImmRet = 
ImmCallImeConsoleIME(
hWnd, TmpMessage, wParam, lParam, &uVKey) ;
00246 
00247     
if ( dwImmRet & 
IPHK_HOTKEY ) {
00248     
00249     
00250     
00251     
00252     
00253        
return ;
00254     }
00255     
else if (dwImmRet & 
IPHK_PROCESSBYIME) {
00256         
BOOL Status ;
00257 
00258 
00259 
00260 
00261 
00262         
Status = 
ImmTranslateMessage(
hWnd, TmpMessage, wParam, lParam);
00263 
00264 
00265     }
00266     
else if (dwImmRet & 
IPHK_CHECKCTRL) {
00267         
CharHandlerToConsole( 
hWnd, Message-
CONIME_KEYDATA, wParamSave, lParam);
00268     }
00269     
else
00270     {
00271         
if ((Message == WM_CHAR   +
CONIME_KEYDATA)||
00272             (Message == WM_SYSCHAR+
CONIME_KEYDATA)) {
00273             
CharHandlerToConsole( 
hWnd, Message-
CONIME_KEYDATA, wParamSave, lParam);
00274         }
00275         
else
00276             
CharHandlerToConsole( 
hWnd, Message-
CONIME_KEYDATA, wParam, lParam);
00277     }
00278 
00279 }
00280 
00281 VOID CharHandlerToConsole( HWND hWnd, UINT Message, ULONG wParam, ULONG lParam)
00282 {
00283     
PCONSOLE_TABLE ConTbl;
00284     WORD  ch ;
00285     
int   NumByte = 0 ;
00286 
00287     ConTbl = 
SearchConsole(
LastConsole);
00288     
if (ConTbl == 
NULL) {
00289         
DBGPRINT((
"CONIME: Error! Cannot found registed Console\n"));
00290         
return;
00291     }
00292 
00293     
if (HIWORD(lParam) & KF_UP ) {
00294         
PostMessage( ConTbl->
hWndCon,
00295                      Message+
CONIME_KEYDATA,
00296                      wParam,
00297                      lParam) ;
00298         
return ;
00299     }
00300 
00301     ch = LOWORD(wParam) ;
00302     
if ((ch < 
UNICODE_SPACE) ||
00303         ((ch >= 
UNICODE_SPACE) &&
00304         ((Message == WM_KEYDOWN) || (Message == WM_SYSKEYDOWN) ))) {
00305 
#ifdef DEBUG_MODE
00306 
        VirtualKeyHandler( 
hWnd, wParam ,lParam) ;
00307 
#endif
00308 
        PostMessage( ConTbl->
hWndCon,
00309                      Message+
CONIME_KEYDATA,
00310                      wParam,
00311                      lParam) ;
00312         
return ;
00313     }
00314 
00315 
#ifdef DEBUG_MODE
00316 
    StoreChar( 
hWnd, ch, 0);
00317 
#endif
00318 
00319     
PostMessage( ConTbl->
hWndCon,
00320                  Message+
CONIME_KEYDATA,
00321                  wParam,          
00322                  lParam) ;
00323 }
00324 
00325 
#ifdef DEBUG_MODE
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
VOID ImeUIMoveCandWin( HWND hwnd )
00335 {
00336     
PCONSOLE_TABLE ConTbl;
00337 
00338     ConTbl = 
SearchConsole(LastConsole);
00339     
if (ConTbl == 
NULL) {
00340         
DBGPRINT((
"CONIME: Error! Cannot found registed Console\n"));
00341         
return;
00342     }
00343 
00344     
if ( ConTbl->
fInCandidate )
00345     {
00346         POINT           point;          
00347         
int             i;              
00348         
int             NumCandWin;     
00349         RECT            rect;           
00350 
00351         
00352         
00353         
00354         
00355         
00356 
00357         NumCandWin = 0;
00358 
00359         GetCaretPos( (LPPOINT)&point );
00360         
ClientToScreen( hwnd, (LPPOINT)&point );
00361 
00362         
for ( i = 0; i < 
MAX_LISTCAND ; i++ )
00363         {
00364             
if ( ConTbl->hListCand[ i ] )
00365             {
00366                 
GetClientRect( ConTbl->hListCand[ i ], &rect );
00367 
00368                 MoveWindow( ConTbl->hListCand[ i ],
00369                             point.x + X_INDENT * NumCandWin,
00370                             point.y + Y_INDENT * NumCandWin + cyMetrics,
00371                             ( rect.right - rect.left + 1 ),
00372                             ( rect.bottom - rect.top + 1 ), TRUE );
00373 
00374                 NumCandWin++;
00375             }
00376         }
00377     }
00378 }
00379 
#endif
00380 
00381 
#ifdef DEBUG_MODE
00382 
00383 
00384 
00385 
00386 
00387 
00388 
VOID ResetCaret( HWND hWnd )
00389 {
00390 
00391     HideCaret( hWnd );
00392     
DestroyCaret();
00393     
CreateCaret( hWnd,
00394          NULL,
00395          
IsUnicodeFullWidth( ConvertLine[xPos] ) ?
00396            CaretWidth*2 : CaretWidth,
00397          cyMetrics );
00398     
SetCaretPos( xPos * cxMetrics, 0 );
00399     ShowCaret( hWnd );
00400 
00401 }
00402 
00403 
00404 
00405 
00406 
00407 
00408 
00409 
BOOL MoveCaret( HWND hwnd )
00410 {
00411     HIMC        hIMC;
00412     
BOOL        retVal = 
TRUE;
00413 
00414     
if ( !( hIMC = 
ImmGetContext( hwnd ) ) )
00415     
return retVal;
00416 
00417     
if ( ImmGetCompositionString( hIMC, GCS_CURSORPOS,
00418                   (
void FAR *)NULL, 0 ) )
00419     retVal = 
FALSE;
00420 
00421     
ImmReleaseContext( hwnd, hIMC );
00422 
00423     
return retVal;
00424 }
00425 
#endif
00426 
00427 
#ifdef DEBUG_MODE
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
VOID StoreChar( HWND hWnd, WORD ch, UCHAR atr )
00436 {
00437     HDC hdc;
00438 
00439     
if ( xPos >= 
CVMAX-3 )
00440         
return;
00441 
00442     
00443     
00444     
00445     ConvertLine[xPos] = ch;
00446     ConvertLineAtr[xPos] = atr;
00447     xPos++ ;
00448     xPosLast = 
max(xPosLast,xPos) ;
00449 
00450     
00451     
00452     
00453     hdc = 
GetDC( hWnd );
00454     HideCaret( hWnd );
00455     DisplayConvInformation( hWnd ) ;
00456     ResetCaret( hWnd );
00457     
ReleaseDC( hWnd, hdc );
00458 
00459 }
00460 
#endif