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

508 lines
15 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
#pragma hdrstop
/***************************************************************************/
/****************** Basic Class Dialog Handlers ****************************/
/***************************************************************************/
#define cchpMax 511
/*
** Purpose:
** Edit, Checkbox & MultiComboBox Dialog procedure.
**
*****************************************************************************/
INT_PTR APIENTRY FGstCombinationDlgProc (HWND hdlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam)
{
static WPARAM wSelStart = 0;
static WPARAM wSelEnd = 0;
CHP rgchNum[10];
CHP rgchText[cchpMax + 1];
CCHP cchp;
SZ sz, szListIn, szListOut;
RGSZ rgsz, rgszIn, rgszOut, rgszListIn;
PSZ psz, pszIn, pszOut, pszListIn;
LRESULT iItem;
WORD idc;
static BOOL fNotify[10];
INT i, nCount, nCurSel;
Unused(lParam);
switch (wMsg) {
case STF_REINITDIALOG:
if ((sz = SzFindSymbolValueInSymTab("ReInit")) == (SZ)NULL ||
(CrcStringCompareI(sz, "YES") != crcEqual)) {
return(fTrue);
}
case WM_INITDIALOG:
AssertDataSeg();
if( wMsg == WM_INITDIALOG ) {
FCenterDialogOnDesktop(hdlg);
}
// Initialise the edit box
// Find the limit on the edit box text
cchp = cchpMax;
if ((sz = SzFindSymbolValueInSymTab("EditTextLim")) != (SZ)NULL) {
cchp = (CCHP) atoi(sz);
}
SendDlgItemMessage(hdlg, IDC_EDIT1, EM_LIMITTEXT, cchp, 0L);
// Find the text limit
if ((sz = SzFindSymbolValueInSymTab("EditTextIn")) == (SZ)NULL) {
sz = "";
}
Assert(sz != NULL);
SetDlgItemText(hdlg, IDC_EDIT1, (LPSTR)sz);
// Find the focus string, default is END
cchp = strlen(sz);
if ((sz = SzFindSymbolValueInSymTab("EditFocus")) == (SZ)NULL) {
sz = "END";
}
wSelStart = (WPARAM)cchp;
wSelEnd = (WPARAM)cchp;
if (CrcStringCompare(sz, "END") == crcEqual) {
;
}
else if (CrcStringCompare(sz, "ALL") == crcEqual) {
wSelStart = 0;
wSelEnd = INT_MAX;
}
else if (CrcStringCompare(sz, "START") == crcEqual) {
wSelStart = 0;
wSelEnd = 0;
}
// Initialise the combo boxes
szListIn = SzFindSymbolValueInSymTab("ComboListItemsIn");
szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut");
if (szListIn == (SZ)NULL ||
szListOut == (SZ)NULL ) {
Assert(fFalse);
return(fTrue);
}
while ((pszIn = rgszIn = RgszFromSzListValue(szListIn)) == (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
while ((pszOut =rgszOut = RgszFromSzListValue(szListOut)) == (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
idc = IDC_COMBO1;
while (*pszIn != (SZ)NULL) {
Assert(*pszOut != (SZ)NULL);
if ((szListIn = SzFindSymbolValueInSymTab(*pszIn)) == (SZ)NULL)
{
Assert(fFalse);
EvalAssert(FFreeRgsz(rgszIn));
EvalAssert(FFreeRgsz(rgszOut));
return(fTrue);
}
while ((pszListIn = rgszListIn = RgszFromSzListValue(szListIn))
== (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
SendDlgItemMessage(hdlg, idc, CB_RESETCONTENT, 0, 0L);
while (*pszListIn != (SZ)NULL)
SendDlgItemMessage(hdlg, idc, CB_ADDSTRING, 0,
(LPARAM)*pszListIn++);
//
// Try to find out the item to select from the combo list.
//
// If there are no items, set nCurSel to -1 to clear the combo
// If there are items, however the ListOut variable either doesn't
// exist or is "" then set the nCurSel to 0 ( the first element )
// If the ListOut var exists and is found in the list box then
// set the nCurSel to the index of the element found
//
nCount = (INT)SendDlgItemMessage(hdlg, idc, CB_GETCOUNT, 0, 0L);
if ( nCount ) {
nCurSel = 0;
if ((szListOut = SzFindSymbolValueInSymTab(*pszOut)) != (SZ)NULL &&
CrcStringCompareI(szListOut, "") != crcEqual) {
CHP szItemCur[256];
for (i = 0; i < nCount; i++) {
if ( (SendDlgItemMessage(
hdlg,
idc,
CB_GETLBTEXT,
(WPARAM)i,
(LPARAM)szItemCur
) != CB_ERR)
&& (CrcStringCompareI(szItemCur, szListOut) == crcEqual)
) {
nCurSel = i;
break;
}
}
}
}
else {
nCurSel = -1;
}
SendDlgItemMessage(hdlg, idc, CB_SETCURSEL, (WPARAM)nCurSel, 0L);
EvalAssert(FFreeRgsz(rgszListIn));
idc++;
pszIn++;
pszOut++;
}
EvalAssert(FFreeRgsz(rgszIn));
EvalAssert(FFreeRgsz(rgszOut));
// Extract the information on which combo modifications should
// be modified
for (i = 0; i < 10; i++) {
fNotify[i] = fFalse;
}
if ((sz = SzFindSymbolValueInSymTab("NotifyFields")) != (SZ)NULL) {
while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
for (i = 0; (i < 10) && (*psz != (SZ) NULL); i++) {
fNotify[i] = (CrcStringCompareI(*(psz++), "YES") == crcEqual) ?
fTrue : fFalse;
}
EvalAssert(FFreeRgsz(rgsz));
}
//
// Handle all the text status fields in this dialog
//
if ((sz = SzFindSymbolValueInSymTab("TextFields")) != (SZ)NULL) {
WORD idcStatus;
while ((psz = rgsz = RgszFromSzListValue(sz)) == (RGSZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
idcStatus = IDC_TEXT1;
while (*psz != (SZ)NULL && GetDlgItem(hdlg, idcStatus)) {
SetDlgItemText (hdlg, idcStatus++,*psz++);
}
EvalAssert(FFreeRgsz(rgsz));
}
//
// Initialise the check boxes, note that check boxes are optional
//
if ((sz = SzFindSymbolValueInSymTab("CheckItemsIn")) == (SZ)NULL) {
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 (idc = LOWORD(wParam))
{
// Edit Box Notification
case IDC_EDIT1:
if (HIWORD(wParam) == EN_SETFOCUS)
SendDlgItemMessage(hdlg, IDC_EDIT1, EM_SETSEL, wSelStart,
wSelEnd);
else if (HIWORD(wParam) == EN_KILLFOCUS)
SendDlgItemMessage(hdlg, IDC_EDIT1, EM_GETSEL, (WPARAM)&wSelStart,
(LPARAM)&wSelEnd);
break;
// Check box Notification
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),
(WORD)!IsDlgButtonChecked(hdlg, (int)wParam));
break;
case IDC_COMBO1:
case IDC_COMBO2:
case IDC_COMBO3:
case IDC_COMBO4:
case IDC_COMBO5:
case IDC_COMBO6:
case IDC_COMBO7:
case IDC_COMBO8:
case IDC_COMBO9:
switch (HIWORD(wParam)) {
case CBN_SELCHANGE:
if (fNotify[idc-IDC_COMBO1] == fTrue) {
break;
}
default:
return fFalse;
}
// Other Buttons
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:
// Add the Button checked to the symbol table
_itoa((INT)wParam, rgchNum, 10);
while (!FAddSymbolValueToSymTab("ButtonPressed", rgchNum))
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
// Extract the text from the edit box and add it to the
// table
SendDlgItemMessage(hdlg, IDC_EDIT1, (WORD)WM_GETTEXT, cchpMax + 1,
(LPARAM)rgchText);
while (!FAddSymbolValueToSymTab("EditTextOut", rgchText))
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
// Extract the checkbox states.
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));
// Extract the selections in the combo boxes and add them to the
// symbol table
if ((szListOut = SzFindSymbolValueInSymTab("ComboListItemsOut"))
== (SZ)NULL)
{
Assert(fFalse);
break;
}
while ((pszOut = rgszOut = RgszFromSzListValue(szListOut))
== (RGSZ)NULL)
if (!FHandleOOM(hdlg))
{
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
idc = IDC_COMBO1;
while (*pszOut != (SZ)NULL) {
if ((iItem = SendDlgItemMessage(
hdlg,
idc,
CB_GETCURSEL,
0,
0L
)) == CB_ERR) {
*rgchText = '\0';
}
else {
SendDlgItemMessage(
hdlg,
idc,
CB_GETLBTEXT,
(WPARAM)iItem,
(LPARAM)rgchText
);
}
while (!FAddSymbolValueToSymTab(*pszOut, rgchText)) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
pszOut++;
idc++;
}
EvalAssert(FFreeRgsz(rgszOut));
PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L);
break;
}
break;
case STF_DESTROY_DLG:
PostMessage(GetParent(hdlg), (WORD)STF_MULTICOMBO_DLG_DESTROYED, 0, 0L);
DestroyWindow(hdlg);
return(fTrue);
}
return(fFalse);
}