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

796 lines
19 KiB
C++

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
FTMan
File Name:
FTListVw.cpp
Abstract:
Implementation of the CFTListView class. It is a list view displaying all members of a
logical volume
Author:
Cristian Teodorescu October 20, 1998
Notes:
Revision History:
--*/
#include "stdafx.h"
#include "Actions.h"
#include "FTDoc.h"
#include "FTListVw.h"
#include "FTTreeVw.h"
#include "Item.h"
#include "MainFrm.h"
#include "LogVol.h"
#include "PhPart.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// This is the configuration of the list-view columns
LV_COLUMN_CONFIG ColumnsConfig[COLUMNS_NUMBER] = {
{ LVC_Name, IDS_COLUMN_NAME, LVCFMT_LEFT, 20 },
{ LVC_Type, IDS_COLUMN_TYPE, LVCFMT_LEFT, 20 },
{ LVC_DiskNumber, IDS_COLUMN_DISKS, LVCFMT_RIGHT, 10 },
{ LVC_Size, IDS_COLUMN_SIZE, LVCFMT_RIGHT, 15 },
{ LVC_Offset, IDS_COLUMN_OFFSET, LVCFMT_RIGHT, 15 },
{ LVC_VolumeID, IDS_COLUMN_VOLUMEID,LVCFMT_RIGHT, 20 } };
/////////////////////////////////////////////////////////////////////////////
// CFTListView
IMPLEMENT_DYNCREATE(CFTListView, CListView)
BEGIN_MESSAGE_MAP(CFTListView, CListView)
//{{AFX_MSG_MAP(CFTListView)
ON_WM_DESTROY()
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_COMMAND(ID_ITEM_EXPAND, OnItemExpand)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(ID_ACTION_ASSIGN, OnActionAssign)
ON_UPDATE_COMMAND_UI(ID_ACTION_ASSIGN, OnUpdateActionAssign)
ON_COMMAND(ID_ACTION_FTBREAK, OnActionFtbreak)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTBREAK, OnUpdateActionFtbreak)
ON_COMMAND(ID_ACTION_CREATE_EXTENDED_PARTITION, OnActionCreateExtendedPartition)
ON_UPDATE_COMMAND_UI(ID_ACTION_CREATE_EXTENDED_PARTITION, OnUpdateActionCreateExtendedPartition)
ON_COMMAND(ID_ACTION_CREATE_PARTITION, OnActionCreatePartition)
ON_UPDATE_COMMAND_UI(ID_ACTION_CREATE_PARTITION, OnUpdateActionCreatePartition)
ON_COMMAND(ID_ACTION_DELETE, OnActionDelete)
ON_UPDATE_COMMAND_UI(ID_ACTION_DELETE, OnUpdateActionDelete)
ON_COMMAND(ID_ACTION_FTINIT, OnActionFtinit)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTINIT, OnUpdateActionFtinit)
ON_COMMAND(ID_ACTION_FTMIRROR, OnActionFtmirror)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTMIRROR, OnUpdateActionFtmirror)
ON_COMMAND(ID_ACTION_FTSTRIPE, OnActionFtstripe)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTSTRIPE, OnUpdateActionFtstripe)
ON_COMMAND(ID_ACTION_FTSWAP, OnActionFtswap)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTSWAP, OnUpdateActionFtswap)
ON_COMMAND(ID_ACTION_FTSWP, OnActionFtswp)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTSWP, OnUpdateActionFtswp)
ON_COMMAND(ID_ACTION_FTVOLSET, OnActionFtvolset)
ON_UPDATE_COMMAND_UI(ID_ACTION_FTVOLSET, OnUpdateActionFtvolset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFTListView construction/destruction
CFTListView::CFTListView() : m_pParentData(NULL)
{
// TODO: add construction code here
}
CFTListView::~CFTListView()
{
}
BOOL CFTListView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFTListView drawing
void CFTListView::OnDraw(CDC* pDC)
{
// TODO: add draw code for native data here
}
void CFTListView::OnInitialUpdate()
{
MY_TRY
CListView::OnInitialUpdate();
// fill in image list for normal icons
CImageList* pImageList = new CImageList();
if( pImageList->Create( IDB_IMAGELIST_LARGE, 32, 32, RGB( 255, 0, 255 ) ) )
GetListCtrl().SetImageList(pImageList, LVSIL_NORMAL);
else
AfxMessageBox( IDS_ERR_CREATE_IMAGELIST, MB_ICONSTOP );
// fill in image list for small icons
pImageList = new CImageList();
if( pImageList->Create( IDB_IMAGELIST_SMALL, 16, 16, RGB( 255, 0, 255 ) ) )
GetListCtrl().SetImageList(pImageList, LVSIL_SMALL);
else
AfxMessageBox( IDS_ERR_CREATE_IMAGELIST, MB_ICONSTOP );
// insert columns (REPORT mode) and modify the new header items
CRect rect;
GetListCtrl().GetWindowRect(&rect);
for( int i = 0; i < COLUMNS_NUMBER; i++ )
{
PLV_COLUMN_CONFIG pColumn = &(ColumnsConfig[i]);
CString str;
if( !str.LoadString(pColumn->dwTitleID) )
ASSERT(FALSE);
GetListCtrl().InsertColumn( i, str, pColumn->nFormat ,
rect.Width() * pColumn->wWidthPercent/100, pColumn->iSubItem);
}
// Set the list-view style
ModifyStyle(LVS_TYPEMASK, LVS_REPORT | LVS_SHOWSELALWAYS );
// Load the popup menu
m_menuPopup.LoadMenu(IDM_POPUP);
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
MY_CATCH_AND_REPORT
}
int CFTListView::GetFocusedItem() const
{
return GetListCtrl().GetNextItem(-1, LVNI_FOCUSED );
}
BOOL CFTListView::SetFocusedItem( int iItem )
{
// The old focused item must loose the focus
GetListCtrl().SetItemState(GetFocusedItem(), 0, LVNI_FOCUSED);
// The new item receive focus
return GetListCtrl().SetItemState(iItem, LVNI_FOCUSED, LVNI_FOCUSED);
}
BOOL CFTListView::SelectItem( int iItem, BOOL bSelect /* =TRUE */ )
{
return GetListCtrl().SetItemState( iItem, bSelect ? LVNI_SELECTED : 0, LVNI_SELECTED );
}
CItemData* CFTListView::GetItemData( int iItem )
{
LVITEM lvItem;
lvItem.iItem = iItem;
lvItem.iSubItem = LVC_Name;
lvItem.mask = LVIF_PARAM;
if( !GetListCtrl().GetItem(&lvItem) )
return NULL;
return (CItemData*)(lvItem.lParam);
}
BOOL CFTListView::AddItem( CItemData* pData )
{
MY_TRY
LVITEM lvitem;
CString strDisplay;
// Just in case
if( pData == NULL )
return FALSE;
BOOL bReportStyle = ( GetWindowLong( GetListCtrl().GetSafeHwnd(), GWL_STYLE ) & LVS_REPORT );
// 1. Insert the item
lvitem.iItem = GetListCtrl().GetItemCount();
ASSERT(LVC_Name==0); // The first SubItem must be zero
lvitem.iSubItem = LVC_Name;
if( bReportStyle )
pData->GetDisplayName(strDisplay);
else
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 = GetListCtrl().InsertItem( &lvitem );
if( iActualItem < 0 )
return FALSE;
// The items must appear in the list exactly in the order we added them
ASSERT( iActualItem == lvitem.iItem );
pData->SetListItem( iActualItem );
// 2. Set all subitems
lvitem.iItem = iActualItem;
lvitem.mask = LVIF_TEXT;
// Type
lvitem.iSubItem = LVC_Type;
pData->GetDisplayType(strDisplay);
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
GetListCtrl().SetItem( &lvitem );
// Disks set
lvitem.iSubItem = LVC_DiskNumber;
pData->GetDisplayDisksSet(strDisplay);
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
GetListCtrl().SetItem( &lvitem );
// Size
lvitem.iSubItem = LVC_Size;
pData->GetDisplaySize(strDisplay);
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
GetListCtrl().SetItem( &lvitem );
// Offset
lvitem.iSubItem = LVC_Offset;
pData->GetDisplayOffset(strDisplay);
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
GetListCtrl().SetItem( &lvitem );
// Volume ID
lvitem.iSubItem = LVC_VolumeID;
pData->GetDisplayVolumeID(strDisplay);
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
GetListCtrl().SetItem( &lvitem );
return TRUE;
MY_CATCH_REPORT_AND_RETURN_FALSE
}
BOOL CFTListView::RefreshItem( int iItem )
{
MY_TRY
LVITEM lvitem;
CString strDisplay;
BOOL bReportStyle = ( GetWindowLong( GetListCtrl().GetSafeHwnd(), GWL_STYLE ) & LVS_REPORT );
// 1. Get the item data
lvitem.iItem = iItem;
ASSERT(LVC_Name==0); // The first SubItem must be zero
lvitem.iSubItem = LVC_Name;
lvitem.mask = LVIF_PARAM ;
if( !GetListCtrl().GetItem( &lvitem ) )
return FALSE;
CItemData* pData = (CItemData*)(lvitem.lParam);
ASSERT( pData );
ASSERT( pData->GetListItem() == iItem );
// 2. Now refresh the name and the image of the item
if( bReportStyle )
pData->GetDisplayName( strDisplay );
else
pData->GetDisplayExtendedName( strDisplay );
lvitem.pszText = (LPTSTR)(LPCTSTR)strDisplay;
lvitem.iImage = pData->GetImageIndex();
lvitem.mask = LVIF_TEXT | LVIF_IMAGE;
return GetListCtrl().SetItem( &lvitem );
MY_CATCH_REPORT_AND_RETURN_FALSE
}
BOOL CFTListView::AddMembersFromTree()
{
MY_TRY
GetListCtrl().DeleteAllItems();
if( !m_pParentData )
return TRUE;
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, GetParentFrame() );
CFTTreeView* pLeftView = (CFTTreeView*)(pFrame->GetLeftPane());
ASSERT( pLeftView );
CTreeCtrl& rTreeCtrl = pLeftView->GetTreeCtrl();
ASSERT( m_pParentData->AreMembersInserted() );
HTREEITEM hItem = m_pParentData->GetTreeItem();
ASSERT(hItem);
// For each member of the item add a new item to the list view
HTREEITEM hChild = rTreeCtrl.GetChildItem(hItem);
while( hChild != NULL )
{
TVITEM tvItem;
tvItem.hItem = hChild;
tvItem.mask = TVIF_PARAM;
if( rTreeCtrl.GetItem(&tvItem) )
{
ASSERT(tvItem.lParam);
if( !AddItem( (CItemData*)(tvItem.lParam) ) )
return FALSE;
}
else
ASSERT(FALSE);
hChild = rTreeCtrl.GetNextSiblingItem(hChild);
}
SelectItem(0);
SetFocusedItem(0);
return TRUE;
MY_CATCH_REPORT_AND_RETURN_FALSE
}
// This method fills the list view with all members of the given item
// It causes also the expandation of the parent item in the tree view ( if it is not expanded )
BOOL CFTListView::ExpandItem( int iItem)
{
MY_TRY
if( iItem < 0 )
return FALSE;
// Now get the CItemData structure of the selected item
CItemData* pData = GetItemData(iItem);
if( !pData )
return FALSE;
// TODO: Add your control notification handler code here
ASSERT( m_pParentData );
// Double-clicking a member of the list is equivalent with two actions in the tree:
// 1. Expand the selected item ( if not expanded )
// 2. Select a member of it
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, GetParentFrame() );
CFTTreeView* pLeftView = (CFTTreeView*)(pFrame->GetLeftPane());
ASSERT(pLeftView);
CTreeCtrl& rTreeCtrl = pLeftView->GetTreeCtrl();
// First expand the parent tree item
HTREEITEM hItem = m_pParentData->GetTreeItem();
ASSERT( hItem );
TVITEM tvItem;
tvItem.hItem = hItem;
tvItem.stateMask = TVIS_EXPANDED;
tvItem.mask = TVIF_STATE;
rTreeCtrl.GetItem(&tvItem);
// If the parent node is not expanded then expand it
if( !(tvItem.state & TVIS_EXPANDED ) )
{
// Reset the ExpandedOnce flag; so the tree view will receive the OnItemExpanding notification
tvItem.stateMask = TVIS_EXPANDEDONCE;
tvItem.state = 0;
rTreeCtrl.SetItem(&tvItem);
// Before expanding the tree we must take a copy of pData ( because the expandation causes
// all list-view items to be refreshed i.e. the old CItemData structures to be deleted
CItemData* pOldData;
if( pData->GetItemType() == IT_LogicalVolume )
pOldData = new CLogicalVolumeData( *((CLogicalVolumeData*)pData) );
else if( pData->GetItemType() == IT_PhysicalPartition )
pOldData = new CPhysicalPartitionData( *((CPhysicalPartitionData*)pData) );
else
ASSERT(FALSE);
rTreeCtrl.Expand( hItem, TVE_EXPAND );
// Now we must find the old member among the new refreshed members
int i;
for( i=0, pData = NULL; ( i < GetListCtrl().GetItemCount() ) && !pData; i++ )
{
CItemData* pItemData = GetItemData(i);
if( *pOldData == *pItemData )
pData = pItemData;
}
// It is possible to don't find our member anymore
// That means something happened with it outside our application
if( !pData )
{
CString strDisplayName, str;
pOldData->GetDisplayExtendedName(strDisplayName);
AfxFormatString1(str, IDS_ERR_MEMBER_NOT_FOUND_ANYMORE, strDisplayName);
AfxMessageBox(str,MB_ICONSTOP);
delete pOldData;
return FALSE;
}
delete pOldData;
}
// Then mark the double-clicked item as selected in the tree
ASSERT( pData->GetTreeItem() );
//rTreeCtrl.EnsureVisible( pData->GetTreeItem() );
return rTreeCtrl.SelectItem( pData->GetTreeItem() );
MY_CATCH_REPORT_AND_RETURN_FALSE
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Public methods
void CFTListView::GetSnapshot( LIST_SNAPSHOT& snapshot )
{
MY_TRY
CWaitCursor wc;
snapshot.setSelectedItems.RemoveAll();
int iItem = GetListCtrl().GetNextItem( -1, LVNI_SELECTED );
while (iItem >= 0)
{
CItemData* pData = GetItemData(iItem);
ASSERT(pData);
CItemID idItem( *pData );
snapshot.setSelectedItems.Add(idItem);
iItem = GetListCtrl().GetNextItem( iItem, LVNI_SELECTED );
}
MY_CATCH_AND_REPORT
}
void CFTListView::SetSnapshot( LIST_SNAPSHOT& snapshot )
{
MY_TRY
CWaitCursor wc;
for ( int i = 0; i < GetListCtrl().GetItemCount(); i++ )
{
CItemData* pData = GetItemData(i);
ASSERT( pData );
CItemID idItem( *pData );
if( snapshot.setSelectedItems.InSet(idItem ) )
{
SelectItem( i, TRUE );
SetFocusedItem(i);
}
else
SelectItem( i, FALSE );
}
MY_CATCH_AND_REPORT
}
BOOL CFTListView::SynchronizeMembersWithTree( CItemData* pParentData )
{
m_pParentData = pParentData;
return AddMembersFromTree();
}
void CFTListView::GetSelectedItems( CObArray& arrSelectedItems )
{
MY_TRY
arrSelectedItems.RemoveAll();
int iItem = GetListCtrl().GetNextItem( -1, LVNI_SELECTED );
while (iItem >= 0)
{
CItemData* pData = GetItemData(iItem);
ASSERT(pData);
arrSelectedItems.Add(pData);
iItem = GetListCtrl().GetNextItem( iItem, LVNI_SELECTED );
}
MY_CATCH_AND_REPORT
}
void CFTListView::DisplayItemsExtendedNames( BOOL bExtended /* = TRUE */ )
{
MY_TRY
for( int i = 0; i < GetListCtrl().GetItemCount(); i++ )
{
CItemData* pData = (CItemData*)(GetListCtrl().GetItemData(i));
ASSERT( pData );
CString strDisplayName;
if( bExtended )
pData->GetDisplayExtendedName( strDisplayName );
else
pData->GetDisplayName( strDisplayName );
GetListCtrl().SetItemText( i, LVC_Name, strDisplayName );
}
MY_CATCH_AND_REPORT
}
/////////////////////////////////////////////////////////////////////////////
// CFTListView diagnostics
#ifdef _DEBUG
void CFTListView::AssertValid() const
{
CListView::AssertValid();
}
void CFTListView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CFTDocument* CFTListView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFTDocument)));
return (CFTDocument*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFTListView message handlers
void CFTListView::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
{
//TODO: add code to react to the user changing the view style of your window
}
void CFTListView::OnDestroy()
{
GetListCtrl().DeleteAllItems();
// Delete the image list
CImageList* pImageList = GetListCtrl().GetImageList(LVSIL_NORMAL);
if( pImageList )
{
pImageList->DeleteImageList();
delete pImageList;
}
pImageList = GetListCtrl().GetImageList(LVSIL_SMALL);
if( pImageList )
{
pImageList->DeleteImageList();
delete pImageList;
}
// Destroy the popup menu
m_menuPopup.DestroyMenu();
CListView::OnDestroy();
// TODO: Add your message handler code here
}
void CFTListView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLISTVIEW pNMLV = (LPNMLISTVIEW) pNMHDR;
*pResult = 0;
ExpandItem( pNMLV->iItem );
}
void CFTListView::OnItemExpand()
{
// TODO: Add your command handler code here
int iItem = GetFocusedItem();
ExpandItem(iItem);
}
void CFTListView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) pNMHDR;
if( lpnmlv->iItem < 0 )
return ;
ClientToScreen( &(lpnmlv->ptAction) );
// We want to display in fact only the first popup of the menu m_menuPopup
CMenu* pPopup = m_menuPopup.GetSubMenu(0);
if( pPopup != NULL )
pPopup->TrackPopupMenu( TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, AfxGetMainWnd(), NULL);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// FT Actions
void CFTListView::OnActionAssign()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionAssign( arrSelectedItems );
}
void CFTListView::OnUpdateActionAssign(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionAssign( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtbreak()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtbreak( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtbreak(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtbreak( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionCreateExtendedPartition()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionCreateExtendedPartition( arrSelectedItems );
}
void CFTListView::OnUpdateActionCreateExtendedPartition(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionCreateExtendedPartition( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionCreatePartition()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionCreatePartition( arrSelectedItems );
}
void CFTListView::OnUpdateActionCreatePartition(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionCreatePartition( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionDelete()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionDelete( arrSelectedItems );
}
void CFTListView::OnUpdateActionDelete(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionDelete( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtinit()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtinit( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtinit(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtinit( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtmirror()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtmirror( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtmirror(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtmirror( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtstripe()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtstripe( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtstripe(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtstripe( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtswap()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtswap( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtswap(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtswap( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtswp()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtswp( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtswp(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtswp( pCmdUI, arrSelectedItems );
}
void CFTListView::OnActionFtvolset()
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
ActionFtvolset( arrSelectedItems );
}
void CFTListView::OnUpdateActionFtvolset(CCmdUI* pCmdUI)
{
CObArray arrSelectedItems;
GetSelectedItems( arrSelectedItems );
UpdateActionFtvolset( pCmdUI, arrSelectedItems );
}