// ConnDlg.cpp : implementation file // #include "stdafx.h" #include "FrontEnd.h" #include "Connect.h" #include "StatDlg.h" #include "Server.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // TConnectionsDlg dialog TConnectionsDlg::TConnectionsDlg(CWnd* pParent /*=NULL*/) : CDialog(TConnectionsDlg::IDD, pParent) { //{{AFX_DATA_INIT(TConnectionsDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void TConnectionsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(TConnectionsDlg) DDX_Control(pDX, IDC_TREE, m_tree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(TConnectionsDlg, CDialog) //{{AFX_MSG_MAP(TConnectionsDlg) ON_WM_CLOSE() ON_WM_TIMER() ON_BN_CLICKED(IDC_UPDATE, OnUpdateNow) ON_NOTIFY(TVN_KEYDOWN, IDC_TREE, OnKeydownUsers) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // TConnectionsDlg message handlers static int add_to_tree(TConnection& rConnection, void* pJolly) { const TPrassiConnection& conn = (const TPrassiConnection&)rConnection; CTreeCtrl& tree = *(CTreeCtrl*)pJolly; for (HTREEITEM hPeer = tree.GetRootItem(); hPeer; hPeer = tree.GetNextSiblingItem(hPeer)) { if (tree.GetItemText(hPeer) == conn.PeerName()) break; } if (!hPeer) hPeer = tree.InsertItem(conn.PeerName(), 0, 0); for (HTREEITEM hUser = tree.GetChildItem(hPeer); hUser; hUser = tree.GetNextSiblingItem(hUser)) { if (tree.GetItemText(hUser) == conn.User()) break; } if (!hUser) { BOOL bNewPeer = !tree.ItemHasChildren(hPeer); hUser = tree.InsertItem(conn.User(), 1, 1, hPeer); if (bNewPeer) tree.Expand(hPeer, TVE_EXPAND); } BOOL bNewUser = !tree.ItemHasChildren(hUser); HTREEITEM hApp = tree.InsertItem(conn.Application(), 2, 2, hUser); if (hApp) tree.SetItemData(hApp, conn.Id()); if (bNewUser) tree.Expand(hUser, TVE_EXPAND); return 1; } void TConnectionsDlg::UpdateStatus() { TDongleServer& srv = GetServer(); const int nPeers = srv.Peers(); const int nUsers = srv.Users(); const int nConnections = srv.Connections(); SetDlgItemInt(IDC_PEERS, nPeers); SetDlgItemInt(IDC_USERS, nUsers); SetDlgItemInt(IDC_CONNECTIONS, nConnections); m_tree.DeleteAllItems(); srv.ForEachConnection(add_to_tree, &m_tree); } BOOL TConnectionsDlg::OnInitDialog() { CDialog::OnInitDialog(); HINSTANCE hInst = AfxGetResourceHandle(); m_Images.Create(24, 24, ILC_MASK, 3, 0); m_Images.Add(::LoadIcon(hInst, "Tree_Computer")); m_Images.Add(::LoadIcon(hInst, "Tree_User")); m_Images.Add(::LoadIcon(hInst, "Tree_Program")); m_tree.SetImageList(&m_Images,TVSIL_NORMAL); UpdateStatus(); m_nTimerId = SetTimer(1, 10000, NULL); // Ogni dieci secondi return TRUE; } void TConnectionsDlg::OnClose() { KillTimer(m_nTimerId); CDialog::OnClose(); } void TConnectionsDlg::OnTimer(UINT nIDEvent) { if (m_nTimerId == nIDEvent) { UpdateStatus(); } CDialog::OnTimer(nIDEvent); } void TConnectionsDlg::OnUpdateNow() { UpdateStatus(); } void TConnectionsDlg::OnKeydownUsers(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR; if (pTVKeyDown->wVKey == VK_DELETE) { HTREEITEM hCurrent = m_tree.GetSelectedItem(); if (hCurrent && !m_tree.ItemHasChildren(hCurrent)) { DWORD nId = m_tree.GetItemData(hCurrent); int nCode = AfxMessageBox("Confermate la chiusura della connessione?", MB_YESNO | MB_ICONQUESTION); if (nCode == IDYES) { GetServer().RemoveConnection(nId); UpdateStatus(); } } } *pResult = 0; }