You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
388 lines
12 KiB
388 lines
12 KiB
#include "stdafx.h"
|
|
#include "PageGeneral.h"
|
|
#include "PageServices.h"
|
|
#include "PageStartup.h"
|
|
#include "PageBootIni.h"
|
|
#include "PageIni.h"
|
|
#include "PageGeneral.h"
|
|
#include "ExpandDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define WM_SETCANCELTOCLOSE WM_USER + 1
|
|
|
|
extern CPageServices * ppageServices;
|
|
extern CPageStartup * ppageStartup;
|
|
extern CPageBootIni * ppageBootIni;
|
|
extern CPageIni * ppageWinIni;
|
|
extern CPageIni * ppageSystemIni;
|
|
extern CPageGeneral * ppageGeneral;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPageGeneral property page
|
|
|
|
IMPLEMENT_DYNCREATE(CPageGeneral, CPropertyPage)
|
|
|
|
CPageGeneral::CPageGeneral() : CPropertyPage(CPageGeneral::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CPageGeneral)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_fForceSelectiveRadio = FALSE;
|
|
}
|
|
|
|
CPageGeneral::~CPageGeneral()
|
|
{
|
|
}
|
|
|
|
void CPageGeneral::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPageGeneral)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPageGeneral, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CPageGeneral)
|
|
ON_BN_CLICKED(IDC_DIAGNOSTICSTARTUP, OnDiagnosticStartup)
|
|
ON_BN_CLICKED(IDC_NORMALSTARTUP, OnNormalStartup)
|
|
ON_BN_CLICKED(IDC_SELECTIVESTARTUP, OnSelectiveStartup)
|
|
ON_BN_CLICKED(IDC_CHECK_PROCSYSINI, OnCheckProcSysIni)
|
|
ON_BN_CLICKED(IDC_CHECKLOADSTARTUPITEMS, OnCheckStartupItems)
|
|
ON_BN_CLICKED(IDC_CHECKLOADSYSSERVICES, OnCheckServices)
|
|
ON_BN_CLICKED(IDC_CHECKPROCWININI, OnCheckWinIni)
|
|
ON_MESSAGE(WM_SETCANCELTOCLOSE, OnSetCancelToClose)
|
|
ON_BN_CLICKED(IDC_RADIOMODIFIED, OnRadioModified)
|
|
ON_BN_CLICKED(IDC_RADIOORIGINAL, OnRadioOriginal)
|
|
ON_BN_CLICKED(IDC_BUTTONEXTRACT, OnButtonExtract)
|
|
ON_BN_CLICKED(IDC_BUTTONLAUNCHSYSRESTORE, OnButtonSystemRestore)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPageGeneral message handlers
|
|
|
|
BOOL CPageGeneral::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
// Check to see if system restore is on this system (it should be).
|
|
|
|
BOOL fSysRestorePresent = FALSE;
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
if (::ExpandEnvironmentStrings(_T("%windir%\\system32\\restore\\rstrui.exe"), szPath, MAX_PATH))
|
|
fSysRestorePresent = FileExists(szPath);
|
|
::EnableWindow(GetDlgItemHWND(IDC_BUTTONLAUNCHSYSRESTORE), fSysRestorePresent);
|
|
|
|
// Hide the radio buttons for BOOT.INI if there isn't any such page.
|
|
|
|
if (NULL == ppageBootIni)
|
|
{
|
|
::ShowWindow(GetDlgItemHWND(IDC_RADIOORIGINAL), SW_HIDE);
|
|
::ShowWindow(GetDlgItemHWND(IDC_RADIOMODIFIED), SW_HIDE);
|
|
}
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// When the this tab is shown, we should update the buttons based on the
|
|
// states of the other tabs.
|
|
//-------------------------------------------------------------------------
|
|
|
|
BOOL CPageGeneral::OnSetActive()
|
|
{
|
|
UpdateControls();
|
|
return TRUE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Update the controls on the general tab based on the state of all the
|
|
// other tabs.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::UpdateControls()
|
|
{
|
|
// Get the state for each tabs. The state will be set in the check box
|
|
// associated with the particular tab, and an overall state will be
|
|
// maintained.
|
|
|
|
BOOL fAllNormal = TRUE;
|
|
BOOL fAllDiagnostic = TRUE;
|
|
|
|
if (ppageSystemIni)
|
|
UpdateCheckBox(ppageSystemIni, IDC_CHECK_PROCSYSINI, fAllNormal, fAllDiagnostic);
|
|
|
|
if (ppageWinIni)
|
|
UpdateCheckBox(ppageWinIni, IDC_CHECKPROCWININI, fAllNormal, fAllDiagnostic);
|
|
|
|
if (ppageServices)
|
|
UpdateCheckBox(ppageServices, IDC_CHECKLOADSYSSERVICES, fAllNormal, fAllDiagnostic);
|
|
|
|
if (ppageStartup)
|
|
UpdateCheckBox(ppageStartup, IDC_CHECKLOADSTARTUPITEMS, fAllNormal, fAllDiagnostic);
|
|
|
|
if (ppageBootIni)
|
|
{
|
|
if (NORMAL == dynamic_cast<CPageBase *>(ppageBootIni)->GetCurrentTabState())
|
|
CheckRadioButton(IDC_RADIOORIGINAL, IDC_RADIOMODIFIED, IDC_RADIOORIGINAL);
|
|
else
|
|
{
|
|
fAllNormal = FALSE;
|
|
CheckRadioButton(IDC_RADIOORIGINAL, IDC_RADIOMODIFIED, IDC_RADIOMODIFIED);
|
|
}
|
|
}
|
|
|
|
// Set the radio button based on the states of the tabs.
|
|
|
|
if (fAllNormal && !m_fForceSelectiveRadio)
|
|
CheckRadioButton(IDC_NORMALSTARTUP, IDC_SELECTIVESTARTUP, IDC_NORMALSTARTUP);
|
|
else if (fAllDiagnostic && !m_fForceSelectiveRadio)
|
|
CheckRadioButton(IDC_NORMALSTARTUP, IDC_SELECTIVESTARTUP, IDC_DIAGNOSTICSTARTUP);
|
|
else
|
|
CheckRadioButton(IDC_NORMALSTARTUP, IDC_SELECTIVESTARTUP, IDC_SELECTIVESTARTUP);
|
|
|
|
::EnableWindow(GetDlgItemHWND(IDC_CHECK_PROCSYSINI), ((!fAllNormal && !fAllDiagnostic) || m_fForceSelectiveRadio));
|
|
::EnableWindow(GetDlgItemHWND(IDC_CHECKPROCWININI), ((!fAllNormal && !fAllDiagnostic) || m_fForceSelectiveRadio));
|
|
::EnableWindow(GetDlgItemHWND(IDC_CHECKLOADSYSSERVICES), ((!fAllNormal && !fAllDiagnostic) || m_fForceSelectiveRadio));
|
|
::EnableWindow(GetDlgItemHWND(IDC_CHECKLOADSTARTUPITEMS), ((!fAllNormal && !fAllDiagnostic) || m_fForceSelectiveRadio));
|
|
|
|
if (ppageBootIni)
|
|
{
|
|
if ((!fAllNormal && !fAllDiagnostic) || m_fForceSelectiveRadio)
|
|
{
|
|
::EnableWindow(GetDlgItemHWND(IDC_RADIOORIGINAL), TRUE);
|
|
::EnableWindow(GetDlgItemHWND(IDC_RADIOMODIFIED), (IDC_RADIOMODIFIED == GetCheckedRadioButton(IDC_RADIOORIGINAL, IDC_RADIOMODIFIED)));
|
|
}
|
|
else
|
|
{
|
|
::EnableWindow(GetDlgItemHWND(IDC_RADIOMODIFIED), FALSE);
|
|
::EnableWindow(GetDlgItemHWND(IDC_RADIOORIGINAL), FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Update the checkbox for pPage (indicated by nControlID) as well as
|
|
// updating fAllNormal and fAllDiagnostic.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::UpdateCheckBox(CPageBase * pPage, UINT nControlID, BOOL & fAllNormal, BOOL & fAllDiagnostic)
|
|
{
|
|
CPageBase::TabState state = pPage->GetCurrentTabState();
|
|
UINT nCheck = BST_CHECKED;
|
|
if (state == CPageBase::DIAGNOSTIC)
|
|
nCheck = BST_UNCHECKED;
|
|
else if (state == CPageBase::USER)
|
|
nCheck = BST_INDETERMINATE;
|
|
|
|
CheckDlgButton(nControlID, nCheck);
|
|
|
|
// Finally, we need to keep track if all of the check boxes are either
|
|
// NORMAL or DIAGNOSTIC.
|
|
|
|
if (state != CPageBase::NORMAL)
|
|
fAllNormal = FALSE;
|
|
if (state != CPageBase::DIAGNOSTIC)
|
|
fAllDiagnostic = FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Allow another tab (OK, only the BOOT.INI tab will ever use this) to
|
|
// force the selection of the Selective radio button.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::ForceSelectiveRadio(BOOL fNewValue)
|
|
{
|
|
m_fForceSelectiveRadio = fNewValue;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// If the user clicks on the Startup or Diagnostic radio button, then
|
|
// all of the tabs will receive the appropriate notification.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnDiagnosticStartup()
|
|
{
|
|
m_fForceSelectiveRadio = FALSE;
|
|
|
|
if (ppageSystemIni) dynamic_cast<CPageBase *>(ppageSystemIni)->SetDiagnostic();
|
|
if (ppageWinIni) dynamic_cast<CPageBase *>(ppageWinIni)->SetDiagnostic();
|
|
if (ppageBootIni) dynamic_cast<CPageBase *>(ppageBootIni)->SetDiagnostic();
|
|
if (ppageServices) dynamic_cast<CPageBase *>(ppageServices)->SetDiagnostic();
|
|
if (ppageStartup) dynamic_cast<CPageBase *>(ppageStartup)->SetDiagnostic();
|
|
|
|
UpdateControls();
|
|
}
|
|
|
|
void CPageGeneral::OnNormalStartup()
|
|
{
|
|
m_fForceSelectiveRadio = FALSE;
|
|
|
|
if (ppageSystemIni) dynamic_cast<CPageBase *>(ppageSystemIni)->SetNormal();
|
|
if (ppageWinIni) dynamic_cast<CPageBase *>(ppageWinIni)->SetNormal();
|
|
if (ppageBootIni) dynamic_cast<CPageBase *>(ppageBootIni)->SetNormal();
|
|
if (ppageServices) dynamic_cast<CPageBase *>(ppageServices)->SetNormal();
|
|
if (ppageStartup) dynamic_cast<CPageBase *>(ppageStartup)->SetNormal();
|
|
|
|
UpdateControls();
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Most of the CPageBase functions we need to override (pure virtual)
|
|
// shouldn't do anything at all.
|
|
//-------------------------------------------------------------------------
|
|
|
|
CPageBase::TabState CPageGeneral::GetCurrentTabState()
|
|
{
|
|
return NORMAL;
|
|
}
|
|
|
|
BOOL CPageGeneral::OnApply()
|
|
{
|
|
this->PostMessage(WM_SETCANCELTOCLOSE);
|
|
return TRUE;
|
|
}
|
|
|
|
void CPageGeneral::CommitChanges()
|
|
{
|
|
}
|
|
|
|
void CPageGeneral::SetNormal()
|
|
{
|
|
}
|
|
|
|
void CPageGeneral::SetDiagnostic()
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// For some reason, CancelToClose() doesn't work if called in the
|
|
// OnApply override. So that function posts a user message to this
|
|
// page, which is handled by this function.
|
|
//-------------------------------------------------------------------------
|
|
|
|
LRESULT CPageGeneral::OnSetCancelToClose(WPARAM wparam, LPARAM lparam)
|
|
{
|
|
CancelToClose();
|
|
return 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// If the user selects selective startup radio button, force the selection
|
|
// to stick even if all the checkboxes are diagnostic or normal.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnSelectiveStartup()
|
|
{
|
|
m_fForceSelectiveRadio = TRUE;
|
|
UpdateControls();
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Handles the typical case for the checkbox click.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnClickedCheckBox(CPageBase * pPage, UINT nControlID)
|
|
{
|
|
ASSERT(pPage);
|
|
ASSERT(nControlID);
|
|
|
|
UINT nCheck = IsDlgButtonChecked(nControlID);
|
|
if (pPage != NULL)
|
|
{
|
|
switch (nCheck)
|
|
{
|
|
case BST_UNCHECKED:
|
|
pPage->SetDiagnostic();
|
|
break;
|
|
|
|
case BST_INDETERMINATE:
|
|
pPage->SetDiagnostic();
|
|
break;
|
|
|
|
case BST_CHECKED:
|
|
pPage->SetNormal();
|
|
break;
|
|
}
|
|
|
|
SetModified(TRUE);
|
|
UpdateControls();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// If the user clicks on a check box, we should allow the user
|
|
// to toggle between DIAGNOSTIC and NORMAL.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnCheckProcSysIni()
|
|
{
|
|
OnClickedCheckBox(ppageSystemIni, IDC_CHECK_PROCSYSINI);
|
|
}
|
|
|
|
void CPageGeneral::OnCheckStartupItems()
|
|
{
|
|
OnClickedCheckBox(ppageStartup, IDC_CHECKLOADSTARTUPITEMS);
|
|
}
|
|
|
|
void CPageGeneral::OnCheckServices()
|
|
{
|
|
OnClickedCheckBox(ppageServices, IDC_CHECKLOADSYSSERVICES);
|
|
}
|
|
|
|
void CPageGeneral::OnCheckWinIni()
|
|
{
|
|
OnClickedCheckBox(ppageWinIni, IDC_CHECKPROCWININI);
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Handle radio button selections for the BOOT.INI control.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnRadioModified()
|
|
{
|
|
// The user can never actually select this radio button. If this option
|
|
// is enabled, it's because it is already selected.
|
|
}
|
|
|
|
void CPageGeneral::OnRadioOriginal()
|
|
{
|
|
if (ppageBootIni)
|
|
{
|
|
dynamic_cast<CPageBase *>(ppageBootIni)->SetNormal();
|
|
::EnableWindow(GetDlgItemHWND(IDC_RADIOMODIFIED), FALSE);
|
|
}
|
|
|
|
UpdateControls();
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Display the extract dialog.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnButtonExtract()
|
|
{
|
|
CExpandDlg dlg;
|
|
dlg.DoModal();
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Launch System Restore, if it's around.
|
|
//-------------------------------------------------------------------------
|
|
|
|
void CPageGeneral::OnButtonSystemRestore()
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
if (::ExpandEnvironmentStrings(_T("%windir%\\system32\\restore\\rstrui.exe"), szPath, MAX_PATH))
|
|
::ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);
|
|
}
|