/// <summary> /// Costruttore della classe ServerTabManagement /// </summary> /// <param name="DTI"> Tab Item del server al quale è associato l'oggetto corrente </param> public ServerTabManagement(DynamicTabItem DTI) { InitializeComponent(); ServerTab = DTI; // Ogni ServerTab si iscrive all'evento di chiusura della mainwindow ServerTab.MainWndw.ClosingEvent += ServerTabClose; // Si impostano i timestamp iniziali all'istante corrente ServerTabBirth = LastPercentageUpdate = DateTime.Now; // La percentuale viene aggiornata ogni 1000 ms PercentageRefreshTimer = new System.Timers.Timer(1000); // Impostiamo il timer come ricorsivo: al termine dei 1000 ms riparte da zero e ricomincia PercentageRefreshTimer.AutoReset = true; // Allo scadere del timer, si lancia la funzione di aggiornamento della percentuale (PercentageRefresh) PercentageRefreshTimer.Elapsed += (obj, e) => { Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { PercentageRefresh(); })); }; // Inizializzazione della lista di applicazioni (inizialmente vuota) Applications = new ObservableCollection <AppItem>(); // Associazione della lista delle applicazioni all'elemento WPF Applist Applist.ItemsSource = Applications; // Abilitazione dell'accesso alla lista da parte di più thread BindingOperations.EnableCollectionSynchronization(Applications, Applications); }
/// <summary> /// Funzione che chiude un singolo tab /// </summary> /// <param name="tab">Riferimento al tab da chiudere</param> public void CloseTab(DynamicTabItem tab) { // Caso in cui il tab da chiudere sia l'ultimo attivo: chiusura dell'intera finestra if (ServerTabs.Count == 1) { this.Close(); return; } ServerTabManagement servertab = tab.ServerTab; // In caso di chiusura della main window, la funzione di chiusura di questo tab non andrà più eseguita ClosingEvent -= servertab.ServerTabClose; // Chiusura del tab servertab.ServerTabClose(); // Rimozione di questo tab dalla lista dei tab dei server ServerTabs.Remove(tab); // Rimozione dei questa connessione dalla lista di connessioni attive ActiveConnections.Remove(tab.RemoteHost); if (ServerTabs.Count == 1) { ForegroundAppsBox.IsEnabled = false; } }
/// <summary> /// Funzione che crea un nuovo tab /// </summary> /// <param name="client"></param> /// <param name="stream"></param> /// <param name="address"></param> public void NewTab(TcpClient client, NetworkStream stream, String address) { DynamicTabItem tab = new DynamicTabItem(this); ServerTabManagement s = new ServerTabManagement(tab); tab.ServerTab = s; // Il titolo del nuovo tab ed il suo host remoto corrispondono all'indirizzo del server tab.DynamicHeader = tab.RemoteHost = address; if (address.StartsWith("127.")) { tab.DynamicHeader = "Loopback"; } else { Dns.BeginGetHostEntry(address, new AsyncCallback((IAsyncResult ar) => { try { string host = Dns.EndGetHostEntry(ar).HostName; this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { tab.DynamicHeader = host; })); } catch (SocketException) { Console.WriteLine("Server {0}: Nessun host trovato", address); } }), null); } s.Connection = client; s.Stream = stream; s.StartServerDataExchange(); tab.Content = s; // Aggiunta del nuovo tab alla lista ServerTabs.Add(tab); // Evidenziazione dell'ultimo tab creato ServerTabControl.SelectedIndex = ServerTabs.Count - 1; if (ServerTabs.Count > 1) { ForegroundAppsBox.IsEnabled = true; } }