// // Driver Verifier UI // Copyright (c) Microsoft Corporation, 1999 // // // // module: DiskPage.cpp // author: DMihai // created: 11/7/01 // // Description: // #include "stdafx.h" #include "verifier.h" #include "DiskPage.h" #include "VrfUtil.h" #include "VGlobal.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // // Help IDs // static DWORD MyHelpIds[] = { IDC_DISKLIST_LIST, IDH_DV_DisksEnabled_Disk_FullList, 0, 0 }; ///////////////////////////////////////////////////////////////////////////// // CDiskListPage property page IMPLEMENT_DYNCREATE(CDiskListPage, CVerifierPropertyPage) CDiskListPage::CDiskListPage() : CVerifierPropertyPage(CDiskListPage::IDD) { //{{AFX_DATA_INIT(CDiskListPage) //}}AFX_DATA_INIT m_nSortColumnIndex = 1; m_bAscendSortSelected = FALSE; m_bAscendSortName = TRUE; } CDiskListPage::~CDiskListPage() { } void CDiskListPage::DoDataExchange(CDataExchange* pDX) { CVerifierPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDiskListPage) DDX_Control(pDX, IDC_DISKLIST_LIST, m_DiskList); DDX_Control(pDX, IDC_DISKLIST_NEXT_DESCR_STATIC, m_NextDescription); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDiskListPage, CVerifierPropertyPage) //{{AFX_MSG_MAP(CDiskListPage) ON_NOTIFY(LVN_COLUMNCLICK, IDC_DISKLIST_LIST, OnColumnclickDiskList) ON_WM_CONTEXTMENU() ON_MESSAGE( WM_HELP, OnHelp ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// VOID CDiskListPage::SetupListHeader() { CString strTitle; CRect rectWnd; LVCOLUMN lvColumn; // // The list's rectangle // m_DiskList.GetClientRect( &rectWnd ); ZeroMemory( &lvColumn, sizeof( lvColumn ) ); lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvColumn.fmt = LVCFMT_LEFT; // // Column 0 // VERIFY( strTitle.LoadString( IDS_ENABLED_QUESTION ) ); lvColumn.iSubItem = 0; lvColumn.cx = (int)( rectWnd.Width() * 0.12 ); lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 ); if (NULL != lvColumn.pszText) { VERIFY( m_DiskList.InsertColumn( 0, &lvColumn ) != -1 ); strTitle.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_DiskList.InsertColumn( 0, &lvColumn ) != -1 ); } // // Column 1 // VERIFY( strTitle.LoadString( IDS_DISK ) ); lvColumn.iSubItem = 1; lvColumn.cx = (int)( rectWnd.Width() * 0.87 ); lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 ); if (NULL != lvColumn.pszText) { VERIFY( m_DiskList.InsertColumn( 1, &lvColumn ) != -1 ); strTitle.ReleaseBuffer(); } else { lvColumn.pszText = g_szVoidText; VERIFY( m_DiskList.InsertColumn( 1, &lvColumn ) != -1 ); } } ///////////////////////////////////////////////////////////////////////////// VOID CDiskListPage::FillTheList() { INT_PTR nDisksNo; INT_PTR nCrtDiskIndex; CDiskData *pCrtDiskData; const CDiskDataArray &DiskDataArray = g_NewVerifierSettings.m_aDiskData; m_DiskList.DeleteAllItems(); // // Parse the driver data array // nDisksNo = DiskDataArray.GetSize(); for( nCrtDiskIndex = 0; nCrtDiskIndex < nDisksNo; nCrtDiskIndex += 1) { pCrtDiskData = DiskDataArray.GetAt( nCrtDiskIndex ); ASSERT_VALID( pCrtDiskData ); AddListItem( nCrtDiskIndex, pCrtDiskData ); } } ///////////////////////////////////////////////////////////////////////////// BOOL CDiskListPage::GetNewVerifiedDisks() { INT nListItemCount; INT nCrtListItem; INT_PTR nCrtDisksArrayIndex; BOOL bSomeDisksVerified; BOOL bVerified; CDiskData *pCrtDiskData; CDiskDataArray &DiskDataArray = g_NewVerifierSettings.m_aDiskData; bSomeDisksVerified = FALSE; nListItemCount = m_DiskList.GetItemCount(); for( nCrtListItem = 0; nCrtListItem < nListItemCount; nCrtListItem += 1 ) { // // Verification status for the current list item // bVerified = m_DiskList.GetCheck( nCrtListItem ); if( bVerified ) { bSomeDisksVerified = TRUE; } // // Set the right verify state in our disk array // nCrtDisksArrayIndex = m_DiskList.GetItemData( nCrtListItem ); pCrtDiskData = DiskDataArray.GetAt( nCrtDisksArrayIndex ); ASSERT_VALID( pCrtDiskData ); pCrtDiskData->m_bVerifierEnabled = bVerified; } return bSomeDisksVerified; } ///////////////////////////////////////////////////////////////////////////// BOOL CDiskListPage::GetCheckFromItemData( INT nItemData ) { BOOL bChecked = FALSE; INT nItemIndex; LVFINDINFO FindInfo; ZeroMemory( &FindInfo, sizeof( FindInfo ) ); FindInfo.flags = LVFI_PARAM; FindInfo.lParam = nItemData; nItemIndex = m_DiskList.FindItem( &FindInfo ); if( nItemIndex >= 0 ) { bChecked = m_DiskList.GetCheck( nItemIndex ); } return bChecked; } ///////////////////////////////////////////////////////////////////////////// BOOL CDiskListPage::GetBitNameFromItemData( LPARAM lParam, TCHAR *szName, ULONG uNameBufferLength ) { BOOL bSuccess = FALSE; INT nItemIndex; LVFINDINFO FindInfo; LVITEM lvItem; ZeroMemory( &FindInfo, sizeof( FindInfo ) ); FindInfo.flags = LVFI_PARAM; FindInfo.lParam = lParam; nItemIndex = m_DiskList.FindItem( &FindInfo ); if( nItemIndex >= 0 ) { // // Found it // ZeroMemory( &lvItem, sizeof( lvItem ) ); lvItem.mask = LVIF_TEXT; lvItem.iItem = nItemIndex; lvItem.iSubItem = 1; lvItem.pszText = szName; lvItem.cchTextMax = uNameBufferLength; bSuccess = m_DiskList.GetItem( &lvItem ); ASSERT( bSuccess ); } return bSuccess; } ///////////////////////////////////////////////////////////////////////////// VOID CDiskListPage::AddListItem( INT_PTR nItemData, CDiskData *pDiskData ) { INT nActualIndex; LVITEM lvItem; CString strName; ASSERT_VALID( pDiskData ); ZeroMemory( &lvItem, sizeof( lvItem ) ); // // Sub-item 0 - enabled/diabled - empty text and a checkbox // lvItem.pszText = g_szVoidText; lvItem.mask = LVIF_TEXT | LVIF_PARAM; lvItem.lParam = nItemData; lvItem.iItem = m_DiskList.GetItemCount(); nActualIndex = m_DiskList.InsertItem( &lvItem ); if( nActualIndex < 0 ) { // // Could not add an item in the list - give up // goto Done; } m_DiskList.SetCheck( nActualIndex, pDiskData->m_bVerifierEnabled ); // // Sub-item 1 - disk name // lvItem.pszText = pDiskData->m_strDiskDevicesForDisplay.GetBuffer( pDiskData->m_strDiskDevicesForDisplay.GetLength() + 1 ); if( NULL == lvItem.pszText ) { goto Done; } lvItem.mask = LVIF_TEXT; lvItem.iItem = nActualIndex; lvItem.iSubItem = 1; VERIFY( m_DiskList.SetItem( &lvItem ) ); pDiskData->m_strDiskDevicesForDisplay.ReleaseBuffer(); Done: // // All done // NOTHING; } ///////////////////////////////////////////////////////////// VOID CDiskListPage::SortTheList() { if( 0 != m_nSortColumnIndex ) { // // Sort by settings name // m_DiskList.SortItems( StringCmpFunc, (LPARAM)this ); } else { // // Sort by selected status // m_DiskList.SortItems( CheckedStatusCmpFunc, (LPARAM)this ); } } ///////////////////////////////////////////////////////////// int CALLBACK CDiskListPage::StringCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nCmpRez = 0; BOOL bSuccess; TCHAR szBitName1[ _MAX_PATH ]; TCHAR szBitName2[ _MAX_PATH ]; CDiskListPage *pThis = (CDiskListPage *)lParamSort; ASSERT_VALID( pThis ); ASSERT( 0 != pThis->m_nSortColumnIndex ); // // Get the first name // bSuccess = pThis->GetBitNameFromItemData( lParam1, szBitName1, ARRAY_LENGTH( szBitName1 ) ); if( FALSE == bSuccess ) { goto Done; } // // Get the second name // bSuccess = pThis->GetBitNameFromItemData( lParam2, szBitName2, ARRAY_LENGTH( szBitName2 ) ); if( FALSE == bSuccess ) { goto Done; } // // Compare the names // nCmpRez = _tcsicmp( szBitName1, szBitName2 ); if( FALSE != pThis->m_bAscendSortName ) { nCmpRez *= -1; } Done: return nCmpRez; } ///////////////////////////////////////////////////////////// int CALLBACK CDiskListPage::CheckedStatusCmpFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nCmpRez = 0; INT nItemIndex; BOOL bVerified1; BOOL bVerified2; LVFINDINFO FindInfo; CDiskListPage *pThis = (CDiskListPage *)lParamSort; ASSERT_VALID( pThis ); ASSERT( 0 == pThis->m_nSortColumnIndex ); // // Find the first item // ZeroMemory( &FindInfo, sizeof( FindInfo ) ); FindInfo.flags = LVFI_PARAM; FindInfo.lParam = lParam1; nItemIndex = pThis->m_DiskList.FindItem( &FindInfo ); if( nItemIndex < 0 ) { ASSERT( FALSE ); goto Done; } bVerified1 = pThis->m_DiskList.GetCheck( nItemIndex ); // // Find the second item // FindInfo.flags = LVFI_PARAM; FindInfo.lParam = lParam2; nItemIndex = pThis->m_DiskList.FindItem( &FindInfo ); if( nItemIndex < 0 ) { ASSERT( FALSE ); goto Done; } bVerified2 = pThis->m_DiskList.GetCheck( nItemIndex ); // // Compare them // if( bVerified1 != bVerified2 ) { if( FALSE != bVerified1 ) { nCmpRez = 1; } else { nCmpRez = -1; } if( FALSE != pThis->m_bAscendSortSelected ) { nCmpRez *= -1; } } Done: return nCmpRez; } ///////////////////////////////////////////////////////////////////////////// // CDiskListPage message handlers BOOL CDiskListPage::OnWizardFinish() { BOOL bExitTheApp; bExitTheApp = FALSE; if( GetNewVerifiedDisks() == TRUE ) { g_NewVerifierSettings.SaveToRegistry(); // // Exit the app // bExitTheApp = CVerifierPropertyPage::OnWizardFinish(); } else { VrfErrorResourceFormat( IDS_SELECT_AT_LEAST_ONE_DISK ); } return bExitTheApp; } ///////////////////////////////////////////////////////////////////////////// BOOL CDiskListPage::OnInitDialog() { CVerifierPropertyPage::OnInitDialog(); // // setup the list // m_DiskList.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | m_DiskList.GetExtendedStyle() ); SetupListHeader(); FillTheList(); VrfSetWindowText( m_NextDescription, IDS_DISKLIST_PAGE_FINISH_DESCR ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ///////////////////////////////////////////////////////////////////////////// void CDiskListPage::OnColumnclickDiskList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if( 0 != pNMListView->iSubItem ) { // // Clicked on the name column // if( m_nSortColumnIndex == pNMListView->iSubItem ) { // // Change the current ascend/descend order for this column // m_bAscendSortName = !m_bAscendSortName; } } else { // // Clicked on the selected status column // if( m_nSortColumnIndex == pNMListView->iSubItem ) { // // Change the current ascend/descend order for this column // m_bAscendSortSelected = !m_bAscendSortSelected; } } m_nSortColumnIndex = pNMListView->iSubItem; SortTheList(); *pResult = 0; } ///////////////////////////////////////////////////////////////////////////// BOOL CDiskListPage::OnSetActive() { // // This is always the last page of the wizard. // m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_FINISH ); return CVerifierPropertyPage::OnSetActive(); } ///////////////////////////////////////////////////////////// LONG CDiskListPage::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 CDiskListPage::OnContextMenu(CWnd* pWnd, CPoint point) { ::WinHelp( pWnd->m_hWnd, g_szVerifierHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) MyHelpIds ); }