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

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

#1233

  • small fixes for HiveEngine
File size: 16.1 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        logView.Content = null;
110      } else {
111        nameTextBox.Text = Content.HiveExperiment.Name;
112        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
113        resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
114        useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
115        //includeJobsCheckBox.Checked = Content.IncludeJobs;
116        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
117        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
118        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
119        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
120        logView.Content = Content.Log;
121      }
122      Content_HiveExperimentChanged(this, EventArgs.Empty);
123      Content_HiveJobChanged(this, EventArgs.Empty);
124      Content_IsProgressingChanged(this, EventArgs.Empty);
125      SetEnabledStateOfControls();
126    }
127
128    protected override void SetEnabledStateOfControls() {
129      base.SetEnabledStateOfControls();
130      executionTimeTextBox.Enabled = Content != null;
131      jobsTextBox.ReadOnly = true;
132      calculatingTextBox.ReadOnly = true;
133      finishedTextBox.ReadOnly = true;
134
135      if (Content != null) {
136        bool alreadyUploaded = Content.Id != Guid.Empty;
137        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
138
139        this.nameTextBox.ReadOnly =                 !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
140        this.resourceNamesTextBox.ReadOnly =        !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
141        this.jobsTreeView.ReadOnly =                !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
142
143        this.useLocalPluginsCheckBox.Enabled =      Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
144        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
145        this.refreshButton.Enabled =                Content.IsControllable && alreadyUploaded;
146        this.Locked =                               !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
147      }
148      SetEnabledStateOfExecutableButtons();
149    }
150
151    protected override void OnClosed(FormClosedEventArgs e) {
152      if (Content != null) {
153        if (Content.RefreshAutomatically)
154          Content.StopResultPolling();
155      }
156      base.OnClosed(e);
157    }
158
159    #region Content Events
160    private void HiveJobs_ItemsAdded_Removed_Reset(object sender, CollectionItemsChangedEventArgs<HiveJob> e) {
161      if (InvokeRequired)
162        Invoke(new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset), sender, e);
163      else {
164        SetEnabledStateOfControls();
165      }
166    }
167    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
168      if (InvokeRequired)
169        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
170      else
171        SetEnabledStateOfControls();
172    }
173    private void Content_Prepared(object sender, EventArgs e) {
174      if (InvokeRequired)
175        Invoke(new EventHandler(Content_Prepared), sender, e);
176      else {
177        nameTextBox.Enabled = true;
178        Locked = false;
179        SetEnabledStateOfControls();
180      }
181    }
182    private void Content_Started(object sender, EventArgs e) {
183      if (InvokeRequired)
184        Invoke(new EventHandler(Content_Started), sender, e);
185      else {
186        nameTextBox.Enabled = false;
187        SetEnabledStateOfControls();
188      }
189    }
190    private void Content_Paused(object sender, EventArgs e) {
191      if (InvokeRequired)
192        Invoke(new EventHandler(Content_Paused), sender, e);
193      else {
194        nameTextBox.Enabled = true;
195        SetEnabledStateOfControls();
196      }
197    }
198    private void Content_Stopped(object sender, EventArgs e) {
199      if (InvokeRequired)
200        Invoke(new EventHandler(Content_Stopped), sender, e);
201      else {
202        nameTextBox.Enabled = true;
203        Locked = false;
204        SetEnabledStateOfControls();
205      }
206    }
207    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
208      if (InvokeRequired)
209        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
210      else
211        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
212    }
213    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
214      if (InvokeRequired)
215        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
216      else {
217        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
218        SetEnabledStateOfControls();
219      }
220    }
221    private void Content_HiveJobChanged(object sender, EventArgs e) {
222      if (InvokeRequired)
223        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
224      else {
225        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
226          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
227          RegisterHiveJobEvents();
228        } else {
229          jobsTreeView.Content = null;
230        }
231        SetEnabledStateOfControls();
232      }
233    }
234
235    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
236      if (InvokeRequired)
237        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
238      else {
239        jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
240        calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
241        finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
242      }
243    }
244
245    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
246      if (Content.HiveExperiment != null) {
247        RegisterHiveExperimentEvents();
248        Content_IsProgressingChanged(sender, e);
249      }
250    }
251    private void Content_IsControllableChanged(object sender, EventArgs e) {
252      SetEnabledStateOfControls();
253    }
254    #endregion
255
256    #region Control events
257    private void startButton_Click(object sender, EventArgs e) {
258      ExperimentManagerClient.StartExperiment(new Action<Exception>((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.