Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

375 lines
9.1 KiB

// BindsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "KeyObjs.h"
#include "wrapmb.h"
#include "cmnkey.h"
#include "mdkey.h"
#include "ListRow.h"
#include "BindsDlg.h"
#include "EdtBindD.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define COL_RAW 0
#define COL_IP 1
#define COL_PORT 2
/////////////////////////////////////////////////////////////////////////////
// CBindingsDlg dialog
CBindingsDlg::CBindingsDlg(WCHAR* pszw, CWnd* pParent /*=NULL*/)
: CDialog(CBindingsDlg::IDD, pParent),
m_pszwMachineName( pszw )
{
//{{AFX_DATA_INIT(CBindingsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CBindingsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBindingsDlg)
DDX_Control(pDX, IDC_DELETE, m_cbutton_delete);
DDX_Control(pDX, IDC_EDIT, m_cbutton_edit);
DDX_Control(pDX, IDC_LIST, m_clistctrl_list);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBindingsDlg, CDialog)
//{{AFX_MSG_MAP(CBindingsDlg)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_BN_CLICKED(IDC_EDIT, OnEdit)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList)
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//---------------------------------------------------------------------------
BOOL CBindingsDlg::OnInitDialog()
{
// call the parental oninitdialog
BOOL f = CDialog::OnInitDialog();
// set up the columns
FInitList();
// fill in the bindings
FillInBindings();
// set the initial states of the buttons
EnableButtons();
// return the answer
return f;
}
//-----------------------------------------------------------------
BOOL CBindingsDlg::FInitList()
{
CString sz;
int i;
// setup the raw field
sz.LoadString( IDS_IP_ADDRESS );
i = m_clistctrl_list.InsertColumn( COL_RAW, " ", LVCFMT_LEFT, 0 );
// setup the alias field
sz.LoadString( IDS_IP_ADDRESS );
i = m_clistctrl_list.InsertColumn( COL_IP, sz, LVCFMT_LEFT, 118 );
// setup the directory field
sz.LoadString( IDS_PORT_NUMBER );
i = m_clistctrl_list.InsertColumn( COL_PORT, sz, LVCFMT_LEFT, 118);
return TRUE;
}
//--------------------------------------------------------
// This provides us another opportunity to parse the
void CBindingsDlg::AddBinding( CString sz )
{
DWORD i;
BOOL f;
// add the binding string to the dislpay list
i = m_clistctrl_list.InsertItem( 0, " " );
// update the display portion
UpdateBindingDisplay( i, sz );
// update the raw portion
m_clistctrl_list.SetItemText( i, COL_RAW, sz );
}
//--------------------------------------------------------
// This provides us another opportunity to parse the
void CBindingsDlg::UpdateBindingDisplay( DWORD iItem, CString szBinding )
{
CString szIP;
CString szPort;
int iColon;
// prepare the localized string
CString szDefault;
szDefault.LoadString( IDS_DEFAULT );
// check for the default
if ( szBinding == MDNAME_DEFAULT )
{
szIP.Empty();
szIP.Empty();
}
else
{
// the first thing we are going to do is seperate the IP and PORT into seperate strings
// look for the : and seperate
iColon = szBinding.Find(':');
// if we got the colon, we can seperate easy
if ( iColon >= 0 )
{
szIP = szBinding.Left(iColon);
szPort = szBinding.Right( szBinding.GetLength() - iColon - 1);
}
// we did not get the colon, so it is one or the other, look for a '.' to get the IP
else
{
if ( szBinding.Find('.') >= 0 )
szIP = szBinding;
else
szPort = szBinding;
}
}
// if there any wildcards, show the right thing
if ( szIP.IsEmpty() )
szIP.LoadString( IDS_ANY_UNASSIGNED );
if ( szPort.IsEmpty() )
szPort.LoadString( IDS_ANY_UNASSIGNED );
// set the strings into the columns
m_clistctrl_list.SetItemText( iItem, COL_IP, szIP );
m_clistctrl_list.SetItemText( iItem, COL_PORT, szPort );
}
//--------------------------------------------------------
// fill in the bindings into the list
void CBindingsDlg::FillInBindings()
{
// just load the binding list from the key into the list. The only
// exception is that the non-localized "default" key indicator should
// be displayed as the localed "Default" from the resources
// get the number of strings that we will be dealing with here.
DWORD nStrings = m_pKey->m_rgbszBindings.GetSize();
// loop the strings and add them to the display list
for ( DWORD i = 0; i < nStrings; i++ )
{
CString sz = m_pKey->m_rgbszBindings[i];
// add the binding string to the dislpay list
AddBinding( sz );
}
}
//--------------------------------------------------------
// enable the buttons as appropriate
void CBindingsDlg::EnableButtons()
{
// if there is an item selected in the list, then enable
// the edit and delete buttons. Otherwise, disable them
if ( m_clistctrl_list.GetSelectedCount() >= 1 )
{
// there are items selected
m_cbutton_edit.EnableWindow( TRUE );
m_cbutton_delete.EnableWindow( TRUE );
}
else
{
// nope. Nothing selected
m_cbutton_edit.EnableWindow( FALSE );
m_cbutton_delete.EnableWindow( FALSE );
}
}
//--------------------------------------------------------
BOOL CBindingsDlg::FEdit( CString &sz )
{
BOOL fAnswer = FALSE;
CEditBindingDlg dlg( m_pszwMachineName );
// prepare the dialog
dlg.m_pBindingsDlg = this;
dlg.m_szBinding = sz;
// run the dialog and return if the answer is OK
if (dlg.DoModal() == IDOK)
{
fAnswer = TRUE;
sz = dlg.m_szBinding;
}
// return the answer
return fAnswer;
}
//--------------------------------------------------------
// check the local list to see if a binding is already there
BOOL CBindingsDlg::FContainsBinding( CString sz )
{
DWORD iItem, cItems;
CString szTest;
// scan all the items in the list looking for a match
cItems = m_clistctrl_list.GetItemCount();
for ( iItem = 0; iItem < cItems; iItem++ )
{
szTest = m_clistctrl_list.GetItemText(iItem, COL_RAW);
if ( sz == szTest )
return TRUE;
}
// we did not find the binding
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CBindingsDlg message handlers
//--------------------------------------------------------
void CBindingsDlg::OnAdd()
{
CString szNew;
// default the new binding to be the default
szNew = MDNAME_DEFAULT;
// edit the new string. if the answer is OK, then add it to the list
if ( FEdit(szNew) )
{
// add the binding string to the dislpay list
AddBinding( szNew );
}
// enable the buttons as appropriate
EnableButtons();
}
//--------------------------------------------------------
void CBindingsDlg::OnDelete()
{
int i = GetSelectedIndex();
// delete the item from the display list
if ( i >= 0 )
m_clistctrl_list.DeleteItem ( GetSelectedIndex() );
// enable the buttons as appropriate
EnableButtons();
}
//--------------------------------------------------------
// edit the selected item
void CBindingsDlg::OnEdit()
{
int i = GetSelectedIndex();
// delete the item from the display list
if ( i >= 0 )
{
// get the existing binding text
CString sz = m_clistctrl_list.GetItemText(i, COL_RAW);
// edit the text
if ( FEdit(sz) )
{
// if the edit worked, place the text back into the object
m_clistctrl_list.SetItemText(i, COL_RAW, sz);
// update the display portion
UpdateBindingDisplay( i, sz );
}
}
}
//--------------------------------------------------------
void CBindingsDlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
// enable the buttons as appropriate
EnableButtons();
}
//--------------------------------------------------------
void CBindingsDlg::OnOK()
{
DWORD iItem, cItems;
CString sz;
// all the validation work of the bindings is done in the binding edit
// dialog, not here. So we can just blurt out the bindings back into
// key's binding list
// clear the list
m_pKey->m_rgbszBindings.RemoveAll();
// blurt out the bindings back into the key and set the bindings changed
// flag for the key
cItems = m_clistctrl_list.GetItemCount();
for ( iItem = 0; iItem < cItems; iItem++ )
{
// get the text for the binding
sz = m_clistctrl_list.GetItemText(iItem, COL_RAW);
// if it is the default string, add the non-localized version
if ( sz == MDNAME_DEFAULT )
m_pKey->m_rgbszBindings.Add( MDNAME_DEFAULT );
else
// otherwise, add the string directly
m_pKey->m_rgbszBindings.Add( (LPCSTR)sz );
}
// we also need to remove bindings in other keys that this one has taken over
cItems = rgbRemovals.GetSize();
for ( iItem = 0; iItem < cItems; iItem++ )
{
// remove the binding
rgbRemovals[iItem]->RemoveBinding();
// delete the objects as we go
delete rgbRemovals[iItem];
}
rgbRemovals.RemoveAll();
// tell the key to update the bindings
m_pKey->m_fUpdateBindings = TRUE;
// call the parent to close the dialog
CDialog::OnOK();
}
//--------------------------------------------------------
void CBindingsDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{
// if something in the list was double clicked, edit it
if ( m_clistctrl_list.GetSelectedCount() == 1 )
OnEdit();
*pResult = 0;
}