windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/multproc.c
2020-09-26 16:20:57 +08:00

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);
}