windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/chckproc.c

219 lines
6.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
#pragma hdrstop
/***************************************************************************/
/****************** Basic Class Dialog Handlers ****************************/
/***************************************************************************/
/*
** Purpose:
** CheckBox Dialog procedure for templates with one to ten checkbox
** controls.
** Control IDs:
** The Checkbox controls must have sequential ids starting with IDC_B1
** and working up to a maximum of IDC_B10.
** Pushbuttons recognized are IDC_O, IDC_C, IDC_M, IDC_H, IDC_X, and IDC_B.
** Initialization:
** The symbol $(CheckItemsIn) is evaluated as a list of elements of
** either 'ON' or 'OFF'. So examples for a template with four
** checkbox controls would include {ON, ON, ON, ON},
** {ON, OFF, ON, OFF} and {OFF, OFF, OFF, OFF}. These elements
** determine if the initial state of the corresponding checkbox
** control is checked (ON) or unchecked (OFF). If there are more
** controls than elements, the extra controls will be initialized
** as unchecked. If there are more elements than controls, the
** extra elements are ignored.
** The symbol $(OptionsGreyed) is evaluated as a list of indexes
** (one-based) of check boxes to be disabled (greyed). Default is
** none.
** Termination:
** The state of each checkbox is queried and a list with the same format
** as the initialization list is created and stored in the symbol
** $(CheckItemsOut).
** 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 FGstCheckDlgProc(HWND hdlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam)
{
CHP rgchNum[10];
WORD idc;
RGSZ rgsz;
PSZ psz;
SZ sz;
Unused(lParam);
switch (wMsg) {
case STF_REINITDIALOG:
return(fTrue);
case WM_INITDIALOG:
AssertDataSeg();
if( wMsg == WM_INITDIALOG ) {
FCenterDialogOnDesktop(hdlg);
}
if ((sz = SzFindSymbolValueInSymTab("CheckItemsIn")) == (SZ)NULL)
{
PreCondition(fFalse, fTrue);
return(fTrue);
}
while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
idc = IDC_B1;
while (*psz != (SZ)NULL)
{
WORD wCheck = 0;
if (CrcStringCompare(*(psz++), "ON") == crcEqual)
wCheck = 1;
CheckDlgButton(hdlg, idc++, wCheck);
}
EvalAssert(FFreeRgsz(rgsz));
if ((sz = SzFindSymbolValueInSymTab("OptionsGreyed")) == (SZ)NULL)
{
PreCondition(fFalse, fTrue);
return(fTrue);
}
while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
while (*psz != (SZ)NULL)
{
SZ sz = *(psz++);
INT i = atoi(sz);
if (i > 0 && i <= 10)
EnableWindow(GetDlgItem(hdlg, IDC_B0 + i), 0);
else if (*sz != '\0')
PreCondition(fFalse, fTrue);
}
EvalAssert(FFreeRgsz(rgsz));
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_B1:
case IDC_B2:
case IDC_B3:
case IDC_B4:
case IDC_B5:
case IDC_B6:
case IDC_B7:
case IDC_B8:
case IDC_B9:
case IDC_B10:
CheckDlgButton(hdlg, LOWORD(wParam),
(UINT)!IsDlgButtonChecked(hdlg, (UINT)wParam));
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_B:
case IDC_X:
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);
}
while ((psz = rgsz = (RGSZ)SAlloc((CB)(11 * sizeof(SZ)))) ==
(RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
for (idc = IDC_B1; GetDlgItem(hdlg, idc); psz++, idc++)
{
BOOL fChecked = IsDlgButtonChecked(hdlg, idc);
while ((*psz = SzDupl(fChecked ? "ON" : "OFF")) == (SZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
*psz = (SZ)NULL;
while ((sz = SzListValueFromRgsz(rgsz)) == (SZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
while (!FAddSymbolValueToSymTab("CheckItemsOut", sz))
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
SFree(sz);
EvalAssert(FFreeRgsz(rgsz));
PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L);
break;
}
break;
case STF_DESTROY_DLG:
PostMessage(GetParent(hdlg), (WORD)STF_CHECK_DLG_DESTROYED, 0, 0L);
DestroyWindow(hdlg);
return(fTrue);
}
return(fFalse);
}