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 @ 6178

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

#1233

  • added semaphores to ensure an appdomain is never unloaded when the start method has not finished
  • HiveEngine uploading and downloading of jobs works and is displayed in the view
File size: 16.0 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.ComponentModel;
24using System.Linq;
25using System.Threading;
26using System.Windows.Forms;
27using HeuristicLab.Clients.Hive.ExperimentManager;
28using HeuristicLab.Collections;
29using HeuristicLab.Common;
30using HeuristicLab.Core;
31using HeuristicLab.Core.Views;
32using HeuristicLab.MainForm;
33using HeuristicLab.Optimization;
34using HeuristicLab.PluginInfrastructure;
35
36namespace HeuristicLab.Clients.Hive.Views.ExperimentManager {
37  /// <summary>
38  /// The base class for visual representations of items.
39  /// </summary>
40  [View("Hive Experiment View")]
41  [Content(typeof(RefreshableHiveExperiment), true)]
42  public sealed partial class RefreshableHiveExperimentView : ItemView {
43    private ProgressView progressView;
44
45    public new RefreshableHiveExperiment Content {
46      get { return (RefreshableHiveExperiment)base.Content; }
47      set { base.Content = value; }
48    }
49
50    /// <summary>
51    /// Initializes a new instance of <see cref="ItemBaseView"/>.
52    /// </summary>
53    public RefreshableHiveExperimentView() {
54      InitializeComponent();
55    }
56
57    protected override void RegisterContentEvents() {
58      base.RegisterContentEvents();
59      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
60      Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
61      Content.HiveExperimentChanged += new EventHandler(Content_HiveExperimentChanged);
62      Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
63    }
64    protected override void DeregisterContentEvents() {
65      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
66      Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(Content_PropertyChanged);
67      Content.HiveExperimentChanged -= new EventHandler(Content_HiveExperimentChanged);
68      Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
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        jobsTextBox.Text = "0";
107        calculatingTextBox.Text = "0";
108        finishedTextBox.Text = "0";
109      } else {
110        nameTextBox.Text = Content.HiveExperiment.Name;
111        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
112        resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
113        useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
114        //includeJobsCheckBox.Checked = Content.IncludeJobs;
115        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
116        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
117        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
118        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
119      }
120      Content_HiveExperimentChanged(this, EventArgs.Empty);
121      Content_HiveJobChanged(this, EventArgs.Empty);
122      Content_IsProgressingChanged(this, EventArgs.Empty);
123      SetEnabledStateOfControls();
124    }
125
126    protected override void SetEnabledStateOfControls() {
127      base.SetEnabledStateOfControls();
128      executionTimeTextBox.Enabled = Content != null;
129      jobsTextBox.ReadOnly = true;
130      calculatingTextBox.ReadOnly = true;
131      finishedTextBox.ReadOnly = true;
132
133      if (Content != null) {
134        bool alreadyUploaded = Content.Id != Guid.Empty;
135        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
136
137        this.nameTextBox.ReadOnly =                 !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
138        this.resourceNamesTextBox.ReadOnly =        !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
139        this.jobsTreeView.ReadOnly =                !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
140
141        this.useLocalPluginsCheckBox.Enabled =      Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
142        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
143        this.refreshButton.Enabled =                Content.IsControllable && alreadyUploaded;
144        this.Locked =                               !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
145      }
146      SetEnabledStateOfExecutableButtons();
147    }
148
149    protected override void OnClosed(FormClosedEventArgs e) {
150      if (Content != null) {
151        if (Content.RefreshAutomatically)
152          Content.StopResultPolling();
153      }
154      base.OnClosed(e);
155    }
156
157    #region Content Events
158    private void HiveJobs_ItemsAdded_Removed_Reset(object sender, CollectionItemsChangedEventArgs<HiveJob> e) {
159      if (InvokeRequired)
160        Invoke(new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset), sender, e);
161      else {
162        SetEnabledStateOfControls();
163      }
164    }
165    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
166      if (InvokeRequired)
167        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
168      else
169        SetEnabledStateOfControls();
170    }
171    private void Content_Prepared(object sender, EventArgs e) {
172      if (InvokeRequired)
173        Invoke(new EventHandler(Content_Prepared), sender, e);
174      else {
175        nameTextBox.Enabled = true;
176        Locked = false;
177        SetEnabledStateOfControls();
178      }
179    }
180    private void Content_Started(object sender, EventArgs e) {
181      if (InvokeRequired)
182        Invoke(new EventHandler(Content_Started), sender, e);
183      else {
184        nameTextBox.Enabled = false;
185        SetEnabledStateOfControls();
186      }
187    }
188    private void Content_Paused(object sender, EventArgs e) {
189      if (InvokeRequired)
190        Invoke(new EventHandler(Content_Paused), sender, e);
191      else {
192        nameTextBox.Enabled = true;
193        SetEnabledStateOfControls();
194      }
195    }
196    private void Content_Stopped(object sender, EventArgs e) {
197      if (InvokeRequired)
198        Invoke(new EventHandler(Content_Stopped), sender, e);
199      else {
200        nameTextBox.Enabled = true;
201        Locked = false;
202        SetEnabledStateOfControls();
203      }
204    }
205    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
206      if (InvokeRequired)
207        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
208      else
209        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
210    }
211    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
212      if (InvokeRequired)
213        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
214      else {
215        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
216        SetEnabledStateOfControls();
217      }
218    }
219    private void Content_HiveJobChanged(object sender, EventArgs e) {
220      if (InvokeRequired)
221        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
222      else {
223        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
224          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
225          RegisterHiveJobEvents();
226        } else {
227          jobsTreeView.Content = null;
228        }
229        SetEnabledStateOfControls();
230      }
231    }
232
233    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
234      if (InvokeRequired)
235        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
236      else {
237        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
238        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
239        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
240      }
241    }
242
243    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
244      if (Content.HiveExperiment != null) {
245        RegisterHiveExperimentEvents();
246        Content_IsProgressingChanged(sender, e);
247      }
248    }
249    private void Content_IsControllableChanged(object sender, EventArgs e) {
250      SetEnabledStateOfControls();
251    }
252    #endregion
253
254    #region Control events
255    private void startButton_Click(object sender, EventArgs e) {
256      ExperimentManagerClient.StartExperiment(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex)), Content);
257    }
258    private void pauseButton_Click(object sender, EventArgs e) {
259      ExperimentManagerClient.PauseExperiment(Content.HiveExperiment);
260    }
261    private void stopButton_Click(object sender, EventArgs e) {
262      ExperimentManagerClient.StopExperiment(Content.HiveExperiment);
263    }
264    private void resetButton_Click(object sender, EventArgs e) { }
265
266    private void nameTextBox_Validated(object sender, EventArgs e) {
267      if (Content.HiveExperiment.Name != nameTextBox.Text)
268        Content.HiveExperiment.Name = nameTextBox.Text;
269    }
270
271    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
272      if (Content.HiveExperiment.ResourceNames != resourceNamesTextBox.Text)
273        Content.HiveExperiment.ResourceNames = resourceNamesTextBox.Text;
274    }
275
276    private void includeJobsCheckBox_CheckedChanged(object sender, EventArgs e) {
277      //if (Content != null) Content.IncludeJobs = includeJobsCheckBox.Checked;
278    }
279
280    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
281      if (Content != null) {
282        Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
283      }
284    }
285
286    private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
287      if (Content != null) Content.HiveExperiment.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
288    }
289
290    private void refreshButton_Click(object sender, EventArgs e) {
291      var invoker = new Action<HiveExperiment>(ExperimentManagerClient.LoadExperiment);
292      invoker.BeginInvoke(Content.HiveExperiment, (ar) => {
293        try {
294          invoker.EndInvoke(ar);
295        }
296        catch (Exception ex) {
297          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
298        }
299      }, null);
300    }
301    #endregion
302
303    #region Helpers
304    private void SetEnabledStateOfExecutableButtons() {
305      if (Content == null) {
306        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
307      } else {
308        startButton.Enabled = Content.IsControllable && Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.Count > 0 && Content.HiveExperiment.ExecutionState == ExecutionState.Prepared;
309        pauseButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
310        stopButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
311        resetButton.Enabled = false;
312      }
313    }
314    #endregion
315
316    #region Progress reporting
317    private void Content_IsProgressingChanged(object sender, EventArgs e) {
318      if (this.InvokeRequired) {
319        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
320      } else {
321        if (Content != null && Content.HiveExperiment.IsProgressing) {
322          SetProgressView();
323        } else {
324          FinishProgressView();
325        }
326      }
327    }
328
329    private void SetProgressView() {
330      if (progressView == null) {
331        progressView = new ProgressView(this, Content.HiveExperiment.Progress);
332      }
333      progressView.Progress = Content.HiveExperiment.Progress;
334    }
335
336    private void FinishProgressView() {
337      if (progressView != null) {
338        progressView.Finish();
339        progressView = null;
340        SetEnabledStateOfControls();
341      }
342    }
343    #endregion
344
345    #region Drag & Drop
346    private void jobsTreeView_DragOver(object sender, DragEventArgs e) {
347      jobsTreeView_DragEnter(sender, e);
348    }
349
350    private void jobsTreeView_DragEnter(object sender, DragEventArgs e) {
351      e.Effect = DragDropEffects.None;
352      var obj = e.Data.GetData(Constants.DragDropDataFormat);
353      if (obj is IOptimizer) {
354        e.Effect = DragDropEffects.Copy;
355      }
356    }
357
358    private void jobsTreeView_DragDrop(object sender, DragEventArgs e) {
359      if (e.Effect != DragDropEffects.None) {
360        var obj = e.Data.GetData(Constants.DragDropDataFormat);
361
362        var optimizer = obj as IOptimizer;
363        if (optimizer != null) {
364          Content.HiveExperiment.HiveJobs.Add(new OptimizerHiveJob(optimizer));
365        }
366      }
367    }
368    #endregion
369  }
370}
Note: See TracBrowser for help on using the repository browser.