コード例 #1
0
        // 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);
        }
コード例 #2
0
        // 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);
            }
        }
コード例 #3
0
        /*
         * 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);
            }
        }
コード例 #4
0
 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); }));
 }
コード例 #5
0
        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); }));
            }
        }
コード例 #6
0
        /*
         * 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;
            }
        }
コード例 #7
0
        /*
         * 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;
            }
        }
コード例 #8
0
        //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;
        }
コード例 #9
0
 /*
  * Costruttore della classe MySocketListener
  */
 public MySocketListener(MyTabItem main)
 {
     item   = main;
     Stream = item.Stream;
 }
コード例 #10
0
        /*
         * 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);
                            }
                        }