source: trunk/CrypPlugins/P2PEditor/GUI/Controls/JobDisplay.xaml.cs @ 1917

Last change on this file since 1917 was 1917, checked in by Paul Lelgemann, 11 years ago

o KeySearcher: fixed "+unendlich years" as estimated finish date display bug
o P2PEditor: fixed behavior of new button without p2p connection and participate button with not job selected
o P2PEditor: minor refactoring, removed unused code and classes

File size: 7.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            new JobParticipationWorker(P2PEditor, JobListManager, jobToParticipateIn, Dispatcher).RunWorkerAsync();
168        }
169
170        private void DeleteButtonClick(object sender, RoutedEventArgs e)
171        {
172            DeleteSelectedJob();
173        }
174
175        private void JobListBoxKeyUp(object sender, KeyEventArgs e)
176        {
177            switch (e.Key)
178            {
179                case Key.Enter:
180                    ParticipateInSelectedJob();
181                    break;
182                case Key.Delete:
183                    DeleteSelectedJob();
184                    break;
185            }
186           
187        }
188
189        private void DeleteSelectedJob()
190        {
191            var jobToDelete = (DistributedJob)JobListBox.SelectedItem;
192
193            if (jobToDelete == null || jobToDelete.Owner != P2PSettings.Default.PeerName) return;
194
195            P2PEditor.GuiLogMessage(
196                string.Format("Deleting job {0} ({1}).", jobToDelete.Name, jobToDelete.Guid),
197                NotificationLevel.Info);
198
199            var backgroundCreationWorker = new JobDeletionWorker(JobListManager, jobToDelete);
200            backgroundCreationWorker.RunWorkerCompleted += BackgroundDeletionWorkerCompleted;
201            backgroundCreationWorker.RunWorkerAsync();
202        }
203
204        private void BackgroundDeletionWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
205        {
206            P2PEditorPresentation.ShowActiveJobs();
207        }
208
209        #region INotifyPropertyChanged Members
210
211        public event PropertyChangedEventHandler PropertyChanged;
212
213        private void OnPropertyChanged(string propertyName)
214        {
215            if (PropertyChanged != null)
216                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
217        }
218
219        #endregion
220    }
221}
Note: See TracBrowser for help on using the repository browser.