windows-nt/Source/XPSP1/NT/base/cluster/admin/cluadmin/moveres.cpp
2020-09-26 16:20:57 +08:00

404 lines
11 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2000 Microsoft Corporation
//
// Module Name:
// MoveRes.cpp
//
// Abstract:
// Implementation of the CMoveResourcesDlg class.
//
// Author:
// David Potter (davidp) April 1, 1997
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CluAdmin.h"
#include "MoveRes.h"
#include "Res.h"
#include "ResType.h"
#include "HelpData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMoveResourcesDlg class
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CMoveResourcesDlg, CBaseDialog)
//{{AFX_MSG_MAP(CMoveResourcesDlg)
ON_NOTIFY(NM_DBLCLK, IDC_MR_RESOURCES_LIST, OnDblClkResourcesList)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_MR_RESOURCES_LIST, OnColumnClick)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDYES, CBaseDialog::OnOK)
ON_BN_CLICKED(IDNO, CBaseDialog::OnCancel)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::CMoveResourcesDlg
//
// Routine Description:
// Constructor.
//
// Arguments:
// pciRes [IN] Resource being moved.
// plpci [IN] List of resources which are dependent on pciRes.
// pParent [IN OUT] Parent window for the dialog.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CMoveResourcesDlg::CMoveResourcesDlg(
IN CResource * pciRes,
IN const CResourceList * plpci,
IN OUT CWnd * pParent /*=NULL*/
)
: CBaseDialog(IDD, g_aHelpIDs_IDD_MOVE_RESOURCES, pParent)
{
//{{AFX_DATA_INIT(CMoveResourcesDlg)
//}}AFX_DATA_INIT
ASSERT_VALID(pciRes);
ASSERT(plpci != NULL);
m_pciRes = pciRes;
m_plpci = plpci;
} //*** CMoveResourcesDlg::CMoveResourcesDlg()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CMoveResourcesDlg::DoDataExchange(CDataExchange * pDX)
{
CBaseDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMoveResourcesDlg)
DDX_Control(pDX, IDC_MR_RESOURCES_LIST, m_lcResources);
//}}AFX_DATA_MAP
} //*** CMoveResourcesDlg::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Focus needs to be set.
// FALSE Focus already set.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CMoveResourcesDlg::OnInitDialog(void)
{
int nitem;
CBaseDialog::OnInitDialog();
// Change list view control extended styles.
{
DWORD dwExtendedStyle;
dwExtendedStyle = (DWORD)m_lcResources.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
m_lcResources.SendMessage(
LVM_SETEXTENDEDLISTVIEWSTYLE,
0,
dwExtendedStyle
| LVS_EX_FULLROWSELECT
| LVS_EX_HEADERDRAGDROP
);
} // Change list view control extended styles
// Set the image list for the list control to use.
m_lcResources.SetImageList(GetClusterAdminApp()->PilSmallImages(), LVSIL_SMALL);
// Add the columns.
{
CString strColumn;
try
{
strColumn.LoadString(IDS_COLTEXT_NAME);
m_lcResources.InsertColumn(0, strColumn, LVCFMT_LEFT, COLI_WIDTH_NAME * 3 / 2);
strColumn.LoadString(IDS_COLTEXT_RESTYPE);
m_lcResources.InsertColumn(1, strColumn, LVCFMT_LEFT, COLI_WIDTH_RESTYPE * 3 / 2);
} // try
catch (CException * pe)
{
pe->Delete();
} // catch: CException
} // Add the columns
// Add the resource being moved to the list.
nitem = m_lcResources.InsertItem(0, PciRes()->StrName(), PciRes()->IimgObjectType());
m_lcResources.SetItemText(nitem, 1, PciRes()->StrRealResourceTypeDisplayName());
m_lcResources.SetItemData(nitem, (DWORD_PTR) PciRes());
m_pciRes->AddRef();
// Add the items.
{
POSITION pos;
int iitem;
CResource * pciRes;
pos = Plpci()->GetHeadPosition();
for (iitem = 1 ; pos != NULL ; iitem++)
{
pciRes = (CResource *) Plpci()->GetNext(pos);
ASSERT_VALID(pciRes);
if (pciRes != PciRes())
{
nitem = m_lcResources.InsertItem(iitem, pciRes->StrName(), pciRes->IimgObjectType());
m_lcResources.SetItemText(nitem, 1, pciRes->StrRealResourceTypeDisplayName());
m_lcResources.SetItemData(nitem, (DWORD_PTR) pciRes);
pciRes->AddRef();
} // if: not resource being moved
} // while: more items in the list
} // Add the items
// Sort the items.
m_nSortColumn = 0;
m_nSortDirection = 0;
m_lcResources.SortItems(CompareItems, (LPARAM) this);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} //*** CMoveResourcesDlg::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::OnDestroy
//
// Routine Description:
// Handler method for the WM_DESTROY message.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CMoveResourcesDlg::OnDestroy(void)
{
// Dereference all the cluster item pointers.
if (m_lcResources.m_hWnd != NULL)
{
int ili = -1;
CClusterItem * pci;
while ((ili = m_lcResources.GetNextItem(ili, LVNI_ALL)) != -1)
{
pci = (CClusterItem *) m_lcResources.GetItemData(ili);
ASSERT_VALID(pci);
ASSERT_KINDOF(CClusterItem, pci);
pci->Release();
} // while: more items in the list control
} // if: list control has been instantiated
CBaseDialog::OnDestroy();
} //*** CMoveResourcesDlg::OnDestroy()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::OnDblClkDependsList
//
// Routine Description:
// Handler method for the NM_DBLCLK message.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CMoveResourcesDlg::OnDblClkResourcesList(NMHDR * pNMHDR, LRESULT * pResult)
{
int iitem;
CResource * pciRes;
// Get the item with the focus.
iitem = m_lcResources.GetNextItem(-1, LVNI_FOCUSED);
ASSERT(iitem != -1);
if (iitem != -1)
{
// Get the resource pointer.
pciRes = (CResource *) m_lcResources.GetItemData(iitem);
ASSERT_VALID(pciRes);
// Get properties of that item.
pciRes->BDisplayProperties(FALSE /*bReadOnly*/);
} // if: found an item with focus
*pResult = 0;
} //*** CMoveResourcesDlg::OnDblClkResourcesList()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::OnColumnClick
//
// Routine Description:
// Handler method for the LVN_COLUMNCLICK message.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CMoveResourcesDlg::OnColumnClick(NMHDR * pNMHDR, LRESULT * pResult)
{
NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pNMHDR;
if (m_lcResources.GetItemCount() != 0)
{
// Save the current sort column and direction.
if (pNMListView->iSubItem == m_nSortColumn)
m_nSortDirection ^= -1;
else
{
m_nSortColumn = pNMListView->iSubItem;
m_nSortDirection = 0;
} // else: different column
// Sort the list.
m_lcResources.SortItems(CompareItems, (LPARAM) this);
} // if: there are items in the list
*pResult = 0;
} //*** CMoveResourcesDlg::OnColumnClick()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CMoveResourcesDlg::CompareItems [static]
//
// Routine Description:
// Callback function for the CListCtrl::SortItems method.
//
// Arguments:
// lparam1 First item to compare.
// lparam2 Second item to compare.
// lparamSort Sort parameter.
//
// Return Value:
// -1 First parameter comes before second.
// 0 First and second parameters are the same.
// 1 First parameter comes after second.
//
//--
/////////////////////////////////////////////////////////////////////////////
int CALLBACK CMoveResourcesDlg::CompareItems(
LPARAM lparam1,
LPARAM lparam2,
LPARAM lparamSort
)
{
CResource * pciRes1 = (CResource *) lparam1;
CResource * pciRes2 = (CResource *) lparam2;
CMoveResourcesDlg * pdlg = (CMoveResourcesDlg *) lparamSort;
const CString * pstr1;
const CString * pstr2;
int nResult;
ASSERT_VALID(pciRes1);
ASSERT_VALID(pciRes2);
ASSERT_VALID(pdlg);
// Get the strings from the list items.
if (pdlg->m_nSortColumn == 1)
{
pstr1 = &pciRes1->StrRealResourceTypeDisplayName();
pstr2 = &pciRes2->StrRealResourceTypeDisplayName();
} // if: sorting on name column
else
{
pstr1 = &pciRes1->StrName();
pstr2 = &pciRes2->StrName();
} // else: sorting on resource type column
// Compare the two strings.
// Use CompareString() so that it will sort properly on localized builds.
nResult = CompareString(
LOCALE_USER_DEFAULT,
0,
*pstr1,
pstr1->GetLength(),
*pstr2,
pstr2->GetLength()
);
if ( nResult == CSTR_LESS_THAN )
{
nResult = -1;
}
else if ( nResult == CSTR_EQUAL )
{
nResult = 0;
}
else if ( nResult == CSTR_GREATER_THAN )
{
nResult = 1;
}
else
{
// An error occurred. Ignore it.
nResult = 0;
}
// Return the result based on the direction we are sorting.
if (pdlg->m_nSortDirection != 0)
nResult = -nResult;
return nResult;
} //*** CMoveResourcesDlg::CompareItems()