// Costruttore della classe MyTabManagement public MyTabManagement(MyTabItem MTI) { InitializeComponent(); MyTab = MTI; // Ogni TabManager si iscrive all'evento di chiusura della mainwindow MyTab.MainWndw.ClosingEvent += ServerTabClose; // Si impostano i timestamp iniziali all'istante corrente MyTabBirth = 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); }
// Funzione che chiude un singolo tab nel caso si preme Disconnetti public void CloseTab(MyTabItem tab) { // Caso in cui il tab da chiudere sia l'ultimo attivo: chiusura dell'intera finestra if (TabItemList.Count == 1) { this.Close(); return; } MyTabManagement servertab = tab.TabManager; // In caso di chiusura della main window, la funzione di chiusura di questo tab non andrà più eseguita dal delegato ClosingEvent -= servertab.ServerTabClose; // Chiusura del tab servertab.ServerTabClose(); // Rimozione di questo tab dalla lista dei tab dei server TabItemList.Remove(tab); // Rimozione dei questa connessione dalla lista di connessioni attive ActiveConnectionsIPList.Remove(tab.TabServerIP); //rimuove dalla list box l'app in focus della tab in chiusura int index = AppsInFocus.IndexOf(new AppInFocus(tab.AppInFocus)); if (index != -1) { AppsInFocus.RemoveAt(index); } }
/* * Metodo invocato al click dell'opzione "Disconnetti" * Chiude la tab visualizzata */ private void disconnect_Click(object sender, RoutedEventArgs e) { MyTabItem selected = tabControl.SelectedContent as MyTabItem; if (selected != null) { CloseTab(selected.ContainerTab); } }
static public void ReceiveConnectionError(MyTabItem item) { MessageBox.Show("Errore di connessione.", "Attenzione", MessageBoxButton.OK, MessageBoxImage.Warning); if (item.ContainerTab.MainWindow.tabItems.Count == 1) { item.ContainerTab.MainWindow.error = true; // Per evitare di eseguire il codice di Window_closing } item.ContainerTab.MainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { item.ContainerTab.MainWindow.CloseTab(item.ContainerTab); })); }
static public void SendError(MyTabItem item) { MessageBoxResult res = MessageBox.Show("Impossibile inviare il comando, vuoi chiudere la connessione a " + item.ContainerTab.Header as String + "?", "Attenzione", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (res == MessageBoxResult.Yes) { item.ContainerTab.MainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => { item.ContainerTab.MainWindow.CloseTab(item.ContainerTab); })); } }
/* * Metodo per creare una nuova Tab e aggiungerla a quelle visualizzate */ public void addTab(TcpClient client, NetworkStream stream, String indirizzo) { InteractiveTabItem first = new InteractiveTabItem(this); MyTabItem tab = new MyTabItem(first); first.TabElement = tab; // Impostazione header Tab con l'indirizzo IP first.NewHeader = first.RemoteHost = indirizzo; // Se l'indirizzo è di loopback, viene visualizzato nell'header if (indirizzo.StartsWith("127.")) { first.NewHeader = "Loopback"; } else { // Tentativo di risoluzione del nome host Dns.BeginGetHostEntry(indirizzo, new AsyncCallback((IAsyncResult ar) => { try { // Se la risoluzione è riuscita, il nome host viene visualizzato nell'header string hostName = Dns.EndGetHostEntry(ar).HostName; this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { first.NewHeader = hostName; })); } catch (SocketException) { // Se non viene trovato un nome host, la tab mantiene l'indirizzo come header Console.WriteLine("Server {0}: Nessun nome host trovato", indirizzo); } }), null); } tab.Connection = client; tab.Stream = stream; tab.startWork(); first.Content = tab; // Aggiunta della Tab tra quelle visualizzate tabItems.Add(first); // Viene evidenziata l'ultima tab creata tabControl.SelectedIndex = tabItems.Count - 1; // Nel caso ci siano più tab, attiviamo la scelta dell'app in foreground tramite checkbox if (tabItems.Count > 1) { foregroundBox.IsEnabled = true; } }
/* * Metodo che chiude in maniera corretta una Tab */ public void CloseTab(InteractiveTabItem tab) { // Chiusura della mainWindow se non ci sono più tab (richiamo window_close) if (tabItems.Count == 1) { this.Close(); return; } // Rimozione della Tab MyTabItem mytab = tab.TabElement; ClosingEvent -= mytab.atClosingTime; mytab.atClosingTime(); tabItems.Remove(tab); connessioni_attive.Remove(tab.RemoteHost); // Nel caso sia rimasta una sola tab, disattiviamo la scelta dell'app in foreground if (tabItems.Count == 1) { foregroundBox.IsEnabled = false; } }
//Funzione che crea un nuovo tab public void NewTab(TcpClient client, NetworkStream stream, String address) { MyTabItem tab = new MyTabItem(this); MyTabManagement s = new MyTabManagement(tab); //assegno la proprietà Header(ereditata da TabItem) e la proprietà "copia" interna di MyTabItem tab.Header = tab.TabServerIP = address; s.Connection = client; s.Stream = stream; s.StartServerDataExchange(); //assegno la proprietà Content(ereditata da TabItem) e la proprietà "copia" interna di MyTabItem tab.Content = tab.TabManager = s; // Aggiunta del nuovo tab alla lista TabItemList.Add(tab); // Evidenziazione dell'ultimo tab creato ServerTabControl.SelectedIndex = TabItemList.Count - 1; }
/* * Costruttore della classe MySocketListener */ public MySocketListener(MyTabItem main) { item = main; Stream = item.Stream; }
/* * Metodo eseguito allo scatenarsi dell'evento PreviewKeyDown * Cattura e registra i modificatori che vengono premuti * Cattura e invia i tasti che vengono premuti */ private void Client_PreviewKeyDown(object sender, KeyEventArgs e) { // Il tasto ALT è un tasto di sistema Key key = (e.Key == Key.System ? e.SystemKey : e.Key); // Switch per gestire la pressione dei modificatori switch (key) { case Key.LeftShift: case Key.RightShift: modifier = modifier | command_t.shift; shiftRect.Fill = new SolidColorBrush(Colors.DeepSkyBlue); e.Handled = true; break; case Key.LeftCtrl: case Key.RightCtrl: modifier = modifier | command_t.ctrl; ctrlRect.Fill = new SolidColorBrush(Colors.DeepSkyBlue); e.Handled = true; break; case Key.LeftAlt: case Key.RightAlt: modifier = modifier | command_t.alt; altRect.Fill = new SolidColorBrush(Colors.DeepSkyBlue); e.Handled = true; break; default: break; } // Se l'evento non è stato gestito, si procede all'invio del tasto premuto if (!e.Handled) { // Preparazione dei dati da inviare int convertedKey = KeyInterop.VirtualKeyFromKey(key); byte[] buffer = new byte[1 + sizeof(int)]; buffer[0] = (byte)modifier; BitConverter.GetBytes(IPAddress.HostToNetworkOrder(convertedKey)).CopyTo(buffer, 1); // Ottenimento dell'app in foreground a cui vogliamo inviare i comandi ForegroundApp focusedApp = foregroundBox.SelectedItem as ForegroundApp; if (focusedApp == null) { e.Handled = true; return; } // Ricerca dei tab aventi quest'app in foreground foreach (InteractiveTabItem tab in tabItems) { if (tab.foregroundApp == focusedApp.Name) { MyTabItem myTab = tab.Content as MyTabItem; if (myTab != null) { // Invio asincrono dei dati try { myTab.Stream.BeginWrite(buffer, 0, 1 + sizeof(int), new AsyncCallback(SendToServer), myTab); } catch (IOException) { ExceptionHandler.SendError(myTab); } }