// // Driver Verifier UI // Copyright (c) Microsoft Corporation, 1999 // // // // module: taspage.cpp // author: DMihai // created: 11/1/00 // // Description: // #include "stdafx.h" #include "verifier.h" #include "taspage.h" #include "VrfUtil.h" #include "VGlobal.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // Change this if you add/remove/change order // of radio buttons on this page // #define FIRST_RADIO_BUTTON_ID IDC_TAS_TYPICAL_RADIO // // Help IDs // static DWORD MyHelpIds[] = { IDC_TAS_TYPICAL_RADIO, IDH_DV_Settings_standard, IDC_TAS_ADVANCED_RADIO, IDH_DV_Settings_custom, IDC_TAS_DELETE_RADIO, IDH_DV_Settings_deleteexisting, IDC_TAS_VIEWREGISTRY_RADIO, IDH_DV_Settings_displaycurrent, IDC_TAS_STATISTICS_RADIO, IDH_DV_Settings_displayexisting, 0, 0 }; ///////////////////////////////////////////////////////////////////////////// // CTypAdvStatPage IMPLEMENT_DYNCREATE(CTypAdvStatPage, CVerifierPropertyPage) CTypAdvStatPage::CTypAdvStatPage() : CVerifierPropertyPage( CTypAdvStatPage::IDD ) { //{{AFX_DATA_INIT(CTypAdvStatPage) m_nCrtRadio = -1; //}}AFX_DATA_INIT } CTypAdvStatPage::~CTypAdvStatPage() { } ///////////////////////////////////////////////////////////////////////////// // // DDX support // void CTypAdvStatPage::DoDataExchange(CDataExchange* pDX) { CVerifierPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTypAdvStatPage) DDX_Control(pDX, IDC_TAS_NEXT_DESCR_STATIC, m_NextDescription); DDX_Radio(pDX, IDC_TAS_TYPICAL_RADIO, m_nCrtRadio); //}}AFX_DATA_MAP } ///////////////////////////////////////////////////////////////////////////// // // Message map // BEGIN_MESSAGE_MAP(CTypAdvStatPage, CVerifierPropertyPage) //{{AFX_MSG_MAP(CTypAdvStatPage) ON_BN_CLICKED(IDC_TAS_DELETE_RADIO, OnDeleteRadio) ON_BN_CLICKED(IDC_TAS_ADVANCED_RADIO, OnAdvancedRadio) ON_BN_CLICKED(IDC_TAS_STATISTICS_RADIO, OnStatisticsRadio) ON_BN_CLICKED(IDC_TAS_TYPICAL_RADIO, OnTypicalRadio) ON_BN_CLICKED(IDC_TAS_VIEWREGISTRY_RADIO, OnViewregistryRadio) ON_WM_CONTEXTMENU() ON_MESSAGE( WM_HELP, OnHelp ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // // All the property pages derived from this class should // provide these methods. // ULONG CTypAdvStatPage::GetDialogId() const { return CTypAdvStatPage::IDD; } ///////////////////////////////////////////////////////////////////////////// // CTypAdvStatPage message handlers LRESULT CTypAdvStatPage::OnWizardNext() { LRESULT lNextPageId; // // Kill a possible active worker thread // g_SlowProgressDlg.KillWorkerThread(); // // Let's assume we cannot continue // lNextPageId = -1; if( UpdateData() == TRUE ) { switch( m_nCrtRadio ) { case IDC_TAS_TYPICAL_RADIO - FIRST_RADIO_BUTTON_ID: // // Set typical settings and go to driver selection page // g_NewVerifierSettings.m_SettingsBits.m_SettingsType = CSettingsBits::SettingsTypeTypical; g_NewVerifierSettings.m_SettingsBits.SetTypicalOnly(); lNextPageId = IDD_DRVSET_PAGE; break; case IDC_TAS_ADVANCED_RADIO - FIRST_RADIO_BUTTON_ID: // // Start building custom settings (advanced, for developers) // g_NewVerifierSettings.m_SettingsBits.m_SettingsType = CSettingsBits::SettingsTypeCustom; lNextPageId = IDD_CUSTSETT_PAGE; break; case IDC_TAS_VIEWREGISTRY_RADIO - FIRST_RADIO_BUTTON_ID: // // Display the current registry settings // // // Load the current verified drivers string and flags from the registry // if( TRUE != VrtLoadCurrentRegistrySettings( g_bAllDriversVerified, g_astrVerifyDriverNamesRegistry, g_dwVerifierFlagsRegistry ) ) { goto Done; } // // Look if we already have loaded the list of drivers // with version information, etc. and if we need it // if( TRUE != g_NewVerifierSettings.m_DriversSet.m_bDriverDataInitialized ) { if( NULL == g_SlowProgressDlg.m_hWnd ) { // // This is the first time we are showing the // "slow progress" dialog so create it first // g_SlowProgressDlg.Create( CSlowProgressDlg::IDD, AfxGetMainWnd() ); } // // Show the dialog // g_SlowProgressDlg.ShowWindow( SW_SHOW ); // // Start the worker thread to do the work in background // while the initial thread updates the GUI. If the thread ends // successfully it will press our "Next" button at the end, after setting // g_NewVerifierSettings.m_DriversSet.m_bDriverDataInitialized to TRUE // g_SlowProgressDlg.StartWorkerThread( CSlowProgressDlg::LoadDriverDataWorkerThread, IDS_LOADING_DRIVER_INFORMATION ); // // Wait for the "next" button again // goto Done; } // // We have already loaded information (name, version, etc.) about // the currently loaded drivers if have gotten to this point. // // Go to the next page. // lNextPageId = IDD_CRT_REGISTRY_SETTINGS_PAGE; break; case IDC_TAS_STATISTICS_RADIO - FIRST_RADIO_BUTTON_ID: // // The user wants just statistics - nothing to change // lNextPageId = IDD_DRVSTATUS_STAT_PAGE; break; default: // // Oops. how did we get here? // // We shouldn't have had a "Next" button for the // "delete settings" selection // ASSERT( FALSE ); } } GoingToNextPageNotify( lNextPageId ); Done: return lNextPageId; } ///////////////////////////////////////////////////////////////////////////// void CTypAdvStatPage::OnDeleteRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_FINISH ); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_DELETE ); } void CTypAdvStatPage::OnAdvancedRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_CUSTOM ); } void CTypAdvStatPage::OnStatisticsRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_STATISTICS ); } void CTypAdvStatPage::OnTypicalRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_STANDARD ); } void CTypAdvStatPage::OnViewregistryRadio() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_NEXT ); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_REGISTRY ); } ///////////////////////////////////////////////////////////////////////////// BOOL CTypAdvStatPage::OnSetActive() { ASSERT_VALID( m_pParentSheet ); m_pParentSheet->SetWizardButtons( PSWIZB_NEXT ); return CVerifierPropertyPage::OnSetActive(); } ///////////////////////////////////////////////////////////////////////////// BOOL CTypAdvStatPage::OnWizardFinish() { BOOL bFinish; INT nResponse; // // Kill a possible active worker thread // g_SlowProgressDlg.KillWorkerThread(); bFinish = FALSE; if( TRUE == UpdateData( TRUE ) ) { // // This must have been the "delete settings" selection // if we had a "Finish" button. // ASSERT( IDC_TAS_DELETE_RADIO - FIRST_RADIO_BUTTON_ID == m_nCrtRadio ); nResponse = AfxMessageBox( IDS_DELETE_ALL_SETTINGS, MB_YESNO ); if( IDYES == nResponse ) { VrfDeleteAllVerifierSettings(); bFinish = CVerifierPropertyPage::OnWizardFinish(); } } return bFinish; } ///////////////////////////////////////////////////////////////////////////// BOOL CTypAdvStatPage::OnInitDialog() { // // Don't try to reconstruct the current data from the registry // to the GUI because it's too hard. Always start with the typical settings // m_nCrtRadio = IDC_TAS_TYPICAL_RADIO - FIRST_RADIO_BUTTON_ID; CVerifierPropertyPage::OnInitDialog(); VrfSetWindowText( m_NextDescription, IDS_TAS_PAGE_NEXT_DESCR_STANDARD ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////// LONG CTypAdvStatPage::OnHelp( WPARAM wParam, LPARAM lParam ) { LONG lResult = 0; LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam; ::WinHelp( (HWND) lpHelpInfo->hItemHandle, g_szVerifierHelpFile, HELP_WM_HELP, (DWORD_PTR) MyHelpIds ); return lResult; } ///////////////////////////////////////////////////////////////////////////// void CTypAdvStatPage::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp( pWnd->m_hWnd, g_szVerifierHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds ); }