#include "precomp.h" #pragma hdrstop /***************************************************************************/ /****************** Basic Class Dialog Handlers ****************************/ /***************************************************************************/ /* ** Purpose: ** Multiple Choice Listbox Dialog procedure for templates with exactly one ** listbox control. ** Control IDs: ** The Listbox control must have the id IDC_LIST1. Pushbuttons ** recognized are IDC_O, IDC_C, IDC_M, IDC_H, IDC_X, and IDC_B. ** Initialization: ** The symbol $(ListItemsIn) is a list of strings to insert into the ** listbox. The symbol $(ListItemOut) is a list of strings which for ** each that matches a string in $(ListItemsIn) it sets that item as ** selected. ** Termination: ** The selected items (if any) are stored as a list in the symbol ** $(ListItemsOut). The id of the Pushbutton (eg IDC_C) which caused ** termination is converted to a string and stored in the symbol ** $(ButtonPressed). ** *****************************************************************************/ INT_PTR APIENTRY FGstMultiDlgProc(HWND hdlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { CHP rgchNum[10]; INT i, nCount; RGSZ rgsz, rgszSel; PSZ psz, pszSel; SZ szList; CHP szItemCur[256]; UINT iItemTop; Unused(lParam); switch (wMsg) { case WM_INITDIALOG: AssertDataSeg(); if( wMsg == WM_INITDIALOG ) { FCenterDialogOnDesktop(hdlg); } if ((szList = SzFindSymbolValueInSymTab("ListItemsIn")) == (SZ)NULL) { Assert(fFalse); return(fTrue); } while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } nCount = 0; while (*psz) { SendDlgItemMessage(hdlg, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)*psz++); nCount++; } Assert(nCount == (INT)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT, 0, 0L)); // // Find out the items in the multi list box to select // if ((szList = SzFindSymbolValueInSymTab("ListItemsOut")) == (SZ)NULL) { EvalAssert(FFreeRgsz(rgsz)); return(fTrue); } while ((pszSel = rgszSel = RgszFromSzListValue(szList)) == (RGSZ)NULL) if (!FHandleOOM(hdlg)) { EvalAssert(FFreeRgsz(rgsz)); DestroyWindow(GetParent(hdlg)); return(fTrue); } iItemTop = 0; for (i = 0; i < nCount; i++) { CHP szItemCur[256]; if ( (SendDlgItemMessage( hdlg, IDC_LIST1, LB_GETTEXT, (WPARAM)i, (LPARAM)szItemCur ) != LB_ERR) ) { psz = pszSel; while ( *psz ) { if (CrcStringCompareI(*psz++, szItemCur) == crcEqual) { EvalAssert(SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, 1, MAKELONG(i, 0)) != LB_ERR); if (iItemTop == 0 || i < (INT)iItemTop) { iItemTop = i; } break; } } } } EvalAssert(FFreeRgsz(rgsz)); EvalAssert(FFreeRgsz(rgszSel)); /* REVIEW KLUDGE no way to find out how many lines in the listbox? */ if (iItemTop < 4) iItemTop = 0; SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETTOPINDEX, iItemTop, 0L); return(fTrue); case STF_REINITDIALOG: return(fTrue); case WM_CLOSE: PostMessage( hdlg, WM_COMMAND, MAKELONG(IDC_X, BN_CLICKED), 0L ); return(fTrue); case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_S: case IDC_L: SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, (LOWORD(wParam) == IDC_S), -1L); break; case IDCANCEL: if (LOWORD(wParam) == IDCANCEL) { if (!GetDlgItem(hdlg, IDC_B) || HIWORD(GetKeyState(VK_CONTROL)) || HIWORD(GetKeyState(VK_SHIFT)) || HIWORD(GetKeyState(VK_MENU))) { break; } wParam = IDC_B; } case IDC_O: case IDC_C: case IDC_M: case IDC_X: case IDC_B: case IDC_BTN0: case IDC_BTN1: case IDC_BTN2: case IDC_BTN3: case IDC_BTN4: case IDC_BTN5: case IDC_BTN6: case IDC_BTN7: case IDC_BTN8: case IDC_BTN9: _itoa((INT)wParam, rgchNum, 10); while (!FAddSymbolValueToSymTab("ButtonPressed", rgchNum)) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } nCount = (INT)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETSELCOUNT, 0, 0L); while ((psz = rgsz = (RGSZ)SAlloc((CB)((nCount + 1) * sizeof(SZ)))) == (RGSZ)NULL) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } rgsz[nCount] = (SZ)NULL; /* REVIEW would be faster to use LB_GETSELITEMS */ nCount = (INT)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT, 0, 0L); for (i = 0; i < nCount; i++) { if (SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETSEL, (WORD)i, 0L)) { EvalAssert(SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETTEXT, (WPARAM)i, (LPARAM)szItemCur) != LB_ERR); while ((*psz = SzDupl(szItemCur)) == (SZ)NULL) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } psz++; } } while ((szList = SzListValueFromRgsz(rgsz)) == (SZ)NULL) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } while (!FAddSymbolValueToSymTab("ListItemsOut", szList)) if (!FHandleOOM(hdlg)) { DestroyWindow(GetParent(hdlg)); return(fTrue); } SFree(szList); FFreeRgsz(rgsz); PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L); break; } break; case STF_DESTROY_DLG: PostMessage(GetParent(hdlg), (WORD)STF_MULTI_DLG_DESTROYED, 0, 0L); DestroyWindow(hdlg); return(fTrue); } return(fFalse); }