241 lines
6.3 KiB
C
241 lines
6.3 KiB
C
#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);
|
|
}
|