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

534 lines
13 KiB
C

#include "precomp.h"
#pragma hdrstop
/*************************************************************************/
/***** Custom User Interface Library Sample ******************************/
/*************************************************************************/
DLGMP DialogMap[] =
{
(SZ)"Info", (WNDPROC)FGstInfoDlgProc, (PFNEVENT)NULL,
(SZ)"Edit", (WNDPROC)FGstEditDlgProc, (PFNEVENT)NULL,
(SZ)"MultiEdit", (WNDPROC)FGstMultiEditDlgProc, (PFNEVENT)NULL,
(SZ)"Check", (WNDPROC)FGstCheckDlgProc, (PFNEVENT)NULL,
(SZ)"Check1", (WNDPROC)FGstCheck1DlgProc, (PFNEVENT)EhrcGstCheck1EventHandler,
(SZ)"Radio", (WNDPROC)FGstRadioDlgProc, (PFNEVENT)NULL,
(SZ)"List", (WNDPROC)FGstListDlgProc, (PFNEVENT)NULL,
(SZ)"Multi", (WNDPROC)FGstMultiDlgProc, (PFNEVENT)NULL,
(SZ)"Dual", (WNDPROC)FGstDualDlgProc, (PFNEVENT)NULL,
(SZ)"Dual1", (WNDPROC)FGstDual1DlgProc, (PFNEVENT)NULL,
(SZ)"MultiCombo", (WNDPROC)FGstMultiComboDlgProc, (PFNEVENT)EhrcGstMultiComboEventHandler,
(SZ)"Combination", (WNDPROC)FGstCombinationDlgProc, (PFNEVENT)EhrcGstMultiComboEventHandler,
(SZ)"RadioCombination", (WNDPROC)FGstComboRadDlgProc, (PFNEVENT)EhrcGstMultiComboEventHandler,
(SZ)"Maintenance", (WNDPROC)FGstMaintDlgProc, (PFNEVENT)EhrcGstMaintenanceEventHandler,
(SZ)"Billboard", (WNDPROC)FGstBillboardDlgProc, (PFNEVENT)NULL
};
/*
** Purpose:
** To push the dialog szDlgName onto the top of the dialog stack if it
** is not already on top of the stack. if it is already on the top of
** the stack it merely ensures that the dialog is active and enabled.
**
** Arguments:
** szDlgName: the name of the dialog (not the dialog template name).
** hinst: Handle to instance of the APP (i.e. the shell).
** hwndShell: Handle to the main app window (i.e. the shell).
**
** Returns:
** fTrue if the operation succeeds, fFalse otherwise.
**
****************************************************************************/
BOOL APIENTRY
FDoDialog(
IN SZ szDlgName,
IN HANDLE hInst,
IN HWND hwndShell
)
{
BOOL fReturn;
SZ szDlgType, szDlgTemplate;
pDLGMP pdlgmp;
AssertDataSeg();
Assert(szDlgName != NULL);
// find the dialog type associated with this dialog and
// validate it
EvalAssert((szDlgType = SzFindSymbolValueInSymTab(DLGTYPE)) != NULL);
// Handle the case when the dialog is already on the stack
if (SzStackTopName() != NULL &&
CrcStringCompare(szDlgName, SzStackTopName()) == crcEqual) {
if (FResumeStackTop()) {
Assert(HdlgStackTop() != NULL);
PostMessage(HdlgStackTop(), (UINT)STF_REINITDIALOG, 0, 0L);
fReturn = fTrue;
}
else {
fReturn = fFalse;
}
}
else {
// find out if the dialog is a message box. message boxes are handled
// here.
if ( CrcStringCompare(szDlgType, "MessageBox") == crcEqual ) {
fReturn = FHandleUIMessageBox(hwndShell);
PostMessage(hwndShell, (UINT) STF_SHL_INTERP, 0, 0L);
return(fReturn);
}
else {
//
// find the dialog template associated with this dialog and
// validate it. see if what we are doing is enough
EvalAssert((szDlgTemplate = SzFindSymbolValueInSymTab(DLGTEMPLATE)) != NULL);
//
// map the dialog type into a dialog procedure
//
EvalAssert((pdlgmp = pdlgmpFindDlgType (szDlgType, DialogMap)) != NULL);
//
// start the dialog
//
fReturn = (HdlgPushDbcb(
hInst,
szDlgName,
szDlgTemplate,
hwndShell,
pdlgmp->FGstDlgProc,
(DWORD)0,
pdlgmp->EhrcEventHandler,
(SZ)"",
(WNDPROC)NULL
) != NULL);
}
}
if ( CrcStringCompare( szDlgType, "Billboard" ) == crcEqual ) {
PostMessage(hwndShell, (UINT) STF_SHL_INTERP, 0, 0L);
}
return( fReturn );
}
pDLGMP
pdlgmpFindDlgType(
IN SZ szDlgType,
IN pDLGMP DialogMap
)
{
while ( DialogMap!=NULL &&
CrcStringCompare(szDlgType, DialogMap->szDlgType) != crcEqual ) {
DialogMap++;
}
return (DialogMap);
}
/*
** Purpose:
** To destroy the top N dialogs on the dialog stack and free the storage
** occupied by their DBCB's (dialog box context blocks).
**
** Arguments:
** n: The number of dialogs to be destroyed.
** fResume: Indicates if the dialog on top of the dialog stack after
** killing N dialogs should be resumed. fResume = fTrue means
** that it should be resumed, fFalse means that it should not
** be resumed.
**
** Returns:
** fTrue if the operation is completely successful (i.e. all n of the
** dialogs are successfully destroyed and the top of stack is resumed if
** appropriate), fFalse otherwise.
****************************************************************************/
BOOL APIENTRY FKillNDialogs(USHORT n,BOOL fResume)
{
BOOL fReturn;
AssertDataSeg();
Assert(n > 0);
if ((fReturn = (FPopNDbcb(n) != fFalse)) &&
fResume)
{
Assert(!FStackEmpty());
fReturn = FResumeStackTop();
}
return(fReturn);
}
/*
** Purpose:
** Display a message box whose characteristics are drawn from the
** symbol table.
** Arguments:
** hwndParent: non-NULL handle to parent's window.
** Symbol Table Inputs:
** STF_MB_TITLE: string to display as title - can be blank.
** STF_MB_TEXT: string to display as text - should not be blank.
** STF_MB_TYPE: 1 -> MB_OK; 2 -> MB_OKCANCEL; 3 -> MB_YESNO;
** 4 -> MB_YESNOCANCEL; 5 -> MB_RETRYCANCEL; 6 -> MB_ABORTRETRYIGNORE.
** STF_MB_ICON: 1 -> none; 2 -> info; 3 -> stop; 4 -> ?; 5 -> !
** STF_MB_DEF: default button - 1 (default), 2, or 3.
** Symbol Table Outputs:
** DLGEVENT: "ABORT", "CANCEL", "IGNORE", "NO", "OK", "RETRY", or "YES".
** Returns:
** fFalse for undefined input symbols or OOM; fTrue otherwise.
****************************************************************************/
BOOL APIENTRY FHandleUIMessageBox(hwndParent)
HWND hwndParent;
{
INT imbReturn;
UINT wType = MB_TASKMODAL;
SZ szTitle, szText;
BOOL fRet = fFalse;
HWND aw;
ChkArg(hwndParent != NULL, 1, fFalse);
if ((szText = SzFindSymbolValueInSymTab("STF_MB_TYPE")) == NULL)
{
Assert(fFalse);
goto LHUIMBError;
}
switch (*szText)
{
case '1':
wType |= MB_OK;
break;
case '2':
wType |= MB_OKCANCEL;
break;
case '3':
wType |= MB_YESNO;
break;
case '4':
wType |= MB_YESNOCANCEL;
break;
case '5':
wType |= MB_RETRYCANCEL;
break;
case '6':
wType |= MB_ABORTRETRYIGNORE;
break;
default:
Assert(fFalse);
goto LHUIMBError;
}
if ((szText = SzFindSymbolValueInSymTab("STF_MB_ICON")) == NULL)
{
Assert(fFalse);
goto LHUIMBError;
}
switch (*szText)
{
case '1':
break;
case '2':
wType |= MB_ICONINFORMATION;
break;
case '3':
wType |= MB_ICONSTOP;
break;
case '4':
wType |= MB_ICONQUESTION;
break;
case '5':
wType |= MB_ICONEXCLAMATION;
break;
default:
Assert(fFalse);
goto LHUIMBError;
}
if ((szText = SzFindSymbolValueInSymTab("STF_MB_DEF")) == NULL)
{
Assert(fFalse);
goto LHUIMBError;
}
switch (*szText)
{
case '1':
break;
case '2':
wType |= MB_DEFBUTTON2;
break;
case '3':
wType |= MB_DEFBUTTON3;
break;
default:
Assert(fFalse);
goto LHUIMBError;
}
if ((szText = SzFindSymbolValueInSymTab("STF_MB_TEXT")) == NULL)
{
Assert(fFalse);
goto LHUIMBError;
}
if ((szTitle = SzFindSymbolValueInSymTab("STF_MB_TITLE")) == NULL)
szTitle = "";
aw = GetActiveWindow();
if ( aw == NULL || aw == GetDesktopWindow() ) {
aw = hwndParent;
}
while ((imbReturn = MessageBox(aw, szText, szTitle, wType)) == 0) {
if (!FHandleOOM(hwndParent)) {
goto LHUIMBError;
}
}
switch (imbReturn)
{
case IDABORT:
szText = "ABORT";
break;
case IDCANCEL:
szText = "CANCEL";
break;
case IDIGNORE:
szText = "IGNORE";
break;
case IDNO:
szText = "NO";
break;
case IDOK:
szText = "OK";
break;
case IDRETRY:
szText = "RETRY";
break;
case IDYES:
szText = "YES";
break;
default:
Assert(fFalse);
goto LHUIMBError;
}
while (!FAddSymbolValueToSymTab("DLGEVENT", szText))
if (!FHandleOOM(hwndParent))
goto LHUIMBError;
fRet = fTrue;
LHUIMBError:
return(fRet);
}
/*
** Purpose:
** ??
** Arguments:
** ??
** Returns:
** ??
****************************************************************************/
EHRC APIENTRY EhrcGstCheck1EventHandler(HANDLE hInst,
HWND hwndShell,
UINT wMsg,
WPARAM wParam,
LONG lParam)
{
SZ sz = SzFindSymbolValueInSymTab("ButtonPressed");
WORD idc;
INT iButton;
CHP rgchNum[10];
Unused(hInst);
Unused(hwndShell);
Unused(wMsg);
Unused(wParam);
Unused(lParam);
Assert(sz != NULL);
switch (idc = (WORD)atoi(sz))
{
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:
sz = "NOTIFY";
iButton = (INT) (idc - IDC_B1 + 1);
break;
case IDC_SP1:
case IDC_SP2:
case IDC_SP3:
case IDC_SP4:
case IDC_SP5:
case IDC_SP6:
case IDC_SP7:
case IDC_SP8:
case IDC_SP9:
case IDC_SP10:
sz = "CUSTOMISE";
iButton = (INT) (idc - IDC_SP1 + 1);
break;
default:
return(ehrcNotHandled);
}
_itoa(iButton, rgchNum, 10);
if(!FAddSymbolValueToSymTab("ButtonChecked", rgchNum) ||
!FAddSymbolValueToSymTab("DLGEVENT", sz))
return(ehrcError);
else
return(ehrcPostInterp);
}
/*
** Purpose:
** ??
** Arguments:
** ??
** Returns:
** ??
****************************************************************************/
EHRC APIENTRY EhrcGstMultiComboEventHandler(HANDLE hInst,
HWND hwndShell,
UINT wMsg,
WPARAM wParam,
LONG lParam)
{
SZ sz = SzFindSymbolValueInSymTab("ButtonPressed");
WORD idc;
INT iButton;
CHP rgchNum[10];
Unused(hInst);
Unused(hwndShell);
Unused(wMsg);
Unused(wParam);
Unused(lParam);
Assert(sz != NULL);
switch (idc = (WORD)atoi(sz))
{
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:
sz = "NOTIFY";
iButton = (INT) (idc - IDC_COMBO1 + 1);
break;
default:
return(ehrcNotHandled);
}
_itoa(iButton, rgchNum, 10);
if(!FAddSymbolValueToSymTab("ButtonChecked", rgchNum) ||
!FAddSymbolValueToSymTab("DLGEVENT", sz))
return(ehrcError);
else
return(ehrcPostInterp);
}
/*
** Purpose:
** ??
** Arguments:
** ??
** Returns:
** ??
****************************************************************************/
EHRC APIENTRY
EhrcGstMaintenanceEventHandler(
HANDLE hInst,
HWND hwndShell,
UINT wMsg,
WPARAM wParam,
LONG lParam
)
{
SZ sz = SzFindSymbolValueInSymTab("ButtonPressed");
WORD idc;
INT iButton;
CHP rgchNum[10];
Unused(hInst);
Unused(hwndShell);
Unused(wMsg);
Unused(wParam);
Unused(lParam);
Assert(sz != NULL);
switch (idc = (WORD)atoi(sz)) {
case MENU_CHANGE:
sz = "SYSTEM";
iButton = 1;
break;
default:
return(ehrcNotHandled);
}
_itoa(iButton, rgchNum, 10);
if(!FAddSymbolValueToSymTab("ButtonChecked", rgchNum) ||
!FAddSymbolValueToSymTab("DLGEVENT", sz)) {
return(ehrcError);
}
else {
return(ehrcPostInterp);
}
}