|
|
// ActionDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Resource.h"
#include "ActDlg.h"
#include "FrSpace.h"
#include "FTManDef.h"
#include "Item.h"
#include "LogVol.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
extern LV_COLUMN_CONFIG ColumnsConfig[];
/////////////////////////////////////////////////////////////////////////////
// CActionDlg dialog
CActionDlg::CActionDlg( CObArray* parrVolumeData, UINT nIDTemplate /* =IDD_GENERIC_ACTION */ , BOOL bChangeOrder /* =TRUE */ , CWnd* pParent /* =NULL */) : CDialog(nIDTemplate, pParent), m_parrVolumeData( parrVolumeData ), m_bChangeOrder( bChangeOrder ) { //{{AFX_DATA_INIT(CActionDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
ASSERT( parrVolumeData ); }
void CActionDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CActionDlg)
if( m_bChangeOrder ) { DDX_Control(pDX, IDC_BUTTON_DOWN, m_buttonDown); DDX_Control(pDX, IDC_BUTTON_UP, m_buttonUp); } DDX_Control(pDX, IDC_LIST_VOLUMES, m_listVol); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CActionDlg, CDialog) //{{AFX_MSG_MAP(CActionDlg)
ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_UP, OnButtonUp) ON_BN_CLICKED(IDC_BUTTON_DOWN, OnButtonDown) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_VOLUMES, OnItemchangedListVolumes) ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_VOLUMES, OnKeydownListVolumes) ON_NOTIFY(NM_CLICK, IDC_LIST_VOLUMES, OnClickListVolumes) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////////////////////
// Protected methods
// Insert a item ( with the given data ) at a certain position in the given list ctrl
BOOL CActionDlg::InsertItem( CListCtrl& listCtrl, int iIndex, CItemData* pData ) { MY_TRY
ASSERT(pData); LVITEM lvitem; CString strDisplay;
// 1. Insert the item
lvitem.iItem = iIndex; ASSERT(LVC_Name==0); // The first SubItem must be zero
lvitem.iSubItem = 0; pData->GetDisplayExtendedName(strDisplay); lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay; lvitem.iImage = pData->GetImageIndex(); lvitem.lParam = (LPARAM)pData; lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM ; int iActualItem = listCtrl.InsertItem( &lvitem ); if( iActualItem < 0 ) return FALSE;
// 2. Set all subitems
lvitem.iItem = iActualItem; lvitem.mask = LVIF_TEXT;
// Disks set
lvitem.iSubItem = 1; pData->GetDisplayDisksSet(strDisplay); lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay; listCtrl.SetItem( &lvitem );
// Size
lvitem.iSubItem = 2; pData->GetDisplaySize(strDisplay); lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay; listCtrl.SetItem( &lvitem );
return TRUE;
MY_CATCH_AND_THROW }
// Move an item from the old index to a new index in the given list ctrl
BOOL CActionDlg::MoveItem( CListCtrl& listCtrl, int iOldIndex, int iNewIndex ) { MY_TRY
ASSERT( ( iOldIndex >= 0 ) && ( iOldIndex < listCtrl.GetItemCount() ) ); ASSERT( ( iNewIndex >= 0 ) && ( iNewIndex < listCtrl.GetItemCount() ) );
if( iOldIndex == iNewIndex ) return TRUE;
// 1. Get the item information
LVITEM lvitem; lvitem.iItem = iOldIndex; lvitem.iSubItem = 0; lvitem.mask = LVIF_PARAM; if( !listCtrl.GetItem(&lvitem) ) return FALSE; CItemData* pData = (CItemData*)(lvitem.lParam);
// 2. Delete the item at the old position
if( !listCtrl.DeleteItem(iOldIndex) ) return FALSE;
// 3. Insert the item at the new position
if ( !InsertItem( listCtrl, iNewIndex, pData ) ) return FALSE;
// 4. Select and focus again the item
m_listVol.SetItemState( iNewIndex, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED ); return TRUE;
MY_CATCH_AND_THROW }
// Prepare the given control list to display volume information
void CActionDlg::ConfigureList ( CListCtrl& listCtrl ) { MY_TRY
if( m_ImageListSmall.GetSafeHandle() != NULL ) listCtrl.SetImageList(&m_ImageListSmall, LVSIL_SMALL); // Insert columns (REPORT mode)
CRect rect; listCtrl.GetWindowRect(&rect);
// Add some columns ( not all columns from ColumnConfig are necessary in the dialog )
// The name
PLV_COLUMN_CONFIG pColumn = &(ColumnsConfig[LVC_Name]); CString str; if( !str.LoadString(pColumn->dwTitleID) ) ASSERT(FALSE); listCtrl.InsertColumn( 0, str, pColumn->nFormat , rect.Width() * 1/2, 0);
// The disks set
pColumn = &(ColumnsConfig[LVC_DiskNumber]); if( !str.LoadString(pColumn->dwTitleID) ) ASSERT(FALSE); listCtrl.InsertColumn( 1, str, pColumn->nFormat , rect.Width() * 1/6, 1);
// The size
pColumn = &(ColumnsConfig[LVC_Size]); if( !str.LoadString(pColumn->dwTitleID) ) ASSERT(FALSE); listCtrl.InsertColumn( 2, str, pColumn->nFormat , rect.Width() * 4/15, 2);
MY_CATCH_AND_THROW
}
// Populate the given control list with the given volumes data
// parrData should point to an array of CLVTreeItemData objects
void CActionDlg::PopulateList ( CListCtrl& listCtrl, CObArray* parrData ) { MY_TRY
for( int i = 0; i < parrData->GetSize(); i++ ) { CItemData* pData = (CItemData*)(parrData->GetAt(i)); ASSERT(pData); InsertItem( listCtrl, i, pData ); }
MY_CATCH_AND_THROW }
/////////////////////////////////////////////////////////////////////////////
// CActionDlg message handlers
BOOL CActionDlg::OnInitDialog() { MY_TRY
CDialog::OnInitDialog(); // TODO: Add extra initialization here
// Set caption
CString str; str.LoadString(IDS_ACTION_DLG_CAPTION); SetWindowText(str);
// Create the image list small icons
// The background color for mask is pink. All image's pixels of this color will take
// the view's background color.
if( !m_ImageListSmall.Create( IDB_IMAGELIST_SMALL, 16, 16, RGB( 255, 0, 255 ) ) ) AfxMessageBox( IDS_ERR_CREATE_IMAGELIST, MB_ICONSTOP );
// Configure and populate the list ctrl
ConfigureList( m_listVol ); ASSERT( m_parrVolumeData->GetSize() > 0 ); PopulateList( m_listVol, m_parrVolumeData );
// Select and focus the first item in the list ctrl
if( m_listVol.GetItemCount() > 0 ) m_listVol.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED );
MY_CATCH_REPORT_AND_CANCEL
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CActionDlg::OnDestroy() { // Delete the image list
m_ImageListSmall.DeleteImageList(); CDialog::OnDestroy(); }
void CActionDlg::OnButtonUp() { MY_TRY ASSERT( m_bChangeOrder ); int iItem = m_listVol.GetNextItem(-1, LVNI_SELECTED); if (iItem < 0 ) { TRACE(_T("No items were selected!\n")); return; } if( iItem > 0 ) { MoveItem( m_listVol, iItem, iItem-1 ); m_listVol.EnsureVisible(iItem-1, FALSE); m_listVol.SetFocus(); } MY_CATCH_REPORT_AND_CANCEL }
void CActionDlg::OnButtonDown() { MY_TRY ASSERT( m_bChangeOrder ); int iItem = m_listVol.GetNextItem(-1, LVNI_SELECTED); if (iItem < 0 ) { TRACE(_T("No items were selected!\n")); return; } if( iItem < m_listVol.GetItemCount()-1 ) { MoveItem( m_listVol, iItem, iItem+1 ); m_listVol.EnsureVisible(iItem+1, FALSE); m_listVol.SetFocus(); } MY_CATCH_REPORT_AND_CANCEL }
void CActionDlg::OnItemchangedListVolumes(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here
// We are interested on items who received focus
if( m_bChangeOrder && ( pNMListView->uChanged & LVIF_STATE ) && ( pNMListView->uNewState & LVIS_FOCUSED ) && !( pNMListView->uOldState & LVIS_FOCUSED ) ) { m_buttonUp.EnableWindow( pNMListView->iItem > 0 ); m_buttonDown.EnableWindow( pNMListView->iItem < m_listVol.GetItemCount() - 1 ); } *pResult = 0; }
void CActionDlg::OnClickListVolumes(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here
POINT pt; GetCursorPos( &pt ); LVHITTESTINFO lvhittestinfo; lvhittestinfo.pt = pt; m_listVol.ScreenToClient( &(lvhittestinfo.pt) ); lvhittestinfo.pt.x = 4; int iItem = ListView_SubItemHitTest( m_listVol.GetSafeHwnd(), &lvhittestinfo );
if( iItem >= 0 ) m_listVol.SetItemState( iItem, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED ); else { if( m_bChangeOrder ) { // Disable buttons Up and Down because no item will be selected
m_buttonUp.EnableWindow( FALSE ); m_buttonDown.EnableWindow( FALSE ); } } }
void CActionDlg::OnOK() { MY_TRY
// Just read the new order of members
if( m_bChangeOrder ) { m_parrVolumeData->RemoveAll(); for( int i = 0; i < m_listVol.GetItemCount(); i++ ) { LVITEM lvitem; lvitem.iItem = i; lvitem.iSubItem = 0; lvitem.mask = LVIF_PARAM; if( !m_listVol.GetItem(&lvitem) ) return;
CItemData* pData = (CItemData*)(lvitem.lParam); ASSERT(pData); m_parrVolumeData->Add( pData ); } } CDialog::OnOK(); MY_CATCH_REPORT_AND_CANCEL }
void CActionDlg::OnKeydownListVolumes(NMHDR* pNMHDR, LRESULT* pResult) { if( !m_bChangeOrder ) { *pResult = 0; return; }
#pragma message("TODO: A keyboard hook would be more useful here")
LV_KEYDOWN* pLVKeyDown = (LV_KEYDOWN*)pNMHDR; // TODO: Add your control notification handler code here
// We are interested on:
// SHIFT-UP or U equivalent with pressing button "Up"
// SHIFT_DOWN or D equivalent with pressing button "Down"
BOOL bIsShiftPressed = ( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ); if( ( ( pLVKeyDown->wVKey == VK_DOWN ) && bIsShiftPressed ) || ( pLVKeyDown->wVKey == 'D') ) { OnButtonDown(); *pResult = 1; return; } if( ( ( pLVKeyDown->wVKey == VK_UP ) && bIsShiftPressed ) || ( pLVKeyDown->wVKey == 'U') ) { OnButtonUp(); *pResult = 1; return; } *pResult = 0; }
/////////////////////////////////////////////////////////////////////////////
// CCreateStripeDlg dialog
CCreateStripeDlg::CCreateStripeDlg( CObArray* parrVolumeData, UINT nIDTemplate /* =IDD_CREATE_STRIPE */ ,CWnd* pParent /* =NULL */) : CActionDlg( parrVolumeData, nIDTemplate, TRUE, pParent) { //{{AFX_DATA_INIT(CCreateStripeDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_ulStripeSize = 0x10000; // 64KB
}
void CCreateStripeDlg::DoDataExchange(CDataExchange* pDX) { CActionDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCreateStripeDlg)
DDX_Control(pDX, IDC_COMBO_STRIPE_SIZE, m_comboStripeSize); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCreateStripeDlg, CActionDlg) //{{AFX_MSG_MAP(CCreateStripeDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CActionDlg message handlers
BOOL CCreateStripeDlg::OnInitDialog() { MY_TRY
CActionDlg::OnInitDialog();
// Fill the stripe size combo with all powers of 2 between 8KB and 4MB
for( ULONG ulStripeSize = 0x2000; ulStripeSize <= 0x400000; ulStripeSize = ( ulStripeSize << 1 ) ) { CString strStripeSize; FormatVolumeSize( strStripeSize, ulStripeSize ); int nIndex = m_comboStripeSize.AddString( strStripeSize ); if( nIndex != CB_ERR ) { m_comboStripeSize.SetItemData(nIndex, ulStripeSize ); if( ulStripeSize == m_ulStripeSize ) m_comboStripeSize.SetCurSel(nIndex); } } MY_CATCH_REPORT_AND_CANCEL
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCreateStripeDlg::OnOK() { // TODO: Add extra validation here
int nIndex = m_comboStripeSize.GetCurSel(); ASSERT( nIndex >= 0 ); m_ulStripeSize = (ULONG)(m_comboStripeSize.GetItemData(nIndex)); CActionDlg::OnOK(); }
/////////////////////////////////////////////////////////////////////////////
// CBreakDlg dialog
CBreakDlg::CBreakDlg( CLogicalVolumeData *pSetData, CObArray* parrMembersData, UINT nIDTemplate /* =IDD_BREAK */ , CWnd* pParent /* =NULL */ ) : CActionDlg( parrMembersData, nIDTemplate, FALSE, pParent), m_pSetData(pSetData), m_nWinnerIndex(-1), m_nFocusedItem(-1) { MY_TRY
//{{AFX_DATA_INIT(CBreakDlg)
m_staticSetName = _T(""); //}}AFX_DATA_INIT
ASSERT( pSetData ); m_pSetData->GetDisplayExtendedName(m_staticSetName);
MY_CATCH_AND_REPORT }
void CBreakDlg::DoDataExchange(CDataExchange* pDX) { CActionDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBreakDlg)
DDX_Text(pDX, IDC_STATIC_SET_NAME, m_staticSetName); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBreakDlg, CActionDlg) //{{AFX_MSG_MAP(CBreakDlg)
ON_NOTIFY(LVN_ITEMCHANGING, IDC_LIST_VOLUMES, OnItemchangingListVolumes) ON_NOTIFY(NM_CLICK, IDC_LIST_VOLUMES, OnClickListVolumes) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBreakDlg message handlers
BOOL CBreakDlg::OnInitDialog() { CActionDlg::OnInitDialog();
// Select and focus the first healthy member
for( int i = 0; i < m_listVol.GetItemCount(); i++ ) { CItemData* pData = (CItemData*)(m_listVol.GetItemData(i)); ASSERT(pData); if( pData->GetMemberStatus() == FtMemberHealthy ) { m_listVol.SetItemState( i, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED ); break; } }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBreakDlg::OnOK() { // Get the winner
int iItem = m_listVol.GetNextItem(-1, LVNI_SELECTED); if (iItem < 0 ) { TRACE(_T("No items were selected!\n")); return; }
m_nWinnerIndex = iItem;
CActionDlg::OnOK(); }
void CBreakDlg::OnItemchangingListVolumes(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here
if( pNMListView->uChanged & LVIF_STATE ) { // If the item receives focus check whether the item is healthy or not
if( ( pNMListView->uNewState & LVIS_FOCUSED ) && !( pNMListView->uOldState & LVIS_FOCUSED ) ) { CItemData* pMemberData = (CItemData*)(pNMListView->lParam); if( pMemberData->GetMemberStatus() == FtMemberHealthy ) { // The member is healthy so proceed with item changing
m_nFocusedItem = pNMListView->iItem; *pResult = 0; return; } else { // The member is not healthy so prevent item changing
if( m_nFocusedItem >= 0 ) { m_listVol.SetItemState( m_nFocusedItem, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED ); m_listVol.RedrawItems( m_nFocusedItem, m_nFocusedItem ); } *pResult = 1; return; } } // If the item has the focus but looses selection then prevent this to happen
if( !( pNMListView->uNewState & LVIS_SELECTED ) && ( pNMListView->uOldState & LVIS_SELECTED ) ) { if( m_listVol.GetItemState( pNMListView->iItem, LVIS_FOCUSED ) & LVIS_FOCUSED ) { *pResult = 1; return; } } }
*pResult = 0; }
void CBreakDlg::OnClickListVolumes(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; POINT pt; GetCursorPos( &pt ); LVHITTESTINFO lvhittestinfo; lvhittestinfo.pt = pt; m_listVol.ScreenToClient( &(lvhittestinfo.pt) ); lvhittestinfo.pt.x = 4; int iItem = ListView_SubItemHitTest( m_listVol.GetSafeHwnd(), &lvhittestinfo );
if( iItem < 0 ) return;
CItemData* pMemberData = (CItemData*)(m_listVol.GetItemData( iItem ) ); if( pMemberData->GetMemberStatus() == FtMemberHealthy ) { int iFocusedItem = m_nFocusedItem; m_listVol.SetItemState( iItem, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED ); m_listVol.SetItemState( iFocusedItem, 0, LVIS_SELECTED | LVIS_FOCUSED ); } }
/////////////////////////////////////////////////////////////////////////////
// CSwapDlg dialog
CSwapDlg::CSwapDlg( CLogicalVolumeData *pParentData, CLogicalVolumeData *pMemberData, CObArray* parrVolumeData, UINT nIDTemplate /* =IDD_SWAP */ , CWnd* pParent /* =NULL */ ) : CActionDlg( parrVolumeData, nIDTemplate, FALSE, pParent), m_pParentData(pParentData), m_pMemberData(pMemberData), m_nReplacementIndex(-1) { MY_TRY
//{{AFX_DATA_INIT(CBreakDlg)
m_staticTitle = _T(""); //}}AFX_DATA_INIT
ASSERT( pParentData ); ASSERT( pMemberData );
CString strParentName, strMemberName; pParentData->GetDisplayExtendedName( strParentName ); pMemberData->GetDisplayExtendedName( strMemberName );
AfxFormatString2( m_staticTitle, IDS_SWAP_DLG_TITLE, strMemberName, strParentName );
MY_CATCH_AND_REPORT }
void CSwapDlg::DoDataExchange(CDataExchange* pDX) { CActionDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSwapDlg)
DDX_Text(pDX, IDC_STATIC_TITLE, m_staticTitle); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSwapDlg, CActionDlg) //{{AFX_MSG_MAP(CSwapDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSwapDlg message handlers
BOOL CSwapDlg::OnInitDialog() { CActionDlg::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSwapDlg::OnOK() { // Get the replacement index
int iItem = m_listVol.GetNextItem(-1, LVNI_SELECTED); if (iItem < 0 ) { TRACE(_T("No items were selected!\n")); return; }
m_nReplacementIndex = iItem;
CActionDlg::OnOK(); }
/////////////////////////////////////////////////////////////////////////////
// CAssignDlg dialog
CAssignDlg::CAssignDlg( CItemData* pVolumeData, CWnd* pParent /*=NULL*/) : CDialog(CAssignDlg::IDD, pParent), m_pVolumeData( pVolumeData ) { MY_TRY
//{{AFX_DATA_INIT(CAssignDlg)
m_staticName = _T(""); m_radioAssign = pVolumeData->GetDriveLetter() ? 0 : 1; //}}AFX_DATA_INIT
ASSERT( pVolumeData );
pVolumeData->GetDisplayExtendedName(m_staticName );
MY_CATCH_AND_REPORT }
void CAssignDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAssignDlg)
DDX_Control(pDX, IDC_COMBO_DRIVE_LETTERS, m_comboDriveLetters); DDX_Text(pDX, IDC_STATIC_SET_NAME, m_staticName); DDX_Radio(pDX, IDC_RADIO_ASSIGN, m_radioAssign); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAssignDlg, CDialog) //{{AFX_MSG_MAP(CAssignDlg)
ON_BN_CLICKED(IDC_RADIO_ASSIGN, OnRadioAssign) ON_BN_CLICKED(IDC_RADIO_DO_NOT_ASSIGN, OnRadioDoNotAssign) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CAssignDlg::FillDriveLettersCombo() { MY_TRY
DWORD bitmask, bit; TCHAR cDriveLetter;
bitmask = GetLogicalDrives(); if( bitmask == 0 ) { DisplaySystemErrorMessage( IDS_ERR_GET_LOGICAL_DRIVES ); return FALSE; }
for( cDriveLetter = _T('C'), bit = 4 ; cDriveLetter <= _T('Z'); cDriveLetter++, bit = bit<<1 ) { if( ( cDriveLetter == m_pVolumeData->GetDriveLetter() ) || !( bitmask&bit ) ) { CString str; str.Format( _T("%c:"), cDriveLetter ); int nIndex = m_comboDriveLetters.AddString(str); if( nIndex == CB_ERR ) return FALSE; if( !m_comboDriveLetters.SetItemData(nIndex, (DWORD)cDriveLetter ) ) return FALSE; if( cDriveLetter == m_pVolumeData->GetDriveLetter() ) m_comboDriveLetters.SetCurSel(nIndex); } }
return TRUE;
MY_CATCH_AND_THROW }
/////////////////////////////////////////////////////////////////////////////
// CAssignDlg message handlers
BOOL CAssignDlg::OnInitDialog() { MY_TRY
CDialog::OnInitDialog();
if( !FillDriveLettersCombo() ) OnCancel();
if( m_comboDriveLetters.GetCount() == 0 ) { ASSERT( !m_pVolumeData->GetDriveLetter() ); GetDlgItem(IDC_RADIO_ASSIGN)->EnableWindow(FALSE); } else if ( m_comboDriveLetters.GetCurSel() == CB_ERR ) m_comboDriveLetters.SetCurSel(0);
if( m_radioAssign != 0 ) m_comboDriveLetters.EnableWindow(FALSE); MY_CATCH_REPORT_AND_CANCEL
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CAssignDlg::OnOK() { // TODO: Add extra validation here
UpdateData(TRUE);
m_bAssign = ( m_radioAssign == 0 );
if( m_bAssign ) { int nIndex = m_comboDriveLetters.GetCurSel(); ASSERT( nIndex != CB_ERR ); m_cDriveLetter = (TCHAR)(m_comboDriveLetters.GetItemData(nIndex)); } else m_cDriveLetter = _T('\0'); CDialog::OnOK(); }
void CAssignDlg::OnRadioAssign() { // Enable the drive letters combo
m_comboDriveLetters.EnableWindow(TRUE); }
void CAssignDlg::OnRadioDoNotAssign() { // Disable the drive letters combo
m_comboDriveLetters.EnableWindow(FALSE); } /////////////////////////////////////////////////////////////////////////////
// CCreatePartitionDlg dialog
CCreatePartitionDlg::CCreatePartitionDlg( CFreeSpaceData* pFreeData, LONGLONG llPartStartOffset, BOOL bExtendedPartition /* = FALSE */, CWnd* pParent /*=NULL*/) : CDialog(CCreatePartitionDlg::IDD, pParent), m_pFreeData( pFreeData ), m_llPartStartOffset( llPartStartOffset), m_bExtendedPartition( bExtendedPartition) { //{{AFX_DATA_INIT(CCreatePartitionDlg)
//}}AFX_DATA_INIT
ASSERT( pFreeData ); ASSERT( llPartStartOffset >= pFreeData->m_llOffset ); // The partition size should be greater than or equal with the cylinder size
ASSERT( llPartStartOffset + pFreeData->m_llCylinderSize <= pFreeData->m_llOffset + pFreeData->m_llSize ); }
void CCreatePartitionDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCreatePartitionDlg)
DDX_Control(pDX, IDC_STATIC_PARTITION_TYPE, m_staticPartitionType); DDX_Control(pDX, IDC_EDIT_PARTITION_SIZE, m_editPartitionSize); DDX_Control(pDX, IDC_STATIC_MINIMUM_SIZE, m_staticMinimumSize); DDX_Control(pDX, IDC_STATIC_MAXIMUM_SIZE, m_staticMaximumSize); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCreatePartitionDlg, CDialog) //{{AFX_MSG_MAP(CCreatePartitionDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCreatePartitionDlg message handlers
BOOL CCreatePartitionDlg::OnInitDialog() { MY_TRY
CDialog::OnInitDialog(); // TODO: Add extra initialization here
CString str;
if( m_bExtendedPartition ) { ASSERT( m_pFreeData->m_wFreeSpaceType == FST_Primary ); str.LoadString( IDS_TYPE_EXTENDED_PARTITION ); } else { if( m_pFreeData->m_wFreeSpaceType == FST_Primary ) str.LoadString( IDS_TYPE_PRIMARY_PARTITION ); else str.LoadString( IDS_TYPE_PARTITION_IN_EXTENDED_PARTITION ); } m_staticPartitionType.SetWindowText( str); ASSERT( m_pFreeData->m_llCylinderSize <= m_pFreeData->m_llSize ); str.Format(_T("%I64u"), (LONGLONG)(m_pFreeData->m_llCylinderSize / 0x100000) ); m_staticMinimumSize.SetWindowText(str); str.Format(_T("%I64u"), (LONGLONG)( ( m_pFreeData->m_llOffset + m_pFreeData->m_llSize - m_llPartStartOffset ) / 0x100000 ) ); m_staticMaximumSize.SetWindowText(str); m_editPartitionSize.SetWindowText(str);
// The number input in the edit-box must be less than 2^63 / 2^20 = 8796093022208
m_editPartitionSize.LimitText(13); MY_CATCH_REPORT_AND_CANCEL
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCreatePartitionDlg::OnOK() { MY_TRY
// TODO: Add extra validation here
CString str;
m_editPartitionSize.GetWindowText(str); LONGLONG llSizeInMB = _ttoi64(str);
if( ( llSizeInMB < (LONGLONG)( m_pFreeData->m_llCylinderSize / 0x100000 ) ) || ( llSizeInMB > (LONGLONG)( ( m_pFreeData->m_llOffset + m_pFreeData->m_llSize - m_llPartStartOffset ) / 0x100000 ) ) ) { AfxMessageBox(IDS_ERR_INVALID_SIZE, MB_ICONSTOP ); return; }
m_llPartitionSize = llSizeInMB * 0x100000; CDialog::OnOK();
MY_CATCH_REPORT_AND_CANCEL }
|