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.

1176 lines
34 KiB

  1. /*************************************************
  2. * dconvdlg.c *
  3. * *
  4. * Copyright (C) 1995-1999 Microsoft Inc. *
  5. * *
  6. *************************************************/
  7. #include "prop.h"
  8. #include "upimeres.h"
  9. #include <regstr.h>
  10. /*****************************************************************************
  11. FUNCTION: ConvDialogProc(HWND, UINT, WPARAM, LPARAM)
  12. PURPOSE: Processes messages for "conv" property sheet.
  13. PARAMETERS:
  14. hdlg - window handle of the property sheet
  15. wMessage - type of message
  16. wparam - message-specific information
  17. lparam - message-specific information
  18. RETURN VALUE:
  19. TRUE - message handled
  20. FALSE - message not handled
  21. HISTORY:
  22. 04-18-95 Yehfew Tie Created.
  23. ****************************************************************************/
  24. BOOL CALLBACK ConvDialogProc(HWND hdlg,
  25. UINT uMessage,
  26. WPARAM wparam,
  27. LPARAM lparam)
  28. {
  29. LPNMHDR lpnmhdr;
  30. static DWORD dwDesOffset,dwDesLen;
  31. static DWORD dwRuleOffset,dwRuleLen;
  32. static char szMbName[MAX_PATH];
  33. static char szSrcName[MAX_PATH];
  34. static char _szStr[MAX_PATH];
  35. static char Ext[]=".mb";
  36. static BOOL bModify;
  37. LPRULE lpRule;
  38. int i;
  39. static DESCRIPTION Descript;
  40. switch (uMessage)
  41. {
  42. case WM_INITDIALOG:
  43. {
  44. LPENCODEAREA lpEncode;
  45. InstallConvSubClass(GetDlgItem(hdlg,IDC_LIST));
  46. SendDlgItemMessage(hdlg,IDC_IMENAME,EM_LIMITTEXT,24,0L);
  47. SendDlgItemMessage(hdlg,IDC_USEDCODE,EM_LIMITTEXT,MAXUSEDCODES-1,0L);
  48. SetConvDisable(hdlg);
  49. PropSheet_CancelToClose(GetParent(hdlg));
  50. hRule = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
  51. sizeof(RULE)*MAXCODELEN);
  52. hEncode = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
  53. NUMENCODEAREA*sizeof(ENCODEAREA));
  54. if(!hRule || !hEncode)
  55. ProcessError(ERR_OUTOFMEMORY,hdlg,ERR);
  56. lpEncode = (LPENCODEAREA) GlobalLock(hEncode);
  57. ConvInitEncode(lpEncode);
  58. GlobalUnlock(hEncode);
  59. break;
  60. }
  61. case WM_NOTIFY:
  62. lpnmhdr = (NMHDR FAR *)lparam;
  63. switch (lpnmhdr->code)
  64. {
  65. case PSN_SETACTIVE:
  66. break;
  67. case PSN_APPLY:
  68. if(bModify) {
  69. LoadString(NULL, IDS_FILEMODIFY, _szStr, sizeof(_szStr));
  70. wsprintf(szMbName,"�������뷨ҳ����\n\'%s\'\n%s",szSrcName,_szStr);
  71. if(ErrMessage(hdlg,szMbName)) {
  72. SendMessage(hdlg,WM_COMMAND,IDC_SAVE,0L);
  73. }
  74. }
  75. break;
  76. case PSN_RESET:
  77. break;
  78. case PSN_QUERYCANCEL:
  79. break;
  80. case PSN_HELP:
  81. break;
  82. default:
  83. break;
  84. }
  85. break;
  86. case WM_COMMAND:
  87. switch (LOWORD(wparam))
  88. {
  89. case ID_FILEOPEN:
  90. if(bModify) {
  91. char errString[MAX_PATH];
  92. LoadString(NULL, IDS_FILEMODIFY, _szStr, sizeof(_szStr));
  93. wsprintf(errString,"\'%s\'%s",szSrcName,_szStr);
  94. if(ErrMessage(hdlg,errString))
  95. SendMessage(hdlg,WM_COMMAND,IDC_SAVE,0L);
  96. }
  97. SetDlgItemText(hdlg,IDC_MBNAME,szMbName);
  98. {
  99. #ifdef UNICODE
  100. static TCHAR szTitle[] = {0x6253, 0x5F00, 0x0000};
  101. #else
  102. TCHAR szTitle[MAX_PATH];
  103. strcpy(szTitle,"����");
  104. #endif
  105. if(!TxtFileOpenDlg(hdlg,_szStr,szTitle))
  106. break;
  107. }
  108. lstrcpy(szSrcName,_szStr);
  109. bModify = FALSE;
  110. _szStr[0] = 0;
  111. SetDlgItemText(hdlg,IDC_EDITBOX,_szStr);
  112. SendDlgItemMessage(hdlg,IDC_LIST,LB_RESETCONTENT,0,0L);
  113. {
  114. LPSTR lpString;
  115. if((lpString = strrchr(szSrcName,'\\'))!=NULL)
  116. SetDlgItemText(hdlg,IDC_SRCNAME, lpString+1);
  117. lstrcpy(szMbName, szSrcName);
  118. lstrcpy(_szStr, szSrcName);
  119. if((lpString = strrchr(szMbName,'.'))!=NULL)
  120. *lpString = 0;
  121. lstrcat(szMbName,Ext);
  122. }
  123. SetDlgItemText(hdlg,IDC_MBNAME,szMbName);
  124. {
  125. int nRetValue;
  126. nRetValue = ConvGetDescript(hdlg, szSrcName,
  127. &dwDesOffset, &dwDesLen, &Descript, FALSE);
  128. if(nRetValue ==(-ERR_FILENOTOPEN)) {
  129. szSrcName[0]=0;
  130. lstrcpy(szMbName, szSrcName);
  131. SetDlgItemText(hdlg,IDC_SRCNAME,szSrcName);
  132. SetDlgItemText(hdlg,IDC_MBNAME,szMbName);
  133. MessageBeep((UINT)-1);
  134. break;
  135. }
  136. }
  137. if(!(lpRule = GlobalLock(hRule)) ) {
  138. ProcessError(ERR_GLOBALLOCK,hdlg,ERR);
  139. break;
  140. }
  141. if(ConvGetRule(hdlg, szSrcName, &dwRuleOffset, &dwRuleLen,
  142. lpRule, &Descript)==(-ERR_FILENOTOPEN))
  143. {
  144. szSrcName[0]=0;
  145. lstrcpy(szMbName,szSrcName);
  146. SetDlgItemText(hdlg,IDC_SRCNAME,szSrcName);
  147. SetDlgItemText(hdlg,IDC_MBNAME,szMbName);
  148. GlobalUnlock(hRule);
  149. MessageBeep((UINT)-1);
  150. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
  151. break;
  152. }
  153. SetDlgDescript(hdlg,&Descript);
  154. SetDlgRuleStr(hdlg,Descript.wNumRules,lpRule);
  155. SetDlgItemText(hdlg,IDC_MBNAME,szMbName);
  156. GlobalUnlock(hRule);
  157. SetConvEnable(hdlg);
  158. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
  159. SendMessage(GetDlgItem(hdlg,ID_FILEOPEN),BM_SETSTYLE,BS_PUSHBUTTON,0L);
  160. SendMessage(GetDlgItem(hdlg,IDC_CONV),BM_SETSTYLE,BS_DEFPUSHBUTTON,TRUE);
  161. SetFocus(GetDlgItem(hdlg,IDC_CONV));
  162. break;
  163. case IDC_MBNAME:
  164. GetDlgItemText(hdlg,IDC_MBNAME,szMbName,256);
  165. if(lstrlen(szMbName) == 0) {
  166. EnableWindow(GetDlgItem(hdlg,IDC_CONV),FALSE);
  167. break;
  168. }
  169. else {
  170. GetDlgItemText(hdlg,IDC_IMENAME,_szStr,32);
  171. if(lstrlen(_szStr) != 0 && Descript.wMaxCodes != 0)
  172. EnableWindow(GetDlgItem(hdlg,IDC_CONV),TRUE);
  173. else
  174. EnableWindow(GetDlgItem(hdlg,IDC_CONV),FALSE);
  175. }
  176. break;
  177. case IDC_IMENAME:
  178. GetDlgItemText(hdlg,IDC_IMENAME,_szStr,128);
  179. _szStr[128]=0;
  180. if(lstrlen(_szStr) == 0) {
  181. EnableWindow(GetDlgItem(hdlg,IDC_CONV),FALSE);
  182. break;
  183. }
  184. else {
  185. GetDlgItemText(hdlg,IDC_MBNAME,szMbName,256);
  186. if(lstrlen(szMbName) != 0 && Descript.wMaxCodes != 0)
  187. EnableWindow(GetDlgItem(hdlg,IDC_CONV),TRUE);
  188. else
  189. EnableWindow(GetDlgItem(hdlg,IDC_CONV),FALSE);
  190. }
  191. if(lstrcmpi(Descript.szName,_szStr)==0)
  192. break;
  193. bModify = TRUE;
  194. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  195. break;
  196. case IDC_MAXCODES:
  197. {
  198. int nMaxCodes;
  199. nMaxCodes = GetDlgItemInt (hdlg,IDC_MAXCODES,NULL,FALSE);
  200. if(nMaxCodes > MAXCODELEN) {
  201. MessageBeep((UINT)-1);
  202. SetDlgItemInt (hdlg,IDC_MAXCODES,MAXCODELEN,FALSE);
  203. Descript.wMaxCodes = MAXCODELEN;
  204. }
  205. if(Descript.wMaxCodes != nMaxCodes) {
  206. bModify = TRUE;
  207. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  208. }
  209. break;
  210. }
  211. case IDC_USEDCODE:
  212. GetDlgItemText(hdlg,IDC_USEDCODE,_szStr,sizeof(_szStr));
  213. if(lstrlen(_szStr) == 0)
  214. EnableWindow(GetDlgItem(hdlg,IDC_CONV),FALSE);
  215. if(lstrcmpi(Descript.szUsedCode,_szStr)==0)
  216. break;
  217. bModify = TRUE;
  218. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  219. break;
  220. case IDC_WILDCHAR:
  221. GetDlgItemText(hdlg,IDC_WILDCHAR,_szStr,sizeof(_szStr));
  222. if(lstrlen(_szStr)==0 ) {
  223. if( Descript.cWildChar!=0) {
  224. bModify = TRUE;
  225. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  226. }
  227. break;
  228. }
  229. if(lstrlen(_szStr)>1) {
  230. MessageBeep((UINT)-1);
  231. _szStr[0]=0;
  232. SetDlgItemText(hdlg,IDC_WILDCHAR,_szStr);
  233. break;
  234. }
  235. {
  236. char WildChar;
  237. WildChar=_szStr[0];
  238. if(WildChar != Descript.cWildChar) {
  239. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  240. bModify = TRUE;
  241. }
  242. GetDlgItemText(hdlg,IDC_USEDCODE,_szStr,sizeof(_szStr));
  243. if(strchr(_szStr,WildChar) != NULL) {
  244. _szStr[0]=0;
  245. SetDlgItemText(hdlg,IDC_WILDCHAR,_szStr);
  246. MessageBeep((UINT)-1);
  247. break;
  248. }
  249. }
  250. break;
  251. case IDC_SINGLEELEMENT:
  252. case IDC_MULTIELEMENT:
  253. if(Descript.byMaxElement == (BYTE)(IsDlgButtonChecked(hdlg,IDC_MULTIELEMENT)?2:1))
  254. break;
  255. Descript.byMaxElement = 1 + Descript.byMaxElement%2;
  256. bModify = TRUE;
  257. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  258. break;
  259. case IDC_ADD:
  260. {
  261. FARPROC lpProcInfo;
  262. szRuleStr[0] = 0;
  263. if(Descript.wNumRules >= MAXCODELEN) {
  264. ProcessError(ERR_RULENUM,hdlg,WARNING);
  265. break;
  266. }
  267. lpProcInfo = MakeProcInstance((FARPROC)AddRuleDlg, hInst);
  268. DialogBox(hInst,
  269. MAKEINTRESOURCE(IDD_ADDRULE),
  270. hdlg,
  271. (DLGPROC)AddRuleDlg);
  272. FreeProcInstance(lpProcInfo);
  273. bModify = TRUE;
  274. break;
  275. }
  276. case IDC_MODIFY:
  277. {
  278. FARPROC lpProcInfo;
  279. int nSelect;
  280. nSelect = SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCURSEL,0,0L);
  281. if(nSelect == LB_ERR) {
  282. MessageBeep((UINT)-1);
  283. break;
  284. }
  285. SendDlgItemMessage(hdlg,IDC_LIST,LB_GETTEXT,nSelect,(LPARAM)szRuleStr);
  286. lpProcInfo = MakeProcInstance((FARPROC)ModiRuleDlg, hInst);
  287. DialogBox(hInst,
  288. MAKEINTRESOURCE(IDD_EDITRULE),
  289. hdlg,
  290. (DLGPROC)ModiRuleDlg);
  291. FreeProcInstance(lpProcInfo);
  292. break;
  293. }
  294. case IDC_DEL:
  295. {
  296. int nSelect;
  297. nSelect = SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCURSEL,0,0L);
  298. if(nSelect != LB_ERR) {
  299. SendDlgItemMessage(hdlg,IDC_LIST,LB_DELETESTRING,nSelect,0L);
  300. if(!(lpRule = GlobalLock(hRule)) ) {
  301. ProcessError(ERR_GLOBALLOCK,hdlg,ERR);
  302. break;
  303. }
  304. DelSelRule(Descript.wNumRules,(WORD)nSelect,lpRule);
  305. Descript.wNumRules--;
  306. GlobalUnlock(hRule);
  307. bModify = TRUE;
  308. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  309. SetFocus(GetDlgItem(hdlg,IDC_LIST));
  310. SendDlgItemMessage(hdlg,IDC_LIST,LB_SETCURSEL,nSelect,0L);
  311. if((nSelect=SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCURSEL,0,0L))==LB_ERR) {
  312. nSelect=SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCOUNT,0,0L);
  313. SendDlgItemMessage(hdlg,IDC_LIST,LB_SETCURSEL,nSelect-1,0L);
  314. }
  315. }
  316. else
  317. MessageBeep((UINT)-1);
  318. break;
  319. }
  320. case IDC_ADDRULE:
  321. if(!(lpRule = GlobalLock(hRule)) ) {
  322. ProcessError(ERR_GLOBALLOCK,hdlg,ERR);
  323. szRuleStr[0] = 0;
  324. break;
  325. }
  326. if(RuleParse(hdlg,szRuleStr,0,lpRule,Descript.wMaxCodes)) {
  327. int nCnt;
  328. nCnt =(WORD)SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCOUNT,0,0L);
  329. if(nCnt != 0)
  330. {
  331. for(i=0; i<nCnt; i++) {
  332. SendDlgItemMessage(hdlg,IDC_LIST,LB_GETTEXT,i,(LPARAM)_szStr);
  333. if(_strnicoll(szRuleStr,_szStr,3) == 0)
  334. {
  335. GlobalUnlock(hRule);
  336. ProcessError(ERR_DUPRULE,hdlg,ERR);
  337. MessageBeep((UINT)-1);
  338. MessageBeep((UINT)-1);
  339. _szStr[0] = 0;
  340. lstrcpy((LPSTR)lparam,_szStr);
  341. return FALSE;
  342. }
  343. }
  344. }
  345. SendDlgItemMessage(hdlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)szRuleStr);
  346. bModify = TRUE;
  347. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  348. Descript.wNumRules++;
  349. }
  350. else
  351. {
  352. MessageBeep((UINT)-1);
  353. _szStr[0] = 0;
  354. lstrcpy((LPSTR)lparam,_szStr);
  355. }
  356. GlobalUnlock(hRule);
  357. break;
  358. case IDC_CHGDATA:
  359. if(!(lpRule = GlobalLock(hRule)) ) {
  360. ProcessError(ERR_GLOBALLOCK,hdlg,ERR);
  361. _szStr[0] = 0;
  362. lstrcpy((LPSTR)lparam,_szStr);
  363. break;
  364. }
  365. {
  366. int nSelect;
  367. nSelect = SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCURSEL,0,0L);
  368. if(RuleParse(hdlg,szRuleStr,nSelect,lpRule,Descript.wMaxCodes)) {
  369. // Descript.wNumRules++;
  370. int nCnt;
  371. nCnt =(WORD)SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCOUNT,0,0L);
  372. if(nCnt != 0)
  373. {
  374. for(i=0; i<nCnt; i++) {
  375. if(i == nSelect)
  376. continue;
  377. SendDlgItemMessage(hdlg,IDC_LIST,LB_GETTEXT,i,(LPARAM)_szStr);
  378. if(_strnicoll(szRuleStr,_szStr,3) == 0)
  379. {
  380. GlobalUnlock(hRule);
  381. MessageBeep((UINT)-1);
  382. _szStr[0] = 0;
  383. lstrcpy((LPSTR)lparam,_szStr);
  384. return FALSE;
  385. }
  386. }
  387. }
  388. SendDlgItemMessage(hdlg,IDC_LIST,LB_DELETESTRING,nSelect,0L);
  389. SendDlgItemMessage(hdlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)szRuleStr);
  390. bModify = TRUE;
  391. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),TRUE);
  392. }
  393. else
  394. {
  395. _szStr[0] = 0;
  396. lstrcpy((LPSTR)lparam,_szStr);
  397. MessageBeep((UINT)-1);
  398. }
  399. GlobalUnlock(hRule);
  400. break;
  401. }
  402. case IDC_GETMBFILE:
  403. GetDlgItemText(hdlg,IDC_MBNAME,_szStr,sizeof(_szStr));
  404. lstrcpy((LPSTR)lparam,_szStr);
  405. break;
  406. case IDC_GETSRCFILE:
  407. lstrcpy((LPSTR)lparam,szSrcName);
  408. break;
  409. case IDC_CONV:
  410. {
  411. FARPROC lpProcInfo;
  412. if(bModify)
  413. SendMessage(hdlg,WM_COMMAND,IDC_SAVE,0L);
  414. lpProcInfo = MakeProcInstance((FARPROC)InfoDlg, hInst);
  415. pfnmsg=(PFNMSG)ConvProc;
  416. bEndProp=FALSE;
  417. DialogBox(hInst,
  418. MAKEINTRESOURCE(IDD_INFO),
  419. hdlg,
  420. (DLGPROC)lpProcInfo);
  421. FreeProcInstance(lpProcInfo);
  422. break;
  423. }
  424. case IDC_CRTIME:
  425. {
  426. FARPROC lpProcInfo;
  427. int nRetValue;
  428. GetDlgItemText(hdlg, IDC_MBNAME, _szStr, sizeof(_szStr));
  429. nRetValue = ReadDescript(_szStr,&Descript,FILE_SHARE_READ);
  430. if(nRetValue == -1){
  431. char errString[MAX_PATH];
  432. LoadString(NULL, IDS_FILEOPEN, errString, sizeof(errString));
  433. lstrcat(_szStr, errString);
  434. FatalMessage(hdlg,_szStr);
  435. break;
  436. }
  437. else if(!nRetValue)
  438. {
  439. ProcessError(ERR_READMAININDEX,hdlg,WARNING);
  440. break;
  441. }
  442. lpProcInfo = MakeProcInstance((FARPROC)CrtImeDlg, hInst);
  443. DialogBox(hInst,
  444. MAKEINTRESOURCE(IDD_CRTIME),
  445. hdlg,
  446. (DLGPROC)lpProcInfo);
  447. FreeProcInstance(lpProcInfo);
  448. break;
  449. }
  450. case IDC_SAVE:
  451. GetDlgDescript(hdlg,&Descript);
  452. if(!CheckCodeCollection(hdlg,Descript.szUsedCode))
  453. break;
  454. GetDlgRule(hdlg,lpRule,&(Descript.wNumRules),Descript.wMaxCodes);
  455. if(!ConvSaveDescript(szSrcName,&Descript, dwDesOffset,dwDesLen))
  456. break;
  457. ConvGetDescript(hdlg,szSrcName,&dwDesOffset,&dwDesLen,&Descript,TRUE);
  458. if(!(lpRule = GlobalLock(hRule)) ) {
  459. ProcessError(ERR_GLOBALLOCK,hdlg,ERR);
  460. break;
  461. }
  462. if(!ConvSaveRule(hdlg,szSrcName, dwDesLen,dwRuleLen,
  463. lpRule, Descript.wNumRules))
  464. break;
  465. ConvGetRule(hdlg, szSrcName, &dwRuleOffset, &dwRuleLen,
  466. lpRule, &Descript);
  467. GlobalUnlock(hRule);
  468. bModify = FALSE;
  469. EnableWindow(GetDlgItem(hdlg,IDC_CONV),TRUE);
  470. EnableWindow(GetDlgItem(hdlg,IDC_SAVE),FALSE);
  471. SendMessage(GetDlgItem(hdlg,IDC_SAVE),BM_SETSTYLE,BS_PUSHBUTTON,0L);
  472. SendMessage(GetDlgItem(hdlg,IDC_CONV),BM_SETSTYLE,BS_DEFPUSHBUTTON,TRUE);
  473. SetFocus(GetDlgItem(hdlg,IDC_CONV));
  474. break;
  475. case IDC_HLP:
  476. break;
  477. default:
  478. break;
  479. }
  480. break;
  481. default:
  482. break;
  483. }
  484. return FALSE;
  485. }
  486. VOID ConvProc(LPVOID hWnd)
  487. {
  488. static char file1[MAX_PATH]="";
  489. static char file2[MAX_PATH]="";
  490. SendMessage(GetParent(hDlgless),WM_COMMAND,IDC_GETSRCFILE,(LPARAM)file1);
  491. SendMessage(GetParent(hDlgless),WM_COMMAND,IDC_GETMBFILE,(LPARAM)file2);
  492. if(ConvConv(hDlgless,file1,file2))
  493. bEndProp=TRUE;
  494. //PropSheet_PressButton(GetParent(GetParent(hDlgless)),PSBTN_OK);
  495. SendMessage(hDlgless,WM_CLOSE,0,0L);
  496. }
  497. void SetDlgDescript(HWND hDlg,LPDESCRIPTION lpDescript)
  498. {
  499. short nElement;
  500. char _szStr[20];
  501. nElement =(lpDescript->byMaxElement==1)?IDC_SINGLEELEMENT:IDC_MULTIELEMENT;
  502. SetDlgItemText(hDlg,IDC_IMENAME,lpDescript->szName);
  503. SetDlgItemText(hDlg,IDC_USEDCODE,lpDescript->szUsedCode);
  504. _szStr[0]=lpDescript->cWildChar;
  505. _szStr[1]=0;
  506. SetDlgItemText(hDlg,IDC_WILDCHAR,_szStr);
  507. SetDlgItemInt (hDlg,IDC_MAXCODES,lpDescript->wMaxCodes,FALSE);
  508. CheckRadioButton(hDlg,IDC_SINGLEELEMENT,IDC_MULTIELEMENT,nElement);
  509. }
  510. void GetDlgDescript(HWND hDlg,LPDESCRIPTION lpDescript)
  511. {
  512. BOOL bTrans;
  513. char _szStr[20];
  514. GetDlgItemText(hDlg,IDC_IMENAME,lpDescript->szName,NAMESIZE);
  515. GetDlgItemText(hDlg,IDC_USEDCODE,lpDescript->szUsedCode,MAXUSEDCODES);
  516. GetDlgItemText(hDlg,IDC_WILDCHAR,_szStr,sizeof(_szStr));
  517. DelSpace(_szStr);
  518. if(_szStr[0]==0) _szStr[0]='?';
  519. lpDescript->cWildChar=_szStr[0];
  520. lpDescript->wMaxCodes=(WORD)GetDlgItemInt (hDlg,IDC_MAXCODES,&bTrans,FALSE);
  521. lpDescript->wNumCodes=(WORD)lstrlen(lpDescript->szUsedCode);
  522. lpDescript->byMaxElement=(BYTE)(IsDlgButtonChecked(hDlg,IDC_MULTIELEMENT)?2:1);
  523. lpDescript->wNumRules=(WORD)SendDlgItemMessage(hDlg,IDC_LIST,LB_GETCOUNT,0,0L);
  524. }
  525. void SetDlgRuleStr(HWND hDlg,WORD NumRules,LPRULE lpRule)
  526. {
  527. WORD i;
  528. char _szStr[MAX_PATH];
  529. SendDlgItemMessage(hDlg,IDC_LIST,LB_RESETCONTENT,0,0L);
  530. if(NumRules==0) return;
  531. for(i=0; i<NumRules; i++) {
  532. RuleToText(&lpRule[i], _szStr);
  533. _szStr[lstrlen(_szStr)-2]=0;
  534. SendDlgItemMessage(hDlg,IDC_LIST,LB_ADDSTRING,0,(LPARAM)_szStr);
  535. }
  536. }
  537. void GetDlgRule(HWND hdlg,LPRULE lpRule,LPWORD fwNumRules,WORD MaxCodes)
  538. {
  539. int i;
  540. char _szStr[128];
  541. WORD NumRules = 0;
  542. lpRule = GlobalLock(hRule);
  543. *fwNumRules =(WORD)SendDlgItemMessage(hdlg,IDC_LIST,LB_GETCOUNT,0,0L);
  544. if((*fwNumRules) == 0)
  545. {
  546. GlobalUnlock(hRule);
  547. return;
  548. }
  549. for(i=0;i<(int)*fwNumRules;i++) {
  550. SendDlgItemMessage(hdlg,IDC_LIST,LB_GETTEXT,i,(LPARAM)_szStr);
  551. if(RuleParse(hdlg,_szStr,i,lpRule,MaxCodes))
  552. NumRules++;
  553. }
  554. GlobalUnlock(hRule);
  555. *fwNumRules = NumRules;
  556. }
  557. void DelSelRule(WORD wNumRules,WORD wSelect,LPRULE lpRule)
  558. {
  559. int i;
  560. if(wSelect>=MAXCODELEN) return;
  561. for(i=wSelect;i<wNumRules;i++)
  562. lpRule[i]=lpRule[i+1];
  563. }
  564. void SetConvDisable(HWND hDlg)
  565. {
  566. WORD wID;
  567. for(wID = IDC_MBNAME ;wID <= IDC_CONV ;wID++)
  568. EnableWindow(GetDlgItem(hDlg,wID),FALSE);
  569. EnableWindow(GetDlgItem(hDlg,IDC_CRTIME),FALSE);
  570. for(wID = IDC_STATIC1 ;wID <= IDC_STATIC5 ;wID++)
  571. EnableWindow(GetDlgItem(hDlg,wID),FALSE);
  572. }
  573. void SetConvEnable(HWND hDlg)
  574. {
  575. WORD wID;
  576. for(wID = IDC_MBNAME ;wID <= IDC_CONV ;wID++)
  577. EnableWindow(GetDlgItem(hDlg,wID),TRUE);
  578. EnableWindow(GetDlgItem(hDlg,IDC_CRTIME),TRUE);
  579. for(wID = IDC_STATIC1 ;wID <= IDC_STATIC5 ;wID++)
  580. EnableWindow(GetDlgItem(hDlg,wID),TRUE);
  581. }
  582. BOOL CALLBACK ConvEditProc(HWND hWnd,
  583. UINT wMsgID,
  584. WPARAM wParam,
  585. LPARAM lParam)
  586. {
  587. switch(wMsgID) {
  588. case WM_LBUTTONDBLCLK:
  589. SendMessage(GetParent(hWnd),WM_COMMAND,IDC_MODIFY,0L);
  590. break;
  591. case WM_KEYDOWN:
  592. switch(wParam) {
  593. case VK_DELETE:
  594. SendMessage(GetParent(hWnd),WM_COMMAND,IDC_DEL,0L);
  595. break;
  596. }
  597. default:
  598. return CallWindowProc(lpConvProc,hWnd,wMsgID,wParam,lParam);
  599. }
  600. return FALSE;
  601. }
  602. void InstallConvSubClass(HWND hWnd)
  603. {
  604. FARPROC lpNewProc;
  605. lpNewProc = MakeProcInstance(ConvEditProc,hInstance);
  606. lpConvProc = (FARPROC)GetWindowLongPtr(hWnd,GWL_WNDPROC);
  607. SetWindowLongPtr(hWnd,GWL_WNDPROC,(LONG_PTR)lpNewProc);
  608. FreeProcInstance(lpNewProc);
  609. }
  610. BOOL CALLBACK AddRuleDlg(
  611. HWND hDlg,
  612. UINT message,
  613. WPARAM wParam,
  614. LPARAM lParam)
  615. {
  616. LPRULE lpRule;
  617. switch (message) {
  618. case WM_INITDIALOG:
  619. lpRule=GlobalLock(hRule);
  620. szRuleStr[0] = 0;
  621. SetDlgItemText(hDlg,IDC_EDITRULE,szRuleStr);
  622. return (TRUE);
  623. case WM_COMMAND:
  624. switch(LOWORD(wParam)) {
  625. case IDOK:
  626. GetDlgItemText(hDlg,IDC_EDITRULE,szRuleStr,sizeof(szRuleStr));
  627. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_ADDRULE,(LPARAM)szRuleStr);
  628. if(*szRuleStr == 0)
  629. {
  630. SetFocus(GetDlgItem(hDlg,IDC_EDITRULE));
  631. //SendMessage(GetParent(hDlg),WM_COMMAND,WM_SETFOCUS,IDC_
  632. return (TRUE);
  633. }
  634. GlobalUnlock(hRule);
  635. EndDialog(hDlg, TRUE);
  636. return (TRUE);
  637. case IDCANCEL:
  638. case WM_CLOSE:
  639. GlobalUnlock(hRule);
  640. EndDialog(hDlg, TRUE);
  641. break;
  642. default:
  643. break;
  644. }
  645. break;
  646. }
  647. return (FALSE);
  648. UNREFERENCED_PARAMETER(lParam);
  649. }
  650. BOOL CALLBACK ModiRuleDlg(
  651. HWND hDlg,
  652. UINT message,
  653. WPARAM wParam,
  654. LPARAM lParam)
  655. {
  656. LPRULE lpRule;
  657. switch (message) {
  658. case WM_INITDIALOG:
  659. lpRule=GlobalLock(hRule);
  660. SetDlgItemText(hDlg,IDC_EDITRULE,szRuleStr);
  661. return (TRUE);
  662. case WM_COMMAND:
  663. switch(LOWORD(wParam)) {
  664. case IDOK:
  665. GetDlgItemText(hDlg,IDC_EDITRULE,szRuleStr,sizeof(szRuleStr));
  666. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_CHGDATA,(LPARAM)szRuleStr);
  667. if(*szRuleStr == 0)
  668. {
  669. SetFocus(GetDlgItem(hDlg,IDC_EDITRULE));
  670. return (TRUE);
  671. }
  672. GlobalUnlock(hRule);
  673. EndDialog(hDlg, TRUE);
  674. return (TRUE);
  675. case IDCANCEL:
  676. case WM_CLOSE:
  677. GlobalUnlock(hRule);
  678. EndDialog(hDlg, TRUE);
  679. break;
  680. default:
  681. break;
  682. }
  683. break;
  684. }
  685. return (FALSE);
  686. UNREFERENCED_PARAMETER(lParam);
  687. }
  688. //**********************************************************
  689. //SetupIme(ImeFileName, ImeLayoutName);
  690. //**********************************************************
  691. /*
  692. BOOL SetupIme(
  693. LPTSTR ImeFileName, //ime file name with full path
  694. LPTSTR MBFileName,
  695. LPTSTR ImeLayoutName)//ime layout name(in chinese)
  696. {
  697. HKEY hKeyCurrVersion, hKey, hNewKey;
  698. long retCode,i;
  699. UCHAR Buf[256], lpszName[256],LayoutHandleName[10];
  700. DWORD dwDisposition;
  701. memset(Buf,0,256);
  702. memset(lpszName,0,256);
  703. memset(LayoutHandleName, 0, 10);
  704. //create registry in keyboard layout
  705. retCode = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
  706. REGSTR_PATH_CURRENT_CONTROL_SET,
  707. (DWORD)0,
  708. KEY_ENUMERATE_SUB_KEYS |
  709. KEY_EXECUTE |
  710. KEY_QUERY_VALUE,
  711. &hKeyCurrVersion);
  712. if (retCode) {
  713. wsprintf (Buf, "����: RegOpenKeyEx = %d", retCode);
  714. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  715. return FALSE;
  716. }
  717. retCode = RegOpenKeyEx (hKeyCurrVersion,
  718. "Keyboard Layouts",
  719. 0,
  720. KEY_ENUMERATE_SUB_KEYS |
  721. KEY_EXECUTE |
  722. KEY_QUERY_VALUE,
  723. &hKey);
  724. if (retCode) {
  725. wsprintf (Buf, "����: RegOpenKeyEx = %d", retCode);
  726. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  727. return FALSE;
  728. }
  729. for(i=0;;i++){
  730. retCode = RegEnumKey(hKey, // handle of key to query
  731. i, // index of subkey to query
  732. lpszName, // address of buffer for subkey name
  733. 256); // size of subkey buffer
  734. if(retCode)
  735. break;
  736. else{
  737. if(strcmp(Buf, lpszName)<0)
  738. strcpy(Buf, lpszName);
  739. }
  740. }
  741. if(Buf[0]=='\0')
  742. return FALSE;
  743. if(Buf[3]=='f' || Buf[3]=='F'){
  744. Buf[3]== '0';
  745. Buf[2]++;
  746. }else if(Buf[3]=='9')
  747. Buf[3]='A';
  748. else
  749. Buf[3]++;
  750. strcpy(LayoutHandleName,Buf);
  751. retCode = RegCreateKeyEx (hKey,
  752. LayoutHandleName,
  753. 0,
  754. 0,
  755. REG_OPTION_NON_VOLATILE,
  756. KEY_ALL_ACCESS,
  757. NULL,
  758. &hNewKey,
  759. &dwDisposition);
  760. if (retCode) {
  761. wsprintf (Buf, "����: RegOpenKeyEx = %d", retCode);
  762. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  763. return FALSE;
  764. }
  765. GetFileTitle(ImeFileName, Buf, MAX_PATH);
  766. retCode = RegSetValueEx (hNewKey,
  767. "IME file",
  768. (DWORD)NULL,
  769. REG_SZ,
  770. (LPBYTE)Buf,
  771. strlen(Buf));
  772. if (retCode) {
  773. wsprintf (Buf, "����: RegSetValueEx = %d", retCode);
  774. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  775. return FALSE;
  776. }
  777. strcpy(Buf, "kbdus.kbd");
  778. retCode = RegSetValueEx (hNewKey,
  779. "layout file",
  780. (DWORD)NULL,
  781. REG_SZ,
  782. (LPBYTE)Buf,
  783. strlen(Buf));
  784. if (retCode) {
  785. wsprintf (Buf, "����: RegSetValueEx = %d", retCode);
  786. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  787. return FALSE;
  788. }
  789. strcpy(Buf, ImeLayoutName);
  790. retCode = RegSetValueEx (hNewKey,
  791. "layout text",
  792. (DWORD)NULL,
  793. REG_SZ,
  794. (LPBYTE)Buf,
  795. strlen(Buf));
  796. if (retCode) {
  797. wsprintf (Buf, "����: RegSetValueEx = %d", retCode);
  798. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  799. return FALSE;
  800. }
  801. RegCloseKey(hNewKey);
  802. RegCloseKey(hKey);
  803. RegCloseKey(hKeyCurrVersion);
  804. //create registry in preload
  805. retCode = RegOpenKeyEx (HKEY_CURRENT_USER,
  806. "Keyboard Layout\\Preload",
  807. 0,
  808. KEY_ENUMERATE_SUB_KEYS |
  809. KEY_EXECUTE |
  810. KEY_QUERY_VALUE,
  811. &hKeyCurrVersion);
  812. if (retCode) {
  813. wsprintf (Buf, "����: RegOpenKeyEx = %d", retCode);
  814. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  815. return FALSE;
  816. }
  817. memset(Buf,0,256);
  818. memset(lpszName,0,256);
  819. for(i=0;;i++){
  820. retCode = RegEnumKey(hKeyCurrVersion, // handle of key to query
  821. i, // index of subkey to query
  822. lpszName, // address of buffer for subkey name
  823. 256); // size of subkey buffer
  824. if(retCode)
  825. break;
  826. else{
  827. if(strcmp(Buf, lpszName)<0)
  828. strcpy(Buf, lpszName);
  829. }
  830. }
  831. if(Buf[0]=='\0')
  832. return FALSE;
  833. i=atoi(Buf);
  834. i++;
  835. _itoa(i,Buf,10);
  836. retCode = RegCreateKeyEx (hKeyCurrVersion,
  837. Buf,
  838. 0,
  839. 0,
  840. REG_OPTION_NON_VOLATILE,
  841. KEY_ALL_ACCESS,
  842. NULL,
  843. &hNewKey,
  844. &dwDisposition);
  845. if (retCode) {
  846. wsprintf (Buf, "����: RegOpenKeyEx = %d", retCode);
  847. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  848. return FALSE;
  849. }
  850. retCode = RegSetValueEx (hNewKey,
  851. NULL,
  852. (DWORD)NULL,
  853. REG_SZ,
  854. (LPBYTE)LayoutHandleName,
  855. strlen(LayoutHandleName));
  856. if (retCode) {
  857. wsprintf (Buf, "����: RegSetValueEx = %d", retCode);
  858. MessageBox (NULL, Buf, "����", MB_OK | MB_ICONINFORMATION);
  859. return FALSE;
  860. }
  861. RegCloseKey(hNewKey);
  862. RegCloseKey(hKey);
  863. RegCloseKey(hKeyCurrVersion);
  864. //copy files
  865. {
  866. UCHAR DesFilePath[MAX_PATH];
  867. GetSystemDirectory(DesFilePath,MAX_PATH);
  868. strcat(DesFilePath,"\\");
  869. GetFileTitle(ImeFileName, Buf, MAX_PATH);
  870. strcat(DesFilePath,Buf);
  871. CopyFile(ImeFileName, DesFilePath, FALSE);
  872. GetSystemDirectory(DesFilePath,MAX_PATH);
  873. strcat(DesFilePath,"\\");
  874. GetFileTitle(MBFileName, Buf, MAX_PATH);
  875. strcat(DesFilePath,Buf);
  876. CopyFile(MBFileName, DesFilePath, FALSE);
  877. }
  878. return TRUE;
  879. }
  880. */
  881. BOOL CALLBACK CrtImeDlg(
  882. HWND hDlg,
  883. UINT message,
  884. WPARAM wParam,
  885. WPARAM lParam)
  886. {
  887. static char _szStr[MAX_PATH];
  888. static char ImeTplName[MAX_PATH];
  889. static char mbName[MAX_PATH];
  890. static char Version[]= "���뷨 �汾";
  891. static IMERES ImeRes;
  892. LPTSTR lpString;
  893. switch (message) {
  894. case WM_INITDIALOG:
  895. SendMessage(GetParent(hDlg),WM_COMMAND,IDC_GETMBFILE,(LPARAM)mbName);
  896. SendDlgItemMessage(hDlg,IDC_VERSION,EM_LIMITTEXT,8,0L);
  897. SendDlgItemMessage(hDlg,IDC_GROUP,EM_LIMITTEXT,32,0L);
  898. ImeRes.Value = 0x00af;
  899. SetValue(hDlg,ImeRes.Value);
  900. SendMessage(hDlg,WM_COMMAND, IDC_DEF, 0L);
  901. CheckRadioButton(hDlg,IDC_DEF,IDC_USERDEF,IDC_DEF);
  902. break;
  903. case WM_COMMAND:
  904. switch(LOWORD(wParam)) {
  905. case IDOK:
  906. {
  907. DESCRIPTION Descript;
  908. if(!GetImeRes(hDlg,&ImeRes))
  909. return TRUE;
  910. ReadDescript(mbName,&Descript,FILE_SHARE_READ);
  911. lstrcpy(_szStr, Descript.szName);
  912. lstrcat(_szStr, Version);
  913. lstrcat(_szStr, ImeRes.Version);
  914. lstrcpy(ImeRes.Version, _szStr);
  915. GetSystemDirectory(ImeTplName,sizeof(ImeTplName));
  916. lstrcat(ImeTplName, TplName);
  917. lstrcpy(_szStr,mbName);
  918. if((lpString=strrchr(_szStr,'.'))!=NULL)
  919. *lpString=0;
  920. lstrcat(_szStr,ImeExt);
  921. DispInfo(GetWindow(hDlg, GW_OWNER),IDS_UPRES);
  922. CopyFile(ImeTplName, _szStr, FALSE);
  923. EndDialog(hDlg, TRUE);
  924. return (TRUE);
  925. }
  926. case IDC_BROWSE:
  927. if(!RcFileOpenDlg(hDlg, _szStr,Title))
  928. break;
  929. if(strstr(_strupr(_szStr),BmpExt) != NULL)
  930. SetDlgItemText(hDlg, IDC_BMP, _szStr);
  931. else if(strstr(_strupr(_szStr),IconExt) != NULL)
  932. SetDlgItemText(hDlg, IDC_ICO, _szStr);
  933. else if(strstr(_strupr(_szStr),HlpExt) != NULL)
  934. SetDlgItemText(hDlg, IDC_HLPFILE, _szStr);
  935. break;
  936. case IDC_DEF:
  937. EnableWindow(GetDlgItem(hDlg,IDC_BMP), FALSE);
  938. EnableWindow(GetDlgItem(hDlg,IDC_ICO), FALSE);
  939. EnableWindow(GetDlgItem(hDlg,IDC_HLPFILE), FALSE);
  940. EnableWindow(GetDlgItem(hDlg,IDC_BROWSE), FALSE);
  941. GetDlgItemText(hDlg, IDC_ICO, ImeRes.IcoName,sizeof(ImeRes.IcoName));
  942. GetDlgItemText(hDlg, IDC_BMP, ImeRes.BmpName,sizeof(ImeRes.BmpName));
  943. GetDlgItemText(hDlg, IDC_BMP, ImeRes.HlpFile,sizeof(ImeRes.HlpFile));
  944. _szStr[0] = 0;
  945. SetDlgItemText(hDlg, IDC_ICO, _szStr);
  946. SetDlgItemText(hDlg, IDC_BMP, _szStr);
  947. SetDlgItemText(hDlg, IDC_HLPFILE, _szStr);
  948. break;
  949. case IDC_USERDEF:
  950. EnableWindow(GetDlgItem(hDlg,IDC_BMP), TRUE);
  951. EnableWindow(GetDlgItem(hDlg,IDC_ICO), TRUE);
  952. EnableWindow(GetDlgItem(hDlg,IDC_HLPFILE), TRUE);
  953. EnableWindow(GetDlgItem(hDlg,IDC_BROWSE), TRUE);
  954. SetDlgItemText(hDlg, IDC_ICO, ImeRes.IcoName);
  955. SetDlgItemText(hDlg, IDC_BMP, ImeRes.BmpName);
  956. SetDlgItemText(hDlg, IDC_HLPFILE, ImeRes.HlpFile);
  957. break;
  958. case IDC_ZJTS:
  959. if(IsDlgButtonChecked(hDlg,IDC_ZJTS))
  960. EnableWindow(GetDlgItem(hDlg,IDC_WMTS),TRUE);
  961. else {
  962. CheckDlgButton(hDlg,IDC_WMTS,0);
  963. EnableWindow(GetDlgItem(hDlg,IDC_WMTS),FALSE);
  964. }
  965. break;
  966. case IDCANCEL:
  967. case WM_CLOSE:
  968. EndDialog(hDlg, TRUE);
  969. return (TRUE);
  970. default:
  971. break;
  972. }
  973. break;
  974. }
  975. return (FALSE);
  976. UNREFERENCED_PARAMETER(lParam);
  977. }
  978. void SetValue(HWND hDlg, WORD Value)
  979. {
  980. CheckDlgButton(hDlg,IDC_CYLX,Value&0x0001);
  981. CheckDlgButton(hDlg,IDC_CYSR,Value&0x0002);
  982. CheckDlgButton(hDlg,IDC_ZJTS,Value&0x0004);
  983. if(Value&0x0004==0) {
  984. EnableWindow(GetDlgItem(hDlg,IDC_WMTS),FALSE);
  985. Value &= ~ 0x0008;
  986. }
  987. CheckDlgButton(hDlg,IDC_WMTS,Value&0x0008);
  988. CheckDlgButton(hDlg,IDC_GBGS,Value&0x0020);
  989. CheckDlgButton(hDlg,IDC_SPACE,Value&0x0040);
  990. CheckDlgButton(hDlg,IDC_ENTER,Value&0x0080);
  991. }
  992. void GetValue(HWND hDlg,LPWORD Value)
  993. {
  994. *Value = 0;
  995. *Value |= IsDlgButtonChecked(hDlg,IDC_CYLX);
  996. *Value |= IsDlgButtonChecked(hDlg,IDC_CYSR) << 1;
  997. *Value |= IsDlgButtonChecked(hDlg,IDC_ZJTS) << 2;
  998. *Value |= IsDlgButtonChecked(hDlg,IDC_WMTS) << 3;
  999. *Value |= IsDlgButtonChecked(hDlg,IDC_GBGS) << 5;
  1000. *Value |= IsDlgButtonChecked(hDlg,IDC_SPACE) << 6;
  1001. *Value |= IsDlgButtonChecked(hDlg,IDC_ENTER) << 7;
  1002. }
  1003. int GetImeRes(HWND hDlg,LPIMERES lpImeRes)
  1004. {
  1005. GetDlgItemText(hDlg, IDC_VERSION, lpImeRes->Version, sizeof(lpImeRes->Version));
  1006. DelSpace(lpImeRes->Version);
  1007. if(lstrlen(lpImeRes->Version) == 0)
  1008. {
  1009. ProcessError(ERR_VERSION, hDlg, WARNING);
  1010. return FALSE;
  1011. }
  1012. GetDlgItemText(hDlg, IDC_GROUP, lpImeRes->Depart, sizeof(lpImeRes->Depart));
  1013. DelSpace(lpImeRes->Depart);
  1014. if(lstrlen(lpImeRes->Depart) == 0)
  1015. {
  1016. ProcessError(ERR_GROUP, hDlg, WARNING);
  1017. return FALSE;
  1018. }
  1019. GetDlgItemText(hDlg, IDC_BMP, lpImeRes->BmpName, sizeof(lpImeRes->BmpName));
  1020. GetDlgItemText(hDlg, IDC_ICO, lpImeRes->IcoName, sizeof(lpImeRes->IcoName));
  1021. GetValue(hDlg, &(lpImeRes->Value));
  1022. return TRUE;
  1023. }