|
|
// 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; }
|