windows-nt/Source/XPSP1/NT/drivers/ftapi/ftman/actdlg.cpp
2020-09-26 16:20:57 +08:00

940 lines
23 KiB
C++

// 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
}