windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/setupmgr/oem/screens.c
2020-09-26 16:20:57 +08:00

455 lines
13 KiB
C

/****************************************************************************\
SCREENS.C / OPK Wizard (OPKWIZ.EXE)
Microsoft Confidential
Copyright (c) Microsoft Corporation 1998
All rights reserved
Source file for the OPK Wizard that contains the external and internal
functions used by the "screens" wizard page.
3/99 - Jason Cohen (JCOHEN)
Updated this old source file for the OPK Wizard as part of the OOBE
update. This file was totally re-written.
5/99 - Jason Cohen (JCOHEN)
Got rid of the global variables and cleaned up the code some more.
09/2000 - Stephen Lodwick (STELO)
Ported OPK Wizard to Whistler
02/2000 - Jason Cohen (JCOHEN)
Added back in the mouse stuff since the OOBE guys now decided that
the still need it.
\****************************************************************************/
//
// Include File(s):
//
#include "pch.h"
#include "wizard.h"
#include "resource.h"
//
// Internal Defined Value(s):
//
#define FILE_MOUSE_HTM _T("MOUSE.HTM")
#define FILE_IME_HTM _T("IMETUT1.HTM")
#define DIR_MOUSE DIR_OEM_OOBE _T("\\HTML\\Mouse")
#define DIR_IME DIR_OEM_OOBE _T("\\HTML\\IME")
//
// Internal Function Prototype(s):
//
static BOOL OnInit(HWND, HWND, LPARAM);
static void OnCommand(HWND, INT, HWND, UINT);
static BOOL OnNext(HWND hwnd);
static void EnableControls(HWND, UINT);
static BOOL BrowseCopy(HWND hwnd, LPTSTR lpszPath, INT id, BOOL bBatch);
//
// External Function(s):
//
LRESULT CALLBACK ScreensDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hwnd, WM_INITDIALOG, OnInit);
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
case WM_NOTIFY:
switch ( ((NMHDR FAR *) lParam)->code )
{
case PSN_KILLACTIVE:
case PSN_RESET:
case PSN_WIZBACK:
case PSN_WIZFINISH:
break;
case PSN_WIZNEXT:
if ( !OnNext(hwnd) )
WIZ_FAIL(hwnd);
break;
case PSN_QUERYCANCEL:
WIZ_CANCEL(hwnd);
break;
case PSN_SETACTIVE:
g_App.dwCurrentHelp = IDH_SCREENS;
WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT);
// Press next if the user is in auto mode
//
WIZ_NEXTONAUTO(hwnd, PSBTN_NEXT);
break;
case PSN_HELP:
WIZ_HELP();
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
//
// Internal Function(s):
//
static BOOL OnInit(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
TCHAR szCustDir[MAX_PATH] = NULLSTR,
szCustomIMEDir[MAX_PATH] = NULLSTR;
DWORD dwUseIMETutorial;
//
// Mouse tutorial:
//
// Check if mouse tutor is in use!
//
if ( GetPrivateProfileInt(INI_SEC_OPTIONS, INI_KEY_MOUSE, 0, GET_FLAG(OPK_BATCHMODE) ? g_App.szOpkWizIniFile : g_App.szOobeInfoIniFile) == 2 )
{
// 2 is a custom mouse tutorial, need to get the custom
// dir.
//
CheckRadioButton(hwnd, IDC_MOUSE_NO, IDC_MOUSE_CUSTOM, IDC_MOUSE_CUSTOM);
GetPrivateProfileString(INI_SEC_OPTIONS, INI_KEY_CUSTMOUSE, NULLSTR, szCustDir, AS(szCustDir), g_App.szOpkWizIniFile);
// Must simulate a copy if this is batch mode.
//
if ( GET_FLAG(OPK_BATCHMODE) )
BrowseCopy(hwnd, szCustDir, IDC_MOUSE_BROWSE, TRUE);
}
else
{
// 0, or default is no mouse tutorial.
//
CheckRadioButton(hwnd, IDC_MOUSE_NO, IDC_MOUSE_CUSTOM, IDC_MOUSE_NO);
}
// Now init the mouse tutorial fields.
//
SetDlgItemText(hwnd, IDC_MOUSE_DIR, szCustDir);
EnableControls(hwnd, IDC_MOUSE_CUSTOM);
//
// IME TUTORIAL
//
// Do we display the tutorial
//
if ( !GET_FLAG(OPK_DBCS) )
{
// Check the default radio button for Non-DBCS builds
//
CheckRadioButton(hwnd, IDC_IME_NO, IDC_IME_CUSTOM, IDC_IME_NO);
// Hide the options is not DBCS
//
ShowEnableWindow(GetDlgItem(hwnd, IDC_IME_NO), FALSE);
ShowEnableWindow(GetDlgItem(hwnd, IDC_IME_CUSTOM), FALSE);
ShowEnableWindow(GetDlgItem(hwnd, IDC_STATIC_IME), FALSE);
ShowEnableWindow(GetDlgItem(hwnd, IDC_IME_DIR), FALSE);
ShowEnableWindow(GetDlgItem(hwnd, IDC_IME_BROWSE), FALSE);
}
else
{
// Get the custom directory from the opkwiz.inf
//
GetPrivateProfileString(INI_SEC_OPTIONS, INI_KEY_IMECUSTDIR, NULLSTR, szCustomIMEDir, AS(szCustomIMEDir), g_App.szOpkWizIniFile);
// See if we are going to use the tutorial
//
dwUseIMETutorial = GetPrivateProfileInt(INI_SEC_OPTIONS, INI_KEY_IMETUT, 0, GET_FLAG(OPK_BATCHMODE) ? g_App. szOpkWizIniFile : g_App.szOobeInfoIniFile);
// Select the proper IME Tutorial
//
if ( szCustomIMEDir[0] && dwUseIMETutorial )
{
CheckRadioButton(hwnd, IDC_IME_NO, IDC_IME_CUSTOM, IDC_IME_CUSTOM);
// Must simulate a copy if this is batch mode.
//
if ( GET_FLAG(OPK_BATCHMODE) )
BrowseCopy(hwnd, szCustDir, IDC_IME_BROWSE, TRUE);
}
else
CheckRadioButton(hwnd, IDC_IME_NO, IDC_IME_CUSTOM, IDC_IME_NO);
SetDlgItemText(hwnd, IDC_IME_DIR, szCustomIMEDir);
EnableControls(hwnd, IDC_IME_CUSTOM);
}
// Always return false to WM_INITDIALOG.
//
return FALSE;
}
static void OnCommand(HWND hwnd, INT id, HWND hwndCtl, UINT codeNotify)
{
TCHAR szPath[MAX_PATH];
switch ( id )
{
case IDC_MOUSE_NO:
case IDC_MOUSE_CUSTOM:
case IDC_IME_NO:
case IDC_IME_CUSTOM:
EnableControls(hwnd, id);
break;
case IDC_MOUSE_BROWSE:
case IDC_IME_BROWSE:
// Try to use their current folder as the default.
//
szPath[0] = NULLCHR;
GetDlgItemText(hwnd, ( id == IDC_MOUSE_BROWSE ) ? IDC_MOUSE_DIR : IDC_IME_DIR, szPath, AS(szPath));
// If there is no current folder, just use the global browse default.
//
if ( szPath[0] == NULLCHR )
lstrcpyn(szPath, g_App.szBrowseFolder,AS(szPath));
// Now bring up the browse for folder dialog.
//
if ( BrowseForFolder(hwnd, IDS_BROWSEFOLDER, szPath, BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_VALIDATE) )
BrowseCopy(hwnd, szPath, id, FALSE);
break;
}
}
static BOOL OnNext(HWND hwnd)
{
TCHAR szFullPath[MAX_PATH],
szImeDir[MAX_PATH] = NULLSTR,
szMouseDir[MAX_PATH] = NULLSTR;
LPTSTR lpMouseOption;
//
// Verify the mouse tutorial settings.
//
// Create the path to the directory that needs to be removed, or
// must exist depending on the option selected.
//
lstrcpyn(szFullPath, g_App.szTempDir,AS(szFullPath));
AddPathN(szFullPath, DIR_MOUSE,AS(szFullPath));
// If we are doing a custom mouse tutorial, check for a valid directory.
// Otherwise, setup the correct values to write to the config files.
//
if ( IsDlgButtonChecked(hwnd, IDC_MOUSE_CUSTOM) == BST_CHECKED )
{
// Make sure we have a valid directory.
//
GetDlgItemText(hwnd, IDC_MOUSE_DIR, szMouseDir, AS(szMouseDir));
if ( !( szMouseDir[0] && DirectoryExists(szFullPath) ) )
{
MsgBox(GetParent(hwnd), IDS_ERR_MOUSEDIR, IDS_APPNAME, MB_ERRORBOX);
SetFocus(GetDlgItem(hwnd, IDC_MOUSE_BROWSE));
return FALSE;
}
// This is what we write out to the oobeinfo and batch file.
//
lpMouseOption = STR_2;
}
else
{
// This is what we write out to the oobeinfo and batch file.
//
lpMouseOption = STR_0;
// Remove the custom files that might already be there.
//
if ( DirectoryExists(szFullPath) )
DeletePath(szFullPath);
// Clear out the display box(es) so we know the files are
// all gone now.
//
SetDlgItemText(hwnd, IDC_MOUSE_DIR, NULLSTR);
}
//
// Verify the IME tutorial settings.
//
// Create the path to the directory that needs to be removed, or
// must exist depending on the option selected.
//
lstrcpyn(szFullPath, g_App.szTempDir,AS(szFullPath));
AddPathN(szFullPath, DIR_IME,AS(szFullPath));
// If we are doing a custom IME tutorial, check for a valid directory.
//
if ( ( GET_FLAG(OPK_DBCS) ) &&
( IsDlgButtonChecked(hwnd, IDC_IME_CUSTOM) == BST_CHECKED ) )
{
// Make sure we have a valid directory.
//
GetDlgItemText(hwnd, IDC_IME_DIR, szImeDir, AS(szImeDir));
if ( !( szImeDir[0] && DirectoryExists(szFullPath) ) )
{
MsgBox(GetParent(hwnd), IDS_ERR_IMEDIR, IDS_APPNAME, MB_ERRORBOX);
SetFocus(GetDlgItem(hwnd, IDC_IME_BROWSE));
return FALSE;
}
}
else
{
// Remove the files that might be there.
//
if ( DirectoryExists(szFullPath) )
DeletePath(szFullPath);
// Clear out the display box(es) so we know the files are
// all gone now.
//
SetDlgItemText(hwnd, IDC_IME_DIR, NULLSTR);
}
//
// Save the mouse tutorial settings:
//
// Write the custom mouse path.
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_CUSTMOUSE, szMouseDir[0] ? szMouseDir : NULL, g_App.szOpkWizIniFile);
// Write the data back to the config files.
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_MOUSE, lpMouseOption, g_App.szOobeInfoIniFile);
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_MOUSE, lpMouseOption, g_App.szOpkWizIniFile);
//
// Save the IME tutorial settings:
//
// If the IME tutorial should not be used, then write out STR_ZERO
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_IMETUT, szImeDir[0] ? STR_1 : STR_0, g_App.szOobeInfoIniFile);
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_IMETUT, szImeDir[0] ? STR_1 : STR_0, g_App.szOpkWizIniFile);
// Write out the IME tutorial custom directory if it's being used
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_IMECUSTDIR, szImeDir[0] ? szImeDir : NULL, g_App.szOpkWizIniFile);
// Always return TRUE if we got this far.
//
return TRUE;
}
static void EnableControls(HWND hwnd, UINT uId)
{
BOOL fEnable;
switch ( uId )
{
case IDC_MOUSE_NO:
case IDC_MOUSE_CUSTOM:
fEnable = ( IsDlgButtonChecked(hwnd, IDC_MOUSE_CUSTOM) == BST_CHECKED );
EnableWindow(GetDlgItem(hwnd, IDC_STATIC_MOUSE), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_MOUSE_DIR), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_MOUSE_BROWSE), fEnable);
break;
case IDC_IME_NO:
case IDC_IME_CUSTOM:
fEnable = ( IsDlgButtonChecked(hwnd, IDC_IME_CUSTOM) == BST_CHECKED );
EnableWindow(GetDlgItem(hwnd, IDC_STATIC_IME), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_IME_DIR), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_IME_BROWSE), fEnable);
break;
}
}
static BOOL BrowseCopy(HWND hwnd, LPTSTR lpszPath, INT id, BOOL bBatch)
{
BOOL bRet = FALSE;
TCHAR szDst[MAX_PATH];
LPTSTR lpEnd,
lpFilename;
// If the pressed OK, save off the path in our last browse folder buffer.
//
if ( !bBatch )
lstrcpyn(g_App.szBrowseFolder, lpszPath, AS(g_App.szBrowseFolder));
// We need to create the path to the destination directory where
// we are going to copy all the files.
//
lstrcpyn(szDst, g_App.szTempDir,AS(szDst));
AddPathN(szDst, ( id == IDC_MOUSE_BROWSE ) ? DIR_MOUSE : DIR_IME,AS(szDst));
// Check for required file.
//
lpEnd = lpszPath + lstrlen(lpszPath);
lpFilename = ( id == IDC_MOUSE_BROWSE ) ? FILE_MOUSE_HTM : FILE_IME_HTM;
AddPath(lpszPath, lpFilename);
if ( ( bBatch ) ||
( FileExists(lpszPath) ) ||
( MsgBox(GetParent(hwnd), ( id == IDC_MOUSE_BROWSE ) ? IDS_ERR_MOUSEFILES : IDS_ERR_IMEFILES, IDS_APPNAME, MB_ICONSTOP | MB_OKCANCEL | MB_APPLMODAL, lpFilename) == IDOK ) )
{
// Chop that file name off so we just have the path again.
//
*lpEnd = NULLCHR;
// Make sure that any exsisting files are removed.
//
if ( DirectoryExists(szDst) )
DeletePath(szDst);
// Now try to copy all the new files over.
//
if ( !CopyDirectoryDialog(g_App.hInstance, hwnd, lpszPath, szDst) )
{
DeletePath(szDst);
MsgBox(GetParent(hwnd), IDS_ERR_COPYINGFILES, IDS_APPNAME, MB_ERRORBOX, szDst[0], lpszPath);
*lpszPath = NULLCHR;
}
else
bRet = TRUE;
// Reset the path display boxes.
//
SetDlgItemText(hwnd, ( id == IDC_MOUSE_BROWSE ) ? IDC_MOUSE_DIR : IDC_IME_DIR, lpszPath);
}
return bRet;
}