/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1998 **/ /**********************************************************************/ /* delowner.cpp Delete owner dialog FILE HISTORY: */ #include "stdafx.h" #include "DelOwner.h" #include "server.h" #include "actreg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDeleteOwner dialog int CALLBACK DelOwnerCompareFunc ( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { return ((CDeleteOwner *) lParamSort)->HandleSort(lParam1, lParam2); } CDeleteOwner::CDeleteOwner(ITFSNode * pNode, CWnd* pParent /*=NULL*/) : CBaseDialog(CDeleteOwner::IDD, pParent) { m_spActRegNode.Set(pNode); m_nSortColumn = -1; for (int i = 0; i < COLUMN_MAX; i++) { m_aSortOrder[i] = TRUE; // ascending } //{{AFX_DATA_INIT(CDeleteOwner) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CDeleteOwner::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDeleteOwner) DDX_Control(pDX, IDC_RADIO_DELETE_RECORDS, m_radioDelete); DDX_Control(pDX, IDC_LIST_OWNER, m_listOwner); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDeleteOwner, CBaseDialog) //{{AFX_MSG_MAP(CDeleteOwner) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_OWNER, OnItemchangedListOwner) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_OWNER, OnColumnclickListOwner) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDeleteOwner message handlers BOOL CDeleteOwner::OnInitDialog() { CBaseDialog::OnInitDialog(); CString strOwner; strOwner.LoadString(IDS_OWNER); m_listOwner.InsertColumn(COLUMN_IP, strOwner, LVCFMT_LEFT, 100, 1); CString strID; strID.LoadString(IDS_HIGHESTID); m_listOwner.InsertColumn(COLUMN_VERSION, strID, LVCFMT_LEFT, 125, -1); CString strName; strName.LoadString(IDS_NAME); m_listOwner.InsertColumn(COLUMN_NAME, strName, LVCFMT_LEFT, 100, -1); m_listOwner.SetFullRowSel(TRUE); // grab the owner info array SPITFSNode spActRegNode; CActiveRegistrationsHandler * pActReg; spActRegNode = GetTFSNode(); pActReg = GETHANDLER(CActiveRegistrationsHandler, spActRegNode); pActReg->GetOwnerInfo(m_ServerInfoArray); // set default radio selection m_radioDelete.SetCheck(TRUE); FillOwnerInfo(); GetDlgItem(IDOK)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDeleteOwner::OnOK() { m_dwSelectedOwner = GetSelectedOwner(); m_fDeleteRecords = m_radioDelete.GetState(); // warn the user if (m_fDeleteRecords) { if (AfxMessageBox(IDS_WARN_DELETE_OWNER, MB_YESNO) == IDNO) { return; } } else { if (AfxMessageBox(IDS_WARN_TOMBSTONE, MB_YESNO) == IDNO) { return; } } CBaseDialog::OnOK(); } void CDeleteOwner::OnItemchangedListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; BOOL fEnable = (GetSelectedOwner() != -1) ? TRUE : FALSE; GetDlgItem(IDOK)->EnableWindow(fEnable); *pResult = 0; } void CDeleteOwner::FillOwnerInfo() { for (int i = 0; i < m_ServerInfoArray.GetSize(); i++) { if (m_ServerInfoArray[i].m_liVersion.QuadPart == OWNER_DELETED) { // this owner has been deleted... continue; } CString strIPAdd; ::MakeIPAddress(m_ServerInfoArray[i].m_dwIp, strIPAdd); CString strVers = GetVersionInfo(m_ServerInfoArray[i].m_liVersion.LowPart, m_ServerInfoArray[i].m_liVersion.HighPart); int nItem = m_listOwner.InsertItem(i, strIPAdd, 0); m_listOwner.SetItemText(nItem, 1, m_ServerInfoArray[i].m_strName); m_listOwner.SetItemText(nItem, 2, strVers); m_listOwner.SetItemData(nItem, i); } Sort(COLUMN_IP); } void CDeleteOwner::Sort(int nCol) { if (m_nSortColumn == nCol) { // if the user is clicking the same column again, reverse the sort order m_aSortOrder[nCol] = m_aSortOrder[nCol] ? FALSE : TRUE; } else { m_nSortColumn = nCol; } m_listOwner.SortItems(DelOwnerCompareFunc, (LPARAM) this); } int CDeleteOwner::HandleSort(LPARAM lParam1, LPARAM lParam2) { int nCompare = 0; switch (m_nSortColumn) { case COLUMN_IP: { DWORD dwIp1 = m_ServerInfoArray.GetAt((int) lParam1).m_dwIp; DWORD dwIp2 = m_ServerInfoArray.GetAt((int) lParam2).m_dwIp; if (dwIp1 > dwIp2) nCompare = 1; else if (dwIp1 < dwIp2) nCompare = -1; } break; case COLUMN_NAME: { CString strName1, strName2; if (!m_ServerInfoArray.GetAt((int) lParam1).m_strName.IsEmpty()) strName1 = m_ServerInfoArray.GetAt((int) lParam1).m_strName; if (!m_ServerInfoArray.GetAt((int) lParam2).m_strName.IsEmpty()) strName2 = m_ServerInfoArray.GetAt((int) lParam2).m_strName; nCompare = strName1.CompareNoCase(strName2); } break; case COLUMN_VERSION: { LARGE_INTEGER li1, li2; li1.QuadPart = m_ServerInfoArray.GetAt((int) lParam1).m_liVersion.QuadPart; li2.QuadPart = m_ServerInfoArray.GetAt((int) lParam2).m_liVersion.QuadPart; if (li1.QuadPart > li2.QuadPart) nCompare = 1; else if (li1.QuadPart < li2.QuadPart) nCompare = -1; } break; } if (m_aSortOrder[m_nSortColumn] == FALSE) { // descending return -nCompare; } else { // ascending return nCompare; } } DWORD CDeleteOwner::GetSelectedOwner() { int nCount = m_listOwner.GetItemCount(); int nSelected = -1; for (int i = 0; i < nCount; i++) { UINT uState = m_listOwner.GetItemState(i, LVIS_SELECTED); if (uState) { DWORD_PTR nData = m_listOwner.GetItemData(i); DWORD dwSelOwner = m_ServerInfoArray.GetAt((int) nData).m_dwIp; return dwSelOwner; } } return 0; } CString CDeleteOwner::GetVersionInfo(LONG lLowWord, LONG lHighWord) { CString strVersionCount; TCHAR sz[20]; TCHAR *pch = sz; ::wsprintf(sz, _T("%08lX%08lX"), lHighWord, lLowWord); // Kill leading zero's while (*pch == '0') { ++pch; } // At least one digit... if (*pch == '\0') { --pch; } strVersionCount = pch; return strVersionCount; } void CDeleteOwner::OnColumnclickListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // sort depending on what column was clicked; Sort(pNMListView->iSubItem); *pResult = 0; }