source: trunk/CrypPlugins/P2PEditor/GUI/Controls/JobDisplayView.xaml.cs @ 2345

Last change on this file since 2345 was 2345, checked in by kopal, 11 years ago

jobdisplay not checked in by tortoise :/

File size: 8.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Threading;
5using System.Timers;
6using System.Windows;
7using System.Windows.Data;
8using System.Windows.Documents;
9using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Threading;
12using Cryptool.P2P;
13using Cryptool.P2PEditor.Converters;
14using Cryptool.P2PEditor.Distributed;
15using Cryptool.P2PEditor.Worker;
16using Cryptool.PluginBase;
17using Timer = System.Timers.Timer;
18
19namespace Cryptool.P2PEditor.GUI.Controls
20{
21    /// <summary>
22    /// Interaction logic for JobDisplay.xaml
23    /// </summary>
24    public partial class JobDisplay : INotifyPropertyChanged
25    {
26        public static readonly DependencyProperty JobsProperty = DependencyProperty.Register("Jobs",
27                                                                                    typeof (List<DistributedJob>),
28                                                                                    typeof (JobDisplay));
29        public ICollection<DistributedJob> Jobs
30        {
31            get { return (List<DistributedJob>)GetValue(JobsProperty); }
32            set { SetValue(JobsProperty, value); }
33        }
34
35        private Timer refreshListTimer;
36        private readonly DispatcherTimer updateJobDetailsTimer;
37        private JobListDetailsUpdateWorker updateTask;
38
39        private bool participating;
40        public bool Participating
41        {
42            get { return participating; }
43            set
44            {
45                participating = value;
46                OnPropertyChanged("Participating");
47            }
48        }
49
50        public JobDisplay()
51        {
52            InitializeComponent();
53            UpdateRefreshTimerSettings(P2PManager.IsConnected);
54
55            P2PManager.ConnectionManager.OnP2PConnectionStateChangeOccurred += P2PManager_OnP2PConnectionStateChangeOccurred;
56
57            updateJobDetailsTimer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(5)};
58            updateJobDetailsTimer.Tick += UpdateJobDetailsTimerElapsed;
59            updateJobDetailsTimer.Start();
60
61            AttachLoadingAdorner();
62        }
63
64        private void AttachLoadingAdorner()
65        {
66            var participateAdorner = new ParticipateAdorner(mainPane);
67            var bind = new Binding("Participating");
68            bind.Source = this;
69            bind.Converter = new TrueToVisibleOrCollapsedConverter();
70            participateAdorner.SetBinding(VisibilityProperty, bind);
71            AdornerLayer.GetAdornerLayer(mainPane).Add(participateAdorner);
72        }
73
74        void UpdateJobDetailsTimerElapsed(object sender, EventArgs eventArgs)
75        {
76            if (!P2PManager.IsConnected || !IsVisible) return;
77            if (updateTask != null) return;
78
79            updateTask = new JobListDetailsUpdateWorker(Jobs, JobListManager);
80            updateTask.RunWorkerCompleted += UpdateTaskRunWorkerCompleted;
81            updateTask.RunWorkerAsync();
82            P2PEditor.GuiLogMessage("Running update task.", NotificationLevel.Debug);
83        }
84
85        void UpdateTaskRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
86        {
87            updateTask = null;
88        }
89
90        void P2PManager_OnP2PConnectionStateChangeOccurred(object sender, bool newState)
91        {
92            UpdateRefreshTimerSettings(newState);
93        }
94
95        private void UpdateRefreshTimerSettings(bool isConnected)
96        {
97            if (P2PSettings.Default.DistributedJobListRefreshInterval == 0) return;
98
99            if (refreshListTimer == null)
100            {
101                refreshListTimer = new Timer(P2PSettings.Default.DistributedJobListRefreshInterval * 1000);
102                refreshListTimer.Elapsed += RefreshListTimerElapsed;
103            }
104
105            if (isConnected)
106                refreshListTimer.Start();
107            else
108                refreshListTimer.Stop();
109        }
110
111        void RefreshListTimerElapsed(object sender, ElapsedEventArgs e)
112        {
113            if (!IsVisible) return;
114            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(UpdateJobList));
115        }
116
117        private void RefreshButtonClick(object sender, RoutedEventArgs e)
118        {
119            UpdateJobList();
120        }
121
122        public void UpdateJobList()
123        {
124            if (!P2PManager.IsConnected) return;
125
126            P2PEditor.GuiLogMessage("Requesting new job list...", NotificationLevel.Debug);
127            var updateWorker = new JobListUpdateWorker(JobListManager);
128            updateWorker.RunWorkerCompleted += HandleRefreshedJobList;
129            updateWorker.RunWorkerAsync();
130        }
131
132        void HandleRefreshedJobList(object sender, RunWorkerCompletedEventArgs e)
133        {
134            var updateWorker = sender as JobListUpdateWorker;
135            if (updateWorker == null)
136            {
137                return;
138            }
139
140            P2PEditor.GuiLogMessage("Received new job list...", NotificationLevel.Debug);
141            Jobs = updateWorker.RefreshedJobList;
142
143            UpdateJobDetailsTimerElapsed(null, null);
144        }
145
146        private void ParticipateButtonClick(object sender, RoutedEventArgs e)
147        {
148            ParticipateInSelectedJob();
149        }
150
151        private void ParticipateItemHandler(object sender, MouseButtonEventArgs e)
152        {
153            ParticipateInSelectedJob();
154        }
155
156        private void ParticipateInSelectedJob()
157        {
158            var jobToParticipateIn = (DistributedJob) JobListBox.SelectedItem;
159            if (jobToParticipateIn == null) return;
160
161            Participating = true;
162
163            P2PEditor.GuiLogMessage(
164                string.Format("Preparing to participate in job {0} ({1}).", jobToParticipateIn.Name,
165                              jobToParticipateIn.Guid),
166                NotificationLevel.Info);
167            var jobParticipationWorker = new JobParticipationWorker(P2PEditor, JobListManager, jobToParticipateIn, Dispatcher);
168            jobParticipationWorker.RunWorkerCompleted +=JobParticipationWorkerRunWorkerCompleted;
169            jobParticipationWorker.RunWorkerAsync();
170        }
171
172        private void JobParticipationWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
173        {
174            Participating = false;
175        }
176
177        private void DeleteButtonClick(object sender, RoutedEventArgs e)
178        {
179            DeleteSelectedJob();
180        }
181
182        private void JobListBoxKeyUp(object sender, KeyEventArgs e)
183        {
184            switch (e.Key)
185            {
186                case Key.Enter:
187                    ParticipateInSelectedJob();
188                    break;
189                case Key.Delete:
190                    DeleteSelectedJob();
191                    break;
192            }
193           
194        }
195
196        private void DeleteSelectedJob()
197        {
198            var jobToDelete = (DistributedJob)JobListBox.SelectedItem;
199
200            if (jobToDelete == null || jobToDelete.Owner != P2PSettings.Default.PeerName) return;
201
202            P2PEditor.GuiLogMessage(
203                string.Format("Deleting job {0} ({1}).", jobToDelete.Name, jobToDelete.Guid),
204                NotificationLevel.Info);
205
206            var backgroundCreationWorker = new JobDeletionWorker(JobListManager, jobToDelete);
207            backgroundCreationWorker.RunWorkerCompleted += BackgroundDeletionWorkerCompleted;
208            backgroundCreationWorker.RunWorkerAsync();
209        }
210
211        private void BackgroundDeletionWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
212        {
213            P2PEditorPresentation.ShowActiveJobsView();
214        }
215
216        #region INotifyPropertyChanged Members
217
218        public event PropertyChangedEventHandler PropertyChanged;
219
220        private void OnPropertyChanged(string propertyName)
221        {
222            if (PropertyChanged != null)
223                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
224        }
225
226        #endregion
227
228        private void DisconnectButton_Click(object sender, RoutedEventArgs e)
229        {
230            if (P2PManager.IsConnected)
231            {
232                P2PManager.Disconnect();
233                this.P2PEditor.GuiLogMessage(Cryptool.P2PEditor.Resources.Attributes.stop_launched, NotificationLevel.Info);
234            }
235            else
236            {
237                this.P2PEditor.GuiLogMessage(Cryptool.P2PEditor.Resources.Attributes.stop_failed, NotificationLevel.Warning);
238            }
239        }
240
241        private void NewButton_Click(object sender, RoutedEventArgs e)
242        {
243            this.P2PEditorPresentation.ShowJobCreationView();
244        }
245    }
246}
Note: See TracBrowser for help on using the repository browser.