mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
705 lines
16 KiB
705 lines
16 KiB
// viewmapp.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "winsadmn.h"
|
|
#include "viewmapp.h"
|
|
#include "editstat.h"
|
|
#include "setmappi.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CViewMappingsDlg dialog
|
|
|
|
CViewMappingsDlg::CViewMappingsDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CViewMappingsDlg::IDD, pParent),
|
|
m_ListBoxRes1(
|
|
IDB_MAPPINGS,
|
|
m_list_Mappings.nBitmaps
|
|
),
|
|
m_ListBoxRes2(
|
|
IDB_SERVER,
|
|
m_list_Owners.nBitmaps
|
|
),
|
|
m_list_Mappings(
|
|
IDS_STATUS_GET_MAPPINGS, // Status bar message ID
|
|
FALSE, // Listbox is single select
|
|
CPreferences::ADD_IP_NB
|
|
),
|
|
m_pMask(NULL),
|
|
//m_pOwner(NULL)
|
|
m_pownCurrentOwner(NULL)
|
|
{
|
|
//{{AFX_DATA_INIT(CViewMappingsDlg)
|
|
m_nSortBy = CPreferences::SORTBY_NB; // Initial sort always by name.
|
|
m_nOwner = 1;
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_list_Mappings.AttachResources( &m_ListBoxRes1 );
|
|
m_list_Owners.AttachResources( &m_ListBoxRes2 );
|
|
}
|
|
|
|
CViewMappingsDlg::~CViewMappingsDlg()
|
|
{
|
|
if (m_pMask != NULL)
|
|
{
|
|
delete m_pMask;
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::DoDataExchange(
|
|
CDataExchange* pDX
|
|
)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CViewMappingsDlg)
|
|
DDX_Control(pDX, IDC_BUTTON_DELETE_OWNER, m_button_DeleteOwner);
|
|
DDX_Control(pDX, IDC_BUTTON_CLEARFILTER, m_button_ClearFilter);
|
|
DDX_Control(pDX, IDC_STATIC_FILTER, m_static_Filter);
|
|
DDX_Control(pDX, IDC_STATIC_SELECTOWNER, m_static_SelectOwner);
|
|
DDX_Control(pDX, IDC_STATIC_HIGHID, m_static_HighID);
|
|
DDX_Radio(pDX, IDC_RADIO_SORTBYIP, m_nSortBy);
|
|
DDX_Radio(pDX, IDC_RADIO_ALL_OWNERS, m_nOwner);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CViewMappingsDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CViewMappingsDlg)
|
|
ON_BN_CLICKED(IDC_BUTTON_CLEARFILTER, OnClickedButtonClearfilter)
|
|
ON_BN_CLICKED(IDC_BUTTON_SETFILTER, OnClickedButtonSetfilter)
|
|
ON_LBN_ERRSPACE(IDC_LIST_MAPPINGS, OnErrspaceListMappings)
|
|
ON_LBN_SELCHANGE(IDC_LIST_MAPPINGS, OnSelchangeListMappings)
|
|
ON_LBN_ERRSPACE(IDC_LIST_OWNERS, OnErrspaceListOwners)
|
|
ON_LBN_SELCHANGE(IDC_LIST_OWNERS, OnSelchangeListOwners)
|
|
ON_BN_CLICKED(IDC_RADIO_SORTBYIP, OnClickedRadioSortbyip)
|
|
ON_BN_CLICKED(IDC_RADIO_SORTBYNETBIOS, OnClickedRadioSortbynetbios)
|
|
ON_BN_CLICKED(IDC_RADIO_SORTBYTIME, OnClickedRadioSortbytime)
|
|
ON_BN_CLICKED(IDC_RADIO_SORTBYTYPE, OnClickedRadioSortbytype)
|
|
ON_WM_SYSCOLORCHANGE()
|
|
ON_BN_CLICKED(IDC_RADIO_ALL_OWNERS, OnClickedRadioAllOwners)
|
|
ON_BN_CLICKED(IDC_RADIO_SPECIFIC, OnClickedRadioSpecific)
|
|
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnClickedButtonRefresh)
|
|
ON_BN_CLICKED(IDC_BUTTON_DELETE_OWNER, OnClickedButtonDeleteOwner)
|
|
ON_BN_CLICKED(IDC_RADIO_SORTBY_VERSION, OnClickedRadioSortbyVersion)
|
|
ON_WM_CHARTOITEM()
|
|
ON_LBN_DBLCLK(IDC_LIST_MAPPINGS, OnDblclkListMappings)
|
|
ON_BN_CLICKED(IDC_BUTTON_PROPERTIES, OnClickedButtonProperties)
|
|
ON_WM_VKEYTOITEM()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Highlight the currently open WINS server in the
|
|
// owners listbox.
|
|
//
|
|
void
|
|
CViewMappingsDlg::SelectCurrentWins()
|
|
{
|
|
ASSERT(theApp.IsConnected());
|
|
|
|
CIpNamePair ip(
|
|
theApp.GetPrimaryIpAddress(),
|
|
(LPCSTR)(theApp.GetConnectedNetBIOSName())+2 // Skip slashes
|
|
);
|
|
|
|
int nSel = m_list_Owners.FindItem(&ip);
|
|
ASSERT(nSel != LB_ERR);
|
|
if (nSel != LB_ERR)
|
|
{
|
|
m_list_Owners.SetCurSel(nSel);
|
|
OnSelchangeListOwners();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::HandleControlStates()
|
|
{
|
|
m_button_ClearFilter.EnableWindow(m_pMask != NULL);
|
|
m_button_DeleteOwner.EnableWindow(m_list_Owners.GetCurSel() != LB_ERR);
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::ShowFilter()
|
|
{
|
|
CString str;
|
|
theApp.GetFilterString(m_pMask, str);
|
|
m_static_Filter.SetWindowText(str);
|
|
}
|
|
|
|
APIERR
|
|
CViewMappingsDlg::FillOwnerListBox()
|
|
{
|
|
APIERR err = 0;
|
|
DWORD i;
|
|
WINSINTF_RESULTS_T Results;
|
|
WINSINTF_RESULTS_NEW_T NewResults;
|
|
BOOL fNewApi = TRUE;
|
|
DWORD dwNumOwners;
|
|
|
|
TRY
|
|
{
|
|
//
|
|
// First try the new API which does not
|
|
// not have the 25 partner limitation. If
|
|
// this fails with RPC_S_PROCNUM_OUT_OF_RANGE,
|
|
// we know the server is a down-level server,
|
|
// and we need to call the old method.
|
|
//
|
|
err = theApp.GetNewConfig(&NewResults);
|
|
if (err == RPC_S_PROCNUM_OUT_OF_RANGE)
|
|
{
|
|
//
|
|
// Try old API
|
|
//
|
|
err = theApp.GetConfig(&Results);
|
|
fNewApi = FALSE;
|
|
}
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
return err;
|
|
}
|
|
ASSERT(!fNewApi || NewResults.pAddVersMaps != NULL);
|
|
|
|
m_list_Owners.ResetContent();
|
|
dwNumOwners = fNewApi ? NewResults.NoOfOwners : Results.NoOfOwners;
|
|
|
|
if (dwNumOwners != 0)
|
|
{
|
|
LARGE_INTEGER liVersion;
|
|
CIpAddress ipa;
|
|
for (i = 0; i < dwNumOwners; i++)
|
|
{
|
|
CString strNetBIOSName;
|
|
strNetBIOSName.LoadString(IDS_UNVERIFIED_NETBIOSNAME);
|
|
|
|
liVersion = fNewApi
|
|
? NewResults.pAddVersMaps[i].VersNo
|
|
: Results.AddVersMaps[i].VersNo;
|
|
ipa = fNewApi
|
|
? NewResults.pAddVersMaps[i].Add.IPAdd
|
|
: Results.AddVersMaps[i].Add.IPAdd;
|
|
COwner ip(ipa, strNetBIOSName, liVersion);
|
|
//
|
|
// Find the netbios name from the WINSS cache
|
|
//
|
|
if (!theApp.m_wcWinssCache.ExpandAddress(ip))
|
|
{
|
|
//
|
|
// We don't know this WINS server yet! See if we can
|
|
// establish contact, and if so add it to our cache.
|
|
//
|
|
}
|
|
int n = m_list_Owners.AddItem(ip, FALSE);
|
|
ASSERT(n!=-1);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Clean up;
|
|
//
|
|
if (fNewApi)
|
|
{
|
|
::WinsFreeMem(NewResults.pAddVersMaps);
|
|
}
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Create a new list (only the first page if sorting by name)
|
|
//
|
|
APIERR
|
|
CViewMappingsDlg::CreateList()
|
|
{
|
|
APIERR err = 0;
|
|
|
|
WINSINTF_ADD_T OwnAdd;
|
|
//
|
|
// Fill in owner
|
|
//
|
|
OwnAdd.Len = 4;
|
|
OwnAdd.Type = 0;
|
|
OwnAdd.IPAdd = m_pownCurrentOwner != NULL
|
|
? (LONG)m_pownCurrentOwner->GetIpAddress()
|
|
: 0L;
|
|
|
|
//
|
|
// If a specific owner is selected, whose max version
|
|
// number is 0, then don't bother the WINS service,
|
|
// as no records will be found anyway.
|
|
//
|
|
if (m_pownCurrentOwner != NULL
|
|
&& m_pownCurrentOwner->GetVersion().LowPart == 0L
|
|
&& m_pownCurrentOwner->GetVersion().HighPart == 0L
|
|
)
|
|
{
|
|
m_list_Mappings.ResetContent();
|
|
}
|
|
else
|
|
{
|
|
err = m_list_Mappings.CreateList(m_pownCurrentOwner != NULL
|
|
? &OwnAdd : NULL,
|
|
m_pMask,
|
|
WINSINTF_BOTH,
|
|
m_nSortBy
|
|
);
|
|
}
|
|
|
|
//
|
|
// Update the controls
|
|
//
|
|
HandleControlStates();
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// CViewMappingsDlg message handlers
|
|
//
|
|
BOOL
|
|
CViewMappingsDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_list_Mappings.SubclassDlgItem(IDC_LIST_MAPPINGS, this);
|
|
m_list_Mappings.SetAddressDisplay(
|
|
m_nSortBy == CPreferences::SORTBY_NB
|
|
? CPreferences::ADD_NB_IP
|
|
: CPreferences::ADD_IP_NB
|
|
);
|
|
|
|
|
|
//
|
|
// Determine the TAB for "Highest ID"
|
|
//
|
|
RECT rc1, rc2;
|
|
m_static_SelectOwner.GetWindowRect(&rc1);
|
|
m_static_HighID.GetWindowRect(&rc2);
|
|
|
|
m_list_Owners.SubclassDlgItem(IDC_LIST_OWNERS, this);
|
|
m_list_Owners.SetAddressDisplay(theApp.m_wpPreferences.m_nAddressDisplay);
|
|
m_list_Owners.SetTab(rc2.left - rc1.left);
|
|
|
|
APIERR err = FillOwnerListBox();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
//
|
|
// Don't show the dialog if we didn't get to it.
|
|
//
|
|
EndDialog(IDCANCEL);
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Select the current WINS server in the listbox, and
|
|
// make sure that this is the one which is used
|
|
// to reading the initial mappings.
|
|
//
|
|
// Note that this will also create the list of
|
|
// of mappings
|
|
//
|
|
SelectCurrentWins();
|
|
|
|
theApp.SetTitle(this);
|
|
ShowFilter();
|
|
|
|
m_list_Mappings.SetFocus();
|
|
m_list_Mappings.SetCurSel(0);
|
|
|
|
return FALSE; // return false, since we set focus ourselves.
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedButtonSetfilter()
|
|
{
|
|
CSetMappingsFilterDlg dlgFilter(m_pMask);
|
|
if (dlgFilter.DoModal()==IDOK)
|
|
{
|
|
ShowFilter();
|
|
APIERR err = CreateList();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedButtonClearfilter()
|
|
{
|
|
ASSERT(m_pMask != NULL);
|
|
|
|
delete m_pMask;
|
|
m_pMask = NULL;
|
|
ShowFilter();
|
|
APIERR err = CreateList();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnErrspaceListMappings()
|
|
{
|
|
theApp.MessageBox(IDS_ERR_ERRSPACE);
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnSelchangeListMappings()
|
|
{
|
|
SetDefID(IDC_BUTTON_PROPERTIES);
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnErrspaceListOwners()
|
|
{
|
|
theApp.MessageBox(IDS_ERR_ERRSPACE);
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnSelchangeListOwners()
|
|
{
|
|
int nCurSel = m_list_Owners.GetCurSel();
|
|
if (nCurSel != LB_ERR)
|
|
{
|
|
//CIpNamePair * p = m_list_Owners.GetItem(nCurSel);
|
|
m_pownCurrentOwner = m_list_Owners.GetItem(nCurSel);
|
|
ASSERT(m_pownCurrentOwner != NULL);
|
|
|
|
//
|
|
// Set "specific" owner radio button
|
|
//
|
|
UpdateData(TRUE);
|
|
m_nOwner = 1;
|
|
UpdateData(FALSE);
|
|
|
|
APIERR err = CreateList();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TRACEEOLID("No owners in listbox");
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSortbyip()
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_IP)
|
|
{
|
|
//
|
|
// Already selected, do nothing
|
|
//
|
|
return;
|
|
}
|
|
|
|
m_list_Mappings.SortByIp();
|
|
m_nSortBy = CPreferences::SORTBY_IP;
|
|
|
|
if (m_list_Mappings.GetCount() > 0)
|
|
{
|
|
m_list_Mappings.SetFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSortbynetbios()
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_NB)
|
|
{
|
|
//
|
|
// Already selected, do nothing
|
|
//
|
|
return;
|
|
}
|
|
|
|
m_list_Mappings.SortByName();
|
|
m_nSortBy = CPreferences::SORTBY_NB;
|
|
m_list_Mappings.SetFocus();
|
|
|
|
if (m_list_Mappings.GetCount() > 0)
|
|
{
|
|
m_list_Mappings.SetFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSortbytime()
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_TIME)
|
|
{
|
|
//
|
|
// Already selected, do nothing
|
|
//
|
|
return;
|
|
}
|
|
|
|
m_list_Mappings.SortByTime();
|
|
m_nSortBy = CPreferences::SORTBY_TIME;
|
|
m_list_Mappings.SetFocus();
|
|
|
|
if (m_list_Mappings.GetCount() > 0)
|
|
{
|
|
m_list_Mappings.SetFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSortbytype()
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_TYPE)
|
|
{
|
|
//
|
|
// Already selected, do nothing
|
|
//
|
|
return;
|
|
}
|
|
|
|
m_list_Mappings.SortByType();
|
|
m_nSortBy = CPreferences::SORTBY_TYPE;
|
|
m_list_Mappings.SetFocus();
|
|
|
|
if (m_list_Mappings.GetCount() > 0)
|
|
{
|
|
m_list_Mappings.SetFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSortbyVersion()
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_VERID)
|
|
{
|
|
//
|
|
// Already selected, do nothing
|
|
//
|
|
return;
|
|
}
|
|
|
|
m_list_Mappings.SortByVersion();
|
|
m_nSortBy = CPreferences::SORTBY_VERID;
|
|
|
|
if (m_list_Mappings.GetCount() > 0)
|
|
{
|
|
m_list_Mappings.SetFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnSysColorChange()
|
|
{
|
|
m_ListBoxRes1.SysColorChanged();
|
|
m_ListBoxRes2.SysColorChanged();
|
|
|
|
CDialog::OnSysColorChange();
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioAllOwners()
|
|
{
|
|
//
|
|
// Deselected current owner
|
|
//
|
|
m_list_Owners.SetCurSel(-1);
|
|
m_pownCurrentOwner = NULL;
|
|
//
|
|
// Add all records
|
|
//
|
|
APIERR err = CreateList();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
}
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedRadioSpecific()
|
|
{
|
|
//
|
|
// Select the first owner in the listbox
|
|
//
|
|
m_list_Owners.SetCurSel(0);
|
|
OnSelchangeListOwners();
|
|
}
|
|
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedButtonRefresh()
|
|
{
|
|
UpdateData(); // Get owner selection..
|
|
int cCurrentOwner = m_list_Owners.GetCurSel();
|
|
APIERR err = FillOwnerListBox();
|
|
if (cCurrentOwner != LB_ERR)
|
|
{
|
|
m_list_Owners.SetCurSel(cCurrentOwner);
|
|
}
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
}
|
|
|
|
//
|
|
// This will refresh the mappings
|
|
//
|
|
OnSelchangeListOwners();
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedButtonDeleteOwner()
|
|
{
|
|
int nCurSel = m_list_Owners.GetCurSel();
|
|
|
|
ASSERT(nCurSel != LB_ERR);
|
|
|
|
if (nCurSel == LB_ERR)
|
|
{
|
|
return;
|
|
}
|
|
|
|
COwner * p = m_list_Owners.GetItem(nCurSel);
|
|
|
|
//
|
|
// Vary the message depending on whether or not
|
|
// the current WINS server is the target of the
|
|
// deletion
|
|
//
|
|
if (theApp.MessageBox(
|
|
theApp.IsCurrentWinsServer(p->GetIpAddress())
|
|
? IDS_MSG_PURGE_WINSS3 : IDS_MSG_PURGE_WINSS2,
|
|
MB_ICONEXCLAMATION | MB_YESNOCANCEL | MB_DEFBUTTON2) == IDYES)
|
|
{
|
|
theApp.SetStatusBarText(IDS_STATUS_PURGING);
|
|
theApp.BeginWaitCursor();
|
|
APIERR err = theApp.DeleteWinsServer(p);
|
|
theApp.EndWaitCursor();
|
|
theApp.SetStatusBarText();
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
theApp.MessageBox(err);
|
|
return;
|
|
}
|
|
|
|
m_list_Owners.DeleteString(nCurSel);
|
|
m_list_Owners.SetCurSel(0); // Select the first item
|
|
OnSelchangeListOwners();
|
|
HandleControlStates();
|
|
}
|
|
}
|
|
|
|
int
|
|
CViewMappingsDlg::OnCharToItem(
|
|
UINT nChar,
|
|
CListBox* pListBox,
|
|
UINT nIndex
|
|
)
|
|
{
|
|
if (pListBox->IsKindOf(RUNTIME_CLASS(CStaticMappingsListBox))
|
|
&& nChar >= ' ' && nChar <= 'z')
|
|
{
|
|
if (m_nSortBy == CPreferences::SORTBY_NB)
|
|
{
|
|
CHAR szMask[] = "X";
|
|
*szMask = (CHAR)nChar;
|
|
((CStaticMappingsListBox *)pListBox)->GetAllPagesUntil((LPBYTE)szMask, TRUE);
|
|
OnSelchangeListMappings();
|
|
}
|
|
return -2;
|
|
}
|
|
|
|
return CDialog::OnCharToItem(nChar, pListBox, nIndex);
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnDblclkListMappings()
|
|
{
|
|
|
|
int nSel = m_list_Mappings.GetCurSel();
|
|
|
|
//
|
|
// This comes up when enter is pressed.
|
|
// If no current selection on the listbox
|
|
// we merely want to dismiss the dialog
|
|
//
|
|
if (nSel == LB_ERR)
|
|
{
|
|
EndDialog(IDOK);
|
|
return;
|
|
}
|
|
|
|
CRawMapping * p = (CRawMapping *)m_list_Mappings.GetItemDataPtr(nSel);
|
|
ASSERT(p != NULL);
|
|
CMapping map(p->GetRawData());
|
|
|
|
CEditStaticMappingDlg dlgEdit(&map, TRUE);
|
|
dlgEdit.DoModal();
|
|
}
|
|
|
|
void
|
|
CViewMappingsDlg::OnClickedButtonProperties()
|
|
{
|
|
OnDblclkListMappings();
|
|
}
|
|
|
|
int
|
|
CViewMappingsDlg::OnVKeyToItem(
|
|
UINT nKey,
|
|
CListBox* pListBox,
|
|
UINT nIndex
|
|
)
|
|
{
|
|
//
|
|
// Only deal with the mappings listbox
|
|
//
|
|
if (!pListBox->IsKindOf(RUNTIME_CLASS(CWinssListBox)) )
|
|
{
|
|
switch(nKey)
|
|
{
|
|
//
|
|
// Check for page-down, end, etc, since we may need to read
|
|
// the next batch into our listbox before executing the
|
|
// command.
|
|
//
|
|
case VK_NEXT:
|
|
case VK_DOWN:
|
|
//
|
|
// If we're in a specific range from the bottom of
|
|
// the listbox, then we read the next page of entries
|
|
// into the listbox.
|
|
//
|
|
if ((UINT)m_list_Mappings.GetCount() <= nIndex + PAGE_BOUNDARY)
|
|
{
|
|
m_list_Mappings.DownPage(TRUE);
|
|
}
|
|
return -1;
|
|
|
|
case VK_END:
|
|
m_list_Mappings.GetAllPages(TRUE);
|
|
return -1;
|
|
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return -2 ;
|
|
}
|