2036 lines
54 KiB
C
2036 lines
54 KiB
C
|
|
/****************************************************************************\
|
|
|
|
WIZARD.C / OPK Wizard (OPKWIZ.EXE)
|
|
|
|
Microsoft Confidential
|
|
Copyright (c) Microsoft Corporation 1999
|
|
All rights reserved
|
|
|
|
Wizard source file for wizard functions used in the OPK Wizard.
|
|
|
|
4/99 - Jason Cohen (JCOHEN)
|
|
Added this new source file for the OPK Wizard as part of the
|
|
Millennium rewrite.
|
|
|
|
09/2000 - Stephen Lodwick (STELO)
|
|
Ported OPK Wizard to Whistler
|
|
|
|
\****************************************************************************/
|
|
|
|
|
|
//
|
|
// Include file(s)
|
|
//
|
|
#include "setupmgr.h"
|
|
#include "allres.h"
|
|
#include "sku.h"
|
|
#include "appver.h"
|
|
|
|
//
|
|
// Internal Function(s):
|
|
//
|
|
|
|
// TreeView Helper Functions
|
|
//
|
|
static void ShowTreeDialog(HWND, LPTREEDLG);
|
|
static void ShowSplashDialog(HWND, DWORD);
|
|
static void FillTreeDialog(HWND);
|
|
static void UpdateTreeVisibility(HWND);
|
|
static LPTREEDLG GetTreeItem(HWND, HTREEITEM);
|
|
static BOOL SelectTreeItem(HWND, HTREEITEM, UINT);
|
|
static BOOL SelectFirstMaintenanceDlg(HWND);
|
|
|
|
// Configuration/Profile Helper Functions
|
|
//
|
|
static BOOL CloseProfile(HWND, BOOL);
|
|
static void OpenProfile(HWND, BOOL);
|
|
static void SaveProfile(HWND);
|
|
|
|
// Miscellaneous Helper Functions
|
|
//
|
|
static void OnCommand(HWND, INT, HWND, UINT);
|
|
static void EnableControls(HWND);
|
|
void SetWizardButtons(HWND, DWORD);
|
|
|
|
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//
|
|
// Page arrays: There are four total arrays
|
|
// OEM/System Builder Pages
|
|
// vdpOEMWizardDialogs - Starting Wizard Pages
|
|
// vdpOEMTreeDialogs - Tree Dialogs
|
|
// Corporate Deployment
|
|
// vdpCDWizardDialogs - Starting Wizard Pages
|
|
// vdpCDTreeDialogs - Tree Dialogs
|
|
//
|
|
static WIZDLG vdpOEMWizardDialogs[]=
|
|
{
|
|
{
|
|
IDD_WELCOME,
|
|
WelcomeDlgProc,
|
|
0,
|
|
0,
|
|
PSP_DEFAULT | PSP_HIDEHEADER
|
|
},
|
|
|
|
#ifndef NO_LICENSE
|
|
{
|
|
IDD_LICENSE,
|
|
LicenseDlgProc,
|
|
IDS_LICENSE_TITLE,
|
|
IDS_LICENSE_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
#endif // NO_LICENSE
|
|
|
|
{
|
|
IDD_CONFIG,
|
|
ConfigDlgProc,
|
|
IDS_CONFIG_TITLE,
|
|
IDS_CONFIG_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_LANG,
|
|
LangDlgProc,
|
|
IDS_LANG_TITLE,
|
|
IDS_LANG_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_CREATE,
|
|
CreateDlgProc,
|
|
IDS_CREATE_TITLE,
|
|
IDS_CREATE_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_MODE,
|
|
ModeDlgProc,
|
|
IDS_MODE_TITLE,
|
|
IDS_MODE_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_SKU,
|
|
SkuDlgProc,
|
|
IDS_SKU_TITLE,
|
|
IDS_SKU_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_OEMINFO,
|
|
OemInfoDlgProc,
|
|
IDS_OEMINFO_TITLE,
|
|
IDS_OEMINFO_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
};
|
|
|
|
static WIZDLG vdpCDWizardDialogs[]=
|
|
{
|
|
{
|
|
IDD_WELCOME,
|
|
DlgWelcomePage,
|
|
0,
|
|
0,
|
|
PSP_DEFAULT | PSP_HIDEHEADER
|
|
},
|
|
|
|
{
|
|
IDD_NEWOREDIT,
|
|
DlgEditOrNewPage,
|
|
IDS_NEWOREDIT_TITLE,
|
|
IDS_NEWOREDIT_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_PRODUCT,
|
|
DlgProductPage,
|
|
IDS_PRODUCT_TITLE,
|
|
IDS_PRODUCT_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_PLATFORM,
|
|
DlgPlatformPage,
|
|
IDS_PLATFORM_TITLE,
|
|
IDS_PLATFORM_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_UNATTENDMODE,
|
|
DlgUnattendModePage,
|
|
IDS_UNATTENDMODE_TITLE,
|
|
IDS_UNATTENDMODE_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_STANDALONE,
|
|
DlgStandAlonePage,
|
|
IDS_STANDALONE_TITLE,
|
|
IDS_STANDALONE_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_COPYFILES1,
|
|
DlgCopyFiles1Page,
|
|
IDS_COPYFILES1_TITLE,
|
|
IDS_COPYFILES1_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_DISTFOLDER,
|
|
DlgDistFolderPage,
|
|
IDS_DISTFOLD_TITLE,
|
|
IDS_DISTFOLD_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_LICENSEAGREEMENT,
|
|
DlgLicensePage,
|
|
IDS_LICENSEAGREEMENT_TITLE,
|
|
IDS_LICENSEAGREEMENT_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
|
|
{
|
|
IDD_SYSPREPLICENSEAGREEMENT,
|
|
DlgSysprepLicensePage,
|
|
IDS_LICENSEAGREEMENT_TITLE,
|
|
IDS_LICENSEAGREEMENT_SUBTITLE,
|
|
DEFAULT_PAGE_FLAGS
|
|
},
|
|
};
|
|
|
|
static TREEDLG vdpOEMTreeDialogs[] =
|
|
{
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_GENERAL,
|
|
IDS_DLG_GENERAL,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_MODE,
|
|
ModeDlgProc,
|
|
IDS_MODE_TITLE,
|
|
IDS_MODE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SKU,
|
|
SkuDlgProc,
|
|
IDS_SKU_TITLE,
|
|
IDS_SKU_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_OEMINFO,
|
|
OemInfoDlgProc,
|
|
IDS_OEMINFO_TITLE,
|
|
IDS_OEMINFO_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_PRODUCTKEY,
|
|
ProductKeyDlgProc,
|
|
IDS_PRODUCTKEY_TITLE,
|
|
IDS_PRODUCTKEY_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_APPINSTALL,
|
|
AppInstallDlgProc,
|
|
IDS_APPINSTALL_TITLE,
|
|
IDS_APPINSTALL_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_LOGO,
|
|
LogoDlgProc,
|
|
IDS_LOGO_TITLE,
|
|
IDS_LOGO_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_OOBE,
|
|
IDS_DLG_OOBE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_OOBECUST,
|
|
OobeCustDlgProc,
|
|
IDS_OOBECUST_TITLE,
|
|
IDS_OOBECUST_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SCREENSTWO,
|
|
ScreensTwoDlgProc,
|
|
IDS_SCREENSTWO_TITLE,
|
|
IDS_SCREENSTWO_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SCREENS,
|
|
ScreensDlgProc,
|
|
IDS_SCREENS_TITLE,
|
|
IDS_SCREENS_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_OOBEUSB,
|
|
OobeUSBDlgProc,
|
|
IDS_OOBEUSB_TITLE,
|
|
IDS_OOBEUSB_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_ISP,
|
|
IspDlgProc,
|
|
IDS_ISP_TITLE,
|
|
IDS_ISP_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
#ifdef HELPCENTER
|
|
{
|
|
IDD_HELPCENT,
|
|
HelpCenterDlgProc,
|
|
IDS_HELPCENT_TITLE,
|
|
IDS_HELPCENT_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
#endif
|
|
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_IEAK,
|
|
IDS_DLG_IEAK,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
#ifdef OEMCUST
|
|
{
|
|
IDD_OEMCUST,
|
|
OemCustDlgProc,
|
|
IDS_OEMCUST_TITLE,
|
|
IDS_OEMCUST_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
#endif // OEMCUST
|
|
|
|
#ifdef BRANDTITLE
|
|
{
|
|
IDD_BTITLE,
|
|
BrandTitleDlgProc,
|
|
IDS_BTITLE_TITLE,
|
|
IDS_BTITLE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
#endif // BRANDTITLE
|
|
|
|
{
|
|
IDD_BTOOLBARS,
|
|
BToolbarsDlgProc,
|
|
IDS_BTOOLBARS_TITLE,
|
|
IDS_BTOOLBARS_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_STARTSEARCH,
|
|
StartSearchDlgProc,
|
|
IDS_STARTSEARCH_TITLE,
|
|
IDS_STARTSEARCH_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_FAVORITES,
|
|
FavoritesDlgProc,
|
|
IDS_FAVORITES_TITLE,
|
|
IDS_FAVORITES_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_SHELLSETTINGS,
|
|
IDS_DLG_SHELLSETTINGS,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_STARTMENU,
|
|
StartMenuDlgProc,
|
|
IDS_STARTMENU_TITLE,
|
|
IDS_STARTMENU_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_OEMLINK,
|
|
OemLinkDlgProc,
|
|
IDS_OEMLINK_TITLE,
|
|
IDS_OEMLINK_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
};
|
|
|
|
static TREEDLG vdpCDTreeDialogs[] =
|
|
{
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_GENERAL,
|
|
IDS_DLG_GENERAL,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_NAMEORG,
|
|
DlgNameOrgPage,
|
|
IDS_NAMEORG_TITLE,
|
|
IDS_NAMEORG_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_DISPLAY,
|
|
DlgDisplayPage,
|
|
IDS_DISPLAY_TITLE,
|
|
IDS_DISPLAY_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_TIMEZONE,
|
|
DlgTimeZonePage,
|
|
IDS_TIMEZONE_TITLE,
|
|
IDS_TIMEZONE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_PID_CD,
|
|
DlgProductIdPage,
|
|
IDS_PID_TITLE,
|
|
IDS_PID_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_NETWORK,
|
|
IDS_DLG_NETWORK,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SRVLICENSE,
|
|
DlgSrvLicensePage,
|
|
IDS_SRVLICENSE_TITLE,
|
|
IDS_SRVLICENSE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
FALSE
|
|
},
|
|
|
|
{
|
|
IDD_COMPUTERNAME,
|
|
DlgComputerNamePage,
|
|
IDS_COMPNAME_TITLE,
|
|
IDS_COMPNAME_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SYSPREPCOMPUTERNAME,
|
|
DlgSysprepComputerNamePage,
|
|
IDS_SYSPREP_COMPNAME_TITLE,
|
|
IDS_SYSPREP_COMPNAME_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_ADMINPASSWORD,
|
|
DlgAdminPasswordPage,
|
|
IDS_ADMINPASSWD_TITLE,
|
|
IDS_ADMINPASSWD_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_LANWIZ_DLG,
|
|
DlgLANWizardPage,
|
|
IDS_LANWIZ_TITLE,
|
|
IDS_LANWIZ_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_DOMAINJ,
|
|
DlgDomainJoinPage,
|
|
IDS_DOMAINJ_TITLE,
|
|
IDS_DOMAINJ_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
0,
|
|
NULL,
|
|
IDS_DLG_ADVANCED,
|
|
IDS_DLG_ADVANCED,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
// If we define OPTCOMP we will display the optional components page otherwise this will be hidden. This page was removed
|
|
// for ISSUE: 628520
|
|
//
|
|
#ifdef OPTCOMP
|
|
{
|
|
IDD_OPTCOMP,
|
|
OptionalCompDlgProc,
|
|
IDS_OPTCOMP_TITLE,
|
|
IDS_OPTCOMP_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
#endif
|
|
|
|
|
|
{
|
|
IDD_TAPI,
|
|
DlgTapiPage,
|
|
IDS_TAPI_TITLE,
|
|
IDS_TAPI_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_REGIONALSETTINGS,
|
|
DlgRegionalSettingsPage,
|
|
IDS_REGIONAL_TITLE,
|
|
IDS_REGIONAL_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_LANGUAGESETTINGS,
|
|
DlgLangSettingsPage,
|
|
IDS_LANGUAGES_TITLE,
|
|
IDS_LANGUAGES_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_IE,
|
|
DlgIePage,
|
|
IDS_IE_TITLE,
|
|
IDS_IE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_TARGETPATH,
|
|
DlgTargetPathPage,
|
|
IDS_TARGETPATH_TITLE,
|
|
IDS_TARGETPATH_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_PRINTERS,
|
|
DlgPrintersPage,
|
|
IDS_PRINTERS_TITLE,
|
|
IDS_PRINTERS_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_RUNONCE,
|
|
DlgRunOncePage,
|
|
IDS_RUNONCE_TITLE,
|
|
IDS_RUNONCE_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_CMDLINES,
|
|
DlgCommandLinesPage,
|
|
IDS_CMDLINES_TITLE,
|
|
IDS_CMDLINES_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_SIFTEXT,
|
|
DlgSifTextSettingsPage,
|
|
IDS_SIF_TEXT_TITLE,
|
|
IDS_SIF_TEXT_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
{
|
|
IDD_OEMDUPSTRING,
|
|
DlgOemDuplicatorStringPage,
|
|
IDS_OEM_DUP_STRING_TITLE,
|
|
IDS_OEM_DUP_STRING_SUBTITLE,
|
|
NULL,
|
|
NULL,
|
|
TRUE
|
|
},
|
|
|
|
};
|
|
|
|
|
|
static SPLASHDLG vdpSplashDialogs[] =
|
|
{
|
|
{
|
|
IDD_COMPLETE,
|
|
CompleteDlgProc,
|
|
NULL
|
|
},
|
|
|
|
{
|
|
IDD_FINISH,
|
|
DlgFinishPage,
|
|
NULL
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// Global Variable(s):
|
|
//
|
|
HWND g_hCurrentDialog; // Current dialog being displayed by the tree view
|
|
DWORD g_dwWizardPages; // Total number of wizard pages for initial wizard
|
|
DWORD g_dwTreePages; // Total number of pages for tree view control
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CreateWizard
|
|
//
|
|
// Purpose: This function is responsible for creating the initial wizard
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
int CreateWizard(HINSTANCE hInstance, HWND hWndParent)
|
|
{
|
|
// Local variables.
|
|
//
|
|
PROPSHEETHEADER PropSheetHeader;
|
|
PROPSHEETPAGE PropPage;
|
|
HPROPSHEETPAGE *PageHandles;
|
|
WIZDLG *pPage;
|
|
DWORD nIndex = 0;
|
|
int nReturn = 0;
|
|
|
|
|
|
// Zero out this memory we are going to use
|
|
//
|
|
ZeroMemory(&PropSheetHeader, sizeof(PROPSHEETHEADER));
|
|
ZeroMemory(&PropPage, sizeof(PROPSHEETPAGE));
|
|
|
|
// Allocate the buffer for the handles to the wizard pages
|
|
//
|
|
if ((PageHandles = MALLOC(g_dwWizardPages * sizeof(HPROPSHEETPAGE))) != NULL )
|
|
{
|
|
// Setup all the property sheet pages.
|
|
//
|
|
for ( nIndex=0; nIndex<g_dwWizardPages; nIndex++ )
|
|
{
|
|
// Assign all the values for this property sheet.
|
|
//
|
|
pPage = (GET_FLAG(OPK_OEM) ? &vdpOEMWizardDialogs[nIndex] : &vdpCDWizardDialogs[nIndex]);
|
|
|
|
PropPage.dwSize = sizeof(PROPSHEETPAGE);
|
|
PropPage.hInstance = hInstance;
|
|
PropPage.pszTemplate = MAKEINTRESOURCE(pPage->dwResource);
|
|
PropPage.pszHeaderTitle = MAKEINTRESOURCE(pPage->dwTitle);
|
|
PropPage.pszHeaderSubTitle = MAKEINTRESOURCE(pPage->dwSubTitle);
|
|
PropPage.pfnDlgProc = pPage->dlgWindowProc;
|
|
PropPage.dwFlags = pPage->dwFlags;
|
|
|
|
// If there is no help file, don't show the help.
|
|
//
|
|
if ( !EXIST(g_App.szHelpFile) )
|
|
PropPage.dwFlags &= ~PSP_HASHELP;
|
|
|
|
#ifndef USEHELP
|
|
PropPage.dwFlags &= ~PSP_HASHELP;
|
|
#endif
|
|
|
|
// Dynamically create the property sheet
|
|
//
|
|
PageHandles[nIndex] = CreatePropertySheetPage(&PropPage);
|
|
}
|
|
|
|
|
|
// Setup the property sheet header.
|
|
//
|
|
PropSheetHeader.dwSize = sizeof(PROPSHEETHEADER);
|
|
PropSheetHeader.dwFlags = PSH_WIZARD97 |
|
|
PSH_WATERMARK |
|
|
#ifdef USEHELP
|
|
PSH_HASHELP |
|
|
#endif
|
|
PSH_HEADER |
|
|
PSH_USEICONID |
|
|
PSH_USECALLBACK;
|
|
PropSheetHeader.hInstance = hInstance;
|
|
PropSheetHeader.hwndParent = hWndParent;
|
|
PropSheetHeader.pszCaption = NULL;
|
|
PropSheetHeader.phpage = PageHandles;
|
|
PropSheetHeader.nStartPage = 0;
|
|
PropSheetHeader.nPages = g_dwWizardPages;
|
|
PropSheetHeader.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
|
|
PropSheetHeader.pszbmHeader = MAKEINTRESOURCE(IDB_BANNER);
|
|
PropSheetHeader.pszIcon = MAKEINTRESOURCE(IDI_SETUPMGR);
|
|
PropSheetHeader.pfnCallback = WizardCallbackProc;
|
|
|
|
// We are activating the wizard
|
|
//
|
|
SET_FLAG(OPK_ACTIVEWIZ, TRUE);
|
|
|
|
// Run the wizard.
|
|
//
|
|
nReturn = (int) PropertySheet(&PropSheetHeader);
|
|
|
|
// We are done with the wizard
|
|
//
|
|
SET_FLAG(OPK_ACTIVEWIZ, FALSE);
|
|
|
|
// Clean up the allocated memory
|
|
//
|
|
FREE(PageHandles);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
// We were unable to allocate memory
|
|
//
|
|
MsgBox(hWndParent, IDS_OUTOFMEM, IDS_APPNAME, MB_ERRORBOX);
|
|
}
|
|
|
|
return nReturn;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CreateMaintenanceWizard
|
|
//
|
|
// Purpose: This function creates the maintenance dialog, the main dialog for
|
|
// Setup Manager
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
int CreateMaintenanceWizard(HINSTANCE hInstance, HWND hWndParent)
|
|
{
|
|
TCHAR szMessage[MAX_PATH] = NULLSTR;
|
|
HWND hChild;
|
|
INITCOMMONCONTROLSEX icc;
|
|
|
|
// ISSUE-2002/02/28-stelo- Both the parameters are not being used. ASSERT on Invalid Parameters if used.
|
|
|
|
// Set the global wizard pages sizes based on OEM tag file
|
|
//
|
|
g_dwWizardPages = ((GET_FLAG(OPK_OEM) ? sizeof(vdpOEMWizardDialogs) : sizeof(vdpCDWizardDialogs)) / sizeof(WIZDLG));
|
|
g_dwTreePages = ((GET_FLAG(OPK_OEM) ? sizeof(vdpOEMTreeDialogs) : sizeof(vdpCDTreeDialogs)) / sizeof(TREEDLG));
|
|
|
|
|
|
// Make sure the common controls are loaded and ready to use.
|
|
//
|
|
icc.dwSize = sizeof(icc);
|
|
icc.dwICC = ICC_WIN95_CLASSES; // loads most commonly used WIN95 classes.
|
|
|
|
InitCommonControlsEx(&icc);
|
|
|
|
return( (int) DialogBox(g_App.hInstance, MAKEINTRESOURCE(IDD_MAINT), NULL, MaintDlgProc) );
|
|
}
|
|
|
|
int CALLBACK WizardCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam)
|
|
{
|
|
if ( uMsg==PSCB_INITIALIZED )
|
|
WizardSubWndProc(hwnd, WM_SUBWNDPROC, 0, 0L);
|
|
|
|
return 1;
|
|
}
|
|
|
|
LONG CALLBACK WizardSubWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
static FARPROC lpfnOldProc = NULL;
|
|
|
|
switch ( msg )
|
|
{
|
|
case WM_SUBWNDPROC:
|
|
lpfnOldProc = (FARPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
|
|
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WizardSubWndProc);
|
|
return 1;
|
|
|
|
case WM_HELP:
|
|
WIZ_HELP();
|
|
break;
|
|
}
|
|
|
|
if ( lpfnOldProc )
|
|
return (LONG) CallWindowProc((WNDPROC) lpfnOldProc, hwnd, msg, wParam, lParam);
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: MaintDlgProc
|
|
//
|
|
// Purpose: Main Dialog Proc for Setup Manager
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
LRESULT CALLBACK MaintDlgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
static HMENU hMenu;
|
|
|
|
switch (uMsg)
|
|
{
|
|
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
|
|
|
|
case WM_CLOSE:
|
|
{
|
|
// Exit the maintenence wizard all together
|
|
//
|
|
if ( !GET_FLAG(OPK_CREATED) || CloseProfile(hwnd, TRUE) )
|
|
EndDialog(hwnd, 0);
|
|
else
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
{
|
|
DWORD dwResult;
|
|
RECT rectHelp, rectCancel, rectBack, rectNext;
|
|
|
|
// Load the menu for the maintenance dialog
|
|
//
|
|
if (hMenu = LoadMenu(g_App.hInstance, GET_FLAG(OPK_OEM) ? MAKEINTRESOURCE(IDR_MAIN_OEM) : MAKEINTRESOURCE(IDR_MAIN_CORP)))
|
|
SetMenu(hwnd, hMenu);
|
|
|
|
if ( !EXIST(g_App.szHelpContentFile) )
|
|
EnableMenuItem(GetMenu(hwnd), ID_HELP_CONTENTS, MF_GRAYED);
|
|
|
|
if ( !EXIST(g_App.szHelpFile) )
|
|
EnableWindow(GetDlgItem(hwnd, IDC_MAINT_HELP), FALSE);
|
|
|
|
#ifndef USEHELP
|
|
|
|
// We are no longer using the help button, we should hide this and move the other controls over
|
|
//
|
|
EnableWindow(GetDlgItem(hwnd, IDC_MAINT_HELP), FALSE);
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_HELP), SW_HIDE);
|
|
|
|
// Move the other buttons to the right
|
|
//
|
|
if ( GetWindowRect(GetDlgItem(hwnd, IDC_MAINT_HELP), &rectHelp) &&
|
|
GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rectCancel) &&
|
|
GetWindowRect(GetDlgItem(hwnd, ID_MAINT_BACK), &rectBack) &&
|
|
GetWindowRect(GetDlgItem(hwnd, ID_MAINT_NEXT), &rectNext)
|
|
)
|
|
{
|
|
LONG lDelta = 0;
|
|
|
|
// Map the coordinates to the screen
|
|
//
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rectHelp, 2);
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rectCancel, 2);
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rectBack, 2);
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rectNext, 2);
|
|
|
|
// Determine the delta
|
|
//
|
|
lDelta = rectHelp.left - rectCancel.left;
|
|
|
|
// Set the new window position
|
|
//
|
|
SetWindowPos(GetDlgItem(hwnd, IDCANCEL), NULL, rectCancel.left+lDelta, rectCancel.top, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
|
|
SetWindowPos(GetDlgItem(hwnd, ID_MAINT_BACK), NULL, rectBack.left+lDelta, rectBack.top, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
|
|
SetWindowPos(GetDlgItem(hwnd, ID_MAINT_NEXT), NULL, rectNext.left+lDelta, rectNext.top, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
|
|
}
|
|
#endif
|
|
|
|
// Load the icon into the wizard window
|
|
//
|
|
SetClassLongPtr(hwnd, GCLP_HICON, (LONG_PTR) LoadIcon(g_App.hInstance, MAKEINTRESOURCE(IDI_OPKSETUP)));
|
|
|
|
// Make the title text bold
|
|
//
|
|
SetWindowFont(GetDlgItem(hwnd, IDC_MAINT_TITLE), FixedGlobals.hBoldFont, TRUE);
|
|
|
|
// Show the Maintenance Wizard
|
|
//
|
|
ShowWindow(hwnd, SW_SHOW);
|
|
|
|
// Create the Wizard dialog
|
|
//
|
|
dwResult = CreateWizard(g_App.hInstance, hwnd);
|
|
|
|
// Populate the tree dialog
|
|
//
|
|
FillTreeDialog(hwnd);
|
|
|
|
if ( !dwResult )
|
|
{
|
|
CloseProfile(hwnd, FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
// Enable the tree view
|
|
//
|
|
EnableWindow(GetDlgItem(hwnd, IDC_PAGES), TRUE);
|
|
|
|
// Select the first child after the last wizard dialog
|
|
//
|
|
if ( !GET_FLAG(OPK_MAINTMODE) )
|
|
SelectFirstMaintenanceDlg(hwnd);
|
|
|
|
// Set the focus to the maintenance wizard so we can use shortcuts
|
|
//
|
|
SetFocus(hwnd);
|
|
}
|
|
return FALSE;
|
|
|
|
case WM_NOTIFY:
|
|
switch ( ((NMHDR FAR *) lParam)->code )
|
|
{
|
|
case TVN_SELCHANGING:
|
|
{
|
|
NMHDR mhdr;
|
|
|
|
// Create the notification message for the wizard page
|
|
//
|
|
mhdr.code = PSN_WIZNEXT;
|
|
|
|
// Send the notification message and if we return false, then do not change the page
|
|
//
|
|
if (SendMessage(g_hCurrentDialog, WM_NOTIFY, (WPARAM) 0, (LPARAM) &mhdr) == -1)
|
|
WIZ_RESULT(hwnd, TRUE);
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case TVN_SELCHANGED:
|
|
{
|
|
HTREEITEM hItem;
|
|
DWORD dwIndex;
|
|
LPTREEDLG lpWizard = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
|
|
// Selection's been changed, now modify the buttons
|
|
//
|
|
EnableControls(hwnd);
|
|
|
|
// Get the current selection and display the dialog
|
|
//
|
|
if (hItem = TreeView_GetSelection(GetDlgItem(hwnd, IDC_PAGES)))
|
|
{
|
|
for(dwIndex=0;dwIndex < g_dwTreePages; dwIndex++, lpWizard++)
|
|
{
|
|
if ( lpWizard->hItem == hItem )
|
|
ShowTreeDialog(hwnd, lpWizard);
|
|
}
|
|
}
|
|
}
|
|
case PSN_SETACTIVE:
|
|
if (g_hCurrentDialog)
|
|
SendMessage(g_hCurrentDialog, WM_NOTIFY, wParam, lParam);
|
|
break;
|
|
}
|
|
|
|
case WM_KEYDOWN:
|
|
|
|
if ( wParam == 18225 )
|
|
break;
|
|
|
|
switch ( wParam )
|
|
{
|
|
case VK_F1:
|
|
|
|
{
|
|
DWORD dwVal = (DWORD) wParam,
|
|
dwVal2 = (DWORD) lParam;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PSM_PRESSBUTTON:
|
|
|
|
switch ( (int) wParam )
|
|
{
|
|
case PSBTN_FINISH:
|
|
break;
|
|
|
|
case PSBTN_NEXT:
|
|
|
|
// Selects the Next button.
|
|
//
|
|
SendMessage(GetDlgItem(hwnd, ID_MAINT_NEXT), BM_CLICK, 0, 0L);
|
|
break;
|
|
|
|
case PSBTN_BACK:
|
|
|
|
// Selects the Back button.
|
|
//
|
|
SendMessage(GetDlgItem(hwnd, ID_MAINT_BACK), BM_CLICK, 0, 0L);
|
|
break;
|
|
|
|
case PSBTN_CANCEL:
|
|
|
|
// Selects the Cancel button.
|
|
//
|
|
SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_CLICK, 0, 0L);
|
|
break;
|
|
|
|
case PSBTN_HELP:
|
|
|
|
// Selects the Help button.
|
|
//
|
|
SendMessage(GetDlgItem(hwnd, IDC_MAINT_HELP), BM_CLICK, 0, 0L);
|
|
break;
|
|
|
|
case PSBTN_OK:
|
|
|
|
// Selects the OK button.
|
|
//
|
|
break;
|
|
|
|
case PSBTN_APPLYNOW:
|
|
|
|
// Selects the Apply button.
|
|
//
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: TreeAddItem
|
|
//
|
|
// Purpose: Adds an item to the tree view returning a handle to that item
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static HTREEITEM TreeAddItem(HWND hwndTV, HTREEITEM hTreeParent, LPTSTR lpszItem)
|
|
{
|
|
TVITEM tvI;
|
|
TVINSERTSTRUCT tvIns;
|
|
|
|
if ( !lpszItem )
|
|
return NULL;
|
|
|
|
ZeroMemory(&tvI, sizeof(TVITEM));
|
|
tvI.pszText = lpszItem;
|
|
tvI.mask = TVIF_TEXT;
|
|
tvI.cchTextMax = lstrlen(tvI.pszText);
|
|
|
|
ZeroMemory(&tvIns, sizeof(TVINSERTSTRUCT));
|
|
tvIns.item = tvI;
|
|
tvIns.hInsertAfter = TVI_LAST;
|
|
tvIns.hParent = hTreeParent;
|
|
|
|
// Insert the item into the tree.
|
|
//
|
|
return TreeView_InsertItem(hwndTV, &tvIns);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: OnCommand
|
|
//
|
|
// Purpose: Processes the Commands of the Main Dialog Proc
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void OnCommand(HWND hwnd, INT id, HWND hwndCtl, UINT codeNotify)
|
|
{
|
|
HTREEITEM hItem;
|
|
|
|
switch ( id )
|
|
{
|
|
case ID_MAINT_NEXT:
|
|
case ID_MAINT_BACK:
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
LPTSTR lpStringNext = NULL;
|
|
TCHAR szStringButton[MAX_PATH];
|
|
|
|
// Determine if the user has pressed the Finish button
|
|
//
|
|
if ( (id == ID_MAINT_NEXT) &&
|
|
(lpStringNext = AllocateString(NULL, IDS_FINISH)) &&
|
|
(GetDlgItemText(hwnd, ID_MAINT_NEXT, szStringButton, STRSIZE(szStringButton))))
|
|
{
|
|
if(!lstrcmpi(lpStringNext, szStringButton))
|
|
{
|
|
SaveProfile(hwnd);
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
// Free the allocated string
|
|
//
|
|
FREE(lpStringNext);
|
|
|
|
// If the Finish button was not pressed, move to the next page
|
|
//
|
|
if ( !bReturn )
|
|
SelectTreeItem(hwnd, TreeView_GetSelection(GetDlgItem(hwnd, IDC_PAGES)), (id == ID_MAINT_NEXT ? TVGN_NEXTVISIBLE : TVGN_PREVIOUSVISIBLE) );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDCANCEL:
|
|
PostMessage(hwnd, WM_CLOSE, 0, 0L);
|
|
break;
|
|
|
|
case IDC_MAINT_HELP:
|
|
WIZ_HELP();
|
|
break;
|
|
|
|
case ID_FILE_SAVE:
|
|
case ID_FILE_SAVEAS:
|
|
SaveProfile(hwnd);
|
|
break;
|
|
|
|
case ID_FILE_CLOSE:
|
|
|
|
// We are going to close the config set but keep the maint wizard open
|
|
//
|
|
CloseProfile(hwnd, TRUE);
|
|
break;
|
|
|
|
case ID_FILE_NEW:
|
|
case ID_FILE_OPEN:
|
|
|
|
// We want to open the config set if:
|
|
// 1) There is now current config set open
|
|
// 2) There is a config set open and then closed
|
|
if ((!GET_FLAG(OPK_CREATED)) ||
|
|
(GET_FLAG(OPK_CREATED) && CloseProfile(hwnd, TRUE)))
|
|
{
|
|
// We are going to open an existing config set
|
|
//
|
|
OpenProfile(hwnd, (id == ID_FILE_NEW ? TRUE : FALSE));
|
|
}
|
|
break;
|
|
|
|
case ID_FILE_EXIT:
|
|
SendMessage(hwnd, WM_CLOSE, (WPARAM) 0, (LPARAM) 0);
|
|
break;
|
|
|
|
case ID_TOOLS_SHARE:
|
|
DistributionShareDialog(hwnd);
|
|
break;
|
|
|
|
case ID_TOOLS_SKUS:
|
|
ManageLangSku(hwnd);
|
|
break;
|
|
|
|
case ID_HELP_ABOUT:
|
|
DialogBox(g_App.hInstance, MAKEINTRESOURCE(IDD_ABOUT), hwnd, (DLGPROC) AboutDlgProc);
|
|
break;
|
|
|
|
case ID_HELP_CONTENTS:
|
|
HtmlHelp(hwnd, g_App.szHelpContentFile, HH_DISPLAY_TOC, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: ShowTreeDialog
|
|
//
|
|
// Purpose: This function Creates a wizard dialog and places it on the maintenance page
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void ShowTreeDialog(HWND hwnd, LPTREEDLG lpTreeDlg)
|
|
{
|
|
RECT rc;
|
|
LPTSTR lpTitle = NULL,
|
|
lpSubTitle = NULL;
|
|
NMHDR mhdr;
|
|
|
|
// Hide the current dialog
|
|
//
|
|
if ( g_hCurrentDialog ) {
|
|
ShowWindow(g_hCurrentDialog, SW_HIDE);
|
|
EnableWindow(g_hCurrentDialog, FALSE);
|
|
}
|
|
|
|
// Show the dialog if it exists or create/show if it does not
|
|
//
|
|
// ISSUE-2002/02/28-stelo- Check for the validity of LPTREEDLG variable
|
|
if ( lpTreeDlg->hWindow || (lpTreeDlg->hWindow = CreateDialog(g_App.hInstance, MAKEINTRESOURCE(lpTreeDlg->dwResource), hwnd, lpTreeDlg->dlgWindowProc )))
|
|
{
|
|
// Create the buffers for the title and subtitle
|
|
//
|
|
if ( (lpTitle = AllocateString(NULL, PtrToUint(MAKEINTRESOURCE(lpTreeDlg->dwTitle)))) != NULL &&
|
|
(lpSubTitle = AllocateString(NULL, PtrToUint(MAKEINTRESOURCE(lpTreeDlg->dwSubTitle)))) != NULL )
|
|
{
|
|
// Set up the title and subtitle for this dialog
|
|
//
|
|
SetDlgItemText(hwnd, IDC_MAINT_TITLE, lpTitle);
|
|
SetDlgItemText(hwnd, IDC_MAINT_SUBTITLE, lpSubTitle);
|
|
}
|
|
|
|
// Free the memory as we don't need it anymore
|
|
//
|
|
FREE(lpTitle);
|
|
FREE(lpSubTitle);
|
|
|
|
// Position the wizard dialog on the maintenance page and display it
|
|
//
|
|
GetWindowRect(GetDlgItem(hwnd, IDC_WIZARDFRAME) , &rc);
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rc, 2);
|
|
SetWindowPos(lpTreeDlg->hWindow, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
|
|
|
|
ShowWindow( lpTreeDlg->hWindow, SW_SHOW );
|
|
EnableWindow(lpTreeDlg->hWindow, TRUE);
|
|
|
|
// We need to know what the current dialog is
|
|
//
|
|
g_hCurrentDialog = lpTreeDlg->hWindow;
|
|
|
|
// Create the notification message for the wizard page
|
|
//
|
|
mhdr.code = PSN_SETACTIVE;
|
|
|
|
// Send the notification message and if we return false, then do not change the page
|
|
//
|
|
if ( SendMessage(lpTreeDlg->hWindow, WM_NOTIFY, (WPARAM) 0, (LPARAM) &mhdr) == -1 )
|
|
{
|
|
// TODO: We should handle when we want to fail the set active.
|
|
//
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: FillTreeDialog
|
|
//
|
|
// Purpose: Fills the Tree Dialog with the appropriate items
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void FillTreeDialog(HWND hwnd)
|
|
{
|
|
DWORD dwPage,
|
|
dwResult,
|
|
dwLastResource;
|
|
HTREEITEM hCurrentGroup = NULL;
|
|
LPTSTR lpHeader;
|
|
HTREEITEM hItem;
|
|
HWND hTreeView = GetDlgItem(hwnd, IDC_PAGES);
|
|
LPTREEDLG lpWizard = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
|
|
|
|
// Remove all items first
|
|
//
|
|
TreeView_DeleteAllItems(hTreeView);
|
|
|
|
// Update the items that should and should not be visible
|
|
//
|
|
UpdateTreeVisibility(hwnd);
|
|
|
|
// Loop through all the pages and add them to the tree view
|
|
//
|
|
for ( dwPage = 0; dwPage < g_dwTreePages; dwPage++, lpWizard++ )
|
|
{
|
|
if ( lpWizard->bVisible &&
|
|
(lpHeader = AllocateString(NULL, lpWizard->dwTitle)) != NULL )
|
|
{
|
|
// If a resource exists then it is a dialog, otherwise it's a group header
|
|
//
|
|
if ( lpWizard->dwResource )
|
|
lpWizard->hItem = TreeAddItem(hTreeView, hCurrentGroup, lpHeader);
|
|
else
|
|
hCurrentGroup = TreeAddItem(hTreeView, NULL, lpHeader);
|
|
|
|
// Expand the current group
|
|
//
|
|
TreeView_Expand(hTreeView, hCurrentGroup, TVE_EXPAND);
|
|
|
|
// Free the header, as it's no longer needed
|
|
//
|
|
FREE(lpHeader);
|
|
}
|
|
}
|
|
|
|
// Select the first child
|
|
//
|
|
TreeView_SelectItem(hTreeView, (hItem = TreeView_GetFirstVisible(hTreeView)));
|
|
TreeView_SelectItem(hTreeView, (hItem = TreeView_GetNextVisible(hTreeView, hItem)));
|
|
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: UpdateTreeVisibility
|
|
//
|
|
// Purpose: This function is used to update each item's bVisible property. At
|
|
// runtime certain variables may change that will change whether or not
|
|
// a page is displayed. This function handles those changes
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void UpdateTreeVisibility(HWND hwnd)
|
|
{
|
|
DWORD dwPage;
|
|
LPTREEDLG lpWizard = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
|
|
for ( dwPage = 0; dwPage < g_dwTreePages; dwPage++, lpWizard++ )
|
|
{
|
|
switch ( lpWizard->dwResource )
|
|
{
|
|
// Dialogs should not be displayed if we are doing a remote install
|
|
//
|
|
case IDD_DOMAINJ:
|
|
if ( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs should be displayed if we are doing a remote install
|
|
//
|
|
case IDD_SIFTEXT:
|
|
if ( WizGlobals.iProductInstall != PRODUCT_REMOTEINSTALL )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs should not be displayed if doing a sysprep install
|
|
//
|
|
case IDD_IE:
|
|
case IDD_TARGETPATH:
|
|
if ( WizGlobals.iProductInstall == PRODUCT_SYSPREP )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs should be displayed if doing a sysprep install
|
|
//
|
|
case IDD_OEMDUPSTRING:
|
|
if ( WizGlobals.iProductInstall != PRODUCT_SYSPREP )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs should be displayed if doing an unattended install
|
|
//
|
|
case IDD_COPYFILES1:
|
|
case IDD_DISTFOLDER:
|
|
case IDD_COMPUTERNAME:
|
|
case IDD_SCSI:
|
|
case IDD_HAL:
|
|
case IDD_OPTCOMP:
|
|
if ( WizGlobals.iProductInstall != PRODUCT_UNATTENDED_INSTALL )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs should not be displayed if doing an unattended install
|
|
//
|
|
case IDD_SYSPREPCOMPUTERNAME:
|
|
if ( WizGlobals.iProductInstall == PRODUCT_UNATTENDED_INSTALL )
|
|
lpWizard->bVisible = FALSE;
|
|
else
|
|
lpWizard->bVisible = TRUE;
|
|
|
|
break;
|
|
|
|
// Dialogs that should be displayed for server installs
|
|
//
|
|
case IDD_SRVLICENSE:
|
|
if ( PLATFORM_SERVERS & WizGlobals.iPlatform)
|
|
lpWizard->bVisible = TRUE;
|
|
else
|
|
lpWizard->bVisible = FALSE;
|
|
|
|
break;
|
|
|
|
/* Always show this now that the mouse stuff is back.
|
|
|
|
// If we are in DBCS mode, show the following screens
|
|
//
|
|
case IDD_SCREENS:
|
|
if ( GET_FLAG(OPK_DBCS))
|
|
lpWizard->bVisible = TRUE;
|
|
else
|
|
lpWizard->bVisible = FALSE;
|
|
*/
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: GetTreeItem
|
|
//
|
|
// Purpose: Given a handle to the TreeView item, this function returns the TREEDLG
|
|
// struct that corresponds with that handle.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static LPTREEDLG GetTreeItem(HWND hwnd, HTREEITEM hItem)
|
|
{
|
|
DWORD dwTreePages = 0,
|
|
dwPage = 0;
|
|
BOOL bFound = FALSE;
|
|
LPTREEDLG lpTreeIndex = NULL;
|
|
|
|
// The first two parameters are required, if any of them are NULL, we exit the fuction
|
|
//
|
|
if ( !hwnd || !hItem )
|
|
return NULL;
|
|
|
|
// Set the dialog to the first dialog in the array
|
|
//
|
|
lpTreeIndex = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
|
|
// Determine the number of tree pages that we are going to iterate through
|
|
//
|
|
dwTreePages = ((GET_FLAG(OPK_OEM) ? sizeof(vdpOEMTreeDialogs) : sizeof(vdpCDTreeDialogs)) / sizeof(TREEDLG));
|
|
|
|
// Loop through all of the wizard pages, looking for the item
|
|
//
|
|
for(dwPage=0;(dwPage < dwTreePages) && !bFound; dwPage++)
|
|
{
|
|
if ( lpTreeIndex->hItem == hItem )
|
|
bFound = TRUE;
|
|
else
|
|
lpTreeIndex++;
|
|
}
|
|
|
|
// If we did not find the item, return FALSE
|
|
//
|
|
if ( !bFound )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
// We successfully found the item, returning it as lpTreeDialog
|
|
//
|
|
return lpTreeIndex;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: SelectTreeItem
|
|
//
|
|
// Purpose: Selects the next/previous item relative to the supplied tree item
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static BOOL SelectTreeItem(HWND hwnd, HTREEITEM hItem, UINT uSelection)
|
|
{
|
|
BOOL bItemFound = FALSE;
|
|
HWND hwndTV = GetDlgItem(hwnd, IDC_PAGES);
|
|
LPTREEDLG lpTreeDialog;
|
|
|
|
// If we do not have the first two parameters or we can't get the TreeView handle then we exit the function
|
|
//
|
|
if ( !hwndTV || !hwnd || !hItem )
|
|
return FALSE;
|
|
|
|
// Verify that we have a valid selection
|
|
//
|
|
switch ( uSelection )
|
|
{
|
|
case TVGN_NEXTVISIBLE:
|
|
case TVGN_PREVIOUSVISIBLE:
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
// While we have not found the item, or there are no more items in that direction, continue iterations
|
|
//
|
|
while ( !bItemFound && hItem )
|
|
{
|
|
// If we are able to get the "next" item and grab the dialog struct check to make sure we have a resource
|
|
//
|
|
if ( (hItem = TreeView_GetNextItem(hwndTV, hItem, uSelection)) &&
|
|
(lpTreeDialog = GetTreeItem(hwnd, hItem)) &&
|
|
(lpTreeDialog->dwResource)
|
|
)
|
|
{
|
|
bItemFound = TRUE;
|
|
TreeView_SelectItem(hwndTV, hItem);
|
|
}
|
|
}
|
|
|
|
// Return whether or not the item was selected
|
|
//
|
|
return bItemFound;
|
|
}
|
|
|
|
|
|
static BOOL SelectFirstMaintenanceDlg(HWND hwnd)
|
|
{
|
|
DWORD dwTotalPages = 0,
|
|
dwPage = 0;
|
|
BOOL bFound = FALSE;
|
|
LPTREEDLG lpTreeIndex = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
WIZDLG WizardIndex;
|
|
|
|
// Determine the number of wizard pages in the array
|
|
//
|
|
dwTotalPages = ((GET_FLAG(OPK_OEM) ? sizeof(vdpOEMWizardDialogs) : sizeof(vdpCDWizardDialogs)) / sizeof(WIZDLG));
|
|
|
|
// Find the last dialog of the wizard
|
|
//
|
|
WizardIndex = (GET_FLAG(OPK_OEM) ? vdpOEMWizardDialogs[dwTotalPages - 1] : vdpCDWizardDialogs[dwTotalPages - 1]);
|
|
|
|
// Determine the number of pages in the tree array
|
|
//
|
|
dwTotalPages = ((GET_FLAG(OPK_OEM) ? sizeof(vdpOEMTreeDialogs) : sizeof(vdpCDTreeDialogs)) / sizeof(WIZDLG));
|
|
|
|
// Locate this dialog in the tree view
|
|
//
|
|
for(dwPage=0;(dwPage < ( dwTotalPages - 1 )) && !bFound; dwPage++)
|
|
{
|
|
if ( WizardIndex.dwResource == lpTreeIndex->dwResource )
|
|
{
|
|
bFound = TRUE;
|
|
|
|
// If there is an Item, select it
|
|
//
|
|
if ( lpTreeIndex->hItem )
|
|
SelectTreeItem(hwnd, lpTreeIndex->hItem, TVGN_NEXTVISIBLE );SelectTreeItem(hwnd, lpTreeIndex->hItem, TVGN_NEXTVISIBLE );
|
|
}
|
|
else
|
|
lpTreeIndex++;
|
|
}
|
|
|
|
return bFound;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: CloseProfile
|
|
//
|
|
// Purpose: This function closes an open profile but keeps the Maintenance Dialog
|
|
// open.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static BOOL CloseProfile(HWND hwnd, BOOL bUserGenerated)
|
|
{
|
|
HWND hwndTV = GetDlgItem(hwnd, IDC_PAGES);
|
|
DWORD dwPage,
|
|
dwReturn;
|
|
LPTSTR lpString;
|
|
LPTREEDLG lpWizard = (GET_FLAG(OPK_OEM) ? vdpOEMTreeDialogs : vdpCDTreeDialogs);
|
|
|
|
// If this was user generated and the do not want to close it, return
|
|
//
|
|
if ( bUserGenerated )
|
|
{
|
|
dwReturn = MsgBox(GetParent(hwnd), IDS_USERCLOSE, IDS_APPNAME, MB_YESNOCANCEL | MB_DEFBUTTON1 );
|
|
|
|
if ( dwReturn == IDYES )
|
|
{
|
|
SaveProfile(hwnd);
|
|
return FALSE;
|
|
}
|
|
else if ( dwReturn == IDCANCEL )
|
|
return FALSE;
|
|
}
|
|
|
|
// Set the tree handles back to null as they are of no use
|
|
//
|
|
for ( dwPage = 0; dwPage < g_dwTreePages; dwPage++, lpWizard++ )
|
|
{
|
|
|
|
// Destroy the window and set the array back to null
|
|
//
|
|
// ISSUE-2002/02/27-stelo,swamip - Need to check the window handle validity.
|
|
DestroyWindow(lpWizard->hWindow);
|
|
lpWizard->hWindow = NULL;
|
|
}
|
|
|
|
// Delete all the items from the list
|
|
//
|
|
if ( hwndTV )
|
|
EnableWindow(hwndTV, FALSE);
|
|
|
|
// Disable all the buttons, except Cancel
|
|
//
|
|
EnableWindow(GetDlgItem(hwnd, ID_MAINT_BACK), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, ID_MAINT_NEXT), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_MAINT_HELP), FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE);
|
|
|
|
// Disable the menu items
|
|
//
|
|
EnableMenuItem(GetMenu(hwnd), ID_FILE_CLOSE, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(GetMenu(hwnd), ID_FILE_SAVE, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
// Hide the title, subtitle
|
|
//
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_TITLE), SW_HIDE);
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_SUBTITLE), SW_HIDE);
|
|
|
|
// Make sure there is no titles in there
|
|
//
|
|
SetDlgItemText(hwnd, IDC_MAINT_TITLE, _T(""));
|
|
SetDlgItemText(hwnd, IDC_MAINT_SUBTITLE, _T(""));
|
|
|
|
// Reset necessary global flags
|
|
//
|
|
SET_FLAG(OPK_CREATED, FALSE);
|
|
|
|
// Reset necessary global variables
|
|
//
|
|
if ( g_App.szTempDir[0] )
|
|
DeletePath(g_App.szTempDir);
|
|
g_App.szTempDir[0] = NULLCHR;
|
|
g_App.szConfigName[0] = NULLCHR;
|
|
g_hCurrentDialog = NULL;
|
|
|
|
// Switch the button back to next
|
|
//
|
|
if ( lpString = AllocateString(NULL, IDS_NEXT))
|
|
{
|
|
SetDlgItemText(hwnd, ID_MAINT_NEXT, lpString);
|
|
FREE(lpString);
|
|
}
|
|
|
|
// Reset the necessary global variables for the answer file
|
|
//
|
|
FixedGlobals.iLoadType = LOAD_UNDEFINED;
|
|
FixedGlobals.ScriptName[0] = NULLCHR;
|
|
FixedGlobals.UdfFileName[0] = NULLCHR;
|
|
FixedGlobals.BatchFileName[0] = NULLCHR;
|
|
|
|
SetFocus(GetDlgItem(hwnd,IDCANCEL));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: OpenProfile
|
|
//
|
|
// Purpose: Brings the user to the open a new configuration/profile page, setting
|
|
// the proper default based on whether the user selected a new/open existing
|
|
// configuration.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void OpenProfile(HWND hwnd, BOOL bNewConfig)
|
|
{
|
|
HWND hwndTV = GetDlgItem(hwnd, IDC_PAGES);
|
|
|
|
// Enabled the menu items
|
|
//
|
|
EnableMenuItem(GetMenu(hwnd), ID_FILE_CLOSE, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(GetMenu(hwnd), ID_FILE_SAVE, MF_BYCOMMAND | MF_ENABLED);
|
|
|
|
EnableWindow(GetDlgItem(hwnd, ID_MAINT_BACK), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, ID_MAINT_NEXT), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_MAINT_HELP), TRUE);
|
|
EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE);
|
|
|
|
// Enable the title and subtitle
|
|
//
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_TITLE), SW_SHOW);
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_SUBTITLE), SW_SHOW);
|
|
|
|
// Are we going to open a new config set
|
|
//
|
|
if ( !bNewConfig )
|
|
SET_FLAG(OPK_OPENCONFIG, TRUE);
|
|
|
|
// Hide the splash screen
|
|
//
|
|
ShowSplashDialog(hwnd, 0);
|
|
|
|
SendMessage(hwnd, WM_INITDIALOG, (WPARAM) 0, (LPARAM) 0);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: SaveProfile
|
|
//
|
|
// Purpose: Saves the currently open profile
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void SaveProfile(HWND hwnd)
|
|
{
|
|
DWORD dwResult = 0;
|
|
NMHDR mhdr;
|
|
|
|
// Create the notification message for the wizard page
|
|
//
|
|
mhdr.code = TVN_SELCHANGING;
|
|
|
|
// Send the notification message and if we return false, then do not change the page
|
|
//
|
|
if ( !SendMessage(hwnd, WM_NOTIFY, (WPARAM) 0, (LPARAM) &mhdr) )
|
|
{
|
|
|
|
// The user is in the oem/system builder mode
|
|
//
|
|
if ( GET_FLAG(OPK_OEM) )
|
|
{
|
|
if ( DialogBox(g_App.hInstance, MAKEINTRESOURCE(IDD_SAVEAS), hwnd, SaveAsDlgProc) )
|
|
{
|
|
//
|
|
// Now some last minute cleanup before we are totally finished.
|
|
//
|
|
g_App.szTempDir[0] = NULLCHR;
|
|
|
|
// Show the complete splash screen
|
|
//
|
|
ShowSplashDialog(hwnd, IDD_COMPLETE);
|
|
|
|
// Close the config set
|
|
//
|
|
CloseProfile(hwnd, FALSE);
|
|
|
|
// Close if the auto run flag is set.
|
|
//
|
|
if ( GET_FLAG(OPK_AUTORUN) )
|
|
PostMessage(hwnd, WM_CLOSE, 0, 0L);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if ( DialogBox(g_App.hInstance, MAKEINTRESOURCE(IDD_SAVESCRIPT), hwnd, DlgSaveScriptPage) )
|
|
{
|
|
if ( WizGlobals.bCreateNewDistFolder &&
|
|
!WizGlobals.bStandAloneScript &&
|
|
(WizGlobals.iProductInstall == PRODUCT_UNATTENDED_INSTALL) )
|
|
{
|
|
COPYDIRDATA cdd;
|
|
DWORD dwFileCount;
|
|
LPTSTR lpBuffer;
|
|
TCHAR szBuffer[MAX_PATH] = NULLSTR;
|
|
|
|
|
|
// Clean up the memory before we use it
|
|
//
|
|
ZeroMemory(&cdd, sizeof(COPYDIRDATA));
|
|
|
|
// Fill in the COPYDIRDATA Structure
|
|
//
|
|
lstrcpyn(szBuffer, WizGlobals.bCopyFromPath ? WizGlobals.CopySourcePath : WizGlobals.CdSourcePath,AS(szBuffer));
|
|
AddPathN(szBuffer, _T(".."),AS(szBuffer));
|
|
GetFullPathName(szBuffer, AS(szBuffer), cdd.szSrc, &lpBuffer);
|
|
|
|
lstrcpyn(cdd.szDst, WizGlobals.DistFolder,AS(cdd.szDst));
|
|
|
|
lstrcpyn(cdd.szInfFile, cdd.szSrc,AS(cdd.szInfFile));
|
|
AddPathN(cdd.szInfFile, WizGlobals.Architecture,AS(cdd.szInfFile));
|
|
AddPathN(cdd.szInfFile, FILE_DOSNET_INF,AS(cdd.szInfFile));
|
|
|
|
dwFileCount = CopySkuFiles(NULL, NULL, cdd.szSrc, cdd.szDst, cdd.szInfFile);
|
|
cdd.dwFileCount = dwFileCount;
|
|
|
|
cdd.lpszEndSku = cdd.szDst + lstrlen(cdd.szDst);
|
|
|
|
// Call the dialog box that copies the sources over
|
|
//
|
|
DialogBoxParam(g_App.hInstance, MAKEINTRESOURCE(IDD_PROGRESS), hwnd, ProgressDlgProc, (LPARAM) &cdd);
|
|
}
|
|
|
|
// Show the complete splash screen
|
|
//
|
|
ShowSplashDialog(hwnd, IDD_FINISH);
|
|
|
|
CloseProfile(hwnd, FALSE);
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Function: EnableControls
|
|
//
|
|
// Purpose: Enables the proper back/next buttons based on the selection in the
|
|
// tree view
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static void EnableControls(HWND hwnd)
|
|
{
|
|
HTREEITEM hItem;
|
|
HWND hwndTV = GetDlgItem(hwnd, IDC_PAGES);
|
|
|
|
if (hwndTV &&
|
|
(hItem = TreeView_GetSelection(hwndTV)))
|
|
{
|
|
// Enable the back button if we are not the first dialog
|
|
//
|
|
EnableWindow(GetDlgItem(hwnd, ID_MAINT_BACK), ( hItem == TreeView_GetFirstVisible(hwndTV) ? FALSE : TRUE) );
|
|
|
|
}
|
|
return;
|
|
}
|
|
|
|
void SetWizardButtons(HWND hwnd, DWORD dwButtons)
|
|
{
|
|
LPTSTR lpString = NULL;
|
|
|
|
// Set the buttons for the starting wizard
|
|
//
|
|
SendMessage(GetParent(hwnd), PSM_SETWIZBUTTONS, 0, (LPARAM) dwButtons);
|
|
|
|
// Determine if we need to set the next button to the finish button
|
|
//
|
|
lpString = AllocateString(NULL, (dwButtons & PSWIZB_FINISH) ? IDS_FINISH : IDS_NEXT);
|
|
|
|
// ISSUE-2002/02/27-stelo,swamip - Make sure Buffer has been allocated.
|
|
SetDlgItemText(GetParent(hwnd), ID_MAINT_NEXT, lpString);
|
|
|
|
// Clean up the allocated memory
|
|
//
|
|
FREE(lpString);
|
|
|
|
|
|
// Set the maintenance mode buttons
|
|
//
|
|
EnableWindow(GetDlgItem(GetParent(hwnd), ID_MAINT_BACK), (dwButtons & PSWIZB_BACK));
|
|
EnableWindow(GetDlgItem(GetParent(hwnd), ID_MAINT_NEXT), (dwButtons & PSWIZB_NEXT) || (dwButtons & PSWIZB_FINISH));
|
|
}
|
|
|
|
static void ShowSplashDialog(HWND hwnd, DWORD dwResource)
|
|
{
|
|
DWORD dwIndex = 0,
|
|
dwDisplay = -1;
|
|
BOOL bFound = FALSE;
|
|
RECT rc;
|
|
|
|
// Loop through each dialog and hide any existing ones
|
|
//
|
|
for ( dwIndex = 0; dwIndex < AS(vdpSplashDialogs); dwIndex++)
|
|
{
|
|
// Hide existing windows
|
|
//
|
|
if ( vdpSplashDialogs[dwIndex].hWindow )
|
|
EndDialog(vdpSplashDialogs[dwIndex].hWindow, 0);
|
|
|
|
// Determine the one that we are going to display
|
|
//
|
|
if ( vdpSplashDialogs[dwIndex].dwResource == dwResource )
|
|
{
|
|
bFound = TRUE;
|
|
dwDisplay = dwIndex;
|
|
}
|
|
}
|
|
|
|
// We have been given a resource and we found it in the loop, display it
|
|
//
|
|
if ( dwResource && bFound)
|
|
{
|
|
if ( vdpSplashDialogs[dwDisplay].hWindow = CreateDialog(g_App.hInstance, MAKEINTRESOURCE(dwResource), hwnd, vdpSplashDialogs[dwDisplay].dlgWindowProc ))
|
|
{
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_BAR), SW_HIDE);
|
|
|
|
// Position the splash dialog on the splash frame
|
|
//
|
|
GetWindowRect(GetDlgItem(hwnd, IDC_SPLASHFRAME) , &rc);
|
|
MapWindowPoints(NULL, hwnd, (LPPOINT) &rc, 2);
|
|
SetWindowPos(vdpSplashDialogs[dwDisplay].hWindow, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
|
|
ShowWindow( vdpSplashDialogs[dwDisplay].hWindow, SW_SHOW );
|
|
}
|
|
|
|
}
|
|
else
|
|
ShowWindow(GetDlgItem(hwnd, IDC_MAINT_BAR), SW_SHOW);
|
|
|
|
}
|
|
|
|
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CHAR szCompany[] = VER_COMPANYNAME_STR,
|
|
szVersion[] = VER_FILEVERSION_STR,
|
|
szCopyright[] = VER_LEGALCOPYRIGHT_STR,
|
|
szDescription[] = VER_FILEDESCRIPTION_STR;
|
|
|
|
SetDlgItemTextA(hwnd, IDC_ABOUT_COMPANY, szCompany);
|
|
SetDlgItemTextA(hwnd, IDC_ABOUT_VERSION, szVersion);
|
|
SetDlgItemTextA(hwnd, IDC_ABOUT_COPYRIGHT, szCopyright);
|
|
SetDlgItemTextA(hwnd, IDC_ABOUT_DESCRIPTION, szDescription);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
|
|
if ( LOWORD(wParam) == IDOK )
|
|
EndDialog(hwnd, LOWORD(wParam));
|
|
return FALSE;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|