Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

994 lines
38 KiB

  1. /*************************************************
  2. * userdic.c *
  3. * *
  4. * Copyright (C) 1995-1999 Microsoft Inc. *
  5. * *
  6. *************************************************/
  7. #include "prop.h"
  8. #include <stdlib.h>
  9. /*****************************************************************************
  10. FUNCTION: UserDicDialogProc(HWND, UINT, WPARAM, LPARAM)
  11. PURPOSE: Processes messages for "UserDic" property sheet.
  12. PARAMETERS:
  13. hdlg - window handle of the property sheet
  14. wMessage - type of message
  15. wparam - message-specific information
  16. lparam - message-specific information
  17. RETURN VALUE:
  18. TRUE - message handled
  19. FALSE - message not handled
  20. HISTORY:
  21. 04-18-95 Yehfew Tie Created.
  22. ****************************************************************************/
  23. INT_PTR CALLBACK UserDicDialogProc(HWND hdlg,
  24. UINT uMessage,
  25. WPARAM wparam,
  26. LPARAM lparam)
  27. {
  28. LPNMHDR lpnmhdr;
  29. static TCHAR DestFile[MAX_PATH];
  30. static TCHAR SrcFile [MAX_PATH];
  31. static TCHAR SysPath [MAX_PATH];
  32. static DWORD dwUserWord;
  33. static LPEMB_Head EMB_Table;
  34. TCHAR wai_code[MAXCODELEN +1],cCharStr[USER_WORD_SIZE+1];
  35. TCHAR szStr[MAX_PATH], FileName[128];
  36. int nCnt, nSel, nInsWords;
  37. int len,i;
  38. int SelItem[1000];
  39. static BOOL bModify;
  40. static int OldSel;
  41. FARPROC lpCrtDlg;
  42. LPIMEKEY lpImeKeyData;
  43. static DESCRIPTION Descript;
  44. HANDLE HmemEMBTmp_Table;
  45. switch (uMessage)
  46. {
  47. case WM_INITDIALOG:
  48. SetUDMDisable(hdlg);
  49. len = GetSystemDirectory(SysPath,MAX_PATH);
  50. lstrcat(SysPath,TEXT(Slope));
  51. hImeKeyData = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
  52. sizeof(IMEKEY)*100);
  53. FillObjectIme(hdlg,hImeKeyData);
  54. lpImeKeyData = GlobalLock(hImeKeyData);
  55. GetImeTxtName(lpImeKeyData[0].ImeKey, FileName);
  56. GlobalUnlock(hImeKeyData);
  57. lstrcpy(DestFile, SysPath);
  58. lstrcat(DestFile, FileName);
  59. len = lstrlen(DestFile);
  60. DestFile[len-4]=0;
  61. lstrcpy(szStr, DestFile);
  62. lstrcat(DestFile,TEXT(EmbExt));
  63. lstrcat(szStr, TEXT(MbExt));
  64. ReadDescript(szStr,&Descript,FILE_SHARE_READ);
  65. if (Descript.wNumRules == 0)
  66. EnableWindow(GetDlgItem(hdlg,IDC_AUTOCODE),FALSE);
  67. else
  68. EnableWindow(GetDlgItem(hdlg,IDC_AUTOCODE),TRUE);
  69. SendDlgItemMessage(hdlg,IDC_COMBO1,CB_SETCURSEL,0,0L);
  70. bModify = FALSE;
  71. OldSel = 0;
  72. break;
  73. case WM_NOTIFY:
  74. lpnmhdr = (NMHDR FAR *)lparam;
  75. switch (lpnmhdr->code)
  76. {
  77. case PSN_SETACTIVE:
  78. hEncode = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
  79. NUMENCODEAREA*sizeof(ENCODEAREA));
  80. if(!hEncode)
  81. ProcessError(ERR_OUTOFMEMORY,hdlg,ERR);
  82. if ( hEncode )
  83. ConvInitEncode(hEncode);
  84. break;
  85. case PSN_APPLY:
  86. if(bModify) {
  87. LoadString(NULL,
  88. IDS_FILEMODIFY,
  89. FileName,
  90. sizeof(FileName)/sizeof(TCHAR));
  91. #ifdef UNICODE
  92. {
  93. TCHAR UniTmp[] = {0x6279, 0x91CF, 0x9020, 0x8BCD,
  94. 0x9875, 0x9762, 0x4E2D, 0x0000};
  95. wsprintf(szStr,TEXT("%ws\n\'%ws\'\n%ws"),
  96. UniTmp,SrcFile,FileName);
  97. }
  98. #else
  99. wsprintf(szStr,"��������ҳ����\n\'%s\'\n%s"
  100. ,SrcFile,FileName);
  101. #endif
  102. if (ErrMessage(hdlg,szStr))
  103. SendMessage(hdlg,WM_COMMAND,IDC_SAVE,0L);
  104. }
  105. break;
  106. case PSN_RESET:
  107. break;
  108. case PSN_QUERYCANCEL:
  109. break;
  110. case PSN_KILLACTIVE:
  111. if (hEncode)
  112. GlobalFree(hEncode);
  113. break;
  114. case PSN_HELP:
  115. break;
  116. default:
  117. break;
  118. }
  119. break;
  120. case WM_COMMAND:
  121. switch (LOWORD(wparam))
  122. {
  123. case ID_FILEOPEN:
  124. {
  125. #ifdef UNICODE
  126. static TCHAR szTitle[] = {0x6253, 0x5F00,0x0000};
  127. #else
  128. TCHAR szTitle[MAX_PATH];
  129. lstrcpy(szTitle,"����");
  130. #endif
  131. if(!TxtFileOpenDlg(hdlg,szStr,szTitle))
  132. break;
  133. }
  134. lstrcpy(SrcFile,szStr);
  135. ReadUserWord(hdlg,SrcFile,&dwUserWord,Descript.wMaxCodes);
  136. SetUDMEnable(hdlg);
  137. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
  138. fnsplit(SrcFile, szStr);
  139. SetDlgItemText(hdlg,IDC_SRCNAME,szStr);
  140. break;
  141. case IDC_COMBO1:
  142. nSel = (INT)SendDlgItemMessage(hdlg,
  143. IDC_COMBO1,
  144. CB_GETCURSEL,
  145. (WPARAM)0,
  146. (LPARAM)0);
  147. if(nSel == CB_ERR || nSel == OldSel) break;
  148. OldSel = nSel;
  149. lpImeKeyData = GlobalLock(hImeKeyData);
  150. GetImeTxtName(lpImeKeyData[nSel].ImeKey, FileName);
  151. GlobalUnlock(hImeKeyData);
  152. lstrcpy(DestFile,SysPath);
  153. lstrcat(DestFile,FileName);
  154. len = lstrlen(DestFile);
  155. DestFile[len-4]=0;
  156. lstrcat(DestFile,TEXT(EmbExt));
  157. SendMessage(hdlg,WM_COMMAND,IDC_GETMBFILE,(LPARAM)szStr);
  158. if(ReadDescript(szStr,&Descript,FILE_SHARE_READ) != TRUE)
  159. Descript.wNumRules = 0;
  160. if(Descript.wNumRules == 0)
  161. EnableWindow(GetDlgItem(hdlg,IDC_AUTOCODE),FALSE);
  162. else
  163. EnableWindow(GetDlgItem(hdlg,IDC_AUTOCODE),TRUE);
  164. break;
  165. case IDC_INSUSERDIC:
  166. if(lstrlen(DestFile)==0) {
  167. MessageBeep((UINT)-1);
  168. MessageBeep((UINT)-1);
  169. break;
  170. }
  171. nCnt=(INT)SendDlgItemMessage(hdlg,IDC_LIST,LB_GETSELCOUNT,0,0L);
  172. if(nCnt>1000) nCnt=1000;
  173. SendDlgItemMessage(hdlg,
  174. IDC_LIST,
  175. LB_GETSELITEMS,
  176. nCnt,
  177. (LPARAM)SelItem);
  178. if(nCnt == 0) {
  179. MessageBeep((UINT)-1);
  180. MessageBeep((UINT)-1);
  181. break;
  182. }
  183. SendMessage(hdlg,WM_COMMAND,IDC_GETMBFILE,(LPARAM)szStr);
  184. if(ReadDescript(szStr,&Descript,FILE_SHARE_READ) != TRUE)
  185. break;
  186. if(!ReadEMBFromFile(DestFile,EMB_Table))
  187. {
  188. GlobalUnlock(HmemEMB_Table);
  189. GlobalFree(HmemEMB_Table);
  190. break;
  191. }
  192. HmemEMBTmp_Table = GlobalReAlloc(HmemEMB_Table,
  193. 1000*sizeof(EMB_Head),
  194. GMEM_MOVEABLE);
  195. if (HmemEMBTmp_Table == NULL)
  196. {
  197. GlobalFree(HmemEMB_Table);
  198. break;
  199. }
  200. HmemEMB_Table = HmemEMBTmp_Table;
  201. EMB_Table = GlobalLock(HmemEMB_Table);
  202. nInsWords = 0;
  203. SetCursor (LoadCursor (NULL, IDC_WAIT));
  204. while((--nCnt) >= 0) {
  205. len = (INT)SendDlgItemMessage(hdlg,
  206. IDC_LIST,
  207. LB_GETTEXT,
  208. SelItem[nCnt],
  209. (LPARAM)szStr);
  210. szStr[len]=0;
  211. dwLineNo = SelItem[nCnt] + 1;
  212. #ifdef UNICODE
  213. for(i=0;i<len;i++)
  214. if(szStr[i] < 0x100) break;
  215. #else
  216. for(i=0;i<len;i += 2)
  217. if(szStr[i] > 0) break;
  218. #endif
  219. lstrncpy(wai_code,MAXCODELEN,&szStr[i]);
  220. szStr[i]=0;
  221. lstrncpy(cCharStr,USER_WORD_SIZE,szStr);
  222. if(CheckCodeLegal(hdlg,cCharStr,NULL,wai_code,&Descript))
  223. {
  224. if(AddZCItem(DestFile,EMB_Table,wai_code,cCharStr))
  225. nInsWords ++;
  226. }
  227. else
  228. {
  229. GlobalUnlock(HmemEMB_Table);
  230. GlobalFree(HmemEMB_Table);
  231. break;
  232. }
  233. }
  234. LoadString(NULL,IDS_INSWORDS,szStr,sizeof(szStr));
  235. #ifdef UNICODE
  236. _itow(nInsWords,FileName,10);
  237. #else
  238. _itoa(nInsWords,FileName,10);
  239. #endif
  240. lstrcat(szStr,FileName);
  241. InfoMessage(hdlg,szStr);
  242. GlobalUnlock(HmemEMB_Table);
  243. GlobalFree(HmemEMB_Table);
  244. SetCursor (LoadCursor (NULL, IDC_ARROW));
  245. break;
  246. case IDC_FULLSELECT:
  247. nCnt=(INT)SendDlgItemMessage(hdlg,
  248. IDC_LIST,
  249. LB_GETCOUNT,
  250. (WPARAM)0,
  251. (LPARAM)0);
  252. SendDlgItemMessage(hdlg,
  253. IDC_LIST,
  254. LB_SELITEMRANGE,
  255. TRUE,MAKELPARAM(1,nCnt));
  256. break;
  257. case IDC_AUTOCODE:
  258. nCnt = (INT)SendDlgItemMessage(hdlg,
  259. IDC_LIST,
  260. LB_GETSELCOUNT,
  261. (WPARAM)0,
  262. (LPARAM)0);
  263. if(nCnt > 1000) nCnt = 1000;
  264. if(nCnt == 0) {
  265. MessageBeep((UINT)-1);
  266. break;
  267. }
  268. SendDlgItemMessage(hdlg,
  269. IDC_LIST,
  270. LB_GETSELITEMS,
  271. nCnt,
  272. (LPARAM)SelItem);
  273. SendMessage(hdlg,WM_COMMAND,IDC_GETMBFILE,(LPARAM)szStr);
  274. if(ReadDescript(szStr,&Descript,FILE_SHARE_READ) != TRUE)
  275. Descript.wNumRules = 0;
  276. if(Descript.wNumRules == 0) {
  277. ProcessError(ERR_NORULE,hdlg,ERR);
  278. break;
  279. }
  280. SetCursor (LoadCursor (NULL, IDC_WAIT));
  281. nInsWords = nCnt;
  282. while((--nCnt) >= 0)
  283. {
  284. len = (INT)SendDlgItemMessage(hdlg,
  285. IDC_LIST,
  286. LB_GETTEXT,
  287. SelItem[nCnt],
  288. (LPARAM)FileName);
  289. FileName[len]=0;
  290. #ifdef UNICODE
  291. for(i=0;i<len;i++)
  292. if(FileName[i] < 0x100) break;
  293. #else
  294. for(i=0;i<len;i += 2)
  295. if(FileName[i] > 0) break;
  296. #endif
  297. lstrncpy(wai_code,MAXCODELEN,&FileName[i]);
  298. FileName[i]=0;
  299. lstrncpy(cCharStr,USER_WORD_SIZE,FileName);
  300. lstrncpy(wai_code,
  301. MAXCODELEN,
  302. ConvCreateWord(hdlg,szStr,cCharStr));
  303. lstrcat(FileName,wai_code);
  304. SendDlgItemMessage(hdlg,
  305. IDC_LIST,
  306. LB_DELETESTRING,
  307. SelItem[nCnt],
  308. (LPARAM)0);
  309. SendDlgItemMessage(hdlg,
  310. IDC_LIST,
  311. LB_INSERTSTRING,
  312. SelItem[nCnt],
  313. (LPARAM)FileName);
  314. }
  315. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  316. bModify = TRUE;
  317. for(i=0; i< nInsWords; i++)
  318. SendDlgItemMessage(hdlg,
  319. IDC_LIST,
  320. LB_SETSEL,
  321. TRUE,
  322. SelItem[i]);
  323. SetCursor(LoadCursor(NULL, IDC_ARROW));
  324. break;
  325. case IDC_ADD:
  326. lpCrtDlg = MakeProcInstance((FARPROC)AddWordDlg, hInst);
  327. DialogBox(hInst,
  328. MAKEINTRESOURCE(IDD_ADDWORD),
  329. hdlg,
  330. (DLGPROC)lpCrtDlg);
  331. FreeProcInstance(lpCrtDlg);
  332. nCnt=(INT)SendDlgItemMessage(hdlg,
  333. IDC_LIST,
  334. LB_GETCOUNT,
  335. (WPARAM)0,
  336. (LPARAM)0);
  337. if(nCnt != 0)
  338. SetUDMEnable(hdlg);
  339. break;
  340. case IDC_ADDSTR:
  341. SendDlgItemMessage(hdlg,IDC_LIST,LB_ADDSTRING,0,lparam);
  342. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  343. bModify = TRUE;
  344. break;
  345. case IDC_GETMBFILE:
  346. nSel=(INT)SendDlgItemMessage(hdlg,
  347. IDC_COMBO1,
  348. CB_GETCURSEL,
  349. (WPARAM)0,
  350. (LPARAM)0);
  351. if(nSel==CB_ERR) break;
  352. lpImeKeyData = GlobalLock(hImeKeyData);
  353. GetImeTxtName(lpImeKeyData[nSel].ImeKey, FileName);
  354. GlobalUnlock(hImeKeyData);
  355. lstrcpy(szStr, SysPath);
  356. lstrcat(szStr, FileName);
  357. len = lstrlen(szStr);
  358. szStr[len-4] = 0;
  359. lstrcat(szStr,TEXT(MbExt));
  360. lstrcpy((LPTSTR)lparam,szStr);
  361. break;
  362. case IDC_GETUSERWORD:
  363. nCnt = (INT)SendDlgItemMessage(hdlg,
  364. IDC_LIST,
  365. LB_GETCURSEL,
  366. (WPARAM)0,
  367. (LPARAM)0);
  368. len = (INT)SendDlgItemMessage(hdlg,
  369. IDC_LIST,
  370. LB_GETTEXT,
  371. nCnt,
  372. (LPARAM)szStr);
  373. szStr[len] = 0;
  374. lstrcpy((LPTSTR)lparam,szStr);
  375. break;
  376. case IDC_CHGDATA:
  377. nCnt=(INT)SendDlgItemMessage(hdlg,
  378. IDC_LIST,
  379. LB_GETCURSEL,
  380. (WPARAM)0,
  381. (LPARAM)0);
  382. SendDlgItemMessage(hdlg,
  383. IDC_LIST,
  384. LB_DELETESTRING,
  385. nCnt,
  386. (LPARAM)0);
  387. SendDlgItemMessage(hdlg,
  388. IDC_LIST,
  389. LB_INSERTSTRING,
  390. nCnt,
  391. lparam);
  392. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  393. bModify = TRUE;
  394. break;
  395. case IDC_MODIFY:
  396. nCnt = (INT)SendDlgItemMessage(hdlg,
  397. IDC_LIST,
  398. LB_GETSELCOUNT,
  399. (WPARAM)0,
  400. (LPARAM)0);
  401. if(nCnt!=1) {
  402. MessageBeep((UINT)-1);
  403. break;
  404. }
  405. SendDlgItemMessage(hdlg,
  406. IDC_LIST,
  407. LB_GETSELITEMS,
  408. nCnt,
  409. (LPARAM)SelItem);
  410. lpCrtDlg = MakeProcInstance((FARPROC)ModiWordDlg, hInst);
  411. DialogBox(hInst,
  412. MAKEINTRESOURCE(IDD_MODIWORD),
  413. hdlg,
  414. (DLGPROC)lpCrtDlg);
  415. FreeProcInstance(lpCrtDlg);
  416. break;
  417. case IDC_DEL:
  418. nCnt=(INT)SendDlgItemMessage(hdlg,
  419. IDC_LIST,
  420. LB_GETSELCOUNT,
  421. (WPARAM)0,
  422. (LPARAM)0);
  423. if (nCnt > 1000) nCnt = 1000;
  424. if (nCnt==0) {
  425. MessageBeep((UINT)-1);
  426. break;
  427. }
  428. SendDlgItemMessage(hdlg,
  429. IDC_LIST,
  430. LB_GETSELITEMS,
  431. nCnt,
  432. (LPARAM)SelItem);
  433. SetCursor(LoadCursor(NULL, IDC_WAIT));
  434. for (i=nCnt-1; i>=0; i--)
  435. SendDlgItemMessage(hdlg,
  436. IDC_LIST,
  437. LB_DELETESTRING,
  438. SelItem[i],
  439. (LPARAM)0);
  440. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  441. SetFocus(GetDlgItem(hdlg,IDC_LIST));
  442. bModify = TRUE;
  443. SetCursor (LoadCursor (NULL, IDC_ARROW));
  444. break;
  445. case IDC_SAVE:
  446. nCnt=(INT)SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCOUNT,0,0L);
  447. if(nCnt==0) {
  448. MessageBeep((UINT)-1);
  449. break;
  450. }
  451. if(SaveTxtFileAs(hdlg,SrcFile)) {
  452. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
  453. bModify = FALSE;
  454. }
  455. break;
  456. default:
  457. break;
  458. }
  459. break;
  460. default:
  461. break;
  462. }
  463. return FALSE;
  464. }
  465. INT_PTR CALLBACK AddWordDlg(
  466. HWND hDlg,
  467. UINT message,
  468. WPARAM wParam,
  469. LPARAM lParam)
  470. {
  471. static TCHAR szDBCS[128];
  472. static TCHAR szCode[13];
  473. static TCHAR szStr[128];
  474. static TCHAR szMbName[128];
  475. switch (message) {
  476. case WM_INITDIALOG:
  477. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_LIMITTEXT,USER_WORD_SIZE,0L);
  478. SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_LIMITTEXT,MAXCODELEN,0L);
  479. return (TRUE);
  480. case WM_COMMAND:
  481. switch(LOWORD(wParam)) {
  482. case IDOK:
  483. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,sizeof(szDBCS)/sizeof(TCHAR));
  484. GetDlgItemText(hDlg,IDC_INPUTCODE,szCode,sizeof(szCode)/sizeof(TCHAR));
  485. if(lstrlen(szDBCS)<2||lstrlen(szCode) == 0){
  486. MessageBeep((UINT)-1);
  487. break;
  488. }
  489. lstrcpy(szStr,szDBCS);
  490. lstrcat(szStr,szCode);
  491. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_ADDSTR,(LPARAM)szStr);
  492. EndDialog(hDlg, TRUE);
  493. return (TRUE);
  494. case IDC_INPUTWORD:
  495. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,sizeof(szDBCS)/sizeof(TCHAR));
  496. if(SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_GETMODIFY,0,0L)) {
  497. if(!CheckUserDBCS(hDlg,szDBCS)) {
  498. SetDlgItemText(hDlg,IDC_INPUTWORD, szDBCS);
  499. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_SETMODIFY,FALSE,0L);
  500. }
  501. if(lstrlen(szDBCS)<4/sizeof(TCHAR)) {
  502. szStr[0]=0;
  503. SetDlgItemText(hDlg,IDC_INPUTCODE,szStr);
  504. break;
  505. }
  506. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_GETMBFILE,(LPARAM)szMbName);
  507. if(lstrlen(szMbName) != 0) {
  508. lstrncpy(szStr,MAXCODELEN,ConvCreateWord(hDlg,szMbName,szDBCS));
  509. szStr[MAXCODELEN]=0;
  510. if(lstrlen(szStr)!=0)
  511. lstrcpy(szCode,szStr);
  512. SetDlgItemText(hDlg,IDC_INPUTCODE, szCode);
  513. }
  514. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_SETMODIFY,FALSE,0L);
  515. }
  516. break;
  517. case IDC_INPUTCODE:
  518. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,sizeof(szDBCS)/sizeof(TCHAR));
  519. GetDlgItemText(hDlg,IDC_INPUTCODE,szCode,sizeof(szCode)/sizeof(TCHAR));
  520. if(lstrlen(szDBCS) == 0) {
  521. MessageBeep((UINT)-1);
  522. SetFocus(GetDlgItem(hDlg,IDC_INPUTWORD));
  523. break;
  524. }
  525. break;
  526. case IDCANCEL:
  527. EndDialog(hDlg, TRUE);
  528. break;
  529. case WM_CLOSE:
  530. EndDialog(hDlg, TRUE);
  531. break;
  532. default:
  533. break;
  534. }
  535. break;
  536. }
  537. return (FALSE);
  538. UNREFERENCED_PARAMETER(lParam);
  539. }
  540. INT_PTR CALLBACK ModiWordDlg(
  541. HWND hDlg,
  542. UINT message,
  543. WPARAM wParam,
  544. LPARAM lParam)
  545. {
  546. static TCHAR szDBCS[128];
  547. static TCHAR szCode[13];
  548. static TCHAR szStr[128];
  549. static TCHAR szMbName[128];
  550. int len,i;
  551. switch (message) {
  552. case WM_INITDIALOG:
  553. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_LIMITTEXT,
  554. USER_WORD_SIZE,0L);
  555. SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_LIMITTEXT,MAXCODELEN,0L);
  556. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_GETUSERWORD,
  557. (LPARAM)szStr);
  558. len=lstrlen(szStr);
  559. for(i=0;i<len;i++)
  560. if(szStr[i] > 0) break;
  561. lstrncpy(szCode,MAXCODELEN,&szStr[i]);
  562. szStr[i]=0;
  563. lstrncpy(szDBCS,USER_WORD_SIZE,szStr);
  564. SetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS);
  565. SetDlgItemText(hDlg,IDC_INPUTCODE,szCode);
  566. return (TRUE);
  567. case WM_COMMAND:
  568. switch(LOWORD(wParam)) {
  569. case IDOK:
  570. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,
  571. sizeof(szDBCS)/sizeof(TCHAR));
  572. GetDlgItemText(hDlg,IDC_INPUTCODE,szCode,
  573. sizeof(szCode)/sizeof(TCHAR));
  574. if(lstrlen(szDBCS)<2||lstrlen(szCode) == 0){
  575. MessageBeep((UINT)-1);
  576. break;
  577. }
  578. lstrcpy(szStr,szDBCS);
  579. lstrcat(szStr,szCode);
  580. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_CHGDATA,0L);
  581. EndDialog(hDlg, TRUE);
  582. return (TRUE);
  583. case IDC_INPUTWORD:
  584. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,
  585. sizeof(szDBCS)/sizeof(TCHAR));
  586. if(SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_GETMODIFY,0,0L))
  587. {
  588. if(!CheckUserDBCS(hDlg,szDBCS)) {
  589. SetDlgItemText(hDlg,IDC_INPUTWORD, szDBCS);
  590. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_SETMODIFY,
  591. FALSE,0L);
  592. }
  593. if(lstrlen(szDBCS)<4/sizeof(TCHAR)) {
  594. szStr[0]=0;
  595. SetDlgItemText(hDlg,IDC_INPUTCODE,szStr );
  596. break;
  597. }
  598. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_GETMBFILE,
  599. (LPARAM)szMbName);
  600. lstrncpy(szStr,MAXCODELEN,
  601. ConvCreateWord(hDlg,szMbName,szDBCS));
  602. szStr[MAXCODELEN]=0;
  603. if(lstrlen(szStr)!=0)
  604. lstrcpy(szCode,szStr);
  605. SetDlgItemText(hDlg,IDC_INPUTCODE, szCode);
  606. SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_SETMODIFY,
  607. FALSE,0L);
  608. }
  609. break;
  610. case IDC_INPUTCODE:
  611. GetDlgItemText(hDlg,IDC_INPUTWORD,szDBCS,
  612. sizeof(szDBCS)/sizeof(TCHAR));
  613. GetDlgItemText(hDlg,IDC_INPUTCODE,szCode,
  614. sizeof(szCode)/sizeof(TCHAR));
  615. if(lstrlen(szDBCS) == 0) {
  616. MessageBeep((UINT)-1);
  617. SetFocus(GetDlgItem(hDlg,IDC_INPUTWORD));
  618. break;
  619. }
  620. break;
  621. case IDCANCEL:
  622. EndDialog(hDlg, TRUE);
  623. break;
  624. case WM_CLOSE:
  625. EndDialog(hDlg, TRUE);
  626. break;
  627. default:
  628. break;
  629. }
  630. break;
  631. }
  632. return (FALSE);
  633. UNREFERENCED_PARAMETER(lParam);
  634. }
  635. void SetUDMDisable(HWND hDlg)
  636. {
  637. EnableWindow(GetDlgItem(hDlg,IDC_INSUSERDIC),FALSE);
  638. EnableWindow(GetDlgItem(hDlg,IDC_FULLSELECT),FALSE);
  639. EnableWindow(GetDlgItem(hDlg,IDC_AUTOCODE),FALSE);
  640. EnableWindow(GetDlgItem(hDlg,IDC_DEL) ,FALSE);
  641. EnableWindow(GetDlgItem(hDlg,IDC_SAVE) ,FALSE);
  642. EnableWindow(GetDlgItem(hDlg,IDC_LIST) ,FALSE);
  643. EnableWindow(GetDlgItem(hDlg,IDC_STATIC1) ,FALSE);
  644. }
  645. void SetUDMEnable(HWND hDlg)
  646. {
  647. EnableWindow(GetDlgItem(hDlg,IDC_INSUSERDIC),TRUE);
  648. EnableWindow(GetDlgItem(hDlg,IDC_FULLSELECT),TRUE);
  649. EnableWindow(GetDlgItem(hDlg,IDC_DEL) ,TRUE);
  650. EnableWindow(GetDlgItem(hDlg,IDC_SAVE) ,TRUE);
  651. EnableWindow(GetDlgItem(hDlg,IDC_LIST) ,TRUE);
  652. EnableWindow(GetDlgItem(hDlg,IDC_STATIC1) ,TRUE);
  653. }
  654. void FillObjectIme(HWND hDlg, HANDLE hImeKeyData)
  655. {
  656. HKEY hImeKey=NULL,hPreImeKey=NULL,hkResult=NULL;
  657. WORD wNumIme = 0;
  658. TCHAR KeyName[10], LayoutName[10];
  659. TCHAR LayoutText[128], FileName[MAX_PATH],SysPath[MAX_PATH];
  660. int i, len, retCode;
  661. DWORD DataType;
  662. LPIMEKEY ImeKeyData;
  663. DESCRIPTION Descript;
  664. DWORD dwKeyName, dwLayoutName;
  665. if(RegCreateKey(HKEY_CURRENT_USER,TEXT(PreImeKey),&hPreImeKey))
  666. return;
  667. if(RegCreateKey(HKEY_LOCAL_MACHINE,TEXT(ImeSubKey),&hImeKey))
  668. return;
  669. SetCursor (LoadCursor (NULL, IDC_WAIT));
  670. ImeKeyData = GlobalLock(hImeKeyData);
  671. for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++) {
  672. dwKeyName = sizeof(KeyName)/sizeof(TCHAR);
  673. dwLayoutName = sizeof(LayoutName);
  674. retCode = RegEnumValue(hPreImeKey,
  675. i,
  676. KeyName,
  677. &dwKeyName,
  678. NULL,&DataType,
  679. (LPBYTE)LayoutName,
  680. &dwLayoutName);
  681. if (retCode == (DWORD)ERROR_SUCCESS) {
  682. LayoutName[dwLayoutName] = TEXT('\0');
  683. if ( hkResult != NULL )
  684. RegCloseKey(hkResult);
  685. if(LayoutName[0] != TEXT('E') && LayoutName[0] != TEXT('e'))
  686. continue;
  687. if(RegOpenKey(hImeKey,LayoutName,&hkResult))
  688. continue;
  689. len = sizeof(LayoutText);
  690. len = RegQueryValueEx(hkResult,
  691. TEXT(LayoutTextKey),
  692. NULL,
  693. &DataType,
  694. (LPBYTE)LayoutText,
  695. &len);
  696. RegCloseKey(hkResult);
  697. if(len != ERROR_SUCCESS)
  698. continue;
  699. GetImeTxtName(LayoutName, FileName);
  700. len = lstrlen(FileName);
  701. FileName[len-4] = 0;
  702. lstrcat(FileName,TEXT(MbExt));
  703. GetSystemDirectory(SysPath,MAX_PATH);
  704. lstrcat(SysPath,TEXT(Slope));
  705. lstrcat(SysPath, FileName);
  706. if(ReadDescript(SysPath,&Descript,FILE_SHARE_READ) != TRUE)
  707. continue;
  708. SendDlgItemMessage(hDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)LayoutText);
  709. lstrcpy(ImeKeyData[wNumIme].ImeKey, LayoutName);
  710. wNumIme++;
  711. }
  712. }
  713. RegCloseKey(hPreImeKey);
  714. RegCloseKey(hImeKey);
  715. GlobalUnlock(hImeKeyData);
  716. SetCursor (LoadCursor (NULL, IDC_ARROW));
  717. }
  718. void GetImeTxtName(LPCTSTR ImeKeyName, LPTSTR FileName)
  719. {
  720. HKEY hImeKey,hkResult;
  721. int len;
  722. DWORD DataType;
  723. FileName[0] = 0;
  724. if(RegCreateKey(HKEY_LOCAL_MACHINE,TEXT(ImeSubKey),&hImeKey))
  725. return;
  726. if(RegOpenKey(hImeKey,ImeKeyName,&hkResult))
  727. return ;
  728. len = 128;
  729. len = RegQueryValueEx(hkResult,TEXT(MbName),NULL,&DataType,(LPBYTE)FileName,&len);
  730. RegCloseKey(hkResult);
  731. RegCloseKey(hImeKey);
  732. }
  733. BOOL SaveTxtFile(HWND hWnd,LPTSTR SrcFile)
  734. {
  735. HANDLE hFile;
  736. TCHAR szStr[256];
  737. int i,nCount;
  738. DWORD dwBytes;
  739. nCount=(INT)SendDlgItemMessage(hWnd,IDC_LIST,LB_GETCOUNT,0,0L);
  740. if(nCount==0) {
  741. MessageBeep((UINT)-1);
  742. return FALSE;
  743. }
  744. hFile = CreateFile(SrcFile,
  745. GENERIC_WRITE,
  746. FILE_SHARE_READ,
  747. NULL,
  748. CREATE_ALWAYS,
  749. 0,
  750. NULL);
  751. if (hFile == (HANDLE)-1)
  752. return FALSE;
  753. SetCursor (LoadCursor (NULL, IDC_WAIT));
  754. for(i=0;i<nCount;i++) {
  755. SendDlgItemMessage(hWnd,IDC_LIST,LB_GETTEXT,i,(LPARAM)szStr);
  756. lstrcat(szStr,TEXT("\r\n"));
  757. WriteFile(hFile,szStr,lstrlen(szStr),&dwBytes,NULL);
  758. }
  759. SetCursor (LoadCursor (NULL, IDC_ARROW));
  760. CloseHandle(hFile);
  761. return TRUE;
  762. }
  763. BOOL SaveEmb(HWND hWnd,LPCTSTR SrcFile)
  764. {
  765. int i,j,len;
  766. WORD nCount;
  767. TCHAR szStr[256];
  768. HANDLE hFile;
  769. DWORD dwBytes;
  770. EMB_Head EmbHead;
  771. nCount=(WORD)SendDlgItemMessage(hWnd,IDC_LIST,LB_GETCOUNT,0,0L);
  772. if(nCount==0) {
  773. MessageBeep((UINT)-1);
  774. return FALSE;
  775. }
  776. hFile = CreateFile(SrcFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
  777. if(hFile==INVALID_HANDLE_VALUE) {
  778. ProcessError(ERR_IMEUSE, GetFocus(), ERR);
  779. return FALSE;
  780. }
  781. SetCursor (LoadCursor (NULL, IDC_WAIT));
  782. WriteFile(hFile,&nCount,2,&dwBytes,NULL);
  783. for(i=0;i<nCount;i++) {
  784. len=(INT)SendDlgItemMessage(hWnd,IDC_LIST,LB_GETTEXT,i,(LPARAM)szStr);
  785. szStr[len]=0;
  786. for(j=0;j<len;j++)
  787. if(szStr[j] > 0) break;
  788. lstrncpy(EmbHead.W_Code,MAXCODELEN,&szStr[j]);
  789. szStr[j]=0;
  790. lstrncpy(EmbHead.C_Char,USER_WORD_SIZE,szStr);
  791. WriteFile(hFile,&EmbHead,sizeof(EMB_Head),&dwBytes,NULL);
  792. }
  793. CloseHandle(hFile);
  794. SetCursor (LoadCursor (NULL, IDC_ARROW));
  795. return TRUE;
  796. }
  797. BOOL CheckMbUsed(HKEY hKey,HWND hWnd,LPTSTR KeyName)
  798. {
  799. int len;
  800. HKEY hkResult;
  801. HANDLE hFile;
  802. DWORD DataType;
  803. TCHAR SysPath[MAX_PATH],FileName[MAX_PATH];
  804. if(RegOpenKey(hKey,KeyName,&hkResult))
  805. return FALSE;
  806. len = sizeof(FileName);
  807. len = RegQueryValueEx(hkResult,TEXT(MbName),NULL,&DataType,(LPBYTE)FileName,&len);
  808. RegCloseKey(hkResult);
  809. if(len) return FALSE;
  810. len = lstrlen(FileName);
  811. if(len < 5) return FALSE;
  812. FileName[len-4] = 0;
  813. lstrcat(FileName,TEXT(MbExt));
  814. GetSystemDirectory(SysPath,MAX_PATH);
  815. lstrcat(SysPath,TEXT(Slope));
  816. lstrcat(SysPath,FileName);
  817. #ifdef UNICODE
  818. if(_waccess(SysPath,0)==0) {
  819. #else
  820. if(_access(SysPath,0)==0) {
  821. #endif
  822. hFile = CreateFile(SysPath,GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
  823. if(hFile==INVALID_HANDLE_VALUE) {
  824. ProcessError(ERR_IMEUSE,hWnd,ERR);
  825. return FALSE;
  826. }
  827. else
  828. CloseHandle(hFile);
  829. }
  830. return TRUE;
  831. }
  832. INT_PTR CALLBACK UDMEditProc(HWND hWnd,
  833. UINT wMsgID,
  834. WPARAM wParam,
  835. LPARAM lParam)
  836. {
  837. switch(wMsgID) {
  838. case WM_LBUTTONDBLCLK:
  839. SendMessage(GetParent(hWnd),WM_COMMAND,IDC_MODIFY,0L);
  840. break;
  841. case WM_KEYDOWN:
  842. switch(wParam) {
  843. case VK_DELETE:
  844. SendMessage(GetParent(hWnd),WM_COMMAND,IDC_DEL,0L);
  845. break;
  846. }
  847. default:
  848. return CallWindowProc((WNDPROC)lpUDMProc,hWnd,wMsgID,wParam,lParam);
  849. }
  850. return FALSE;
  851. }
  852. void InstallUDMSubClass(HWND hWnd)
  853. {
  854. FARPROC lpNewProc;
  855. lpNewProc = MakeProcInstance(UDMEditProc,hInstance);
  856. lpUDMProc = (FARPROC)GetWindowLongPtr(hWnd,GWLP_WNDPROC);
  857. SetWindowLongPtr(hWnd,GWLP_WNDPROC,(LONG_PTR)lpNewProc);
  858. FreeProcInstance(lpNewProc);
  859. }