diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/rpc/install/win/dlgprocs.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/rpc/install/win/dlgprocs.c')
-rw-r--r-- | private/rpc/install/win/dlgprocs.c | 2020 |
1 files changed, 2020 insertions, 0 deletions
diff --git a/private/rpc/install/win/dlgprocs.c b/private/rpc/install/win/dlgprocs.c new file mode 100644 index 000000000..d2d149949 --- /dev/null +++ b/private/rpc/install/win/dlgprocs.c @@ -0,0 +1,2020 @@ +/***************************************************************************/ +/********************* Sample Dialog Procedures **************************/ +/***************************************************************************/ + +#include "cui.h" +#include "dialogs.h" +#include <stdlib.h> +#include <ctype.h> +#include "..\detect\detect.h" + + +#define iszBMax 11 +#define INT_MAX 32767 /* maximum (signed) int value */ +#define cbSymBuf 1024 +#define cbNameMax 52 + + +LPSTR _sz = NULL; + +#define FSingleByteCharSz(sz) ((BOOL)(((_sz = (sz)) != NULL) \ + && AnsiNext((LPSTR)(_sz)) == _sz + 1)) + +int FAR PASCAL LibMain(HANDLE, WORD, WORD, LPSTR); +int FAR PASCAL WEP (int); +LPSTR FAR PASCAL SzLastChar(LPSTR); +LPSTR FAR PASCAL SzDlgEvent(WORD); +int FAR PASCAL AsciiToInt(LPSTR); +LPSTR FAR PASCAL IntToAscii(int, LPSTR); +#if 0 +typedef struct { + unsigned iType; + unsigned iMajor; + unsigned iMinor; + unsigned iRev; + unsigned fEnhance; +} LAN_DETECT; + +int FAR PASCAL GetNetConfiguration( + LAN_DETECT _far *Detect + ) +{ + return(GetInstalledNet(&Detect->iType, &Detect->iMajor, + &Detect->iMinor, &Detect->iRev, &Detect->fEnhance)); +} +#endif + +/* +** Purpose: +** CheckBox Dialog procedure for templates with one to ten checkbox +** controls. +** +** Controls Recognized: +** Checkbox - IDC_B1 to IDC_B10 (sequential) +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "CheckItemsIn" - list of "ON" and "OFF" string items for setting +** the intial state of the checkbox controls, evaluated in +** sequence ("ON" for checked, "OFF" for unchecked). If there +** are more controls than items, extra controls are left unchecked. +** If there are fewer items than controls, extra items are ignored. +** "OptionsGreyed" - list of (one-based) indexes of checkboxes to be +** initialized as disabled. Indexes not in the list will be +** left enabled. +** +** Termination Symbols: +** "CheckItemsOut" - list of same format as "CheckItemsIn" representing +** state of checkbox controls upon return. +** "DLGEVENT" - one of the following, according to control event: +** event value +** ------- ------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FCheckDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + WORD idc, cb, i, cItems; + char szSymBuf[cbSymBuf]; + + switch (wMsg) + { + case WM_INITDIALOG: + cItems = UsGetListLength("CheckItemsIn"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("CheckItemsIn", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szSymBuf, "ON") == 0) + wCheck = 1; + CheckDlgButton(hdlg, idc++, wCheck); + } + + cItems = UsGetListLength("OptionsGreyed"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + int iOpt; + + cb = CbGetListItem("OptionsGreyed", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + iOpt = AsciiToInt((LPSTR)szSymBuf); + if (iOpt > 0 + && iOpt <= 10) + EnableWindow(GetDlgItem(hdlg, IDC_B0 + iOpt), 0); + else if (*szSymBuf != '\0') + Assert(fFalse); + } + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch (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, wParam, + (WORD)!IsDlgButtonChecked(hdlg, wParam)); + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + FRemoveSymbol("CheckItemsOut"); + for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++) + if (!FAddListItem("CheckItemsOut", + IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF")) + { + DestroyWindow(GetParent(hdlg)); + return(fFalse); + } + Assert((unsigned)(idc-IDC_B1+1) <= iszBMax); + + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Custom Install Dialog procedure for templates with one to ten custom +** options each consisting of at least one checkbox with an optional +** sub-option pushbutton or status string. The dialog also supports +** an install path set button, display of the current install path, and +** display of the current disk space status. +** +** Controls Recognized: +** Checkbox - IDC_B1 to IDC_B10 +** with optionaly assocated buttons or text: +** Pushbutton - IDC_SP1 to IDC_SP10 +** Text - IDC_STATUS1 to IDC_STATUS10 +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_P, IDC_X +** Text - IDC_TEXT1 through IDC_TEXT7 +** +** Initialization Symbols: +** "CheckItemsState" - list of "ON" and "OFF" string items for setting +** the intial state of the checkbox controls, evaluated in +** sequence ("ON" for checked, "OFF" for unchecked). If there +** are more controls than items, extra controls are left unchecked. +** If there are fewer items than controls, extra items are ignored. +** "StatusItemsText" - list of strings to initialize status text items +** associated with checkboxes. +** "DriveStatusText" - list of seven strings to initialize drive status +** text items (IDC_TEXT1-7) in the following sequence: +** dst_drive, dst_space_need, dst_space_free, +** win_drive, win_space_need, win_space_free, +** dst_path +** If any of the "win_" items is an empty string, its label +** text will be made non-visible. +** +** Termination Symbols: +** "CheckItemsState" - state of checkbox items (same format as above). +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_P "PATH" +** IDC_X "EXIT" +** IDC_B1 to IDC_B10 "CHK1" to "CHK10" +** IDC_SP1 to IDC_SP10 "BTN1" to "BTN10" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FCustInstDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + char rgchChk[10]; + char rgchBtn[10]; + WORD idc; + WORD cItems; + WORD i, cb; + char szSymBuf[cbSymBuf]; + LPSTR szEvent; + + switch (wMsg) + { + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case STF_REINITDIALOG: + case WM_INITDIALOG: + cItems = UsGetListLength("CheckItemsState"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("CheckItemsState", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szSymBuf, "ON") == 0) + wCheck = 1; + CheckDlgButton(hdlg, idc++, wCheck); + } + + cItems = UsGetListLength("StatusItemsText"); + idc = IDC_STATUS1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("StatusItemsText", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + SetDlgItemText(hdlg, idc++, szSymBuf); + } + + cItems = UsGetListLength("DriveStatusText"); + idc = IDC_TEXT1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("DriveStatusText", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + SetDlgItemText(hdlg, idc++, szSymBuf); + if (i >= 4 + && i <= 6) + { + if (*szSymBuf == '\0') + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE); + else + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE); + } + } + + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + default: + szEvent = (LPSTR)NULL; + break; + + 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: + lstrcpy((LPSTR)rgchChk, "CHK"); + IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3])); + szEvent = (LPSTR)rgchChk; + 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: + lstrcpy((LPSTR)rgchBtn, "BTN"); + IntToAscii((int)(wParam-IDC_SP1+1), (LPSTR)(&rgchBtn[3])); + szEvent = (LPSTR)rgchBtn; + break; + + case IDC_B: + case IDC_C: + case IDC_X: + szEvent = SzDlgEvent(wParam); + Assert(szEvent != NULL); + break; + + case IDC_P: + szEvent = "PATH"; + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + } + + if (szEvent == (LPSTR)NULL) + break; + + FRemoveSymbol("CheckItemsState"); + for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++) + if (!FAddListItem("CheckItemsState", + IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF")) + { + DestroyWindow(GetParent(hdlg)); + return(fFalse); + } + Assert((unsigned)(idc-IDC_B1+1) <= iszBMax); + + if (szEvent != (LPSTR)NULL) + if (!FSetSymbolValue("DLGEVENT", szEvent)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + } + + return(fFalse); +} + + +/* +** Purpose: +** Super-special... +** Custom Install Dialog procedure for templates with one to ten custom +** options each consisting of at least one checkbox with an optional +** sub-option pushbutton or status string. The dialog also supports +** an install path set button, display of the current install path, and +** display of the current disk space status. +** +** Controls Recognized: +** Checkbox - IDC_B1 to IDC_B10 +** with optionaly assocated buttons or text: +** Pushbutton - IDC_SP1 to IDC_SP10 +** Text - IDC_STATUS1 to IDC_STATUS10 +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_P, IDC_X +** Text - IDC_TEXT1 through IDC_TEXT7 +** +** Initialization Symbols: +** "CheckItemsState" - list of "ON" and "OFF" string items for setting +** the intial state of the checkbox controls, evaluated in +** sequence ("ON" for checked, "OFF" for unchecked). If there +** are more controls than items, extra controls are left unchecked. +** If there are fewer items than controls, extra items are ignored. +** "StatusItemsText" - list of strings to initialize status text items +** associated with checkboxes. +** "DriveStatusText" - list of seven strings to initialize drive status +** text items (IDC_TEXT1-7) in the following sequence: +** dst_drive, dst_space_need, dst_space_free, +** win_drive, win_space_need, win_space_free, +** dst_path +** If any of the "win_" items is an empty string, its label +** text will be made non-visible. +** +** Termination Symbols: +** "CheckItemsState" - state of checkbox items (same format as above). +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_P "PATH" +** IDC_X "EXIT" +** IDC_B1 to IDC_B10 "CHK1" to "CHK10" +** IDC_SP1 to IDC_SP10 "BTN1" to "BTN10" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FMyCustInstDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + char rgchChk[10]; + char rgchBtn[10]; + WORD idc; + WORD cItems; + WORD i, cb, cbLen; + static WORD wSelStart[10]; + static WORD wSelEnd[10]; + char szSymBuf[cbSymBuf]; + char rgchText[cbFullPathMax + 1]; + LPSTR szEvent; + + switch (wMsg) + { + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case STF_REINITDIALOG: + SendDlgItemMessage(hdlg, wParam, EM_SETSEL, 0, MAKELONG(256, 256)); + SetFocus(GetDlgItem(hdlg, wParam)); + return(fTrue); + + case WM_INITDIALOG: + cItems = UsGetListLength("CheckItemsState"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("CheckItemsState", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szSymBuf, "ON") == 0) + wCheck = 1; + CheckDlgButton(hdlg, idc++, wCheck); + } + + cItems = UsGetListLength("StatusItemsText"); + idc = IDC_STATUS1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("StatusItemsText", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + SetDlgItemText(hdlg, idc++, szSymBuf); + } + + cItems = UsGetListLength("DriveStatusText"); + idc = IDC_TEXT1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("DriveStatusText", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + SetDlgItemText(hdlg, idc++, szSymBuf); + if (i >= 4 + && i <= 6) + { + if (*szSymBuf == '\0') + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE); + else + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE); + } + } + + cItems = UsGetListLength("EditTextIn"); + idc = IDC_EDT1-1; + for ( i = 1; i <= cItems; ++i) + { + cb = CbGetListItem("EditTextIn", i, szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + SendDlgItemMessage(hdlg, idc+i, EM_LIMITTEXT, cbFullPathMax, 0L); + SetDlgItemText(hdlg, idc+i, (LPSTR)szSymBuf); + + cbLen = lstrlen(szSymBuf); + cb = CbGetListItem("EditFocus", i, szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + + if (lstrcmp(szSymBuf, "ALL") == 0) + { + wSelStart[i] = 0; + wSelEnd[i] = INT_MAX; + } + else if (lstrcmp(szSymBuf, "START") == 0) + { + wSelStart[i] = 0; + wSelEnd[i] = 0; + } + else /* default == END */ + { + wSelStart[i] = (WORD)cbLen; + wSelEnd[i] = (WORD)cbLen; + } + } + + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + default: + szEvent = (LPSTR)NULL; + break; + + 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: + lstrcpy((LPSTR)rgchChk, "CHK"); + IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3])); + szEvent = (LPSTR)rgchChk; + 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: + lstrcpy((LPSTR)rgchBtn, "BTN"); + IntToAscii((int)(wParam-IDC_SP1+1), (LPSTR)(&rgchBtn[3])); + szEvent = (LPSTR)rgchBtn; + break; + + case IDC_TEXT1: + case IDC_TEXT2: + case IDC_TEXT3: + case IDC_TEXT4: + case IDC_TEXT5: + case IDC_TEXT6: + case IDC_TEXT7: + case IDC_TEXT8: + case IDC_TEXT9: + case IDC_TEXT10: + lstrcpy((LPSTR)rgchBtn, "TEXT"); + IntToAscii((int)(wParam-IDC_TEXT1+1), (LPSTR)(&rgchBtn[3])); + szEvent = (LPSTR)rgchBtn; + break; + + case IDC_EDT1: + case IDC_EDT2: + case IDC_EDT3: + case IDC_EDT4: + case IDC_EDT5: + case IDC_EDT6: + case IDC_EDT7: + case IDC_EDT8: + case IDC_EDT9: + case IDC_EDT10: + if (HIWORD(lParam) == EN_SETFOCUS) + SendDlgItemMessage(hdlg, wParam, EM_SETSEL, 0, + MAKELONG(wSelStart[wParam-IDC_EDT1+1], wSelEnd[wParam-IDC_EDT1+1])); + else if (HIWORD(lParam) == EN_KILLFOCUS) + { + LONG l = SendDlgItemMessage(hdlg, wParam, EM_GETSEL, 0, 0L); + + wSelStart[wParam-IDC_EDT1+1] = LOWORD(l); + wSelEnd[wParam-IDC_EDT1+1] = HIWORD(l); + } + break; + + case IDC_B: + case IDC_C: + case IDC_X: + szEvent = SzDlgEvent(wParam); + Assert(szEvent != NULL); + break; + + case IDC_P: + szEvent = "PATH"; + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + } + + if (szEvent == (LPSTR)NULL) + break; + + FRemoveSymbol("CheckItemsState"); + for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++) + if (!FAddListItem("CheckItemsState", + IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF")) + { + DestroyWindow(GetParent(hdlg)); + return(fFalse); + } + Assert((unsigned)(idc-IDC_B1+1) <= iszBMax); + + if (szEvent != (LPSTR)NULL) + if (!FSetSymbolValue("DLGEVENT", szEvent)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + for (idc = IDC_EDT1; GetDlgItem(hdlg, idc); idc++) + { + SendDlgItemMessage(hdlg, idc, (WORD)WM_GETTEXT, + cbFullPathMax + 1, (LONG)((LPSTR)rgchText)); + if (!FAddListItem("EditTextOut", rgchText)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + } + ReactivateSetupScript(); + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Edit Dialog procedure for templates with one Edit control. +** (Limits the input string length to cbFullPathMax characters.) +** +** Controls Recognized: +** Edit - IDC_EDIT +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "EditTextIn" - initial text for IDC_EDIT edit control. +** "EditFocus" - position of intial focus for text string: +** "END" (default), "ALL", or "START" +** +** Termination Symbols: +** "EditTextOut" - text in the IDC_EDIT edit control upon termination. +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FEditDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + static WORD wSelStart = 0; + static WORD wSelEnd = 0; + char rgchText[cbFullPathMax + 1]; + WORD cbLen; + WORD cb; + char szSymBuf[cbFullPathMax + 1]; + + switch (wMsg) + { + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case WM_INITDIALOG: + cb = CbGetSymbolValue("EditTextIn", szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbFullPathMax, 0L); + SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)szSymBuf); + + cbLen = lstrlen(szSymBuf); + cb = CbGetSymbolValue("EditFocus", szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + + if (lstrcmp(szSymBuf, "ALL") == 0) + { + wSelStart = 0; + wSelEnd = INT_MAX; + } + else if (lstrcmp(szSymBuf, "START") == 0) + { + wSelStart = 0; + wSelEnd = 0; + } + else /* default == END */ + { + wSelStart = (WORD)cbLen; + wSelEnd = (WORD)cbLen; + } + return(fTrue); + + case STF_REINITDIALOG: + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256)); + SetFocus(GetDlgItem(hdlg, IDC_EDIT)); + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_EDIT: + if (HIWORD(lParam) == EN_SETFOCUS) + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, + MAKELONG(wSelStart, wSelEnd)); + else if (HIWORD(lParam) == EN_KILLFOCUS) + { + LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L); + + wSelStart = LOWORD(l); + wSelEnd = HIWORD(l); + } + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT, + cbFullPathMax + 1, (LONG)((LPSTR)rgchText)); + if (!FSetSymbolValue("EditTextOut", rgchText)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Super special Edit Dialog procedure for templates with one Edit control. +** (Limits the input string length to cbFullPathMax characters.) +** +** Controls Recognized: +** Edit - IDC_EDIT +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "EditTextIn" - initial text for IDC_EDIT edit control. +** "EditFocus" - position of intial focus for text string: +** "END" (default), "ALL", or "START" +** +** Termination Symbols: +** "EditTextOut" - text in the IDC_EDIT edit control upon termination. +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FMyEditDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + static WORD wSelStart = 0; + static WORD wSelEnd = 0; + char rgchText[cbFullPathMax + 1]; + WORD cbLen; + WORD cb; + WORD cItems, idc, i; + char rgchChk[10]; + char szSymBuf[cbFullPathMax + 1]; + LPSTR szEvent; + + switch (wMsg) + { + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case WM_INITDIALOG: + cItems = UsGetListLength("InnerChkItemsState"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("InnerChkItemsState", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szSymBuf, "ON") == 0) + wCheck = 1; + CheckDlgButton(hdlg, idc++, wCheck); + } + + cb = CbGetSymbolValue("EditTextIn", szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbFullPathMax, 0L); + SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)szSymBuf); + + cbLen = lstrlen(szSymBuf); + cb = CbGetSymbolValue("EditFocus", szSymBuf, cbFullPathMax + 1); + Assert(cb < cbFullPathMax + 1); + + if (lstrcmp(szSymBuf, "ALL") == 0) + { + wSelStart = 0; + wSelEnd = INT_MAX; + } + else if (lstrcmp(szSymBuf, "START") == 0) + { + wSelStart = 0; + wSelEnd = 0; + } + else /* default == END */ + { + wSelStart = (WORD)cbLen; + wSelEnd = (WORD)cbLen; + } + return(fTrue); + + case STF_REINITDIALOG: + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256)); + SetFocus(GetDlgItem(hdlg, IDC_EDIT)); + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_EDIT: + if (HIWORD(lParam) == EN_SETFOCUS) + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, + MAKELONG(wSelStart, wSelEnd)); + else if (HIWORD(lParam) == EN_KILLFOCUS) + { + LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L); + + wSelStart = LOWORD(l); + wSelEnd = HIWORD(l); + } + break; + + 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: + lstrcpy((LPSTR)rgchChk, "CHK"); + IntToAscii((int)(wParam-IDC_B1+1), (LPSTR)(&rgchChk[3])); + szEvent = (LPSTR)rgchChk; + + FRemoveSymbol("InnerChkItemsState"); + for (idc = IDC_B1; GetDlgItem(hdlg, idc); idc++) + if (!FAddListItem("InnerChkItemsState", + IsDlgButtonChecked(hdlg, idc) ? "ON" : "OFF")) + { + DestroyWindow(GetParent(hdlg)); + return(fFalse); + } + Assert((unsigned)(idc-IDC_B1+1) <= iszBMax); + + if (szEvent != (LPSTR)NULL) + if (!FSetSymbolValue("DLGEVENT", szEvent)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT, + cbFullPathMax + 1, (LONG)((LPSTR)rgchText)); + if (!FSetSymbolValue("EditTextOut", rgchText)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + break; + } + + break; + } + + + return(fFalse); +} + + + +/* +** Purpose: +** Help Dialog procedure. +** +** Controls Recognized: +** Pushbutton - IDC_X. +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** none. (Handles IDC_X and IDCANCEL events by calling FCloseHelp.) +** +** Note: +** This dialog proc is for Help dialogs ONLY (szHelpProc$ parameter +** of UIStartDlg) and CANNOT be used as the szDlgProc$ parameter +** of the UIStartDlg MSSetup script function. +** +*****************************************************************************/ +BOOL FAR PASCAL FHelpDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + switch (wMsg) + { + case WM_INITDIALOG: + return(fTrue); + + case STF_REINITDIALOG: + return(fTrue); + + case STF_ACTIVATEAPP: + /* Help dlg should not be on the dlg stack + ** and should never get this message. + */ + Assert(fFalse); + return(fTrue); + + case WM_COMMAND: + if (wParam != IDC_X + && wParam != IDCANCEL) + break; + FCloseHelp(); + return(fTrue); + + } + return(fFalse); +} + + + +/* +** Purpose: +** Information Dialog procedure. +** +** Controls Recognized: +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** "DLGEVENT" - one of the following, according to control event: +** event value +** ------- ------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FInfoDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + switch (wMsg) + { + case WM_INITDIALOG: + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch (wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Information Dialog procedure, without "Exit" button. +** +** Controls Recognized: +** Pushbutton - IDC_B, IDC_C, IDC_H +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FInfo0DlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + switch (wMsg) + { + case WM_INITDIALOG: + return(fTrue); + + case STF_REINITDIALOG: + return(fTrue); + + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case WM_COMMAND: + switch (wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDCANCEL: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Single Choice Listbox Dialog procedure for templates with exactly one +** listbox control. +** +** Controls Recognized: +** Listbox - IDC_LIST1 +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "ListItemsIn" - list of strings to put in the listbox. +** "ListItemsOut" - simple string (not a list) representing an +** initial selection in "ListItemsIn". +** +** Termination Symbols: +** "ListItemsOut" - selected list item string. +** "DLGEVENT" - one of the following, according to control event: +** event value +** ------- ------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FListDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + char szListIn[cbSymBuf]; + char szListOut[cbSymBuf]; + WORD iItem; + WORD cb, i; + WORD cItems; + + switch (wMsg) + { + case WM_INITDIALOG: + cItems = UsGetListLength("ListItemsIn"); + for (i = 1; i <= cItems; ++i) + { + cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf); + Assert(cb < cbSymBuf); + SendDlgItemMessage(hdlg, IDC_LIST1, LB_ADDSTRING, 0, + (LONG)(LPSTR)szListIn); + } + + cb = CbGetSymbolValue("ListItemsOut", szListOut, cbSymBuf); + Assert(cb < cbSymBuf); + if (cb == 0) + SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETCURSEL, (WORD)-1, 0L); + else + { + for (i = 1, iItem = 0; i <= cItems; ++i, ++iItem) + { + cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szListOut, szListIn) == 0) + { + SendDlgItemMessage(hdlg,IDC_LIST1,LB_SETCURSEL,iItem,0L); + break; + } + } + } + + /* Note: Depends on number of lines in list box. + */ + if (iItem < 4) + iItem = 0; + SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETTOPINDEX, iItem, 0L); + + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_LIST1: + if (HIWORD(lParam) != LBN_DBLCLK) + break; + wParam = IDC_C; + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + if ((iItem = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCURSEL, + 0, 0L)) == LB_ERR + || (cb = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, + LB_GETTEXTLEN, iItem, 0L)) == LB_ERR) + *szListOut = '\0'; + else + { + Assert(cb <= cbSymBuf); + SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETTEXT, iItem, + (LONG)(LPSTR)szListOut); + } + if (!FSetSymbolValue("ListItemsOut", szListOut)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + } + break; + + } + + return(fFalse); +} + + + +/* +** Purpose: +** Modeless Dialog procedure. +** +** Controls Recognized: +** none. +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** none. +** +** Note: +** This dialog procedure is REQUIRED with use of any Billboard +** MSSetup script functions. +** +*****************************************************************************/ +BOOL FAR PASCAL FModelessDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + switch (wMsg) + { + case WM_INITDIALOG: + ReactivateSetupScript(); + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_CLOSE: + case WM_COMMAND: + Assert(fFalse); + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Multiple Choice Listbox Dialog procedure for templates with +** exactly one listbox control. +** +** Controls Recognized: +** Listbox - IDC_LIST1 +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_L, IDC_S, IDC_X +** +** Initialization Symbols: +** "ListItemsIn" - list of strings to put in the listbox. +** "ListItemsOut" - list of strings representing initial +** selections in "ListItemsIn". +** +** Termination Symbols: +** "ListItemsOut" - list of items selected (if any). +** "DLGEVENT" - one of the following, according to control event: +** event value +** ------- ------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** Pushbuttons IDC_L and IDC_S are for "clear all" and "select all" +** respectively. +** +*****************************************************************************/ +BOOL FAR PASCAL FMultiDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + WORD i, j, nCount; + char szListIn[cbSymBuf]; + char szListOut[cbSymBuf]; + WORD iItem, iItemTop; + WORD cb; + WORD cItemsIn, cItemsOut; + + switch (wMsg) + { + case WM_INITDIALOG: + cItemsIn = UsGetListLength("ListItemsIn"); + nCount = 0; + for (i = 1; i <= cItemsIn; ++i) + { + cb = CbGetListItem("ListItemsIn", i, szListIn, cbSymBuf); + Assert(cb < cbSymBuf); + SendDlgItemMessage(hdlg, IDC_LIST1, LB_ADDSTRING, 0, + (LONG)(LPSTR)szListIn); + nCount++; + } + Assert(nCount == (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT, + 0, 0L)); + + cItemsOut = UsGetListLength("ListItemsOut"); + for (i = 1, iItemTop = 0; i <= cItemsOut; ++i, ++iItemTop) + { + cb = CbGetListItem("ListItemsOut", i, szListOut, cbSymBuf); + Assert(cb < cbSymBuf); + for (j = 1, iItem = 0; j <= cItemsIn; ++j, ++iItem) + { + cb = CbGetListItem("ListItemsIn", j, szListIn, cbSymBuf); + Assert(cb < cbSymBuf); + if (lstrcmp(szListOut, szListIn) == 0) + { + SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, 1, + MAKELONG(iItem, 0)); + if (iItemTop == 0 + || (WORD)iItem < iItemTop) + iItemTop = (WORD)iItem; + break; + } + } + } + + /* Note: Depends on number of lines in list box. + */ + if (iItemTop < 4) + iItemTop = 0; + SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETTOPINDEX, iItemTop, 0L); + + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_S: + case IDC_L: + SendDlgItemMessage(hdlg, IDC_LIST1, LB_SETSEL, (wParam == IDC_S), + -1L); + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + /* Note: Could be faster to use LB_GETSELITEMS here. + */ + nCount = (WORD)SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETCOUNT, 0, + 0L); + + FRemoveSymbol("ListItemsOut"); + for (i = 0; i < nCount; i++) + { + if (SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETSEL, (WORD)i, 0L)) + { + SendDlgItemMessage(hdlg, IDC_LIST1, LB_GETTEXT, (WORD)i, + (LONG)(LPSTR)szListOut); + if (!FAddListItem("ListItemsOut", szListOut)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + } + } + + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Quit Dialog procedure. +** +** Controls Recognized: +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FQuitDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + switch (wMsg) + { + case WM_INITDIALOG: + return(fTrue); + + case STF_REINITDIALOG: + return(fTrue); + + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + } + break; + } + return(fFalse); +} + + + +/* +** Purpose: +** Radio Button Group Dialog procedure for templates with one group +** of one to ten radio button controls. +** +** Controls Recognized: +** Radio - IDC_B1 to IDC_B10 (sequential) +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "RadioDefault" - index (one-based) of radio button to be +** initialized as selected (default is "1"). +** "OptionsGreyed" - list of (one-based) indexes of radio buttons +** to be initialized as disabled. Indexes not in the list will +** be left enabled. +** +** Termination Symbols: +** "ButtonChecked" - index of currently selected radio button. +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** STF_ACTIVATEAPP "REACTIVATE" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FRadioDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + char rgchNum[10]; + int iButtonChecked; + char szSymBuf[cbSymBuf]; + WORD i, cb, cItems, idc; + + switch (wMsg) + { + case STF_ACTIVATEAPP: + if (!FSetSymbolValue("DLGEVENT", "REACTIVATE")) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + return(fTrue); + + case WM_INITDIALOG: + cb = CbGetSymbolValue("RadioDefault", szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + if (*szSymBuf != '\0') + { + iButtonChecked = AsciiToInt((LPSTR)szSymBuf); + if (iButtonChecked < 1) + iButtonChecked = 0; + if (iButtonChecked > 10) + iButtonChecked = 10; + } + else + iButtonChecked = 1; + + if (iButtonChecked != 0) + SendDlgItemMessage(hdlg, IDC_B0 + iButtonChecked, BM_SETCHECK,1,0L); + + cItems = UsGetListLength("OptionsGreyed"); + idc = IDC_B1; + for (i = 1; i <= cItems; ++i) + { + int iOpt; + + cb = CbGetListItem("OptionsGreyed", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + iOpt = AsciiToInt((LPSTR)szSymBuf); + if (iOpt > 0 + && iOpt <= 10 + && iOpt != iButtonChecked) + EnableWindow(GetDlgItem(hdlg, IDC_B0 + iOpt), 0); + else if (*szSymBuf != '\0') + Assert(fFalse); + } + return(fTrue); + + case STF_REINITDIALOG: + return(fTrue); + + case WM_COMMAND: + switch (wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + 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: + CheckRadioButton(hdlg, IDC_B1, IDC_B10, wParam); + if (HIWORD(lParam) != BN_DOUBLECLICKED) + break; + wParam = IDC_C; + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + iButtonChecked = 0; + for (i = 1; i <= 10; i++) + if (SendDlgItemMessage(hdlg, IDC_B0 + i, BM_GETCHECK, 0, 0L)) + { + iButtonChecked = i; + break; + } + + IntToAscii((int)iButtonChecked, (LPSTR)rgchNum); + if (!FSetSymbolValue("ButtonChecked", rgchNum)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Get Name and Organization Dialog procedure for templates +** with two Edit controls. +** (Limits the input string length to cbNameMax characters.) +** +** Controls Recognized: +** Edit - IDC_EDIT, IDC_EDIT2 +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** none. +** +** Termination Symbols: +** "NameOut" - text in the IDC_EDIT edit control upon termination. +** "OrgOut" - text in the IDC_EDIT2 edit control upon termination. +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FNameOrgDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + static WORD wSelStart1 = 0; + static WORD wSelEnd1 = 0; + static WORD wSelStart2 = 0; + static WORD wSelEnd2 = 0; + char rgchText[cbNameMax + 1]; + + switch (wMsg) + { + case WM_INITDIALOG: + SendDlgItemMessage(hdlg, IDC_EDIT, EM_LIMITTEXT, cbNameMax, 0L); + SetDlgItemText(hdlg, IDC_EDIT, (LPSTR)""); + + SendDlgItemMessage(hdlg, IDC_EDIT2, EM_LIMITTEXT, cbNameMax, 0L); + SetDlgItemText(hdlg, IDC_EDIT2, (LPSTR)""); + + wSelStart1 = wSelEnd1 = 0; + wSelStart2 = wSelEnd2 = 0; + return(fTrue); + + case STF_REINITDIALOG: + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(256, 256)); + SetFocus(GetDlgItem(hdlg, IDC_EDIT)); + return(fTrue); + + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch(wParam) + { + case IDC_EDIT: + if (HIWORD(lParam) == EN_SETFOCUS) + SendDlgItemMessage(hdlg, IDC_EDIT, EM_SETSEL, 0, + MAKELONG(wSelStart1, wSelEnd1)); + else if (HIWORD(lParam) == EN_KILLFOCUS) + { + LONG l = SendDlgItemMessage(hdlg, IDC_EDIT, EM_GETSEL, 0, 0L); + + wSelStart1 = LOWORD(l); + wSelEnd1 = HIWORD(l); + } + break; + + case IDC_EDIT2: + if (HIWORD(lParam) == EN_SETFOCUS) + SendDlgItemMessage(hdlg, IDC_EDIT2, EM_SETSEL, 0, + MAKELONG(wSelStart2, wSelEnd2)); + else if (HIWORD(lParam) == EN_KILLFOCUS) + { + LONG l = SendDlgItemMessage(hdlg, IDC_EDIT2, EM_GETSEL, 0, 0L); + + wSelStart2 = LOWORD(l); + wSelEnd2 = HIWORD(l); + } + break; + + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + SendDlgItemMessage(hdlg, IDC_EDIT, (WORD)WM_GETTEXT, + cbNameMax + 1, (LONG)((LPSTR)rgchText)); + if (!FSetSymbolValue("NameOut", rgchText)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + SendDlgItemMessage(hdlg, IDC_EDIT2, (WORD)WM_GETTEXT, + cbNameMax + 1, (LONG)((LPSTR)rgchText)); + if (!FSetSymbolValue("OrgOut", rgchText)) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Confirm Info Dialog procedure for templates with one to +** static text controls. +** +** Controls Recognized: +** Text - IDC_TEXT1 to IDC_TEXT10 (sequential) +** Pushbutton - IDC_B, IDC_C, IDC_H, IDC_X +** +** Initialization Symbols: +** "ConfirmTextIn" - list of up to ten string items to initialize +** static text items (IDC_TEXT1-10). +** +** Termination Symbols: +** "DLGEVENT" - one of the following, depending on event: +** event value +** ---------- ---------- +** IDC_B "BACK" +** IDC_C "CONTINUE" +** IDC_X "EXIT" +** IDCANCEL "CANCEL" +** +** Note: +** Pushbutton IDC_H will open the related Help dialog, if any. +** +*****************************************************************************/ +BOOL FAR PASCAL FConfirmDlgProc(HWND hdlg, WORD wMsg, WORD wParam, LONG lParam) +{ + WORD idc; + WORD cItems; + WORD i, cb; + char szSymBuf[cbSymBuf]; + + switch (wMsg) + { + case WM_INITDIALOG: + cItems = UsGetListLength("ConfirmTextIn"); + idc = IDC_TEXT1; + for (i = 1; i <= cItems; ++i) + { + WORD wCheck = 0; + + cb = CbGetListItem("ConfirmTextIn", i, szSymBuf, cbSymBuf); + Assert(cb < cbSymBuf); + SetDlgItemText(hdlg, idc++, szSymBuf); + if (i >= 4 + && i <= 6) + { + if (*szSymBuf == '\0') + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_HIDE); + else + ShowWindow(GetDlgItem(hdlg, IDC_TEXT4+i), SW_SHOWNOACTIVATE); + } + } + return(fTrue); + + case STF_REINITDIALOG: + case STF_ACTIVATEAPP: + return(fTrue); + + case WM_COMMAND: + switch (wParam) + { + case IDC_H: + HdlgShowHelp(); + return(fTrue); + + case IDC_B: + case IDC_C: + case IDC_X: + if (!FSetSymbolValue("DLGEVENT", SzDlgEvent(wParam))) + { + DestroyWindow(GetParent(hdlg)); + return(fTrue); + } + ReactivateSetupScript(); + break; + } + break; + } + + return(fFalse); +} + + + +/* +** Purpose: +** Initialization routine for DLL. +** Arguments: +** hInst: handle to instance of App that required this DLL. +** wDataSeg: number of words in DLL's data segment. +** wHeapSize: number of bytes in DLL's heap. +** lpszCmdLine: command line for App that required this DLL. +** Returns: +** 1 always +*****************************************************************************/ +int FAR PASCAL LibMain(HANDLE hInst, WORD wDataSeg, WORD wHeapSize, + LPSTR lpszCmdLine) +{ + if (wHeapSize > 0) + UnlockData(0); + + return(1); +} + + + +/* +** Purpose: +** Windows Exit Procedure. +** Arguments: +** nParam: standard WEP param (ignored). +** Returns: +** 1 always. +*****************************************************************************/ +int FAR PASCAL WEP (int nParam) +{ + return(1); +} + + + +/* +** Purpose: +** Finds the last character in a string. +** Arguments: +** sz: non-NULL zero terminated string to search. +** Returns: +** NULL for an empty string. +** non-Null string pointer to the last valid character in sz. +*****************************************************************************/ +LPSTR FAR PASCAL SzLastChar(LPSTR sz) +{ + LPSTR szCur = (LPSTR)NULL; + LPSTR szNext = sz; + + while (*szNext != '\0') + szNext = AnsiNext((szCur = szNext)); + + return(szCur); +} + + + +/* +** Purpose: +** Gets the string values for the following WM_COMMAND events: +** IDC_B, IDC_C, IDC_X, and IDCANCEL. +** Arguments: +** wParam: event parameter value +** Returns: +** Pointer to string value constant, NULL if unknown event. +*****************************************************************************/ +LPSTR FAR PASCAL SzDlgEvent(WORD wParam) +{ + LPSTR szEvent; + + switch(wParam) + { + case IDC_B: + szEvent = "BACK"; + break; + case IDC_C: + szEvent = "CONTINUE"; + break; + case IDC_X: + szEvent = "EXIT"; + break; + default: + szEvent = NULL; + break; + } + + return(szEvent); +} + + + +/* +** Purpose: +** Converts an ASCII string representing a positive value +** into an integer. +** Arguments: +** sz: non-NULL zero terminated string to convert. +** Returns: +** Integer represented by the string. +*****************************************************************************/ +int FAR PASCAL AsciiToInt(LPSTR sz) +{ + int i = 0; + + while (*sz == ' ' || *sz == '\t') + sz++; + + while (isdigit(*sz)) + i = (i * 10) + *sz++ - '0'; + + return(i); +} + + + +/* +** Purpose: +** Converts an positive integer (< 100) into a string +** representing its value. +** Arguments: +** i: integer to convert (positive and < 100). +** sz: buffer to hold converted string (at least 3 bytes). +** Returns: +** sz. +*****************************************************************************/ +LPSTR FAR PASCAL IntToAscii(int i, LPSTR sz) +{ + LPSTR szSav = sz; + + if (i >= 100 + || i < 0) + Assert(fFalse); + + if (i >= 10) + { + *sz++ = (char)('0' + (i / 10)); + i %= 10; + } + *sz++ = (char)('0' + i); + *sz = '\0'; + + return(szSav); +} |