Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/RefreshableHiveExperimentView.cs @ 6200

Last change on this file since 6200 was 6200, checked in by cneumuel, 13 years ago

#1233

  • stability improvements for HiveEngine
File size: 15.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Linq;
24using System.Threading;
25using System.Windows.Forms;
26using HeuristicLab.Clients.Hive.ExperimentManager;
27using HeuristicLab.Collections;
28using HeuristicLab.Common;
29using HeuristicLab.Core;
30using HeuristicLab.Core.Views;
31using HeuristicLab.MainForm;
32using HeuristicLab.Optimization;
33using HeuristicLab.PluginInfrastructure;
34
35namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
36  /// <summary>
37  /// The base class for visual representations of items.
38  /// </summary>
39  [View("Hive Experiment View")]
40  [Content(typeof(RefreshableHiveExperiment), true)]
41  public sealed partial class RefreshableHiveExperimentView : ItemView {
42    private ProgressView progressView;
43
44    public new RefreshableHiveExperiment Content {
45      get { return (RefreshableHiveExperiment)base.Content; }
46      set { base.Content = value; }
47    }
48
49    /// <summary>
50    /// Initializes a new instance of <see cref="ItemBaseView"/>.
51    /// </summary>
52    public RefreshableHiveExperimentView() {
53      InitializeComponent();
54    }
55
56    protected override void RegisterContentEvents() {
57      base.RegisterContentEvents();
58      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
59      Content.HiveExperimentChanged += new EventHandler(Content_HiveExperimentChanged);
60      Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
61      Content.JobStatisticsChanged += new EventHandler(Content_JobStatisticsChanged);
62    }
63
64    protected override void DeregisterContentEvents() {
65      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
66      Content.HiveExperimentChanged -= new EventHandler(Content_HiveExperimentChanged);
67      Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
68      Content.JobStatisticsChanged -= new EventHandler(Content_JobStatisticsChanged);
69      base.DeregisterContentEvents();
70    }
71
72    private void RegisterHiveExperimentEvents() {
73      Content.HiveExperiment.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
74      Content.HiveExperiment.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
75      Content.HiveExperiment.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
76      Content.HiveExperiment.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
77    }
78    private void DeregisterHiveExperimentEvents() {
79      Content.HiveExperiment.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
80      Content.HiveExperiment.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
81      Content.HiveExperiment.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
82      Content.HiveExperiment.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
83    }
84
85    private void RegisterHiveJobEvents() {
86      Content.HiveExperiment.HiveJobs.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
87      Content.HiveExperiment.HiveJobs.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
88      Content.HiveExperiment.HiveJobs.CollectionReset += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
89    }
90    private void DeregisterHiveJobEvents() {
91      Content.HiveExperiment.HiveJobs.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
92      Content.HiveExperiment.HiveJobs.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
93      Content.HiveExperiment.HiveJobs.CollectionReset -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
94    }
95
96    protected override void OnContentChanged() {
97      base.OnContentChanged();
98      if (Content == null) {
99        nameTextBox.Text = string.Empty;
100        executionTimeTextBox.Text = string.Empty;
101        resourceNamesTextBox.Text = string.Empty;
102        useLocalPluginsCheckBox.Checked = false;
103        logView.Content = null;
104        //includeJobsCheckBox.Checked = false;
105        refreshAutomaticallyCheckBox.Checked = false;
106        logView.Content = null;
107      } else {
108        nameTextBox.Text = Content.HiveExperiment.Name;
109        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
110        resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
111        useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
112        //includeJobsCheckBox.Checked = Content.IncludeJobs;
113        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
114        logView.Content = Content.Log;
115      }
116      Content_JobStatisticsChanged(this, EventArgs.Empty);
117      Content_HiveExperimentChanged(this, EventArgs.Empty);
118      Content_HiveJobChanged(this, EventArgs.Empty);
119      Content_IsProgressingChanged(this, EventArgs.Empty);
120      SetEnabledStateOfControls();
121    }
122
123    protected override void SetEnabledStateOfControls() {
124      base.SetEnabledStateOfControls();
125      executionTimeTextBox.Enabled = Content != null;
126      jobsTextBox.ReadOnly = true;
127      calculatingTextBox.ReadOnly = true;
128      finishedTextBox.ReadOnly = true;
129
130      if (Content != null) {
131        bool alreadyUploaded = Content.Id != Guid.Empty;
132        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
133
134        this.nameTextBox.ReadOnly =                 !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
135        this.resourceNamesTextBox.ReadOnly =        !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
136        this.jobsTreeView.ReadOnly =                !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
137
138        this.useLocalPluginsCheckBox.Enabled =      Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
139        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
140        this.refreshButton.Enabled =                Content.IsControllable && alreadyUploaded;
141        this.Locked =                               !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
142      }
143      SetEnabledStateOfExecutableButtons();
144    }
145
146    protected override void OnClosed(FormClosedEventArgs e) {
147      if (Content != null) {
148        if (Content.RefreshAutomatically)
149          Content.StopResultPolling();
150      }
151      base.OnClosed(e);
152    }
153
154    #region Content Events
155    private void HiveJobs_ItemsAdded_Removed_Reset(object sender, CollectionItemsChangedEventArgs<HiveJob> e) {
156      if (InvokeRequired)
157        Invoke(new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset), sender, e);
158      else {
159        SetEnabledStateOfControls();
160      }
161    }
162    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
163      if (InvokeRequired)
164        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
165      else
166        SetEnabledStateOfControls();
167    }
168    private void Content_Prepared(object sender, EventArgs e) {
169      if (InvokeRequired)
170        Invoke(new EventHandler(Content_Prepared), sender, e);
171      else {
172        nameTextBox.Enabled = true;
173        Locked = false;
174        SetEnabledStateOfControls();
175      }
176    }
177    private void Content_Started(object sender, EventArgs e) {
178      if (InvokeRequired)
179        Invoke(new EventHandler(Content_Started), sender, e);
180      else {
181        nameTextBox.Enabled = false;
182        SetEnabledStateOfControls();
183      }
184    }
185    private void Content_Paused(object sender, EventArgs e) {
186      if (InvokeRequired)
187        Invoke(new EventHandler(Content_Paused), sender, e);
188      else {
189        nameTextBox.Enabled = true;
190        SetEnabledStateOfControls();
191      }
192    }
193    private void Content_Stopped(object sender, EventArgs e) {
194      if (InvokeRequired)
195        Invoke(new EventHandler(Content_Stopped), sender, e);
196      else {
197        nameTextBox.Enabled = true;
198        Locked = false;
199        SetEnabledStateOfControls();
200      }
201    }
202    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
203      if (InvokeRequired)
204        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
205      else
206        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
207    }
208    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
209      if (InvokeRequired)
210        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
211      else {
212        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
213        SetEnabledStateOfControls();
214      }
215    }
216    private void Content_HiveJobChanged(object sender, EventArgs e) {
217      if (InvokeRequired)
218        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
219      else {
220        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
221          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
222          RegisterHiveJobEvents();
223        } else {
224          jobsTreeView.Content = null;
225        }
226        SetEnabledStateOfControls();
227      }
228    }
229
230    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
231      if (Content.HiveExperiment != null) {
232        RegisterHiveExperimentEvents();
233        Content_IsProgressingChanged(sender, e);
234      }
235    }
236    private void Content_IsControllableChanged(object sender, EventArgs e) {
237      SetEnabledStateOfControls();
238    }
239    private void Content_JobStatisticsChanged(object sender, EventArgs e) {
240      if (InvokeRequired)
241        Invoke(new EventHandler(Content_JobStatisticsChanged), sender, e);
242      else {
243        if (Content != null) {
244          jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
245          calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
246          finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
247        } else {
248          jobsTextBox.Text = "0";
249          calculatingTextBox.Text = "0";
250          finishedTextBox.Text = "0";
251        }
252      }
253    }
254    #endregion
255
256    #region Control events
257    private void startButton_Click(object sender, EventArgs e) {
258      ExperimentManagerClient.StartExperiment((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex), Content);
259    }
260    private void pauseButton_Click(object sender, EventArgs e) {
261      ExperimentManagerClient.PauseExperiment(Content.HiveExperiment);
262    }
263    private void stopButton_Click(object sender, EventArgs e) {
264      ExperimentManagerClient.StopExperiment(Content.HiveExperiment);
265    }
266    private void resetButton_Click(object sender, EventArgs e) { }
267
268    private void nameTextBox_Validated(object sender, EventArgs e) {
269      if (Content.HiveExperiment.Name != nameTextBox.Text)
270        Content.HiveExperiment.Name = nameTextBox.Text;
271    }
272
273    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
274      if (Content.HiveExperiment.ResourceNames != resourceNamesTextBox.Text)
275        Content.HiveExperiment.ResourceNames = resourceNamesTextBox.Text;
276    }
277
278    private void includeJobsCheckBox_CheckedChanged(object sender, EventArgs e) {
279      //if (Content != null) Content.IncludeJobs = includeJobsCheckBox.Checked;
280    }
281
282    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
283      if (Content != null) {
284        Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
285      }
286    }
287
288    private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
289      if (Content != null) Content.HiveExperiment.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
290    }
291
292    private void refreshButton_Click(object sender, EventArgs e) {
293      var invoker = new Action<HiveExperiment>(ExperimentManagerClient.LoadExperiment);
294      invoker.BeginInvoke(Content.HiveExperiment, (ar) => {
295        try {
296          invoker.EndInvoke(ar);
297        }
298        catch (Exception ex) {
299          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
300        }
301      }, null);
302    }
303    #endregion
304
305    #region Helpers
306    private void SetEnabledStateOfExecutableButtons() {
307      if (Content == null) {
308        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
309      } else {
310        startButton.Enabled = Content.IsControllable && Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.Count > 0 && Content.HiveExperiment.ExecutionState == ExecutionState.Prepared;
311        pauseButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
312        stopButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
313        resetButton.Enabled = false;
314      }
315    }
316    #endregion
317
318    #region Progress reporting
319    private void Content_IsProgressingChanged(object sender, EventArgs e) {
320      if (this.InvokeRequired) {
321        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
322      } else {
323        if (Content != null && Content.HiveExperiment.IsProgressing) {
324          SetProgressView();
325        } else {
326          FinishProgressView();
327        }
328      }
329    }
330
331    private void SetProgressView() {
332      if (progressView == null) {
333        progressView = new ProgressView(this, Content.HiveExperiment.Progress);
334      }
335      progressView.Progress = Content.HiveExperiment.Progress;
336    }
337
338    private void FinishProgressView() {
339      if (progressView != null) {
340        progressView.Finish();
341        progressView = null;
342        SetEnabledStateOfControls();
343      }
344    }
345    #endregion
346
347    #region Drag & Drop
348    private void jobsTreeView_DragOver(object sender, DragEventArgs e) {
349      jobsTreeView_DragEnter(sender, e);
350    }
351
352    private void jobsTreeView_DragEnter(object sender, DragEventArgs e) {
353      e.Effect = DragDropEffects.None;
354      var obj = e.Data.GetData(Constants.DragDropDataFormat);
355      if (obj is IOptimizer) {
356        e.Effect = DragDropEffects.Copy;
357      }
358    }
359
360    private void jobsTreeView_DragDrop(object sender, DragEventArgs e) {
361      if (e.Effect != DragDropEffects.None) {
362        var obj = e.Data.GetData(Constants.DragDropDataFormat);
363
364        var optimizer = obj as IOptimizer;
365        if (optimizer != null) {
366          Content.HiveExperiment.HiveJobs.Add(new OptimizerHiveJob(optimizer));
367        }
368      }
369    }
370    #endregion
371  }
372}
Note: See TracBrowser for help on using the repository browser.