1452 lines
38 KiB
C++
1452 lines
38 KiB
C++
|
/**********************************************************************/
|
||
|
/** 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;
|
||
|
}
|