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

264 lines
7.2 KiB
C

#include "precomp.h"
#pragma hdrstop
/***************************************************************************/
/****************** Basic Class Dialog Handlers ****************************/
/***************************************************************************/
#define cchpMax 511
/*
** Purpose:
** Multi Edit Dialog procedure for templates with multiple edit controls.
** Control IDs:
** The Edit controls must have IDs of IDC_EDIT1 to IDC_EDIT10.
** Pushbuttons recognized are IDC_O, IDC_C, IDC_M, IDC_H, IDC_X, and IDC_B.
** Initialization:
** The symbol $(EditTextIn) is used to set the initial text in the Edit
** controls. The symbol $(EditTextLim) is used to set the limit of the
** text in the edit fields.
** Termination:
** The strings in the Edit controls are stored in the symbol $(EditTextOut)
** 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
FGstMultiEditDlgProc(
HWND hdlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
CHP rgchNum[10];
CHP rgchText[cchpMax + 1];
RGSZ rgsz, rgszEditTextIn, rgszEditTextLim;
PSZ pszEditTextIn, pszEditTextLim;
SZ sz, szEditTextIn, szEditTextLim;
INT i, nCount, idc;
INT DefEditCtl;
BOOL NeedToSetFocus = FALSE;
Unused(lParam);
switch (wMsg) {
case STF_REINITDIALOG:
if ((sz = SzFindSymbolValueInSymTab("ReInit")) == (SZ)NULL ||
(CrcStringCompareI(sz, "YES") != crcEqual)) {
return(fTrue);
}
//
// See whether we are supposed to set the focus to a certain
// edit control.
//
if((sz = SzFindSymbolValueInSymTab("DefEditCtl")) != NULL) {
NeedToSetFocus = TRUE;
DefEditCtl = atoi(sz);
}
case WM_INITDIALOG:
AssertDataSeg();
FRemoveSymbolFromSymTab("DefEditCtl");
if( wMsg == WM_INITDIALOG ) {
FCenterDialogOnDesktop(hdlg);
}
//
// find the initalisers: EditTextIn, EditTextLim
//
szEditTextIn = SzFindSymbolValueInSymTab("EditTextIn");
szEditTextLim = SzFindSymbolValueInSymTab("EditTextLim");
if ( szEditTextIn == (SZ)NULL ||
szEditTextLim == (SZ)NULL ) {
Assert(fFalse);
return(fTrue);
}
//
// Convert initializers to rgsz structures
//
while ((pszEditTextIn = rgszEditTextIn = RgszFromSzListValue(szEditTextIn)) == (RGSZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
while ((pszEditTextLim = rgszEditTextLim = RgszFromSzListValue(szEditTextLim)) == (RGSZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
//
// Circulate through the initialisers: EditTextIn, EditTextLim
// in tandem, initialising the edit boxes that
// are there in this dialog
//
idc = IDC_EDIT1;
while ( (szEditTextIn = *pszEditTextIn++) != (SZ)NULL &&
(szEditTextLim = *pszEditTextLim++) != (SZ)NULL ) {
// First set the limit of the text in the edit field
SendDlgItemMessage(
hdlg,
idc,
EM_LIMITTEXT,
atoi(szEditTextLim),
0L
);
// And then set the text in the edit field
SetDlgItemText(hdlg, idc++, (LPSTR)szEditTextIn);
}
EvalAssert(FFreeRgsz(rgszEditTextIn));
EvalAssert(FFreeRgsz(rgszEditTextLim));
if(NeedToSetFocus) {
SetFocus(GetDlgItem(hdlg,IDC_EDIT1+DefEditCtl));
return(FALSE);
}
return(fTrue);
case WM_CLOSE:
PostMessage(
hdlg,
WM_COMMAND,
MAKELONG(IDC_X, BN_CLICKED),
0L
);
return(fTrue);
case WM_COMMAND:
switch(LOWORD(wParam)) {
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_C:
case IDC_B:
case IDC_O:
case IDC_M:
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 pressed to the symbol table
_itoa((INT)wParam, rgchNum, 10);
while (!FAddSymbolValueToSymTab("ButtonPressed", rgchNum)) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
// Add EditTextOut list variable to the symbol table
for (i = 0; i < 10; i++) {
if (GetDlgItem(hdlg, IDC_EDIT1 + i) == (HWND)NULL) {
break;
}
}
// i has the number of edit fields, allocate an rgsz structure
// with i+1 entries (last one NULL TERMINATOR)
nCount = i;
while ((rgsz = (RGSZ)SAlloc((CB)((nCount + 1) * sizeof(SZ))))
== (RGSZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
rgsz[nCount] = (SZ)NULL;
// Circulate through the edit fields in the dialog box, determining
// the text in each and storing it in the
for (i = 0; i < nCount; i++) {
SendDlgItemMessage(
hdlg,
IDC_EDIT1 + i,
(WORD)WM_GETTEXT,
cchpMax + 1,
(LPARAM)rgchText
);
rgsz[i] = SzDupl(rgchText);
}
// Form a list out of the rgsz structure
while ((sz = SzListValueFromRgsz(rgsz)) == (SZ)NULL) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
// Set the EditTextOut symbol to this list
while (!FAddSymbolValueToSymTab("EditTextOut", sz)) {
if (!FHandleOOM(hdlg)) {
DestroyWindow(GetParent(hdlg));
return(fTrue);
}
}
EvalAssert(FFreeRgsz(rgsz));
SFree(sz);
PostMessage(GetParent(hdlg), (WORD)STF_UI_EVENT, 0, 0L);
break;
}
break;
case STF_DESTROY_DLG:
PostMessage(GetParent(hdlg), (WORD)STF_EDIT_DLG_DESTROYED, 0, 0L);
DestroyWindow(hdlg);
return(fTrue);
}
return(fFalse);
}