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.

507 lines
15 KiB

  1. #include "precomp.h"
  2. #pragma hdrstop
  3. /***************************************************************************/
  4. /****************** Basic Class Dialog Handlers ****************************/
  5. /***************************************************************************/
  6. #define cchpMax 511
  7. /*
  8. ** Purpose:
  9. ** Edit, Checkbox & MultiComboBox Dialog procedure.
  10. **
  11. *****************************************************************************/
  12. INT_PTR APIENTRY FGstCombinationDlgProc (HWND hdlg,
  13. UINT wMsg,
  14. WPARAM wParam,
  15. LPARAM lParam)
  16. {
  17. static WPARAM wSelStart = 0;
  18. static WPARAM wSelEnd = 0;
  19. CHP rgchNum[10];
  20. CHP rgchText[cchpMax + 1];
  21. CCHP cchp;
  22. SZ sz, szListIn, szListOut;
  23. RGSZ rgsz, rgszIn, rgszOut, rgszListIn;
  24. PSZ psz, pszIn, pszOut, pszListIn;
  25. LRESULT iItem;
  26. WORD idc;
  27. static BOOL fNotify[10];
  28. INT i, nCount, nCurSel;
  29. Unused(lParam);
  30. switch (wMsg) {
  31. case STF_REINITDIALOG:
  32. if ((sz = SzFindSymbolValueInSymTab("ReInit")) == (SZ)NULL ||
  33. (CrcStringCompareI(sz, "YES") != crcEqual)) {
  34. return(fTrue);
  35. }
  36. case WM_INITDIALOG:
  37. AssertDataSeg();
  38. if( wMsg == WM_INITDIALOG ) {
  39. FCenterDialogOnDesktop(hdlg);
  40. }
  41. // Initialise the edit box
  42. // Find the limit on the edit box text
  43. cchp = cchpMax;
  44. if ((sz = SzFindSymbolValueInSymTab("EditTextLim")) != (SZ)NULL) {
  45. cchp = (CCHP) atoi(sz);
  46. }
  47. SendDlgItemMessage(hdlg, IDC_EDIT1, EM_LIMITTEXT, cchp, 0L);
  48. // Find the text limit
  49. if ((sz = SzFindSymbolValueInSymTab("EditTextIn")) == (SZ)NULL) {
  50. sz = "";
  51. }
  52. Assert(sz != NULL);
  53. SetDlgItemText(hdlg, IDC_EDIT1, (LPSTR)sz);
  54. // Find the focus string, default is END
  55. cchp = strlen(sz);
  56. if ((sz = SzFindSymbolValueInSymTab("EditFocus")) == (SZ)NULL) {
  57. sz = "END";
  58. }
  59. wSelStart = (WPARAM)cchp;
  60. wSelEnd = (WPARAM)cchp;
  61. if (CrcStringCompare(sz, "END") == crcEqual) {
  62. ;
  63. }
  64. else if (CrcStringCompare(sz, "ALL") == crcEqual) {
  65. wSelStart = 0;
  66. wSelEnd = INT_MAX;
  67. }
  68. else if (CrcStringCompare(sz, "START") == crcEqual) {
  69. wSelStart = 0;
  70. wSelEnd = 0;
  71. }
  72. // Initialise the combo boxes
  73. szListIn = SzFindSymbolValueInSymTab("ComboListItemsIn");
  74. szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut");
  75. if (szListIn == (SZ)NULL ||
  76. szListOut == (SZ)NULL ) {
  77. Assert(fFalse);
  78. return(fTrue);
  79. }
  80. while ((pszIn = rgszIn = RgszFromSzListValue(szListIn)) == (RGSZ)NULL)
  81. if (!FHandleOOM(hdlg))
  82. {
  83. DestroyWindow(GetParent(hdlg));
  84. return(fTrue);
  85. }
  86. while ((pszOut =rgszOut = RgszFromSzListValue(szListOut)) == (RGSZ)NULL)
  87. if (!FHandleOOM(hdlg))
  88. {
  89. DestroyWindow(GetParent(hdlg));
  90. return(fTrue);
  91. }
  92. idc = IDC_COMBO1;
  93. while (*pszIn != (SZ)NULL) {
  94. Assert(*pszOut != (SZ)NULL);
  95. if ((szListIn = SzFindSymbolValueInSymTab(*pszIn)) == (SZ)NULL)
  96. {
  97. Assert(fFalse);
  98. EvalAssert(FFreeRgsz(rgszIn));
  99. EvalAssert(FFreeRgsz(rgszOut));
  100. return(fTrue);
  101. }
  102. while ((pszListIn = rgszListIn = RgszFromSzListValue(szListIn))
  103. == (RGSZ)NULL)
  104. if (!FHandleOOM(hdlg))
  105. {
  106. DestroyWindow(GetParent(hdlg));
  107. return(fTrue);
  108. }
  109. SendDlgItemMessage(hdlg, idc, CB_RESETCONTENT, 0, 0L);
  110. while (*pszListIn != (SZ)NULL)
  111. SendDlgItemMessage(hdlg, idc, CB_ADDSTRING, 0,
  112. (LPARAM)*pszListIn++);
  113. //
  114. // Try to find out the item to select from the combo list.
  115. //
  116. // If there are no items, set nCurSel to -1 to clear the combo
  117. // If there are items, however the ListOut variable either doesn't
  118. // exist or is "" then set the nCurSel to 0 ( the first element )
  119. // If the ListOut var exists and is found in the list box then
  120. // set the nCurSel to the index of the element found
  121. //
  122. nCount = (INT)SendDlgItemMessage(hdlg, idc, CB_GETCOUNT, 0, 0L);
  123. if ( nCount ) {
  124. nCurSel = 0;
  125. if ((szListOut = SzFindSymbolValueInSymTab(*pszOut)) != (SZ)NULL &&
  126. CrcStringCompareI(szListOut, "") != crcEqual) {
  127. CHP szItemCur[256];
  128. for (i = 0; i < nCount; i++) {
  129. if ( (SendDlgItemMessage(
  130. hdlg,
  131. idc,
  132. CB_GETLBTEXT,
  133. (WPARAM)i,
  134. (LPARAM)szItemCur
  135. ) != CB_ERR)
  136. && (CrcStringCompareI(szItemCur, szListOut) == crcEqual)
  137. ) {
  138. nCurSel = i;
  139. break;
  140. }
  141. }
  142. }
  143. }
  144. else {
  145. nCurSel = -1;
  146. }
  147. SendDlgItemMessage(hdlg, idc, CB_SETCURSEL, (WPARAM)nCurSel, 0L);
  148. EvalAssert(FFreeRgsz(rgszListIn));
  149. idc++;
  150. pszIn++;
  151. pszOut++;
  152. }
  153. EvalAssert(FFreeRgsz(rgszIn));
  154. EvalAssert(FFreeRgsz(rgszOut));
  155. // Extract the information on which combo modifications should
  156. // be modified
  157. for (i = 0; i < 10; i++) {
  158. fNotify[i] = fFalse;
  159. }
  160. if ((sz = SzFindSymbolValueInSymTab("NotifyFields")) != (SZ)NULL) {
  161. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
  162. if (!FHandleOOM(hdlg)) {
  163. DestroyWindow(GetParent(hdlg));
  164. return(fTrue);
  165. }
  166. }
  167. for (i = 0; (i < 10) && (*psz != (SZ) NULL); i++) {
  168. fNotify[i] = (CrcStringCompareI(*(psz++), "YES") == crcEqual) ?
  169. fTrue : fFalse;
  170. }
  171. EvalAssert(FFreeRgsz(rgsz));
  172. }
  173. //
  174. // Handle all the text status fields in this dialog
  175. //
  176. if ((sz = SzFindSymbolValueInSymTab("TextFields")) != (SZ)NULL) {
  177. WORD idcStatus;
  178. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
  179. if (!FHandleOOM(hdlg)) {
  180. DestroyWindow(GetParent(hdlg));
  181. return(fTrue);
  182. }
  183. }
  184. idcStatus = IDC_TEXT1;
  185. while (*psz != (SZ)NULL && GetDlgItem(hdlg, idcStatus)) {
  186. SetDlgItemText (hdlg, idcStatus++,*psz++);
  187. }
  188. EvalAssert(FFreeRgsz(rgsz));
  189. }
  190. //
  191. // Initialise the check boxes, note that check boxes are optional
  192. //
  193. if ((sz = SzFindSymbolValueInSymTab("CheckItemsIn")) == (SZ)NULL) {
  194. return(fTrue);
  195. }
  196. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
  197. if (!FHandleOOM(hdlg)) {
  198. DestroyWindow(GetParent(hdlg));
  199. return(fTrue);
  200. }
  201. }
  202. idc = IDC_B1;
  203. while (*psz != (SZ)NULL)
  204. {
  205. WORD wCheck = 0;
  206. if (CrcStringCompare(*(psz++), "ON") == crcEqual)
  207. wCheck = 1;
  208. CheckDlgButton(hdlg, idc++, wCheck);
  209. }
  210. EvalAssert(FFreeRgsz(rgsz));
  211. if ((sz = SzFindSymbolValueInSymTab("OptionsGreyed")) == (SZ)NULL)
  212. {
  213. PreCondition(fFalse, fTrue);
  214. return(fTrue);
  215. }
  216. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL)
  217. if (!FHandleOOM(hdlg))
  218. {
  219. DestroyWindow(GetParent(hdlg));
  220. return(fTrue);
  221. }
  222. while (*psz != (SZ)NULL)
  223. {
  224. SZ sz = *(psz++);
  225. INT i = atoi(sz);
  226. if (i > 0 && i <= 10)
  227. EnableWindow(GetDlgItem(hdlg, IDC_B0 + i), 0);
  228. else if (*sz != '\0')
  229. PreCondition(fFalse, fTrue);
  230. }
  231. EvalAssert(FFreeRgsz(rgsz));
  232. return(fTrue);
  233. case WM_CLOSE:
  234. PostMessage(
  235. hdlg,
  236. WM_COMMAND,
  237. MAKELONG(IDC_X, BN_CLICKED),
  238. 0L
  239. );
  240. return(fTrue);
  241. case WM_COMMAND:
  242. switch (idc = LOWORD(wParam))
  243. {
  244. // Edit Box Notification
  245. case IDC_EDIT1:
  246. if (HIWORD(wParam) == EN_SETFOCUS)
  247. SendDlgItemMessage(hdlg, IDC_EDIT1, EM_SETSEL, wSelStart,
  248. wSelEnd);
  249. else if (HIWORD(wParam) == EN_KILLFOCUS)
  250. SendDlgItemMessage(hdlg, IDC_EDIT1, EM_GETSEL, (WPARAM)&wSelStart,
  251. (LPARAM)&wSelEnd);
  252. break;
  253. // Check box Notification
  254. case IDC_B1:
  255. case IDC_B2:
  256. case IDC_B3:
  257. case IDC_B4:
  258. case IDC_B5:
  259. case IDC_B6:
  260. case IDC_B7:
  261. case IDC_B8:
  262. case IDC_B9:
  263. case IDC_B10:
  264. CheckDlgButton(hdlg, LOWORD(wParam),
  265. (WORD)!IsDlgButtonChecked(hdlg, (int)wParam));
  266. break;
  267. case IDC_COMBO1:
  268. case IDC_COMBO2:
  269. case IDC_COMBO3:
  270. case IDC_COMBO4:
  271. case IDC_COMBO5:
  272. case IDC_COMBO6:
  273. case IDC_COMBO7:
  274. case IDC_COMBO8:
  275. case IDC_COMBO9:
  276. switch (HIWORD(wParam)) {
  277. case CBN_SELCHANGE:
  278. if (fNotify[idc-IDC_COMBO1] == fTrue) {
  279. break;
  280. }
  281. default:
  282. return fFalse;
  283. }
  284. // Other Buttons
  285. case IDCANCEL:
  286. if (LOWORD(wParam) == IDCANCEL) {
  287. if (!GetDlgItem(hdlg, IDC_B) || HIWORD(GetKeyState(VK_CONTROL)) || HIWORD(GetKeyState(VK_SHIFT)) || HIWORD(GetKeyState(VK_MENU)))
  288. {
  289. break;
  290. }
  291. wParam = IDC_B;
  292. }
  293. case IDC_O:
  294. case IDC_C:
  295. case IDC_M:
  296. case IDC_B:
  297. case IDC_X:
  298. case IDC_BTN0:
  299. case IDC_BTN1: case IDC_BTN2: case IDC_BTN3:
  300. case IDC_BTN4: case IDC_BTN5: case IDC_BTN6:
  301. case IDC_BTN7: case IDC_BTN8: case IDC_BTN9:
  302. // Add the Button checked to the symbol table
  303. _itoa((INT)wParam, rgchNum, 10);
  304. while (!FAddSymbolValueToSymTab("ButtonPressed", rgchNum))
  305. if (!FHandleOOM(hdlg)) {
  306. DestroyWindow(GetParent(hdlg));
  307. return(fTrue);
  308. }
  309. // Extract the text from the edit box and add it to the
  310. // table
  311. SendDlgItemMessage(hdlg, IDC_EDIT1, (WORD)WM_GETTEXT, cchpMax + 1,
  312. (LPARAM)rgchText);
  313. while (!FAddSymbolValueToSymTab("EditTextOut", rgchText))
  314. if (!FHandleOOM(hdlg))
  315. {
  316. DestroyWindow(GetParent(hdlg));
  317. return(fTrue);
  318. }
  319. // Extract the checkbox states.
  320. while ((psz = rgsz = (RGSZ)SAlloc((CB)(11 * sizeof(SZ)))) ==
  321. (RGSZ)NULL)
  322. if (!FHandleOOM(hdlg)) {
  323. DestroyWindow(GetParent(hdlg));
  324. return(fTrue);
  325. }
  326. for (idc = IDC_B1; GetDlgItem(hdlg, idc); psz++, idc++) {
  327. BOOL fChecked = IsDlgButtonChecked(hdlg, idc);
  328. while ((*psz = SzDupl(fChecked ? "ON" : "OFF")) == (SZ)NULL) {
  329. if (!FHandleOOM(hdlg)) {
  330. DestroyWindow(GetParent(hdlg));
  331. return(fTrue);
  332. }
  333. }
  334. }
  335. *psz = (SZ)NULL;
  336. while ((sz = SzListValueFromRgsz(rgsz)) == (SZ)NULL) {
  337. if (!FHandleOOM(hdlg)) {
  338. DestroyWindow(GetParent(hdlg));
  339. return(fTrue);
  340. }
  341. }
  342. while (!FAddSymbolValueToSymTab("CheckItemsOut", sz)) {
  343. if (!FHandleOOM(hdlg)) {
  344. DestroyWindow(GetParent(hdlg));
  345. return(fTrue);
  346. }
  347. }
  348. SFree(sz);
  349. EvalAssert(FFreeRgsz(rgsz));
  350. // Extract the selections in the combo boxes and add them to the
  351. // symbol table
  352. if ((szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut"))
  353. == (SZ)NULL)
  354. {
  355. Assert(fFalse);
  356. break;
  357. }
  358. while ((pszOut = rgszOut = RgszFromSzListValue(szListOut))
  359. == (RGSZ)NULL)
  360. if (!FHandleOOM(hdlg))
  361. {
  362. DestroyWindow(GetParent(hdlg));
  363. return(fTrue);
  364. }
  365. idc = IDC_COMBO1;
  366. while (*pszOut != (SZ)NULL) {
  367. if ((iItem = SendDlgItemMessage(
  368. hdlg,
  369. idc,
  370. CB_GETCURSEL,
  371. 0,
  372. 0L
  373. )) == CB_ERR) {
  374. *rgchText = '\0';
  375. }
  376. else {
  377. SendDlgItemMessage(
  378. hdlg,
  379. idc,
  380. CB_GETLBTEXT,
  381. (WPARAM)iItem,
  382. (LPARAM)rgchText
  383. );
  384. }
  385. while (!FAddSymbolValueToSymTab(*pszOut, rgchText)) {
  386. if (!FHandleOOM(hdlg)) {
  387. DestroyWindow(GetParent(hdlg));
  388. return(fTrue);
  389. }
  390. }
  391. pszOut++;
  392. idc++;
  393. }
  394. EvalAssert(FFreeRgsz(rgszOut));
  395. PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L);
  396. break;
  397. }
  398. break;
  399. case STF_DESTROY_DLG:
  400. PostMessage(GetParent(hdlg), (WORD)STF_MULTICOMBO_DLG_DESTROYED, 0, 0L);
  401. DestroyWindow(hdlg);
  402. return(fTrue);
  403. }
  404. return(fFalse);
  405. }