376 lines
9.1 KiB
C++
376 lines
9.1 KiB
C++
// 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;
|
|
}
|