|
|
/////////////////////////////////////////////////////////////////////////////
//
// 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()
|