940 lines
23 KiB
C++
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
|
|
}
|
|
|
|
|