#include #include #include "hwxobj.h" #include "resource.h" #include "../lib/plv/plv.h" #include "../lib/ptt/ptt.h" #ifdef FE_KOREAN #include "hanja.h" #else #include "../imeskdic/imeskdic.h" #endif #include "hwxfe.h" #include "cmnhdr.h" #ifdef UNDER_CE // Windows CE Stub for unsupported APIs #include "stub_ce.h" #endif // UNDER_CE // implementation of CHwxCAC TCHAR szBuf[MAX_PATH]; TOOLINFOW ti; static HPEN ghOldPen = NULL; static HBITMAP ghOldBitmap = NULL; static WCHAR wchChar[8][40]; // use to query the dictionary #ifdef FE_JAPANESE static KANJIINFO kanji; const WORD wSamplePt[] = {0x350d,0x350e,0x3510,0x3513,0x3514,0x3515,0x3516,0x3517,0x3518,0, 0x191f,0x1822,0x1626,0x142a,0x132d,0x122f,0x1131,0x1033,0, 0x1a21,0x2420,0x301f,0x3a1f,0x441f,0x481f,0x4c1e,0x4f1e, 0x531d,0x5d1d,0x611d,0x621d,0x621e,0x621f,0x6221,0x6122,0x6023,0x5f25, 0x5d26,0x5a29,0x582c,0x562f,0, 0}; const wchar_t wSampleChar[24] = { 0x5B80,0x30A6,0x30A5,0x6587,0x4E4B,0x3048,0x3047,0x5DFE, 0x5B57,0x5BF5,0x5BB9,0x5B9A,0x7A7A,0x5BF0,0x6848,0x5BC4, 0x5BA4,0x7AAE,0x5B9B,0x5BB3,0x7A81,0x5BDD,0x5BC7,0x5B8B }; #endif // FE_JAPANESE CHwxCAC::CHwxCAC(CHwxInkWindow * pInk,HINSTANCE hInst):CHwxObject(hInst) { m_pInk = pInk; m_pCHwxThreadCAC = NULL; m_pCHwxStroke = NULL; m_hCACWnd = NULL; // m_hInstance = hInst; m_bLargeView = TRUE; m_gbDown = FALSE; m_bRightClick = FALSE; memset(m_gawch, '\0', sizeof(m_gawch)); m_cnt = 0; if ( pInk ) m_inkSize = pInk->GetCACInkHeight(); else m_inkSize = PadWnd_Height; m_ghdc = NULL; m_ghbm = NULL; m_ghfntTT = NULL; m_hLVWnd = NULL; #ifdef FE_JAPANESE m_pIImeSkdic = NULL; m_hSkdic = NULL; #endif // FE_JAPANESE m_lpPlvInfo = NULL; m_hCursor = LoadCursor(NULL,IDC_ARROW); m_bResize = FALSE; #ifdef FE_JAPANESE memset(m_wchOther,'\0',sizeof(m_wchOther)); #endif m_bDrawSample = FALSE; } CHwxCAC::~CHwxCAC() { m_pInk = NULL; // m_hInstance = NULL; if ( m_hCACWnd ) { DestroyWindow(m_hCACWnd); m_hCACWnd = NULL; } if ( m_pCHwxThreadCAC ) { delete m_pCHwxThreadCAC; m_pCHwxThreadCAC = NULL; } if ( m_pCHwxStroke ) { delete m_pCHwxStroke; m_pCHwxStroke = NULL; } if ( m_ghdc ) { if ( m_ghbm ) { ghOldBitmap = SelectBitmap(m_ghdc,ghOldBitmap); DeleteBitmap(ghOldBitmap); ghOldBitmap = NULL; m_ghbm = NULL; } DeleteDC(m_ghdc); m_ghdc = NULL; } if ( m_ghfntTT ) { DeleteObject(m_ghfntTT); m_ghfntTT = NULL; } if ( m_hLVWnd ) { DestroyWindow(m_hLVWnd); m_hLVWnd = NULL; } #ifdef FE_KOREAN CloseLex(); #else if ( m_pIImeSkdic ) { m_pIImeSkdic->Release(); m_pIImeSkdic = NULL; } if ( m_hSkdic ) { FreeLibrary(m_hSkdic); m_hSkdic = NULL; } #endif m_lpPlvInfo = NULL; } BOOL CHwxCAC::Initialize(TCHAR * pClsName) { BOOL bRet = CHwxObject::Initialize(pClsName); if ( bRet ) { WNDCLASS wc; wc.style = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS; wc.lpfnWndProc = CACWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(void *); wc.hInstance = m_hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL,MAKEINTRESOURCE(32631)); #ifndef UNDER_CE wc.hbrBackground = (HBRUSH)(COLOR_3DFACE +1); #else // UNDER_CE wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); #endif // UNDER_CE wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MACAW"); RegisterClass(&wc); bRet = Init(); if ( !bRet ) return FALSE; m_pCHwxThreadCAC = new CHwxThreadCAC(this); if ( !m_pCHwxThreadCAC ) return FALSE; m_pCHwxStroke = new CHwxStroke(FALSE,32); if ( !m_pCHwxStroke ) { delete m_pCHwxThreadCAC; m_pCHwxThreadCAC = NULL; return FALSE; } bRet = m_pCHwxThreadCAC->Initialize(TEXT("CHwxThreadCAC")); if ( !bRet && Is16BitApp() && m_pCHwxThreadCAC->IsHwxjpnLoaded() ) { bRet = TRUE; } if ( !bRet ) { delete m_pCHwxThreadCAC; m_pCHwxThreadCAC = NULL; delete m_pCHwxStroke; m_pCHwxStroke = NULL; return FALSE; } bRet = m_pCHwxStroke->Initialize(TEXT("CHwxStrokeCAC")); if ( !bRet ) { delete m_pCHwxThreadCAC; m_pCHwxThreadCAC = NULL; delete m_pCHwxStroke; m_pCHwxStroke = NULL; return FALSE; } } return bRet; } typedef HRESULT (WINAPI * PFN)(void **); static TCHAR szDisp[2][60]; static WCHAR wchDisp[2][60]; BOOL CHwxCAC::Init() { // Create the font handles if ( IsNT() ) { #ifndef UNDER_CE // Windows CE does not support CreateFont static WCHAR wchFont[LF_FACESIZE]; CHwxFE::GetDispFontW(m_hInstance, wchFont, sizeof(wchFont)/sizeof(wchFont[0])); m_ghfntTT = CreateFontW(-FONT_SIZE*2, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, wchFont); #else // UNDER_CE static LOGFONT lf = {-FONT_SIZE*2, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, {TEXT('\0')}}; CHwxFE::GetDispFontW(m_hInstance, lf.lfFaceName, sizeof(lf.lfFaceName)/sizeof(lf.lfFaceName[0])); m_ghfntTT = CreateFontIndirect(&lf); #endif // UNDER_CE } else { #ifndef UNDER_CE // Windows CE always Unicode static CHAR chFont[LF_FACESIZE]; CHwxFE::GetDispFontA(m_hInstance, chFont, sizeof(chFont)); m_ghfntTT = CreateFontA(-FONT_SIZE*2, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, chFont); #endif // UNDER_CE } if ( !m_ghfntTT ) { return FALSE; } //980324:by ToshiaK if(IsNT()) { CHwxFE::GetInkExpTextW(m_hInstance, wchDisp[0], sizeof(wchDisp[0])/sizeof(wchDisp[0][0])); CHwxFE::GetListExpTextW(m_hInstance, wchDisp[1], sizeof(wchDisp[1])/sizeof(wchDisp[1][0])); } else { #ifndef UNDER_CE // Windows CE always Unicode CHwxFE::GetInkExpTextA(m_hInstance, szDisp[0], sizeof(szDisp[0])/sizeof(szDisp[0][0])); CHwxFE::GetListExpTextA(m_hInstance, szDisp[1], sizeof(szDisp[1])/sizeof(szDisp[1][0])); #endif // UNDER_CE } //---------------------------------------------------------------- //Below code is Japanese only //---------------------------------------------------------------- #ifdef FE_JAPANESE m_hSkdic = NULL; m_pIImeSkdic = NULL; GetModuleFileName(m_hInstance, szBuf, sizeof(szBuf)/sizeof(szBuf[0])); #ifndef UNDER_CE TCHAR *p = strrchr(szBuf, (TCHAR)'\\'); #else // UNDER_CE TCHAR *p = _tcsrchr(szBuf, TEXT('\\')); #endif // UNDER_CE p[1] = (TCHAR)0x00; #ifdef _DEBUG lstrcat(szBuf, TEXT("dbgskdic.dll")); #else lstrcat(szBuf, TEXT("imeskdic.dll")); #endif // !_DEBUG m_hSkdic = LoadLibrary(szBuf); m_pIImeSkdic = NULL; if (m_hSkdic ) { #ifndef UNDER_CE PFN lpfn =(PFN)GetProcAddress(m_hSkdic,"CreateIImeSkdicInstance"); #else // UNDER_CE PFN lpfn =(PFN)GetProcAddress(m_hSkdic,TEXT("CreateIImeSkdicInstance")); #endif // UNDER_CE if(lpfn) { if(S_OK != (*lpfn)((void **)&m_pIImeSkdic) ) { FreeLibrary(m_hSkdic); m_hSkdic = NULL; } } else { FreeLibrary(m_hSkdic); m_hSkdic = NULL; } } #endif //FE_JAPANESE return TRUE; } void CHwxCAC::InitBitmap(DWORD nMask, int nItem) { RECT rc; if (nMask & MACAW_REDRAW_BACKGROUND) { rc.left = rc.top = 0; rc.right = rc.bottom = m_inkSize; #ifndef UNDER_CE FillRect(m_ghdc,&rc,(HBRUSH)(COLOR_3DFACE+1)); #else // UNDER_CE FillRect(m_ghdc,&rc,GetSysColorBrush(COLOR_3DFACE)); #endif // UNDER_CE InitBitmapBackground(); if ( !nItem ) { InitBitmapText(); } ghOldPen = SelectPen(m_ghdc, GetStockObject(BLACK_PEN)); return; } if (nMask & MACAW_REDRAW_INK) { InitBitmapBackground(); if ( m_pCHwxStroke->GetNumStrokes() ) { m_pCHwxStroke->DrawStroke(m_ghdc,0,TRUE); } else { InitBitmapText(); } return; } } void CHwxCAC::InitBitmapText() { HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); HFONT hOldFont = (HFONT)SelectObject( m_ghdc, hFont ); RECT rc; rc.left = rc.top = 20; rc.right = rc.bottom = m_inkSize - 20; COLORREF colOld = SetTextColor( m_ghdc, GetSysColor(COLOR_3DSHADOW) ); COLORREF colBkOld = SetBkColor( m_ghdc, GetSysColor(COLOR_WINDOW) ); //980324: by ToshiaK if(IsNT()) { DrawTextW(m_ghdc, wchDisp[0], lstrlenW(wchDisp[0]), &rc, DT_VCENTER|DT_WORDBREAK ); } else { DrawText( m_ghdc, szDisp[0], lstrlen(szDisp[0]), &rc,DT_VCENTER|DT_WORDBREAK ); } SetTextColor( m_ghdc, colOld ); SetBkColor( m_ghdc, colBkOld ); SelectObject( m_ghdc, hOldFont ); //980803:by ToshiaK. no need to delete. hFont is DEFAULT_GUI_FONT. //DeleteFont(hFont); } void CHwxCAC::InitBitmapBackground() { RECT rc; HBRUSH hOldBrush, hBrush; HPEN hOldPen; //---------------------------------------------------------------- //980803:ToshiaK. PRC's merge. Use COLOR_WINDOW instead of WHITE_BRUSH //---------------------------------------------------------------- #ifdef OLD980803 hOldBrush = SelectBrush(m_ghdc, GetStockObject(WHITE_BRUSH)); #endif hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); hOldBrush = SelectBrush(m_ghdc, hBrush); hOldPen = SelectPen(m_ghdc, GetStockObject(BLACK_PEN)); Rectangle(m_ghdc, 4, 4, m_inkSize-4, m_inkSize-4); rc.top = rc.left = 4; rc.bottom = rc.right = m_inkSize-4; DrawEdge(m_ghdc,&rc,EDGE_SUNKEN,BF_RECT); m_pInk->DrawHwxGuide(m_ghdc,&rc); hOldBrush = SelectBrush(m_ghdc, hOldBrush); hOldPen = SelectPen(m_ghdc, hOldPen); DeleteBrush(hOldBrush); DeletePen(hOldPen); } void CHwxCAC::HandleResizePaint(HWND hwnd) { if ( m_ghdc ) { if ( ghOldPen ) { ghOldPen = SelectPen(m_ghdc,ghOldPen); DeletePen(ghOldPen); ghOldPen = NULL; } if ( ghOldBitmap ) { ghOldBitmap = SelectBitmap(m_ghdc,ghOldBitmap); DeleteBitmap(ghOldBitmap); ghOldBitmap = NULL; } DeleteDC(m_ghdc); } HDC hdc = GetDC(hwnd); m_ghbm = CreateCompatibleBitmap(hdc, m_inkSize,m_inkSize); m_ghdc = CreateCompatibleDC(hdc); ReleaseDC(hwnd, hdc); ghOldBitmap = SelectBitmap(m_ghdc, m_ghbm); InitBitmap(MACAW_REDRAW_BACKGROUND,m_gbDown ? 1 : 0); if ( GetStrokeCount() ) InitBitmap(MACAW_REDRAW_INK,0); } BOOL CHwxCAC::CreateUI(HWND hwnd) { //990602:kotae #434: to remove flicker, add WS_CLIPCHILDREN m_hCACWnd = CreateWindowEx(0, TEXT("Macaw"), TEXT(""), WS_CHILD | WS_VISIBLE |WS_CLIPCHILDREN, 0, 0, 0, 0, hwnd, (HMENU)IDC_CACINPUT, //980706:for #1624. for "?" help. m_hInstance, this); if( !m_hCACWnd ) { return FALSE; } m_hLVWnd = PadListView_CreateWindow(m_hInstance, m_hCACWnd, IDC_CACLISTVIEW, CW_USEDEFAULT, CW_USEDEFAULT, 500, CW_USEDEFAULT, CAC_WM_SENDRESULT); if ( !m_hLVWnd ) { DestroyWindow(m_hCACWnd); m_hCACWnd = NULL; return FALSE; } // set style,callbacks,font,column PadListView_SetItemCount(m_hLVWnd, 0); PadListView_SetIconItemCallback(m_hLVWnd, (LPARAM)this, (LPFNPLVICONITEMCALLBACK)GetItemForIcon); #ifdef FE_JAPANESE PadListView_SetReportItemCallback(m_hLVWnd, (LPARAM)this,(LPFNPLVREPITEMCALLBACK)GetItemForReport); #endif //---------------------------------------------------------------- //980727: by ToshiaK for ActiveIME support //---------------------------------------------------------------- //980803:ToshiaK. FE merge. #ifndef UNDER_CE //#ifndef UNICODE static CHAR chFontName[LF_FACESIZE]; CHwxFE::GetDispFontA(m_hInstance, chFontName, sizeof(chFontName)); #else // UNDER_CE static TCHAR chFontName[LF_FACESIZE]; CHwxFE::GetDispFontW(m_hInstance, chFontName, sizeof chFontName/sizeof chFontName[0]); #endif // UNDER_CE if(CHwxFE::IsActiveIMEEnv()) { PadListView_SetCodePage(m_hLVWnd, CHwxFE::GetAppCodePage()); PadListView_SetHeaderFont(m_hLVWnd, chFontName); } //---------------------------------------------------------------- //990810:ToshiaK KOTAE #1030. // Font's BUG. You should check Font's Charset. // Add new api for this. do not change PRC's code. //---------------------------------------------------------------- #ifdef FE_JAPANESE PadListView_SetIconFontEx(m_hLVWnd, chFontName, SHIFTJIS_CHARSET, 16); PadListView_SetReportFontEx(m_hLVWnd, chFontName, SHIFTJIS_CHARSET, 12); #elif FE_KOREAN PadListView_SetIconFontEx(m_hLVWnd, chFontName, HANGUL_CHARSET, 12); PadListView_SetReportFontEx(m_hLVWnd, chFontName, HANGUL_CHARSET, 12); #else PadListView_SetIconFont(m_hLVWnd, chFontName, 16); PadListView_SetReportFont(m_hLVWnd, chFontName, 12); #endif PadListView_SetStyle(m_hLVWnd,PLVSTYLE_ICON); if(IsNT()) { //980324:by ToshiaK #526 for WinNT50 PadListView_SetExplanationTextW(m_hLVWnd,wchDisp[1]); } else { #ifndef UNDER_CE // Windows CE always Unicode PadListView_SetExplanationText(m_hLVWnd,szDisp[1]); #endif // UNDER_CE } //---------------------------------------------------------------- //Detail View is only implemented in Japanese Handwriting //---------------------------------------------------------------- #ifdef FE_JAPANESE int i; for(i = 0; i < LISTVIEW_COLUMN; i++) { PLV_COLUMN plvCol; //980803:ToshiaK: moved to CHwxfe::GetHeaderStringA() #ifndef UNDER_CE //#ifndef UNICODE CHwxFE::GetHeaderStringA(m_hInstance, i, szBuf, sizeof(szBuf)/sizeof(szBuf[0])); #else // UNDER_CE CHwxFE::GetHeaderStringW(m_hInstance, i, szBuf, sizeof(szBuf)/sizeof(szBuf[0])); #endif // UNDER_CE plvCol.mask = PLVCF_FMT | PLVCF_WIDTH | PLVCF_TEXT; plvCol.fmt = PLVCFMT_LEFT; plvCol.pszText = szBuf; plvCol.cx = 60; plvCol.cchTextMax = lstrlen(szBuf); PadListView_InsertColumn(m_hLVWnd, i, &plvCol); } #endif //FE_JAPANESE SetToolTipInfo(TRUE); HandleResizePaint(m_hCACWnd); return TRUE; } void CHwxCAC::HandlePaint(HWND hwnd) { PAINTSTRUCT ps; RECT rcBkgnd; BeginPaint(hwnd, &ps); if ( ps.fErase ) { rcBkgnd.left = m_inkSize; rcBkgnd.top = 0; rcBkgnd.right = m_pInk->GetCACWidth(); rcBkgnd.bottom = m_pInk->GetCACHeight(); #ifndef UNDER_CE FillRect(ps.hdc,&rcBkgnd,(HBRUSH)(COLOR_3DFACE+1)); #else // UNDER_CE FillRect(ps.hdc,&rcBkgnd,GetSysColorBrush(COLOR_3DFACE)); #endif // UNDER_CE if ( m_pInk->GetCACHeight() > m_inkSize ) { rcBkgnd.left = 0; rcBkgnd.top = m_inkSize; rcBkgnd.right = m_inkSize; rcBkgnd.bottom = m_pInk->GetCACHeight(); #ifndef UNDER_CE FillRect(ps.hdc,&rcBkgnd,(HBRUSH)(COLOR_3DFACE+1)); #else // UNDER_CE FillRect(ps.hdc,&rcBkgnd,GetSysColorBrush(COLOR_3DFACE)); #endif // UNDER_CE } } HandleResizePaint(hwnd); BitBlt(ps.hdc, 0, 0, m_inkSize, m_inkSize, m_ghdc, 0,0, SRCCOPY); if (m_gbDown) m_pCHwxStroke->DrawStroke(ps.hdc,-1,FALSE); EndPaint(hwnd, &ps); PadListView_Update(m_hLVWnd); } BOOL CHwxCAC::checkRange(int x, int y ) { #if 1 //for KOTAE #818 //Too ugly code... if(x < (4+2) ||(m_inkSize - (4+4-1)) < x) { return FALSE; } if(y < (4+2) || (m_inkSize - (4+4-1)) < y) { return FALSE; } return TRUE; #endif #if 0 //OLD CODE 990601; int inkSize = m_inkSize - 4; if ((x <= 2) || (x >= inkSize) || (y <= 2) || (y >= inkSize)) return FALSE; return TRUE; #endif } BOOL CHwxCAC::IsPointInResizeBox(int x,int y) { int inkSize = m_inkSize - 4; if ((x <= inkSize) || (x >= (m_inkSize+4 )) || (y <= 4) || (y >= (m_pInk->GetCACHeight()-8))) return FALSE; return TRUE; } void CHwxCAC::recognize() { memset(m_gawch, '\0', sizeof(m_gawch)); PadListView_SetItemCount(m_hLVWnd,0); if(IsNT()) { //980324:by ToshiaK #526 for WinNT50 PadListView_SetExplanationTextW(m_hLVWnd, NULL); } else { PadListView_SetExplanationText(m_hLVWnd,NULL); } m_cnt = 0; int inkSize = m_inkSize - 4; PostThreadMessage(m_pCHwxThreadCAC->GetID(), THRDMSG_SETGUIDE, inkSize, 0); PostThreadMessage(m_pCHwxThreadCAC->GetID(), THRDMSG_RECOGNIZE, 0, 0); } void CHwxCAC::NoThreadRecognize(int boxSize) { memset(m_gawch, '\0', sizeof(m_gawch)); PadListView_SetItemCount(m_hLVWnd,0); if(IsNT()) { //980324:toshiaK for #526 PadListView_SetExplanationTextW(m_hLVWnd,NULL); } else { PadListView_SetExplanationText(m_hLVWnd,NULL); } PadListView_Update(m_hLVWnd); m_cnt = 0; m_pCHwxThreadCAC->RecognizeNoThread(boxSize); } void CHwxCAC::HandleMouseEvent(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { RECT rc; POINT pt; pt.x = (short) LOWORD(lp); pt.y = (short) HIWORD(lp); switch ( msg ) { case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: if (!m_gbDown && checkRange(pt.x,pt.y) ) { if ( m_bRightClick ) return; if ( m_pCHwxStroke->AddPoint(pt) ) { m_gbDown = TRUE; if ( !GetStrokeCount() ) { InvalidateRect(hwnd, NULL, FALSE); UpdateWindow(hwnd); } m_pCHwxStroke->GetUpdateRect(&rc); InvalidateRect(hwnd, &rc, FALSE); m_pCHwxStroke->IncStrokeCount(); SetCapture(hwnd); if ( m_cnt && !m_pInk->IsSglClk() && !m_pInk->IsDblClk() ) { memset(m_gawch, '\0', sizeof(m_gawch)); m_cnt = 0; PadListView_SetItemCount(m_hLVWnd,0); if(IsNT()) { //ToshiaK:983024 PadListView_SetExplanationTextW(m_hLVWnd,NULL); } else { PadListView_SetExplanationText(m_hLVWnd,NULL); } PadListView_Update(m_hLVWnd); } } } else if (IsPointInResizeBox(pt.x,pt.y) ) { if ( !m_bResize ) { m_pInk->SetCACInkHeight( m_inkSize = pt.x > INKBOXSIZE_MIN ? pt.x : INKBOXSIZE_MIN ); m_pCHwxStroke->DeleteAllStroke(); m_pInk->ChangeIMEPADSize(FALSE); m_pInk->ChangeLayout(FALSE); SetCapture(hwnd); m_bResize = TRUE; } } break; case WM_LBUTTONUP: if (m_gbDown) { //990602:Kotae #818 if (pt.x < (4+2)) { pt.x = 4+2; } else if (pt.x >= (m_inkSize-(4+4-1))) { pt.x = m_inkSize-(4+4-1); } if (pt.y < (4+2)) { pt.y = 4+2; } else if (pt.y >= (m_inkSize-(4+4-1))) { pt.y = (m_inkSize-(4+4-1)); } #if 0 if (pt.x <= 2) pt.x = 4; else if (pt.x >= (m_inkSize-4)) pt.x = (m_inkSize-4) - 1; if (pt.y <= 2) pt.y = 4; else if (pt.y >= (m_inkSize-4) ) pt.y = (m_inkSize-4) - 1; #endif if ( m_pCHwxStroke->AddPoint(pt) ) { m_pCHwxStroke->GetUpdateRect(&rc); InvalidateRect(hwnd, &rc, FALSE); m_gbDown = FALSE; ReleaseCapture(); } m_pCHwxStroke->DecStrokeCount(); if ( m_pCHwxStroke->AddBoxStroke(0,0,0) ) { m_pCHwxStroke->DrawStroke(m_ghdc, -2, FALSE); if ( !Is16BitApp() && !m_bDrawSample && (m_pInk->IsSglClk() || m_pInk->IsDblClk()) ) recognize(); } } else if ( IsPointInResizeBox(pt.x,pt.y) ) { if ( m_bResize ) { m_pInk->SetCACInkHeight( m_inkSize = pt.x > INKBOXSIZE_MIN ? pt.x : INKBOXSIZE_MIN ); m_pInk->ChangeIMEPADSize(FALSE); m_pInk->ChangeLayout(FALSE); ReleaseCapture(); m_bResize = FALSE; } } else { if ( m_bResize ) { if ( hwnd == GetCapture() ) ReleaseCapture(); m_hCursor = LoadCursor(NULL,IDC_ARROW); SetCursor(m_hCursor); m_bResize = FALSE; } } break; case WM_MOUSEMOVE: if (m_gbDown) { //fixed KOTAE #818 if (pt.x < (4+2)) { pt.x = 4+2; } else if (pt.x >= (m_inkSize-(4+4-1))) { pt.x = m_inkSize-(4+4-1); } if (pt.y < (4+2)) { pt.y = 4+2; } else if (pt.y >= (m_inkSize-(4+4-1))) { pt.y = (m_inkSize-(4+4-1)); } //These are original code. //Original code uses too much Magic Number //and miscalc rectangle size. #if 0 if (pt.x <= 2) pt.x = 4; else if (pt.x >= (m_inkSize-4)) pt.x = (m_inkSize-4) - 1; if (pt.y <= 2) pt.y = 4; else if (pt.y >= (m_inkSize-4)) pt.y = (m_inkSize-4) - 1; #endif if ( m_gbDown = m_pCHwxStroke->AddPoint(pt) ) { m_pCHwxStroke->GetUpdateRect(&rc); InvalidateRect(hwnd, &rc, FALSE); } } else if (hwnd == GetCapture() || IsPointInResizeBox(pt.x,pt.y) ) { HCURSOR hCur = LoadCursor(NULL,IDC_SIZEWE); #ifndef UNDER_CE // CE specific m_hCursor = SetCursor(hCur); #else // UNDER_CE SetCursor(hCur); #endif // UNDER_CE if ( m_bResize ) { //990810:ToshiaK for KOTAE #1661. //Limit's maximum size of ink box. INT cxScreen = ::GetSystemMetrics(SM_CXFULLSCREEN)/2; //INT cyScreen = ::GetSystemMetrics(SM_CYFULLSCREEN)/2; //OLD CODE //m_pInk->SetCACInkHeight( m_inkSize = pt.x > INKBOXSIZE_MIN ? pt.x : INKBOXSIZE_MIN ); if(pt.x < INKBOXSIZE_MIN) { m_inkSize = INKBOXSIZE_MIN; } else if( cxScreen < pt.x) { m_inkSize = cxScreen; } else { m_inkSize = pt.x; } m_pInk->SetCACInkHeight(m_inkSize); m_pInk->ChangeIMEPADSize(FALSE); m_pInk->ChangeLayout(FALSE); } } else { if ( !m_bResize ) SetCursor(m_hCursor); } break; case WM_RBUTTONDOWN: { if ( checkRange(pt.x,pt.y) ) { m_bRightClick = TRUE; } } break; case WM_RBUTTONUP: { //---------------------------------------------------------------- //971219:by ToshiaK for IME98 #1163: //If already WM_LBUTTONDOWN has come //Do not invoke popup menu. //---------------------------------------------------------------- if(m_gbDown) { m_bRightClick = FALSE; break; } if ( checkRange(pt.x,pt.y) ) { HMENU hMenu; HMENU hMenuTrackPopup; //---------------------------------------------------------------- //fixed MSKK #5035.Need to load specified language's menu resource //BUGBUG::hMenu = LoadMenu (m_hInstance, MAKEINTRESOURCE(IDR_CACINK)); //---------------------------------------------------------------- hMenu = CHwxFE::GetMenu(m_hInstance, MAKEINTRESOURCE(IDR_CACINK)); if (hMenu) { hMenuTrackPopup = GetSubMenu (hMenu, 0); if ( Is16BitApp() ) { EnableMenuItem(hMenuTrackPopup,4,MF_BYPOSITION | MF_GRAYED); } else { if ( m_pInk->IsDblClk() ) { CheckMenuItem(hMenuTrackPopup,4,MF_BYPOSITION | MF_CHECKED); } else { CheckMenuItem(hMenuTrackPopup,4,MF_BYPOSITION | MF_UNCHECKED); } } ClientToScreen(m_hCACWnd,&pt); #ifndef UNDER_CE // Windows CE does not support TPM_LEFTBUTTON on TrackPopupMenu TrackPopupMenu (hMenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0,m_hCACWnd, NULL); #else // UNDER_CE TrackPopupMenu(hMenuTrackPopup, TPM_LEFTALIGN, pt.x, pt.y, 0,m_hCACWnd, NULL); #endif // UNDER_CE DestroyMenu (hMenu); } m_bRightClick = FALSE; } } break; } Unref(wp); } BOOL CHwxCAC::IsDupResult(WORD wd) { BOOL bRet = FALSE; for ( int i = 0; i < m_cnt; i++) { if ( m_gawch[i] == wd ) { bRet = TRUE; break; } } return bRet; } void CHwxCAC::HandleRecogResult(HWND hwnd,WPARAM wp, LPARAM lp) { DWORD cstr; int list; int nItem = HIWORD(lp); list = (wp >> 8) & 0x00ff; cstr = wp & 0x00ff; if ( cstr == (DWORD)GetStrokeCount() ) { WCHAR wch = (WCHAR)lp; if ( list ) { if ( !IsDupResult( wch ) ) { m_gawch[m_cnt++] = wch; } } else { m_gawch[nItem] = wch; m_cnt = nItem + 1; } } Unref(hwnd); } void CHwxCAC::HandleShowRecogResult(HWND hwnd,WPARAM wp, LPARAM lp) { if ( m_cnt ) { PadListView_SetItemCount(m_hLVWnd,m_cnt); if(IsNT()) { //ToshiaK:980324 PadListView_SetExplanationTextW(m_hLVWnd,NULL); } else { PadListView_SetExplanationText(m_hLVWnd,NULL); } PadListView_Update(m_hLVWnd); } Unref(hwnd); Unref(wp); Unref(lp); } void CHwxCAC::pickUpChar(LPPLVINFO lpPlvInfo) { WCHAR wch; wch = GetWCHAR(m_lpPlvInfo->index); if ( wch ) { pickUpCharHelper(wch); } Unref(lpPlvInfo); } void CHwxCAC::pickUpCharHelper(WCHAR wch) { (m_pInk->GetAppletPtr())->SendHwxChar(wch); // 16 bit app, single/double click on recog button if ( Is16BitApp() ) { HandleDeleteAllStroke(); } else { if ( m_pInk->IsSglClk() ) { m_pInk->SetSglClk(FALSE); HandleDeleteAllStroke(); } if ( m_pInk->IsDblClk() ) HandleDeleteAllStroke(); if ( !m_pInk->IsSglClk() && !m_pInk->IsDblClk() ) HandleDeleteAllStroke(); } } HBITMAP CHwxCAC::makeCharBitmap(WCHAR wch) { HDC hdcTmp; RECT rc ={0,0,32,32}; HDC hdc; HBITMAP hBmp; HBITMAP hBmpOld; HFONT hFontOld; hBmp = LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_CHARBMP)); hdc = GetDC( (HWND)m_hCACWnd ); hdcTmp = CreateCompatibleDC( hdc ); hBmpOld = (HBITMAP)SelectObject( hdcTmp, hBmp ); hFontOld = (HFONT)SelectObject( hdcTmp, m_ghfntTT ); ExtTextOutW( hdcTmp, rc.left+2,rc.top+2,ETO_CLIPPED,&rc,&wch,1,NULL); SelectObject( hdcTmp, hFontOld ); SelectObject( hdcTmp , hBmpOld ); DeleteDC( hdcTmp ); ReleaseDC( (HWND)m_hCACWnd, hdc ); return hBmp; } void CHwxCAC::HandleSendResult(HWND hwnd,WPARAM wp,LPARAM lp) { m_lpPlvInfo = (LPPLVINFO)lp; switch (m_lpPlvInfo->code) { case PLVN_ITEMPOPED: #ifdef UNDER_CE // ButtonDown/Up ToolTip case PLVN_ITEMDOWN: #endif // UNDER_CE { if ( m_bLargeView ) { SetToolTipInfo(FALSE); //970902: ToshiaK for #1215, #1231 TOOLTIPUSERINFO ttInfo; #ifndef UNDER_CE // CE Specific(ptt use ClientToScreen(ttInfo.hwnd,&ttInfo.pt) ) ttInfo.hwnd = m_hCACWnd; #else // UNDER_CE ttInfo.hwnd = m_hLVWnd; #endif // UNDER_CE ttInfo.pt = m_lpPlvInfo->pt; ttInfo.rect = m_lpPlvInfo->itemRect; ttInfo.lParam = (LPARAM)m_lpPlvInfo->index; SendMessage(m_pInk->GetToolTipWindow(), TTM_RELAYEVENT_WITHUSERINFO, 0,(LPARAM)(LPTOOLTIPUSERINFO)&ttInfo); } } break; #ifdef UNDER_CE // ButtonDown/Up ToolTip case PLVN_ITEMUP: { if ( m_bLargeView ) { SetToolTipInfo(FALSE); TOOLTIPUSERINFO ttInfo; ZeroMemory(&ttInfo, sizeof(ttInfo)); SendMessage(m_pInk->GetToolTipWindow(), TTM_RELAYEVENT_WITHUSERINFO, 0,(LPARAM)&ttInfo); } } break; #endif // UNDER_CE case PLVN_ITEMCLICKED: if ( m_lpPlvInfo ) { //971219:fixed #3466 if(m_lpPlvInfo->colIndex == 0) { pickUpChar(m_lpPlvInfo); } } break; case PLVN_ITEMCOLUMNCLICKED: break; case PLVN_ITEMDBLCLICKED: break; case PLVN_ITEMCOLUMNDBLCLICKED: break; ////////////////////////////////////////////////////////////////////////////// // !!! CAC context menu Start !!! #ifdef FE_JAPANESE case PLVN_R_ITEMCLICKED: { HMENU hMenu; HMENU hMenuTrackPopup,hMenuSub; POINT pt = m_lpPlvInfo->pt; //---------------------------------------------------------------- //fixed MSKK #5035.Need to load specified language's menu resource //BUGBUG::hMenu = LoadMenu (m_hInstance, MAKEINTRESOURCE(IDR_CACLV)); //---------------------------------------------------------------- hMenu = CHwxFE::GetMenu(m_hInstance, MAKEINTRESOURCE(IDR_CACLV)); if (hMenu) { hMenuTrackPopup = GetSubMenu (hMenu, 0); ClientToScreen(m_hLVWnd,&pt); hMenuSub = GetSubMenu(hMenuTrackPopup,2); if ( m_bLargeView ) { CheckMenuItem(hMenuSub,1,MF_BYPOSITION | MF_UNCHECKED); CheckMenuItem(hMenuSub,0,MF_BYPOSITION | MF_CHECKED); } else { CheckMenuItem(hMenuSub,0,MF_BYPOSITION | MF_UNCHECKED); CheckMenuItem(hMenuSub,1,MF_BYPOSITION | MF_CHECKED); } WCHAR wch; wch = GetWCHAR(m_lpPlvInfo->index); #ifdef OLD_970811 //ToshiaK. do not load radical bitmap for #1231 kanji.mask = KIF_ALL; #else kanji.mask = KIF_YOMI | KIF_ITAIJI; #endif kanji.cItaijiCount = 0; memset(kanji.wchItaiji,'\0',sizeof(kanji.wchItaiji)); memset(m_wchOther,'\0',sizeof(m_wchOther)); if ( wch && m_pIImeSkdic ) { m_pIImeSkdic->GetKanjiInfo(wch,&kanji); } HBITMAP hBmp[MAX_ITAIJI_COUNT+1]= {NULL}; if ( kanji.cItaijiCount ) { DeleteMenu( hMenuTrackPopup, IDM_CACLVSENDOTHER_NONE, MF_BYCOMMAND ); for ( int ibmp = 0; ibmp < kanji.cItaijiCount; ibmp++) { #ifndef UNDER_CE // Windows CE does not support MF_BITMAP on AppendMenu hBmp[ibmp] = makeCharBitmap(kanji.wchItaiji[ibmp]); m_wchOther[ibmp] = kanji.wchItaiji[ibmp]; AppendMenu(GetSubMenu(hMenuTrackPopup,1) , MF_BITMAP, IDM_CACLVSENDOTHER_NONE+100+ibmp, (LPCTSTR)hBmp[ibmp] ); #else // UNDER_CE TCHAR chItaiji[2] = {kanji.wchItaiji[ibmp], TEXT('\0')}; AppendMenu(GetSubMenu(hMenuTrackPopup,1), MF_STRING, IDM_CACLVSENDOTHER_NONE+100+ibmp, chItaiji); #endif // UNDER_CE } } else { EnableMenuItem(hMenuTrackPopup,1,MF_BYPOSITION | MF_GRAYED); } #if 1 // kwada : bold menu item #ifndef UNDER_CE // Windows CE does not support SetMenuDefaultItem SetMenuDefaultItem(hMenuTrackPopup,IDM_CACLVSENDCHAR,FALSE); #endif // UNDER_CE #endif #ifndef UNDER_CE // Windows CE does not support TPM_LEFTBUTTON on TrackPopupMenu TrackPopupMenu (hMenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0,m_hCACWnd, NULL); #else // UNDER_CE TrackPopupMenu(hMenuTrackPopup, TPM_LEFTALIGN, pt.x, pt.y, 0,m_hCACWnd, NULL); #endif // UNDER_CE DestroyMenu (hMenu); if( hBmp[0] ) { for( int i=0; icolIndex - 0); PadListView_Update(m_hLVWnd); #endif break; default: break; } Unref(hwnd); Unref(wp); } void CHwxCAC::GetInkFromMB(CHwxStroke & str,long deltaX,long deltaY) { *m_pCHwxStroke = str; if ( !GetStrokeCount() ) { return; } m_pCHwxStroke->ScaleInkXY(deltaX,deltaY); long X = (m_pInk->GetMBHeight() - m_inkSize)/2; long Y = (m_pInk->GetMBHeight() - m_inkSize)/2; if ( X || Y ) m_pCHwxStroke->ScaleInkXY(X,Y); HandleResizePaint(m_hCACWnd); if ( m_pInk->IsSglClk() || m_pInk->IsDblClk() ) recognize(); } void CHwxCAC::HandleDeleteOneStroke() { if ( GetStrokeCount() ) m_pCHwxStroke->EraseCurrentStroke(); if ( !GetStrokeCount() ) { memset(m_gawch, '\0', sizeof(m_gawch)); m_cnt = 0; PadListView_SetItemCount(m_hLVWnd,0); if(IsNT()) { //ToshiaK:980324 PadListView_SetExplanationTextW(m_hLVWnd,wchDisp[1]); } else { #ifndef UNDER_CE // Windows CE always Unicode PadListView_SetExplanationText(m_hLVWnd,szDisp[1]); #endif // UNDER_CE } PadListView_Update(m_hLVWnd); InitBitmap(MACAW_REDRAW_BACKGROUND, 0); InitBitmap(MACAW_REDRAW_INK, 0); InvalidateRect(m_hCACWnd, NULL, FALSE); return; } if ( !Is16BitApp() && ( m_pInk->IsSglClk() || m_pInk->IsDblClk()) ) recognize(); PadListView_Update(m_hLVWnd); InitBitmap(MACAW_REDRAW_INK, 0); InvalidateRect(m_hCACWnd, NULL, FALSE); } void CHwxCAC::HandleDeleteAllStroke() { if ( GetStrokeCount() ) { m_pCHwxStroke->DeleteAllStroke(); InitBitmap(MACAW_REDRAW_BACKGROUND, 0); InvalidateRect(m_hCACWnd, NULL, FALSE); } } LRESULT CHwxCAC::HandleCommand(HWND hwnd, UINT msg, WPARAM wp,LPARAM lp) { UINT uCode =(UINT)LOWORD(wp); WCHAR wch; switch ( uCode ) { case IDM_CACRECOG: if ( Is16BitApp() ) { m_pCHwxThreadCAC->RecognizeNoThread(m_inkSize); } else { if ( !m_pInk->IsDblClk() && !m_pInk->IsSglClk() ) { m_pInk->SetSglClk(TRUE); recognize(); } } return 0; case IDM_CACDELETEONE: HandleDeleteOneStroke(); return 0; case IDM_CACDELETEALL: HandleDeleteAllStroke(); return 0; case IDM_CACAUTORECOG: // no 16 bit app events here if ( !Is16BitApp() ) { m_pInk->SetDblClk(!m_pInk->IsDblClk()); m_pInk->UpdateRegistry(TRUE/*fSet*/); //SATORI #73 by HiroakiK if ( m_pInk->IsDblClk() ) recognize(); } return 0; case IDM_CACLVSENDCHAR: if ( m_lpPlvInfo ) pickUpChar(m_lpPlvInfo); return 0; case IDM_CACLVSENDOTHER_NONE+100: case IDM_CACLVSENDOTHER_NONE+101: case IDM_CACLVSENDOTHER_NONE+102: case IDM_CACLVSENDOTHER_NONE+103: case IDM_CACLVSENDOTHER_NONE+104: case IDM_CACLVSENDOTHER_NONE+105: case IDM_CACLVSENDOTHER_NONE+106: case IDM_CACLVSENDOTHER_NONE+107: case IDM_CACLVSENDOTHER_NONE+108: case IDM_CACLVSENDOTHER_NONE+109: case IDM_CACLVSENDOTHER_NONE+110: case IDM_CACLVSENDOTHER_NONE+111: case IDM_CACLVSENDOTHER_NONE+112: case IDM_CACLVSENDOTHER_NONE+113: case IDM_CACLVSENDOTHER_NONE+114: case IDM_CACLVSENDOTHER_NONE+115: case IDM_CACLVSENDOTHER_NONE+116: #ifdef FE_JAPANESE if ( wch = m_wchOther[uCode-(IDM_CACLVSENDOTHER_NONE+100)] ) pickUpCharHelper(wch); memset(m_wchOther,'\0',sizeof(m_wchOther)); #endif return 0; case IDM_CACLVDISPLAY_LARGE: if ( !m_bLargeView ) { PadListView_SetStyle(m_hLVWnd,PLVSTYLE_ICON); // m_pInk->SetLargeBtn(); m_bLargeView = TRUE; if(m_pInk) { m_pInk->OnChangeView(TRUE); } } return 0; case IDM_CACLVDISPLAY_DETAIL: if ( m_bLargeView ) { PadListView_SetStyle(m_hLVWnd,PLVSTYLE_REPORT); m_bLargeView = FALSE; if(m_pInk) { m_pInk->OnChangeView(FALSE); } } return 0; #ifdef FE_JAPANESE case IDM_CACLVDISPLAYOTHER_KANJI: case IDM_CACLVDISPLAYOTHER_STROKE: case IDM_CACLVDISPLAYOTHER_RADICAL: case IDM_CACLVDISPLAYOTHER_R1: case IDM_CACLVDISPLAYOTHER_R2: case IDM_CACLVDISPLAYOTHER_K1: case IDM_CACLVDISPLAYOTHER_K2: case IDM_CACLVDISPLAYOTHER_OTHER: sortKanjiInfo(uCode-IDM_CACLVDISPLAYOTHER_KANJI); PadListView_Update(m_hLVWnd); return 0; #endif // FE_JAPANESE default: break; } return DefWindowProc(hwnd, msg, wp, lp); } //---------------------------------------------------------------- //990618:ToshiaK for KOTAE #1329 //---------------------------------------------------------------- void CHwxCAC::OnSettingChange(UINT msg, WPARAM wp,LPARAM lp) { #ifndef UNDER_CE // Unsupported. if(wp == SPI_SETNONCLIENTMETRICS) { if(m_pCHwxStroke) { m_pCHwxStroke->ResetPen(); } } #else // UNDER_CE if(m_pCHwxStroke) { m_pCHwxStroke->ResetPen(); } #endif // UNDER_CE UNREFERENCED_PARAMETER(msg); UNREFERENCED_PARAMETER(lp); } int WINAPI GetItemForIcon(LPARAM lParam, int index, LPPLVITEM lpPlvItem) { CHwxCAC * pCac = (CHwxCAC *)lParam; if ( pCac ) { wchChar[0][0] = pCac->GetWCHAR(index); wchChar[0][1] = (WCHAR)0x0000; if ( wchChar[0][0] ) { lpPlvItem->lpwstr = wchChar[0]; } else { lpPlvItem->lpwstr = NULL; } } return 0; } #ifdef FE_JAPANESE int WINAPI GetItemForReport(LPARAM lParam, int index, INT indexCol, LPPLVITEM lpPlvItem) { CHwxCAC * pCac = (CHwxCAC *)lParam; WCHAR wch; if ( pCac && (wch = pCac->GetWCHAR(index)) && indexCol <= 8 ) { memset(&kanji,'\0',sizeof(kanji)); kanji.mask = KIF_ALL; //981119: for KK RAID #6435 //case for imeskdic.dll does not exist. if(pCac->GetIIMESKDIC()){ (pCac->GetIIMESKDIC())->GetKanjiInfo(wch,&kanji); } for ( int i = 0; i < indexCol; i++) { switch(i) { case 0: lpPlvItem[i].fmt = PLVFMT_TEXT; wchChar[i][0] = wch; wchChar[i][1] = (WCHAR)0x0000; lpPlvItem[i].lpwstr = wchChar[i]; break; case 1: lpPlvItem[i].fmt = PLVFMT_TEXT; if ( kanji.usTotalStroke ) { swprintf(wchChar[i], L"%d", kanji.usTotalStroke); } else { wchChar[i][0] = (WCHAR)0x0000; } lpPlvItem[i].lpwstr = wchChar[i]; break; case 2: lpPlvItem[i].fmt = PLVFMT_BITMAP; lpPlvItem[i].hBitmap = kanji.hBmpRadical; break; case 3: lpPlvItem[i].fmt = PLVFMT_TEXT; lpPlvItem[i].lpwstr = kanji.wchOnYomi1; break; case 4: lpPlvItem[i].fmt = PLVFMT_TEXT; lpPlvItem[i].lpwstr = kanji.wchOnYomi2; break; case 5: lpPlvItem[i].fmt = PLVFMT_TEXT; lpPlvItem[i].lpwstr = kanji.wchKunYomi1; break; case 6: lpPlvItem[i].fmt = PLVFMT_TEXT; lpPlvItem[i].lpwstr = kanji.wchKunYomi2; break; case 7: lpPlvItem[i].fmt = PLVFMT_TEXT; lpPlvItem[i].lpwstr = kanji.wchItaiji; break; default: break; } } } return 0; } #endif //FE_JAPANESE void CHwxCAC::SetToolTipInfo(BOOL bAdd) { ti.cbSize = sizeof(TOOLINFOW); ti.uFlags = 0; ti.hwnd = m_hCACWnd; ti.hinst = m_hInstance; ti.lpszText = LPSTR_TEXTCALLBACKW; ti.uId = IDC_CACLISTVIEW; UINT message = bAdd ? TTM_ADDTOOLW : TTM_NEWTOOLRECTW; HWND hwndTT = m_pInk->GetToolTipWindow(); if ( bAdd ) { ti.rect.left = ti.rect.top = ti.rect.right = ti.rect.bottom = 0; SendMessage(hwndTT,message,0,(LPARAM)(LPTOOLINFOW)&ti); } else { ti.rect = m_lpPlvInfo->itemRect; SendMessage(hwndTT,message,0,(LPARAM)(LPTOOLINFOW)&ti); } } void CHwxCAC::SetToolTipText(LPARAM lp) { WCHAR wch; //BOOL bEmpty = FALSE; static WCHAR tip[60]; LPTOOLTIPTEXTUSERINFO lpttt = (LPTOOLTIPTEXTUSERINFO)lp; int index = (int)((lpttt->userInfo).lParam); wch = GetWCHAR(index); //---------------------------------------------------------------- //980805:ToshiaK. creating Tip string function has Moved to CHwxFE //---------------------------------------------------------------- //980813:ToshiaK. merged with PRC fix memset(tip,'\0', sizeof(tip)); if (-1 == CHwxFE::GetTipText(wch, tip, sizeof(tip)/sizeof(tip[0]), #ifdef FE_KOREAN NULL)) #else m_pIImeSkdic)) #endif { lpttt->lpszText = NULL; } else { lpttt->lpszText = tip; } } #ifdef FE_JAPANESE // increasing order int _cdecl CompareChar(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; if ( p1->wchKanji < p2->wchKanji ) return -1; else if ( p1->wchKanji > p2->wchKanji ) return 1; return 0; } // increasing order int _cdecl CompareStroke(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; if ( p1->usTotalStroke < p2->usTotalStroke ) return -1; else if ( p1->usTotalStroke > p2->usTotalStroke ) return 1; return 0; } // increasing order int _cdecl CompareRadical(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; if ( p1->lRadicalIndex < p2->lRadicalIndex ) return -1; else if ( p1->lRadicalIndex > p2->lRadicalIndex ) return 1; return 0; } // decreasing order int _cdecl CompareR1(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; int i; for( i = 0; i < MAX_YOMI_COUNT+1; i++) { if ( p2->wchOnYomi1[i] < p1->wchOnYomi1[i] ) return -1; else if ( p2->wchOnYomi1[i] > p1->wchOnYomi1[i] ) return 1; } return 0; } // decreasing order int _cdecl CompareR2(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; int i; for( i = 0; i < MAX_YOMI_COUNT+1; i++) { if ( p2->wchOnYomi2[i] < p1->wchOnYomi2[i] ) return -1; else if ( p2->wchOnYomi2[i] > p1->wchOnYomi2[i] ) return 1; } return 0; } // decreasing order int _cdecl CompareK1(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; int i; for( i = 0; i < MAX_YOMI_COUNT+1; i++) { if ( p2->wchKunYomi1[i] < p1->wchKunYomi1[i] ) return -1; else if ( p2->wchKunYomi1[i] > p1->wchKunYomi1[i] ) return 1; } return 0; } // decreasing order int _cdecl CompareK2(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; int i; for( i = 0; i < MAX_YOMI_COUNT+1; i++) { if ( p2->wchKunYomi2[i] < p1->wchKunYomi2[i] ) return -1; else if ( p2->wchKunYomi2[i] > p1->wchKunYomi2[i] ) return 1; } return 0; } // decreasing order int _cdecl CompareOther(const void * lp1, const void * lp2) { LPKANJIINFO p1= (LPKANJIINFO)lp1; LPKANJIINFO p2= (LPKANJIINFO)lp2; int i; for( i = 0; i < MAX_ITAIJI_COUNT; i++) { if ( p2->wchItaiji[i] < p1->wchItaiji[i] ) return -1; else if ( p2->wchItaiji[i] > p1->wchItaiji[i] ) return 1; } return 0; } #endif // FE_JAPANESE #ifdef FE_JAPANESE void CHwxCAC::sortKanjiInfo(int sortID) { KANJIINFO kanjiData[LISTTOTAL]; int i; if ( m_cnt <= LISTTOTAL && m_cnt > 0 && sortID >= 0 && sortID < LISTVIEW_COLUMN ) { // get data memset(kanjiData,'\0',sizeof(KANJIINFO) * LISTTOTAL); for ( i = 0; i < m_cnt; i++ ) { kanjiData[i].mask = KIF_STROKECOUNT | KIF_YOMI | KIF_ITAIJI | KIF_RADICALINDEX; kanjiData[i].wchKanji = m_gawch[i]; m_pIImeSkdic->GetKanjiInfo(m_gawch[i],&kanjiData[i]); } // sort data switch ( sortID ) { case 0: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareChar); break; case 1: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareStroke); break; case 2: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareRadical); break; case 3: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareR1); break; case 4: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareR2); break; case 5: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareK1); break; case 6: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareK2); break; case 7: qsort(kanjiData,m_cnt,sizeof(KANJIINFO),CompareOther); break; } // copy sorted UNICODE for ( i = 0; i < m_cnt; i ++) { m_gawch[i] = kanjiData[i].wchKanji; } } } #endif // FE_JAPANESE void CHwxCAC::SetInkSize(int n) { m_inkSize = n; } void CHwxCAC::HandleDrawSample() { #ifdef FE_JAPANESE int i = 0; POINT pt; if ( !m_bDrawSample ) { return; } while( wSamplePt[i] ) { while( wSamplePt[i] ) { pt.x = HIBYTE(wSamplePt[i]); pt.y = LOBYTE(wSamplePt[i]); // scaling pt.x = (m_inkSize*pt.x)/120; pt.y = (m_inkSize*pt.y)/120; m_pCHwxStroke->AddPoint(pt); i++; } m_pCHwxStroke->AddBoxStroke(0,0,0); i++; } InvalidateRect(m_hCACWnd,NULL,FALSE); UpdateWindow(m_hCACWnd); // too slow when calling this function // NoThreadRecognize(m_inkSize); // cache recognition results memcpy(m_gawch, wSampleChar, sizeof(wSampleChar)); m_cnt = sizeof(wSampleChar)/sizeof(wchar_t); PadListView_SetItemCount(m_hLVWnd,m_cnt); if(IsNT()) { PadListView_SetExplanationTextW(m_hLVWnd,NULL); } else { PadListView_SetExplanationText(m_hLVWnd,NULL); } PadListView_Update(m_hLVWnd); #endif // FE_JAPANESE m_bDrawSample = FALSE; } #if 0 void CHwxCAC::HandleMeasureItem(HWND hwnd, LPARAM lp) { LPMEASUREITEMSTRUCT lpmi = (LPMEASUREITEMSTRUCT)lp; if ( lpmi->CtlType == ODT_MENU ) { HDC hDC = GetDC(hwnd); SIZE size; LPTSTR lptstr = (LPTSTR)lpmi->itemData; GetTextExtentPoint32(hDC, lptstr, strlen(lptstr), &size); lpmi->itemWidth = size.cx + 22; lpmi->itemHeight = 20; ReleaseDC(hwnd, hDC); } } void CHwxCAC::HandleDrawItem(HWND hwnd, LPARAM lp) { LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lp; if( lpdis->CtlType == ODT_MENU ) { if ( lpdis->itemAction & ODA_DRAWENTIRE || lpdis->itemAction & ODA_SELECT || lpdis->itemAction & ODA_FOCUS ) { HBRUSH hBrush; RECT rcItem; DWORD dwOldTextColor, dwOldBkColor; HICON hIcon; if(lpdis->itemState & ODS_SELECTED) { hBrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); dwOldBkColor = SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); dwOldTextColor = SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); hIcon = LoadIcon( m_hInstance, MAKEINTRESOURCE(IDI_SELECTED)); } else { hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); dwOldBkColor = SetBkColor(lpdis->hDC, GetSysColor(COLOR_BTNFACE)); dwOldTextColor = SetTextColor(lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT)); hIcon = LoadIcon( m_hInstance, MAKEINTRESOURCE(IDI_UNSELECT)); } FillRect(lpdis->hDC, (LPRECT)&lpdis->rcItem, hBrush); CopyRect(&rcItem, &lpdis->rcItem); SIZE size; if(lpdis->itemID == IDM_CACAUTORECOG && lpdis->itemState != ODS_GRAYED ) { DrawIconEx(lpdis->hDC, rcItem.left+2, rcItem.top+2, hIcon, 16, 16, 0, NULL, DI_NORMAL); } CopyRect(&rcItem, &lpdis->rcItem); GetTextExtentPoint32(lpdis->hDC, (LPTSTR)lpdis->itemData, strlen((LPTSTR)lpdis->itemData), &size); ExtTextOut(lpdis->hDC, rcItem.left+22, rcItem.top + (rcItem.bottom - rcItem.top - size.cy)/2, ETO_CLIPPED, &rcItem, (LPTSTR)lpdis->itemData, strlen((LPTSTR)lpdis->itemData), NULL); DeleteObject(hBrush); SetBkColor(lpdis->hDC, dwOldBkColor); SetTextColor(lpdis->hDC, dwOldTextColor); } } } #endif // 0