|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
loadrecs.cpp dialog to load records from the datbase, includes by owner and by record type. FILE HISTORY: */
#include "stdafx.h"
#include "winssnap.h"
#include "loadrecs.h"
#include "server.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
BOOL MyCreateImageList(CImageList& imgList, UINT nBitmapID, int cx, int nGrow, COLORREF crMask) { ASSERT(HIWORD(nBitmapID) == 0); HINSTANCE hInst = AfxFindResourceHandle((LPCTSTR)ULongToPtr(nBitmapID), RT_BITMAP); ASSERT(hInst != NULL); return imgList.Attach(ImageList_LoadBitmap(hInst, (LPCTSTR)ULongToPtr(nBitmapID), cx, nGrow, crMask)); }
/////////////////////////////////////////////////////////////////////////////
// CLoadRecords
IMPLEMENT_DYNAMIC(CLoadRecords, CPropertySheet)
CLoadRecords::CLoadRecords(UINT nIDCaption) :CPropertySheet(nIDCaption) { AddPage(&m_pageIpAddress); AddPage(&m_pageOwners); AddPage(&m_pageTypes);
m_psh.dwFlags |= PSH_NOAPPLYNOW; m_nActivePage = 0; m_bEnableCache = FALSE; m_bCaching = FALSE; }
CLoadRecords::~CLoadRecords() { }
VOID CLoadRecords::ResetFiltering() { m_pageOwners.m_dwaOwnerFilter.RemoveAll(); m_pageIpAddress.m_dwaIPAddrs.RemoveAll(); m_pageIpAddress.m_dwaIPMasks.RemoveAll(); m_pageIpAddress.m_bFilterIpAddr = FALSE; m_pageIpAddress.m_bFilterIpMask = FALSE; m_pageIpAddress.m_bFilterName = FALSE; m_pageIpAddress.m_bMatchCase = FALSE; }
BEGIN_MESSAGE_MAP(CLoadRecords, CPropertySheet) //{{AFX_MSG_MAP(CLoadRecords)
ON_WM_HELPINFO() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CLoadRecords::OnInitDialog() { CPropertySheet::OnInitDialog();
m_bCaching = m_bEnableCache; SetActivePage(m_nActivePage); return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// CLoadRecords message handlers
//
extern const DWORD g_aHelpIDs_DisplayRecords_PpSheet[]; BOOL CLoadRecords::OnHelpInfo(HELPINFO* pHelpInfo) { int i; DWORD dwCtrlId;
if (pHelpInfo->iContextType == HELPINFO_WINDOW) { DWORD * pdwHelp = (LPDWORD)g_aHelpIDs_DisplayRecords_PpSheet;
if (pdwHelp) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)pdwHelp); } } return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// COwnerPage dialog
int CALLBACK OwnerPageCompareFunc ( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { return ((COwnerPage *) lParamSort)->HandleSort(lParam1, lParam2); }
COwnerPage::COwnerPage() : CPropertyPage(COwnerPage::IDD) { m_nSortColumn = -1;
for (int i = 0; i < COLUMN_MAX; i++) { m_aSortOrder[i] = TRUE; // ascending
}
m_pbaDirtyFlags = NULL; m_bDirtyOwners = FALSE; //{{AFX_DATA_INIT(COwnerPage)
//}}AFX_DATA_INIT
}
COwnerPage::~COwnerPage() { if (m_pbaDirtyFlags != NULL) delete m_pbaDirtyFlags; }
DWORD COwnerPage::GetOwnerForApi() { return m_dwaOwnerFilter.GetSize() == 1 ? m_dwaOwnerFilter[0] : (DWORD)-1; }
void COwnerPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(COwnerPage)
DDX_Control(pDX, IDC_ENABLE_CACHING, m_btnEnableCache); DDX_Control(pDX, IDC_LIST_OWNER, m_listOwner); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COwnerPage, CPropertyPage) //{{AFX_MSG_MAP(COwnerPage)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_OWNER, OnColumnclickListOwner) ON_WM_HELPINFO() ON_BN_CLICKED(IDC_BUTTON_SELECT_ALL, OnButtonSelectAll) ON_BN_CLICKED(IDC_BUTTON_UNSELECT_ALL, OnButtonUnselectAll) ON_BN_CLICKED(IDC_BUTTON_LOCAL, OnButtonLocal) ON_BN_CLICKED(IDC_ENABLE_CACHING, OnEnableCaching) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_OWNER, OnItemchangedListOwner) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COwnerPage message handlers
BOOL COwnerPage::OnInitDialog() { CPropertyPage::OnInitDialog();
//BOOL ftest = m_ImageList.Create(IDB_LIST_STATE, 16, 1, RGB(255, 0, 0));
MyCreateImageList(m_ImageList, IDB_LIST_STATE, 16, 1, RGB(255, 0, 0));
// set the list item images
m_listOwner.SetImageList(NULL, LVSIL_NORMAL); m_listOwner.SetImageList(NULL, LVSIL_SMALL); m_listOwner.SetImageList(&m_ImageList, LVSIL_STATE);
// fill the header informnation for the list control
CString strOwner; strOwner.LoadString(IDS_OWNER); m_listOwner.InsertColumn(COLUMN_IP, strOwner, LVCFMT_LEFT, 100, 1);
CString strName; strName.LoadString(IDS_NAME); m_listOwner.InsertColumn(COLUMN_NAME, strName, LVCFMT_LEFT, 95, -1);
CString strID; strID.LoadString(IDS_HIGHESTID); m_listOwner.InsertColumn(COLUMN_VERSION, strID, LVCFMT_LEFT, 75, -1);
m_listOwner.SetFullRowSel(TRUE);
// update the UI
FillOwnerInfo();
return TRUE; }
void COwnerPage::FillOwnerInfo() { int i;
m_nChecked = 0;
if (m_ServerInfoArray.GetSize() > 0) { int nDirtySize = (int)m_ServerInfoArray.GetSize();
if (m_pbaDirtyFlags != NULL) delete m_pbaDirtyFlags;
m_pbaDirtyFlags = new BYTE[nDirtySize]; if (m_pbaDirtyFlags != NULL) RtlZeroMemory(m_pbaDirtyFlags, nDirtySize); }
for (i = 0; i < m_ServerInfoArray.GetSize(); i++) { //
// if this owner is deleted or doesn't have any records to show
// then don't add it to the list. Owners can have an ID of 0 if they don't
// have any records but were found owning an address in a 1c record in the database
//
if ( (m_ServerInfoArray[i].m_liVersion.QuadPart == OWNER_DELETED) || (m_ServerInfoArray[i].m_liVersion.QuadPart == 0) ) { // skip this one
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);
// empty filter array means all owners should be selected
if (m_dwaOwnerFilter.GetSize() == 0) { m_listOwner.SetCheck(nItem, TRUE); m_pbaDirtyFlags[i] |= 2; } else { // filter array is not empty, we check the item if it is found in the filter
for (int j = (int)m_dwaOwnerFilter.GetSize()-1; j >= 0; j--) { if (m_ServerInfoArray[i].m_dwIp == m_dwaOwnerFilter[j]) { m_listOwner.SetCheck(nItem, TRUE); m_pbaDirtyFlags[i] |= 2; break; } }
if (j < 0) { // m_nChecked keeps a count of how many items are checked in the list.
// each SetCheck() balances the counter -> ++ if an item is checked
// -- if an item in unchecked. However, initially, we need to set the items
// that are unchecked explicitly otherwise the checkbox doesn't show up.
// this could unballance the counter if we don't correct it by incrementing
// it first. Whatever we add here is decremented immediately after because
// of the SetCheck(..FALSE) below.
m_nChecked++; m_listOwner.SetCheck(nItem, FALSE); } } }
Sort(COLUMN_IP);
for (i = m_listOwner.GetItemCount()-1; i >=0; i--) { if (m_listOwner.GetCheck(i)) { m_listOwner.EnsureVisible(i,FALSE); break; } }
m_listOwner.SetFocus(); }
CString COwnerPage::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 COwnerPage::OnOK() { int i; BOOL bAllSelected;
UpdateData();
// clear any previous owners in the array since
// GetSelectedOwner() is copying over the new
// selected owners
m_dwaOwnerFilter.RemoveAll();
for (i = (int)m_ServerInfoArray.GetSize()-1; i>=0; i--) { if ( (m_ServerInfoArray[i].m_liVersion.QuadPart != OWNER_DELETED) && (m_ServerInfoArray[i].m_liVersion.QuadPart != 0) && !(m_pbaDirtyFlags[i] & 1) ) { bAllSelected = FALSE; break; } }
// mark owners as dirty only if some new owners are added - removing an owner shouldn't
// force the database to be reloaded in any way since the records are already there.
m_bDirtyOwners = FALSE; for (i = (int)m_ServerInfoArray.GetSize()-1; i >=0; i--) {
// 0 - owner was not in the list and it is not now
// 1 - owner was not in the list but it is now
// 2 - owner was in the list and it is not now
// 3 - owner was in the list and it is now
if (!m_bDirtyOwners && m_pbaDirtyFlags[i] == 1) { m_bDirtyOwners = TRUE; } if (!bAllSelected && (m_pbaDirtyFlags[i] & 1)) { m_dwaOwnerFilter.Add(m_ServerInfoArray[i].m_dwIp); } }
CPropertyPage::OnOK(); }
void COwnerPage::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(OwnerPageCompareFunc, (LPARAM) this); }
int COwnerPage::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 = m_ServerInfoArray[(int) lParam1].m_strName; CString strName2 = m_ServerInfoArray[(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; } }
void COwnerPage::OnColumnclickListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// sort depending on what column was clicked;
Sort(pNMListView->iSubItem);
*pResult = 0; }
BOOL COwnerPage::OnHelpInfo(HELPINFO* pHelpInfo) { int i; DWORD dwCtrlId;
if (pHelpInfo->iContextType == HELPINFO_WINDOW) { DWORD * pdwHelp = GetHelpMap();
if (pdwHelp) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)pdwHelp); } } return TRUE; }
void COwnerPage::OnButtonLocal() { int iLocal = 0;
for (int i = 0; i < m_listOwner.GetItemCount(); i++) { // item data has the owner id and the local server always
// has the owner id = 0
if ((DWORD)m_listOwner.GetItemData(i) == 0) iLocal = i;
m_listOwner.SetCheck(i, (DWORD)m_listOwner.GetItemData(i) == 0); }
m_listOwner.EnsureVisible(iLocal, FALSE); }
void COwnerPage::OnButtonSelectAll() { for (int i = 0; i < m_listOwner.GetItemCount(); i++) { m_listOwner.SetCheck(i, TRUE); } }
void COwnerPage::OnButtonUnselectAll() { for (int i = 0; i < m_listOwner.GetItemCount(); i++) { m_listOwner.SetCheck(i, FALSE); } }
BOOL COwnerPage::OnKillActive() { int i;
for (i = m_listOwner.GetItemCount()-1; i >=0 ; i--) { if (m_listOwner.GetCheck(i) == TRUE) break; }
if (i<0) { // tell the user to select at least one name type to display
WinsMessageBox(IDS_ERR_NO_OWNER_SPECIFIED); PropSheet_SetCurSel(GetSafeHwnd(), NULL, 0); m_listOwner.SetFocus();
return FALSE; }
return CPropertyPage::OnKillActive(); }
BOOL COwnerPage::OnSetActive() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); m_btnEnableCache.SetCheck(pParent->m_bCaching); return CPropertyPage::OnSetActive(); }
void COwnerPage::OnEnableCaching() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); pParent->m_bCaching = (m_btnEnableCache.GetCheck() == 1); }
void COwnerPage::OnItemchangedListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; BOOL bInc;
// if the checkbox isn't changed we don't care
if ( pNMListView->uChanged & LVIF_STATE && (pNMListView->uOldState & LVIS_STATEIMAGEMASK) != (pNMListView->uNewState & LVIS_STATEIMAGEMASK)) { CLoadRecords *pParent = (CLoadRecords *)GetParent();
if ((pNMListView->uNewState & INDEXTOSTATEIMAGEMASK(2)) != 0) { m_pbaDirtyFlags[pNMListView->lParam] |= 1; m_nChecked++; bInc = TRUE; } else { m_pbaDirtyFlags[pNMListView->lParam] &= ~1; m_nChecked--; bInc = FALSE; } } *pResult = 0; }
/////////////////////////////////////////////////////////////////////////////
// CFilterPage dialog
int CALLBACK FilterPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { if (lParam1 < lParam2) return -1; else if (lParam1 > lParam2) return 1; else return 0; }
CFilterPage::CFilterPage() : CPropertyPage(CFilterPage::IDD) { //{{AFX_DATA_INIT(CFilterPage)
//}}AFX_DATA_INIT
m_bDirtyTypes = FALSE; m_pbaDirtyFlags = NULL; m_nDirtyFlags = 0; }
CFilterPage::~CFilterPage() { if (m_pbaDirtyFlags != NULL) delete m_pbaDirtyFlags; }
void CFilterPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFilterPage)
DDX_Control(pDX, IDC_ENABLE_CACHING, m_btnEnableCache); DDX_Control(pDX, IDC_BUTTON_DELETE_TYPE, m_buttonDelete); DDX_Control(pDX, IDC_BUTTON_MODIFY_TYPE, m_buttonModify); DDX_Control(pDX, IDC_LIST1, m_listType); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFilterPage, CPropertyPage) //{{AFX_MSG_MAP(CFilterPage)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemchangedList1) ON_BN_CLICKED(IDC_BUTTON_ADD_TYPE, OnButtonAddType) ON_BN_CLICKED(IDC_BUTTON_MODIFY_TYPE, OnButtonModifyType) ON_BN_CLICKED(IDC_BUTTON_DELETE_TYPE, OnButtonDelete) ON_WM_HELPINFO() ON_BN_CLICKED(IDC_BUTTON_SELECT_ALL, OnButtonSelectAll) ON_BN_CLICKED(IDC_BUTTON_UNSELECT_ALL, OnButtonUnselectAll) ON_BN_CLICKED(IDC_ENABLE_CACHING, OnEnableCaching) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFilterPage message handlers
BOOL CFilterPage::OnInitDialog() { CPropertyPage::OnInitDialog();
//BOOL ftest = m_ImageList.Create(IDB_LIST_STATE, 16, 1, RGB(255, 0, 0));
MyCreateImageList(m_ImageList, IDB_LIST_STATE, 16, 1, RGB(255, 0, 0));
m_listType.SetImageList(NULL, LVSIL_NORMAL); m_listType.SetImageList(NULL, LVSIL_SMALL); m_listType.SetImageList(&m_ImageList, LVSIL_STATE); m_listType.InsertColumn(0, _T("Test"), LVCFMT_LEFT, 250);
m_buttonModify.EnableWindow(FALSE); m_buttonDelete.EnableWindow(FALSE);
FillTypeInfo();
m_nDirtyFlags = (UINT)m_arrayTypeFilter.GetSize(); if (m_pbaDirtyFlags != NULL) delete m_pbaDirtyFlags; m_pbaDirtyFlags = new tDirtyFlags[m_nDirtyFlags]; if ( m_pbaDirtyFlags != NULL) { RtlZeroMemory(m_pbaDirtyFlags, m_nDirtyFlags*sizeof(tDirtyFlags));
for (UINT i = 0; i<m_nDirtyFlags; i++) { m_pbaDirtyFlags[i].dwType = m_arrayTypeFilter[i].dwType;
if (m_arrayTypeFilter[i].fShow) { m_pbaDirtyFlags[i].bFlags = 2; } } } else { m_nDirtyFlags = 0; }
return TRUE; }
void CFilterPage::OnOK() { if (m_pbaDirtyFlags == NULL) { m_bDirtyTypes = TRUE; } else { int i,j;
m_bDirtyTypes = FALSE;
for (i = (int)m_arrayTypeFilter.GetSize()-1; i>=0; i--) { for (j = m_nDirtyFlags-1; j>=0; j--) { if (m_arrayTypeFilter[i].dwType == m_pbaDirtyFlags[j].dwType) { if (m_arrayTypeFilter[i].fShow) m_pbaDirtyFlags[j].bFlags |= 1; break; } }
if (j<0 && m_arrayTypeFilter[i].fShow) { m_bDirtyTypes = TRUE; break; } }
for (j = m_nDirtyFlags-1; j>=0; j--) { if (m_pbaDirtyFlags[j].bFlags == 1) { m_bDirtyTypes = TRUE; break; } } }
CPropertyPage::OnOK(); }
BOOL CFilterPage::OnKillActive() { BOOL fShowOneType = FALSE;
for (int i = 0; i < m_arrayTypeFilter.GetSize(); i++) { if (m_arrayTypeFilter[i].fShow == TRUE) { fShowOneType = TRUE; break; } }
if (!fShowOneType) { // tell the user to select at least one name type to display
WinsMessageBox(IDS_ERR_NO_NAME_TYPE_SPECIFIED); PropSheet_SetCurSel(GetSafeHwnd(), NULL, 0); m_listType.SetFocus();
return FALSE; }
return CPropertyPage::OnKillActive(); }
BOOL CFilterPage::OnSetActive() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); m_btnEnableCache.SetCheck(pParent->m_bCaching); return CPropertyPage::OnSetActive(); }
void CFilterPage::OnEnableCaching() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); pParent->m_bCaching = (m_btnEnableCache.GetCheck() == 1); }
void CFilterPage::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // check to see if this item is checked
BOOL bChecked = m_listType.GetCheck(pNMListView->iItem);
int nIndex = pNMListView->iItem; DWORD dwType = (DWORD) m_listType.GetItemData(nIndex);
// if the state isn't changing, then we don't care
if ( !(pNMListView->uChanged & LVIF_STATE) ) return;
for (int i = 0; i < m_arrayTypeFilter.GetSize(); i++) { if (m_arrayTypeFilter[i].dwType == dwType) { m_arrayTypeFilter[i].fShow = bChecked; } }
if (m_listType.IsSelected(nIndex) && !IsDefaultType(dwType) ) { m_buttonModify.EnableWindow(TRUE); m_buttonDelete.EnableWindow(TRUE); } else { m_buttonModify.EnableWindow(FALSE); m_buttonDelete.EnableWindow(FALSE); }
*pResult = 0; }
void CFilterPage::OnButtonAddType() { CNameTypeDlg dlgNameType;
dlgNameType.m_pNameTypeMap = m_pNameTypeMap;
if (dlgNameType.DoModal() == IDOK) { // add new type here
HRESULT hr = m_pNameTypeMap->AddEntry(dlgNameType.m_dwId, dlgNameType.m_strDescription); if (FAILED(hr)) { WinsMessageBox(WIN32_FROM_HRESULT(hr)); return; }
// update our array that keeps track of check state
CTypeFilterInfo typeFilterInfo; typeFilterInfo.dwType = dlgNameType.m_dwId; typeFilterInfo.fShow = TRUE; m_arrayTypeFilter.Add(typeFilterInfo);
// update the listbox
m_listType.DeleteAllItems(); FillTypeInfo(); } }
void CFilterPage::OnButtonModifyType() { CNameTypeDlg dlgNameType; int nSelected;
dlgNameType.m_pNameTypeMap = m_pNameTypeMap;
nSelected = m_listType.GetNextItem(-1, LVNI_SELECTED);
dlgNameType.m_fCreate = FALSE;
dlgNameType.m_dwId = (DWORD) m_listType.GetItemData(nSelected); m_pNameTypeMap->TypeToCString(dlgNameType.m_dwId, -1, dlgNameType.m_strDescription);
if (dlgNameType.DoModal() == IDOK) { // modify type here
HRESULT hr = m_pNameTypeMap->ModifyEntry(dlgNameType.m_dwId, dlgNameType.m_strDescription); if (FAILED(hr)) { WinsMessageBox(WIN32_FROM_HRESULT(hr)); return; }
// move the focus
m_listType.SetFocus(); SetDefID(IDOK);
// update the listbox
m_listType.DeleteAllItems(); FillTypeInfo(); } }
void CFilterPage::OnButtonDelete() { HRESULT hr = hrOK; int nSelected; DWORD dwNameType;
nSelected = m_listType.GetNextItem(-1, LVNI_SELECTED); dwNameType = (DWORD) m_listType.GetItemData(nSelected);
// are you sure?
if (AfxMessageBox(IDS_WARN_DELETE_NAME_TYPE, MB_YESNO) == IDYES) { hr = m_pNameTypeMap->RemoveEntry(dwNameType); if (SUCCEEDED(hr)) { // remove from the list box
m_listType.DeleteItem(nSelected);
// remove from the active filters if it is in the list
for (int i = 0; i < m_arrayTypeFilter.GetSize(); i++) { if (dwNameType == m_arrayTypeFilter[i].dwType) { m_arrayTypeFilter.RemoveAt(i); break; } } } else { WinsMessageBox(WIN32_FROM_HRESULT(hr)); }
// move the focus
m_listType.SetFocus(); SetDefID(IDOK); } }
void CFilterPage::FillTypeInfo() { m_listType.DeleteAllItems();
SPITFSNode spNode; CString strDisplay; CStringMapEntry mapEntry; int nColWidth, nColWidthTemp = 0;
nColWidth = m_listType.GetColumnWidth(0);
for (int i = 0; i < m_pNameTypeMap->GetSize(); i++) { mapEntry = m_pNameTypeMap->GetAt(i); // only display the default name type mapping strings, not the special
// ones based on the wins type of record
if (mapEntry.dwWinsType == -1) { if (mapEntry.dwNameType == NAME_TYPE_OTHER) { strDisplay.Format(_T("%s"), mapEntry.st); } else { strDisplay.Format(_T("[%02Xh] %s"), mapEntry.dwNameType, mapEntry.st); }
if (m_listType.GetStringWidth(strDisplay) > nColWidthTemp) { nColWidthTemp = m_listType.GetStringWidth(strDisplay); }
int nIndex = m_listType.AddItem(strDisplay, i); m_listType.SetItemData(nIndex, mapEntry.dwNameType); } }
// if the strings are too long, update the column width
if (nColWidthTemp > nColWidth) { m_listType.SetColumnWidth(0, nColWidthTemp + 50); }
CheckItems();
m_listType.SortItems(FilterPageCompareFunc, 0); }
void CFilterPage::CheckItems() { int nCount = (int)m_arrayTypeFilter.GetSize();
for (int i = 0; i < nCount; i++) { if (m_arrayTypeFilter[i].fShow) { DWORD dwFound = m_arrayTypeFilter[i].dwType; m_listType.CheckItem(GetIndex(dwFound)); } } }
void CFilterPage::OnButtonSelectAll() { for (int i = 0; i < m_listType.GetItemCount(); i++) { m_listType.SetCheck(i, TRUE); } }
void CFilterPage::OnButtonUnselectAll() { for (int i = 0; i < m_listType.GetItemCount(); i++) { m_listType.SetCheck(i, FALSE); } }
int CFilterPage::GetIndex(DWORD dwIndex) { int nResult = -1;
int nCount = m_listType.GetItemCount(); for (int i = 0; i < nCount; i++) { if (m_listType.GetItemData(i) == dwIndex) return i; }
return nResult; }
BOOL CFilterPage::IsDefaultType(DWORD dwType) { BOOL bDefault = FALSE;
for (int i = 0; i < DimensionOf(s_NameTypeMappingDefault); i++) { if (s_NameTypeMappingDefault[i][0] == dwType) { bDefault = TRUE; break; } }
return bDefault; }
BOOL CFilterPage::OnHelpInfo(HELPINFO* pHelpInfo) { int i; DWORD dwCtrlId;
if (pHelpInfo->iContextType == HELPINFO_WINDOW) { DWORD * pdwHelp = GetHelpMap();
if (pdwHelp) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)pdwHelp); } } return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// CNameTypeDlg dialog
CNameTypeDlg::CNameTypeDlg(CWnd* pParent /*=NULL*/) : CBaseDialog(CNameTypeDlg::IDD, pParent) { //{{AFX_DATA_INIT(CNameTypeDlg)
m_strDescription = _T(""); m_strId = _T(""); //}}AFX_DATA_INIT
m_fCreate = TRUE; m_dwId = 0; }
void CNameTypeDlg::DoDataExchange(CDataExchange* pDX) { CBaseDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNameTypeDlg)
DDX_Control(pDX, IDC_EDIT_NAME_TYPE_DESCRIPTION, m_editDescription); DDX_Control(pDX, IDC_EDIT_NAME_TYPE_ID, m_editId); DDX_Text(pDX, IDC_EDIT_NAME_TYPE_DESCRIPTION, m_strDescription); DDX_Text(pDX, IDC_EDIT_NAME_TYPE_ID, m_strId); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNameTypeDlg, CBaseDialog) //{{AFX_MSG_MAP(CNameTypeDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNameTypeDlg message handlers
BOOL CNameTypeDlg::OnInitDialog() { CBaseDialog::OnInitDialog();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!m_fCreate) { CString strTitle; strTitle.LoadString(IDS_MODIFY_NAME_TYPE);
SetWindowText(strTitle);
m_editId.SetReadOnly(TRUE);
CString strId;
strId.Format(_T("%lx"), m_dwId); m_editId.SetWindowText(strId); }
m_editId.LimitText(2); m_editDescription.LimitText(STRING_LENGTH_MAX);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CNameTypeDlg::OnOK() { UpdateData(); TCHAR * pEnd; // convert the id
m_dwId = _tcstol(m_strId, &pEnd, 16); if (*pEnd != NULL) { AfxMessageBox(IDS_ERR_INVALID_HEX_STRING);
m_editId.SetSel(0, -1); m_editId.SetFocus();
return; }
if (m_fCreate && m_pNameTypeMap->EntryExists(m_dwId)) { AfxMessageBox(IDS_ERROR_NAME_TYPE_EXISTS); m_editId.SetFocus(); return; }
CBaseDialog::OnOK(); } /////////////////////////////////////////////////////////////////////////////
// CIPAddrPage property page
IMPLEMENT_DYNCREATE(CIPAddrPage, CPropertyPage)
CIPAddrPage::CIPAddrPage() : CPropertyPage(CIPAddrPage::IDD) { //{{AFX_DATA_INIT(CIPAddrPage)
//}}AFX_DATA_INIT
}
CIPAddrPage::~CIPAddrPage() { }
LPCOLESTR CIPAddrPage::GetNameForApi() { return m_bFilterName == TRUE ? (LPCOLESTR)m_strName : NULL; }
DWORD CIPAddrPage::GetIPMaskForFilter(UINT nMask) { return m_bFilterIpMask == TRUE ? m_dwaIPMasks[nMask] : INADDR_BROADCAST; }
void CIPAddrPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CIPAddrPage)
DDX_Control(pDX, IDC_CHECK_MATCHCASE, m_ckbMatchCase); DDX_Control(pDX, IDC_CHECK_IPMASK, m_ckbIPMask); DDX_Control(pDX, IDC_CHECK_NAME, m_ckbName); DDX_Control(pDX, IDC_CHECK_IPADDR, m_ckbIPAddr); DDX_Control(pDX, IDC_ENABLE_CACHING, m_btnEnableCache); DDX_Control(pDX, IDC_EDIT_NAME, m_editName); DDX_Control(pDX, IDC_IPADDRESS, m_ctrlIPAddress); DDX_Control(pDX, IDC_SUBNETMASK, m_ctrlIPMask); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIPAddrPage, CPropertyPage) //{{AFX_MSG_MAP(CIPAddrPage)
ON_BN_CLICKED(IDC_CHECK_IPADDR, OnCheckIpaddr) ON_BN_CLICKED(IDC_CHECK_NAME, OnCheckName) ON_BN_CLICKED(IDC_ENABLE_CACHING, OnEnableCaching) ON_BN_CLICKED(IDC_CHECK_IPMASK, OnCheckIpmask) ON_WM_HELPINFO() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIPAddrPage message handlers
void CIPAddrPage::OnOK() { DWORD dwAddress, dwMask; CString oldName; CLoadRecords *pSheet = (CLoadRecords *)GetParent(); pSheet->m_nActivePage = pSheet->GetActiveIndex(); pSheet->m_bEnableCache = pSheet->m_bCaching;
//------------check the name field--------------
m_bFilterName = (m_ckbName.GetCheck() == 1); m_bMatchCase = (m_ckbMatchCase.GetCheck() == 1); // get a hand on the original name
oldName = m_strName; // get the current name
m_editName.GetWindowText(m_strName); if (!m_bDirtyName && !m_bFilterName) // if we didn't filter by name before and we don't now, the name is clean
m_bDirtyName = FALSE; else if (m_bDirtyName && !m_bFilterName) // if we did filter before and we don't now, the name is dirty
m_bDirtyName = TRUE; else if (!m_bDirtyName && m_bFilterName) // if we didn't filter before and we do now, the name is clean
m_bDirtyName = FALSE; else { // we did filter by name before, we do now
// the filter might have changed
LPCTSTR pOldName, pNewName;
// we should mark the name "dirty" only if the old prefix is included in the new one
// meaning all new names should already be loaded in the database view since
// they match the old prefix
for (pOldName = (LPCTSTR)oldName, pNewName = (LPCTSTR)m_strName; *pNewName != _T('\0') && *pNewName != _T('*') && *pNewName != _T('?'); pOldName++, pNewName++) { if (*pOldName != *pNewName) break; } m_bDirtyName = (*pOldName != _T('\0') && *pOldName != _T('*') && *pOldName != _T('?')); }
//------------check the IP address and mask fields--------------
m_bFilterIpAddr = (m_ckbIPAddr.GetCheck() == 1); m_bFilterIpMask = (m_ckbIPMask.GetCheck() == 1);
// get the current address and mask
m_ctrlIPAddress.GetAddress(dwAddress); m_ctrlIPMask.GetAddress(dwMask);
if (m_bDirtyAddr && m_bDirtyMask) { // we did have a mask before
if (m_bFilterIpAddr && m_bFilterIpMask) { // we do have a mask now - if the new mask is less specific, => definitely dirty
m_bDirtyMask = ((dwMask|m_dwaIPMasks[0])^dwMask) != 0; } else { // we don't have a mask now => 255.255.255.255 (which is assumed) is as specific
// as possible => we do have the record we need already => definitely clean
m_bDirtyMask = FALSE; } } else { // we didn't have a mask before => 255.255.255.255 was assumed = the most specific
if (m_bFilterIpAddr && m_bFilterIpMask) { // we do have a mask now
// the mask is dirty only if we actually did IP filtering before,
// otherwise, all the records are already there, regardless their IPs
m_bDirtyMask = m_bDirtyAddr && (dwMask != INADDR_BROADCAST); } else { // we don't have a mask now => nothing changed => definitely clean
m_bDirtyMask = FALSE; } }
if (m_bDirtyAddr) { // we did filter on IP address
if (m_bFilterIpAddr) { // we do filter on IP address now
// we need to see if the new Ip (or subnet address) has changed
//DWORD dwNewSubnet, dwOldSubnet;
//dwNewSubnet = m_bFilterIpMask ? dwAddress & dwMask : dwAddress;
//dwOldSubnet = m_bDirtyMask ? m_dwaIPAddrs[0] & m_dwaIPMasks[0] : m_dwaIPAddrs[0];
m_bDirtyAddr = (dwAddress != m_dwaIPAddrs[0]); } else { // we don't filter on IP address now => definitely dirty
m_bDirtyAddr = TRUE; } } else { // we didn't filter on IP address originally => we have all records => definitely clean
m_bDirtyAddr = FALSE; }
// save the current address but only if there is one! The ip ctrl could very well be empty and we
// risk to see this as 0.0.0.0 which would be wrong
m_dwaIPAddrs.RemoveAll(); if (!m_ctrlIPAddress.IsBlank()) m_dwaIPAddrs.Add(dwAddress);
// save the current mask but only if there is one! The ip ctrl could very well be empty and we
// risk to see this as 0.0.0.0 which would be wrong
m_dwaIPMasks.RemoveAll(); if (!m_ctrlIPMask.IsBlank()) m_dwaIPMasks.Add(dwMask);
CPropertyPage::OnOK(); }
BOOL CIPAddrPage::OnInitDialog() { CPropertyPage::OnInitDialog();
// turn on the ? in the title bar
CWnd * pWnd = GetParent(); if (pWnd) { CWnd * pButton = pWnd->GetDlgItem(IDOK);
if (pButton) { CString strText; strText.LoadString(IDS_FIND_NOW); pButton->SetWindowText(strText); }
pWnd->ModifyStyleEx(0, WS_EX_CONTEXTHELP, 0); }
SetModified();
// just save the previous "filter by name" bit
m_bDirtyName = m_bFilterName; m_ckbName.SetCheck(m_bFilterName); m_ckbMatchCase.SetCheck(m_bMatchCase); m_ckbMatchCase.EnableWindow(m_bFilterName); m_editName.SetWindowText(m_strName); m_editName.EnableWindow(m_bFilterName);
// just save the previous "filter by ip" bit
m_bDirtyAddr = m_bFilterIpAddr; m_ckbIPAddr.SetCheck(m_bFilterIpAddr); if (m_dwaIPAddrs.GetSize() != 0) m_ctrlIPAddress.SetAddress(m_dwaIPAddrs[0]); m_ctrlIPAddress.EnableWindow(m_bFilterIpAddr); m_ckbIPMask.EnableWindow(m_bFilterIpAddr);
// just save the previous "filter by subnet" bit
m_bDirtyMask = m_bFilterIpMask; m_ckbIPMask.SetCheck(m_bFilterIpMask); if (m_dwaIPMasks.GetSize() != 0) m_ctrlIPMask.SetAddress(m_dwaIPMasks[0]); m_ctrlIPMask.EnableWindow(m_bFilterIpAddr && m_bFilterIpMask);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CIPAddrPage::OnCheckIpaddr() { BOOL bFIpAddr = (m_ckbIPAddr.GetCheck() == 1); BOOL bFIpMask = (m_ckbIPMask.GetCheck() == 1);
m_ctrlIPAddress.EnableWindow(bFIpAddr); m_ckbIPMask.EnableWindow(bFIpAddr); m_ctrlIPMask.EnableWindow(bFIpAddr && bFIpMask); m_ctrlIPAddress.SetFieldFocus((WORD)-1); }
void CIPAddrPage::OnCheckIpmask() { BOOL bFIpMask = (m_ckbIPMask.GetCheck() == 1); m_ctrlIPMask.EnableWindow(bFIpMask); m_ctrlIPMask.SetFieldFocus((WORD)-1); }
void CIPAddrPage::OnCheckName() { TCHAR pName[3]; BOOL bFName = (m_ckbName.GetCheck() == 1); CLoadRecords *pParent = (CLoadRecords *)GetParent(); m_editName.EnableWindow(bFName); m_ckbMatchCase.EnableWindow(bFName); }
BOOL CIPAddrPage::OnKillActive() { BOOL bFName = (m_ckbName.GetCheck() == 1); BOOL bFIpAddr = (m_ckbIPAddr.GetCheck() == 1); BOOL bFIpMask = (m_ckbIPMask.GetCheck() == 1);
if (bFName && m_editName.GetWindowTextLength()==0) { WinsMessageBox(IDS_ERR_NO_NAME); return FALSE; }
if (bFIpAddr && m_ctrlIPAddress.IsBlank()) { WinsMessageBox(IDS_ERR_NO_IPADDR); return FALSE; }
if (bFIpAddr && bFIpMask) { if (m_ctrlIPMask.IsBlank()) { WinsMessageBox(IDS_ERR_NO_IPMASK); return FALSE; } else { DWORD dwMask;
m_ctrlIPMask.GetAddress(dwMask); if (dwMask != ~(((dwMask-1)|dwMask)^dwMask)) { WinsMessageBox(IDS_ERR_INVALID_IPMASK); return FALSE; } } }
return CPropertyPage::OnKillActive(); }
BOOL CIPAddrPage::OnSetActive() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); m_btnEnableCache.SetCheck(pParent->m_bCaching); return CPropertyPage::OnSetActive(); }
void CIPAddrPage::OnEnableCaching() { CLoadRecords *pParent = (CLoadRecords *)GetParent(); pParent->m_bCaching = (m_btnEnableCache.GetCheck() == 1); }
BOOL CIPAddrPage::OnHelpInfo(HELPINFO* pHelpInfo) { int i; DWORD dwCtrlId;
if (pHelpInfo->iContextType == HELPINFO_WINDOW) { DWORD * pdwHelp = GetHelpMap();
if (pdwHelp) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)pdwHelp); } } return TRUE; }
|