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

Last change on this file since 1727 was 1727, checked in by Paul Lelgemann, 12 years ago

+ P2PEditor can display the status of jobs, if available; Participating displays overlay while loading workspace data
+ KeySearcher can upload status for P2PEditor display

File size: 7.9 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            ParticipateAdorner participateAdorner = new ParticipateAdorner(mainPane);
67           /* participateAdorner.FontSize = 15;
68            loading.OverlayedText = "loading...";
69            loading.Typeface = new Typeface(FontFamily, FontStyles.Italic,
70                FontWeights.Bold, FontStretch);*/
71            Binding bind = new Binding("Participating");
72            bind.Source = this;
73            bind.Converter = new TrueToVisibleOrCollapsedConverter();
74            participateAdorner.SetBinding(VisibilityProperty, bind);
75            AdornerLayer.GetAdornerLayer(mainPane).Add(participateAdorner);
76        }
77
78        void UpdateJobDetailsTimerElapsed(object sender, EventArgs eventArgs)
79        {
80            if (!P2PManager.IsConnected || !IsVisible) return;
81            if (updateTask != null) return;
82
83            updateTask = new JobListDetailsUpdateWorker(Jobs, JobListManager);
84            updateTask.RunWorkerCompleted += UpdateTaskRunWorkerCompleted;
85            updateTask.RunWorkerAsync();
86            P2PEditor.GuiLogMessage("Running update task.", NotificationLevel.Debug);
87        }
88
89        void UpdateTaskRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
90        {
91            updateTask = null;
92        }
93
94        void P2PManager_OnP2PConnectionStateChangeOccurred(object sender, bool newState)
95        {
96            UpdateRefreshTimerSettings(newState);
97        }
98
99        private void UpdateRefreshTimerSettings(bool isConnected)
100        {
101            if (P2PSettings.Default.DistributedJobListRefreshInterval == 0) return;
102
103            if (refreshListTimer == null)
104            {
105                refreshListTimer = new Timer(P2PSettings.Default.DistributedJobListRefreshInterval * 1000);
106                refreshListTimer.Elapsed += RefreshListTimerElapsed;
107            }
108
109            if (isConnected)
110                refreshListTimer.Start();
111            else
112                refreshListTimer.Stop();
113        }
114
115        void RefreshListTimerElapsed(object sender, ElapsedEventArgs e)
116        {
117            if (!IsVisible) return;
118            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(UpdateJobList));
119        }
120
121        private void RefreshButton_Click(object sender, RoutedEventArgs e)
122        {
123            UpdateJobList();
124        }
125
126        public void UpdateJobList()
127        {
128            if (!P2PManager.IsConnected) return;
129
130            P2PEditor.GuiLogMessage("Requesting new job list...", NotificationLevel.Debug);
131            var updateWorker = new JobListUpdateWorker(JobListManager);
132            updateWorker.RunWorkerCompleted += HandleRefreshedJobList;
133            updateWorker.RunWorkerAsync();
134        }
135
136        void HandleRefreshedJobList(object sender, RunWorkerCompletedEventArgs e)
137        {
138            var updateWorker = sender as JobListUpdateWorker;
139            if (updateWorker == null)
140            {
141                return;
142            }
143
144            P2PEditor.GuiLogMessage("Received new job list...", NotificationLevel.Debug);
145            Jobs = updateWorker.RefreshedJobList;
146
147            UpdateJobDetailsTimerElapsed(null, null);
148        }
149
150        private void ParticipateButton_Click(object sender, RoutedEventArgs e)
151        {
152            ParticipateInSelectedJob();
153        }
154
155        private void ParticipateItemHandler(object sender, MouseButtonEventArgs e)
156        {
157            ParticipateInSelectedJob();
158        }
159
160        private void ParticipateInSelectedJob()
161        {
162            Participating = true;
163
164            var jobToParticipateIn = (DistributedJob) JobListBox.SelectedItem;
165
166            if (jobToParticipateIn == null) return;
167
168            P2PEditor.GuiLogMessage(
169                string.Format("Preparing to participate in job {0} ({1}).", jobToParticipateIn.Name,
170                              jobToParticipateIn.Guid),
171                NotificationLevel.Info);
172            new JobParticipationWorker(P2PEditor, JobListManager, jobToParticipateIn, Dispatcher).RunWorkerAsync();
173        }
174
175        private void DeleteButton_Click(object sender, RoutedEventArgs e)
176        {
177            DeleteSelectedJob();
178        }
179
180        private void JobListBox_KeyUp(object sender, KeyEventArgs e)
181        {
182            switch (e.Key)
183            {
184                case Key.Enter:
185                    ParticipateInSelectedJob();
186                    break;
187                case Key.Delete:
188                    DeleteSelectedJob();
189                    break;
190            }
191           
192        }
193
194        private void DeleteSelectedJob()
195        {
196            var jobToDelete = (DistributedJob)JobListBox.SelectedItem;
197
198            if (jobToDelete == null || jobToDelete.Owner != P2PSettings.Default.PeerName) return;
199
200            P2PEditor.GuiLogMessage(
201                string.Format("Deleting job {0} ({1}).", jobToDelete.Name, jobToDelete.Guid),
202                NotificationLevel.Info);
203
204            var backgroundCreationWorker = new JobDeletionWorker(JobListManager, jobToDelete);
205            backgroundCreationWorker.RunWorkerCompleted += BackgroundDeletionWorkerCompleted;
206            backgroundCreationWorker.RunWorkerAsync();
207        }
208
209        private void BackgroundDeletionWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
210        {
211            P2PEditorPresentation.ShowActiveJobs();
212        }
213
214        #region INotifyPropertyChanged Members
215
216        public event PropertyChangedEventHandler PropertyChanged;
217
218        private void OnPropertyChanged(string propertyName)
219        {
220            if (PropertyChanged != null)
221                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
222        }
223
224        #endregion
225    }
226}
Note: See TracBrowser for help on using the repository browser.