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.

290 lines
8.8 KiB

  1. #include "precomp.h"
  2. #pragma hdrstop
  3. /***************************************************************************/
  4. /****************** Basic Class Dialog Handlers ****************************/
  5. /***************************************************************************/
  6. /*
  7. ** Purpose:
  8. ** ComboBox Dialog procedure.
  9. **
  10. *****************************************************************************/
  11. INT_PTR APIENTRY FGstMultiComboDlgProc(HWND hdlg,
  12. UINT wMsg,
  13. WPARAM wParam,
  14. LPARAM lParam)
  15. {
  16. CHP rgchNum[10];
  17. CHP szBuffer[256];
  18. SZ sz, szListIn, szListOut;
  19. RGSZ rgsz, rgszIn, rgszOut, rgszListIn;
  20. PSZ psz, pszIn, pszOut, pszListIn;
  21. UINT iItem;
  22. WORD idc;
  23. INT i, nCount, nCurSel;
  24. static BOOL fNotify[10];
  25. Unused(lParam);
  26. switch (wMsg)
  27. {
  28. case STF_REINITDIALOG:
  29. if ((sz = SzFindSymbolValueInSymTab("ReInit")) == (SZ)NULL ||
  30. (CrcStringCompareI(sz, "YES") != crcEqual))
  31. return(fTrue);
  32. case WM_INITDIALOG:
  33. AssertDataSeg();
  34. if( wMsg == WM_INITDIALOG ) {
  35. FCenterDialogOnDesktop(hdlg);
  36. }
  37. szListIn = SzFindSymbolValueInSymTab("ComboListItemsIn");
  38. szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut");
  39. if (szListIn == (SZ)NULL ||
  40. szListOut == (SZ)NULL)
  41. {
  42. Assert(fFalse);
  43. return(fTrue);
  44. }
  45. while ((pszIn = rgszIn = RgszFromSzListValue(szListIn)) == (RGSZ)NULL)
  46. if (!FHandleOOM(hdlg))
  47. {
  48. DestroyWindow(GetParent(hdlg));
  49. return(fTrue);
  50. }
  51. while ((pszOut =rgszOut = RgszFromSzListValue(szListOut)) == (RGSZ)NULL) {
  52. if (!FHandleOOM(hdlg)) {
  53. DestroyWindow(GetParent(hdlg));
  54. return(fTrue);
  55. }
  56. }
  57. idc = IDC_COMBO1;
  58. while (*pszIn != (SZ)NULL) {
  59. Assert(*pszOut != (SZ)NULL);
  60. if ((szListIn = SzFindSymbolValueInSymTab(*pszIn)) == (SZ)NULL) {
  61. Assert(fFalse);
  62. EvalAssert(FFreeRgsz(rgszIn));
  63. EvalAssert(FFreeRgsz(rgszOut));
  64. return(fTrue);
  65. }
  66. while ((pszListIn = rgszListIn = RgszFromSzListValue(szListIn))
  67. == (RGSZ)NULL) {
  68. if (!FHandleOOM(hdlg)) {
  69. DestroyWindow(GetParent(hdlg));
  70. return(fTrue);
  71. }
  72. }
  73. SendDlgItemMessage(hdlg, idc, CB_RESETCONTENT, 0, 0L);
  74. while (*pszListIn != (SZ)NULL) {
  75. SendDlgItemMessage(hdlg, idc, CB_ADDSTRING, 0,
  76. (LPARAM)*pszListIn++);
  77. }
  78. //
  79. // Try to find out the item to select from the combo list.
  80. //
  81. // If there are no items, set nCurSel to -1 to clear the combo
  82. // If there are items, however the ListOut variable either doesn't
  83. // exist or is "" then set the nCurSel to 0 ( the first element )
  84. // If the ListOut var exists and is found in the list box then
  85. // set the nCurSel to the index of the element found
  86. //
  87. nCount = (INT)SendDlgItemMessage(hdlg, idc, CB_GETCOUNT, 0, 0L);
  88. if ( nCount ) {
  89. nCurSel = 0;
  90. if ((szListOut = SzFindSymbolValueInSymTab(*pszOut)) != (SZ)NULL &&
  91. CrcStringCompareI(szListOut, "") != crcEqual) {
  92. CHP szItemCur[256];
  93. for (i = 0; i < nCount; i++) {
  94. if ( (SendDlgItemMessage(
  95. hdlg,
  96. idc,
  97. CB_GETLBTEXT,
  98. (WPARAM)i,
  99. (LPARAM)szItemCur
  100. ) != CB_ERR)
  101. && (CrcStringCompareI(szItemCur, szListOut) == crcEqual)
  102. ) {
  103. nCurSel = i;
  104. break;
  105. }
  106. }
  107. }
  108. }
  109. else {
  110. nCurSel = -1;
  111. }
  112. SendDlgItemMessage(hdlg, idc, CB_SETCURSEL, (WPARAM)nCurSel, 0L);
  113. EvalAssert(FFreeRgsz(rgszListIn));
  114. idc++;
  115. pszIn++;
  116. pszOut++;
  117. }
  118. EvalAssert(FFreeRgsz(rgszIn));
  119. EvalAssert(FFreeRgsz(rgszOut));
  120. // Extract the information on which combo modifications should
  121. // be modified
  122. for (i = 0; i < 10; i++) {
  123. fNotify[i] = fFalse;
  124. }
  125. if ((sz = SzFindSymbolValueInSymTab("NotifyFields")) != (SZ)NULL) {
  126. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
  127. if (!FHandleOOM(hdlg)) {
  128. DestroyWindow(GetParent(hdlg));
  129. return(fTrue);
  130. }
  131. }
  132. for (i = 0; (i < 10) && (*psz != (SZ) NULL); i++) {
  133. fNotify[i] = (CrcStringCompareI(*(psz++), "YES") == crcEqual) ?
  134. fTrue : fFalse;
  135. }
  136. EvalAssert(FFreeRgsz(rgsz));
  137. }
  138. // Handle all the text status fields in this dialog
  139. if ((sz = SzFindSymbolValueInSymTab("TextFields")) != (SZ)NULL)
  140. {
  141. WORD idcStatus;
  142. while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL)
  143. if (!FHandleOOM(hdlg))
  144. {
  145. DestroyWindow(GetParent(hdlg));
  146. return(fTrue);
  147. }
  148. idcStatus = IDC_TEXT1;
  149. while (*psz != (SZ)NULL && GetDlgItem(hdlg, idcStatus))
  150. SetDlgItemText (hdlg, idcStatus++,*psz++);
  151. EvalAssert(FFreeRgsz(rgsz));
  152. }
  153. return(fTrue);
  154. case WM_CLOSE:
  155. PostMessage(
  156. hdlg,
  157. WM_COMMAND,
  158. MAKELONG(IDC_X, BN_CLICKED),
  159. 0L
  160. );
  161. return(fTrue);
  162. case WM_COMMAND:
  163. switch (idc = LOWORD(wParam)) {
  164. case IDC_COMBO1:
  165. case IDC_COMBO2:
  166. case IDC_COMBO3:
  167. case IDC_COMBO4:
  168. case IDC_COMBO5:
  169. case IDC_COMBO6:
  170. case IDC_COMBO7:
  171. case IDC_COMBO8:
  172. case IDC_COMBO9:
  173. switch (HIWORD(wParam)) {
  174. case CBN_SELCHANGE:
  175. if (fNotify[idc-IDC_COMBO1] == fTrue)
  176. break;
  177. default:
  178. return fFalse;
  179. }
  180. case IDCANCEL:
  181. if (LOWORD(wParam) == IDCANCEL) {
  182. if (!GetDlgItem(hdlg, IDC_B) || HIWORD(GetKeyState(VK_CONTROL)) || HIWORD(GetKeyState(VK_SHIFT)) || HIWORD(GetKeyState(VK_MENU)))
  183. {
  184. break;
  185. }
  186. wParam = IDC_B;
  187. }
  188. case IDC_O:
  189. case IDC_C:
  190. case IDC_M:
  191. case IDC_X:
  192. case IDC_B:
  193. case IDC_BTN0:
  194. case IDC_BTN1: case IDC_BTN2: case IDC_BTN3:
  195. case IDC_BTN4: case IDC_BTN5: case IDC_BTN6:
  196. case IDC_BTN7: case IDC_BTN8: case IDC_BTN9:
  197. _itoa((INT)wParam, rgchNum, 10);
  198. while (!FAddSymbolValueToSymTab("ButtonPressed", rgchNum))
  199. if (!FHandleOOM(hdlg)) {
  200. DestroyWindow(GetParent(hdlg));
  201. return(fTrue);
  202. }
  203. if ((szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut"))
  204. == (SZ)NULL) {
  205. Assert(fFalse);
  206. break;
  207. }
  208. while ((pszOut = rgszOut = RgszFromSzListValue(szListOut))
  209. == (RGSZ)NULL)
  210. if (!FHandleOOM(hdlg))
  211. {
  212. DestroyWindow(GetParent(hdlg));
  213. return(fTrue);
  214. }
  215. idc = IDC_COMBO1;
  216. while (*pszOut != (SZ)NULL)
  217. {
  218. if( GetWindowText( GetDlgItem( hdlg, idc ),
  219. (LPSTR)szBuffer,
  220. sizeof( szBuffer ) ) == 0 ) {
  221. *szBuffer = '\0';
  222. }
  223. while (!FAddSymbolValueToSymTab(*pszOut, szBuffer))
  224. if (!FHandleOOM(hdlg))
  225. {
  226. DestroyWindow(GetParent(hdlg));
  227. return(fTrue);
  228. }
  229. pszOut++;
  230. idc++;
  231. }
  232. EvalAssert(FFreeRgsz(rgszOut));
  233. PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L);
  234. break;
  235. }
  236. break;
  237. case STF_DESTROY_DLG:
  238. PostMessage(GetParent(hdlg), (WORD)STF_MULTICOMBO_DLG_DESTROYED, 0, 0L);
  239. DestroyWindow(hdlg);
  240. return(fTrue);
  241. }
  242. return(fFalse);
  243. }