Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Clients.Hive.JobManager/3.3/Views/RefreshableHiveJobView.cs @ 8159

Last change on this file since 8159 was 8159, checked in by ascheibe, 12 years ago

#1762 removed blind disabling of controls

File size: 24.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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.Text;
26using System.Threading;
27using System.Threading.Tasks;
28using System.Windows.Forms;
29using HeuristicLab.Collections;
30using HeuristicLab.Common;
31using HeuristicLab.Core;
32using HeuristicLab.MainForm;
33using HeuristicLab.MainForm.WindowsForms;
34using HeuristicLab.Optimization;
35using HeuristicLab.PluginInfrastructure;
36
37namespace HeuristicLab.Clients.Hive.JobManager.Views {
38  /// <summary>
39  /// The base class for visual representations of items.
40  /// </summary>
41  [View("Hive Job View")]
42  [Content(typeof(RefreshableJob), true)]
43  public partial class RefreshableHiveJobView : HeuristicLab.Core.Views.ItemView {
44    private ProgressView progressView;
45    private HiveResourceSelectorDialog hiveResourceSelectorDialog;
46
47    public new RefreshableJob Content {
48      get { return (RefreshableJob)base.Content; }
49      set { base.Content = value; }
50    }
51
52    /// <summary>
53    /// Initializes a new instance of <see cref="ItemBaseView"/>.
54    /// </summary>
55    public RefreshableHiveJobView() {
56      InitializeComponent();
57      progressView = new ProgressView(this);
58    }
59
60    protected override void RegisterContentEvents() {
61      base.RegisterContentEvents();
62      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
63      Content.JobChanged += new EventHandler(Content_HiveExperimentChanged);
64      Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
65      Content.JobStatisticsChanged += new EventHandler(Content_JobStatisticsChanged);
66      Content.ExceptionOccured += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
67      Content.StateLogListChanged += new EventHandler(Content_StateLogListChanged);
68      Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
69      Content.HiveTasksChanged += new EventHandler(Content_HiveTasksChanged);
70      Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
71      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
72      Content.IsAllowedPrivilegedChanged += new EventHandler(Content_IsAllowedPrivilegedChanged);
73      Content.Loaded += new EventHandler(Content_Loaded);
74      Content.TaskReceived += new EventHandler(Content_TaskReceived);
75    }
76
77    protected override void DeregisterContentEvents() {
78      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
79      Content.JobChanged -= new EventHandler(Content_HiveExperimentChanged);
80      Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
81      Content.JobStatisticsChanged -= new EventHandler(Content_JobStatisticsChanged);
82      Content.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
83      Content.StateLogListChanged -= new EventHandler(Content_StateLogListChanged);
84      Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
85      Content.HiveTasksChanged -= new EventHandler(Content_HiveTasksChanged);
86      Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
87      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
88      Content.Loaded -= new EventHandler(Content_Loaded);
89      Content.TaskReceived -= new EventHandler(Content_TaskReceived);
90      base.DeregisterContentEvents();
91    }
92
93    private void RegisterHiveExperimentEvents() {
94      Content.Job.PropertyChanged += new PropertyChangedEventHandler(HiveExperiment_PropertyChanged);
95    }
96
97    private void DeregisterHiveExperimentEvents() {
98      Content.Job.PropertyChanged -= new PropertyChangedEventHandler(HiveExperiment_PropertyChanged);
99    }
100
101    private void RegisterHiveJobEvents() {
102      Content.HiveTasks.ItemsAdded += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsAdded);
103      Content.HiveTasks.ItemsRemoved += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsRemoved);
104      Content.HiveTasks.CollectionReset += new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_CollectionReset);
105    }
106    private void DeregisterHiveJobEvents() {
107      Content.HiveTasks.ItemsAdded -= new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsAdded);
108      Content.HiveTasks.ItemsRemoved -= new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsRemoved);
109      Content.HiveTasks.CollectionReset -= new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_CollectionReset);
110    }
111
112    protected override void OnContentChanged() {
113      base.OnContentChanged();
114      if (Content == null) {
115        nameTextBox.Text = string.Empty;
116        executionTimeTextBox.Text = string.Empty;
117        resourceNamesTextBox.Text = string.Empty;
118        isPrivilegedCheckBox.Checked = false;
119        logView.Content = null;
120        refreshAutomaticallyCheckBox.Checked = false;
121        runCollectionViewHost.Content = null;
122      } else {
123        nameTextBox.Text = Content.Job.Name;
124        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
125        resourceNamesTextBox.Text = Content.Job.ResourceNames;
126        isPrivilegedCheckBox.Checked = Content.Job.IsPrivileged;
127        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
128        logView.Content = Content.Log;
129        runCollectionViewHost.Content = GetAllRunsFromJob(Content);
130      }
131      hiveExperimentPermissionListView.Content = null; // has to be filled by refresh button
132      Content_JobStatisticsChanged(this, EventArgs.Empty);
133      Content_HiveExperimentChanged(this, EventArgs.Empty);
134      Content_HiveTasksChanged(this, EventArgs.Empty);
135      Content_IsProgressingChanged(this, EventArgs.Empty);
136      Content_StateLogListChanged(this, EventArgs.Empty);
137      HiveExperiment_PropertyChanged(this, new PropertyChangedEventArgs("Id"));
138      SetEnabledStateOfControls();
139    }
140
141    protected override void SetEnabledStateOfControls() {
142      base.SetEnabledStateOfControls();
143      executionTimeTextBox.Enabled = Content != null;
144      jobsTextBox.ReadOnly = true;
145      calculatingTextBox.ReadOnly = true;
146      finishedTextBox.ReadOnly = true;
147
148      if (Content != null) {
149        bool alreadyUploaded = Content.Id != Guid.Empty;
150        bool jobsLoaded = Content.HiveTasks != null && Content.HiveTasks.All(x => x.Task.Id != Guid.Empty);
151        tabControl.Enabled = !Content.IsProgressing;
152
153        this.nameTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
154        this.resourceNamesTextBox.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
155        this.searchButton.Enabled = (Content.IsControllable && !(Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded)) || !Content.IsProgressing;
156        this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded || Content.IsProgressing;
157
158        this.isPrivilegedCheckBox.Enabled = Content.IsAllowedPrivileged && Content.IsControllable && !(Content.ExecutionState != ExecutionState.Prepared || alreadyUploaded) && !Content.IsProgressing;
159        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
160        this.refreshButton.Enabled = Content.IsDownloadable && alreadyUploaded && !Content.IsProgressing;
161        this.Locked = !Content.IsControllable || Content.ExecutionState == ExecutionState.Started || Content.IsProgressing;
162      }
163      SetEnabledStateOfExecutableButtons();
164      tabControl_SelectedIndexChanged(this, EventArgs.Empty); // ensure sharing tabpage is disabled
165    }
166
167    protected override void OnClosed(FormClosedEventArgs e) {
168      if (Content != null) {
169        if (Content.RefreshAutomatically)
170          Content.StopResultPolling();
171      }
172      base.OnClosed(e);
173    }
174
175    #region Content Events
176    void Content_TaskReceived(object sender, EventArgs e) {
177      runCollectionViewHost.Content = GetAllRunsFromJob(Content);
178    }
179
180    private void HiveTasks_ItemsAdded(object sender, CollectionItemsChangedEventArgs<HiveTask> e) {
181      if (InvokeRequired)
182        Invoke(new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsAdded), sender, e);
183      else {
184        SetEnabledStateOfControls();
185      }
186    }
187
188    private void HiveTasks_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<HiveTask> e) {
189      if (InvokeRequired)
190        Invoke(new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_ItemsRemoved), sender, e);
191      else {
192        SetEnabledStateOfControls();
193      }
194    }
195
196    private void HiveTasks_CollectionReset(object sender, CollectionItemsChangedEventArgs<HiveTask> e) {
197      if (InvokeRequired)
198        Invoke(new CollectionItemsChangedEventHandler<HiveTask>(HiveTasks_CollectionReset), sender, e);
199      else {
200        SetEnabledStateOfControls();
201      }
202    }
203
204    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
205      if (InvokeRequired)
206        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
207      else
208        SetEnabledStateOfControls();
209    }
210    private void Content_Prepared(object sender, EventArgs e) {
211      if (InvokeRequired)
212        Invoke(new EventHandler(Content_Prepared), sender, e);
213      else {
214        nameTextBox.Enabled = true;
215        Locked = false;
216        SetEnabledStateOfControls();
217      }
218    }
219    private void Content_Started(object sender, EventArgs e) {
220      if (InvokeRequired)
221        Invoke(new EventHandler(Content_Started), sender, e);
222      else {
223        nameTextBox.Enabled = false;
224        SetEnabledStateOfControls();
225      }
226    }
227    private void Content_Paused(object sender, EventArgs e) {
228      if (InvokeRequired)
229        Invoke(new EventHandler(Content_Paused), sender, e);
230      else {
231        nameTextBox.Enabled = true;
232        SetEnabledStateOfControls();
233      }
234    }
235    private void Content_Stopped(object sender, EventArgs e) {
236      if (InvokeRequired)
237        Invoke(new EventHandler(Content_Stopped), sender, e);
238      else {
239        nameTextBox.Enabled = true;
240        Locked = false;
241        SetEnabledStateOfControls();
242      }
243    }
244    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
245      if (InvokeRequired)
246        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
247      else
248        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
249    }
250    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
251      if (InvokeRequired)
252        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
253      else {
254        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
255        SetEnabledStateOfControls();
256      }
257    }
258    private void Content_HiveTasksChanged(object sender, EventArgs e) {
259      if (InvokeRequired)
260        Invoke(new EventHandler(Content_HiveTasksChanged), sender, e);
261      else {
262        if (Content != null && Content.HiveTasks != null) {
263          jobsTreeView.Content = Content.HiveTasks;
264          RegisterHiveJobEvents();
265        } else {
266          jobsTreeView.Content = null;
267        }
268        SetEnabledStateOfControls();
269      }
270    }
271
272    void Content_Loaded(object sender, EventArgs e) {
273      runCollectionViewHost.Content = GetAllRunsFromJob(Content);
274    }
275
276    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
277      if (Content != null && Content.Job != null) {
278        RegisterHiveExperimentEvents();
279        Content_IsProgressingChanged(sender, e);
280      }
281    }
282    private void Content_IsControllableChanged(object sender, EventArgs e) {
283      SetEnabledStateOfControls();
284    }
285    private void Content_JobStatisticsChanged(object sender, EventArgs e) {
286      if (InvokeRequired)
287        Invoke(new EventHandler(Content_JobStatisticsChanged), sender, e);
288      else {
289        if (Content != null) {
290          jobsTextBox.Text = (Content.Job.JobCount - Content.Job.CalculatingCount - Content.Job.FinishedCount).ToString();
291          calculatingTextBox.Text = Content.Job.CalculatingCount.ToString();
292          finishedTextBox.Text = Content.Job.FinishedCount.ToString();
293        } else {
294          jobsTextBox.Text = "0";
295          calculatingTextBox.Text = "0";
296          finishedTextBox.Text = "0";
297        }
298      }
299    }
300    private void Content_ExceptionOccured(object sender, EventArgs<Exception> e) {
301      if (InvokeRequired)
302        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured), sender, e);
303      else {
304        //don't show the error dialog when downloading tasks, the HiveClient will throw an exception and the dialog will be shown then
305        if (sender.GetType() != typeof(ConcurrentTaskDownloader<ItemTask>) && sender.GetType() != typeof(TaskDownloader)) {
306          ErrorHandling.ShowErrorDialog(this, e.Value);
307        }
308      }
309    }
310    private void Content_StateLogListChanged(object sender, EventArgs e) {
311      if (InvokeRequired)
312        Invoke(new EventHandler(Content_StateLogListChanged), sender, e);
313      else {
314        UpdateStateLogList();
315      }
316    }
317    private void Content_IsAllowedPrivilegedChanged(object sender, EventArgs e) {
318      if (InvokeRequired)
319        Invoke(new EventHandler(Content_IsAllowedPrivilegedChanged), sender, e);
320      else {
321        SetEnabledStateOfControls();
322      }
323    }
324
325    private void UpdateStateLogList() {
326      if (Content != null && this.Content.Job != null) {
327        stateLogViewHost.Content = this.Content.StateLogList;
328      } else {
329        stateLogViewHost.Content = null;
330      }
331    }
332
333    private void HiveExperiment_PropertyChanged(object sender, PropertyChangedEventArgs e) {
334      if (this.Content != null && e.PropertyName == "Id") this.hiveExperimentPermissionListView.HiveExperimentId = this.Content.Job.Id;
335    }
336    #endregion
337
338    #region Control events
339    private void searchButton_Click(object sender, EventArgs e) {
340      if (hiveResourceSelectorDialog == null)
341        hiveResourceSelectorDialog = new HiveResourceSelectorDialog();
342      if (hiveResourceSelectorDialog.ShowDialog(this) == DialogResult.OK) {
343        StringBuilder sb = new StringBuilder();
344        foreach (Resource resource in hiveResourceSelectorDialog.GetSelectedResources()) {
345          sb.Append(resource.Name);
346          sb.Append(";");
347        }
348        resourceNamesTextBox.Text = sb.ToString();
349      }
350    }
351
352    private void startButton_Click(object sender, EventArgs e) {
353      if (nameTextBox.Text.Trim() == string.Empty) {
354        MessageBox.Show("Please enter a name for the job before uploading it!", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Information);
355      } else if (Content.ExecutionState == ExecutionState.Paused) {
356        var task = System.Threading.Tasks.Task.Factory.StartNew(ResumeJobAsync, Content);
357        task.ContinueWith((t) => {
358          FinishProgressView();
359          MessageBox.Show("An error occured resuming the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
360          Content.Log.LogException(t.Exception);
361        }, TaskContinuationOptions.OnlyOnFaulted);
362      } else {
363        HiveClient.StartJob((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex), Content, new CancellationToken());
364      }
365    }
366
367    private void pauseButton_Click(object sender, EventArgs e) {
368      var task = System.Threading.Tasks.Task.Factory.StartNew(PauseJobAsync, Content);
369      task.ContinueWith((t) => {
370        FinishProgressView();
371        MessageBox.Show("An error occured pausing the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
372        Content.Log.LogException(t.Exception);
373      }, TaskContinuationOptions.OnlyOnFaulted);
374    }
375
376    private void stopButton_Click(object sender, EventArgs e) {
377      var task = System.Threading.Tasks.Task.Factory.StartNew(StopJobAsync, Content);
378      task.ContinueWith((t) => {
379        FinishProgressView();
380        MessageBox.Show("An error occured stopping the job. See the log for more information.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Error);
381        Content.Log.LogException(t.Exception);
382      }, TaskContinuationOptions.OnlyOnFaulted);
383    }
384    private void resetButton_Click(object sender, EventArgs e) { }
385
386    private void PauseJobAsync(object job) {
387      IProgress prog = new Progress();
388      prog.Status = "Pausing job...";
389      SetProgressView(prog);
390      HiveClient.PauseJob((RefreshableJob)job);
391      FinishProgressView();
392    }
393
394    private void StopJobAsync(object job) {
395      IProgress prog = new Progress();
396      prog.Status = "Stopping job...";
397      SetProgressView(prog);
398      HiveClient.StopJob((RefreshableJob)job);
399      FinishProgressView();
400    }
401
402    private void ResumeJobAsync(object job) {
403      IProgress prog = new Progress();
404      prog.Status = "Resuming job...";
405      SetProgressView(prog);
406      HiveClient.ResumeJob((RefreshableJob)job);
407      FinishProgressView();
408    }
409
410    private void nameTextBox_Validated(object sender, EventArgs e) {
411      if (Content.Job.Name != nameTextBox.Text)
412        Content.Job.Name = nameTextBox.Text;
413    }
414
415    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
416      if (Content.Job.ResourceNames != resourceNamesTextBox.Text)
417        Content.Job.ResourceNames = resourceNamesTextBox.Text;
418    }
419
420    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
421      if (Content != null) Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
422    }
423
424    private void isPrivilegedCheckBox_Validated(object sender, EventArgs e) {
425      if (Content != null) Content.Job.IsPrivileged = isPrivilegedCheckBox.Checked;
426    }
427
428    private void refreshButton_Click(object sender, EventArgs e) {
429      var invoker = new Action<RefreshableJob>(HiveClient.LoadJob);
430      invoker.BeginInvoke(Content, (ar) => {
431        try {
432          invoker.EndInvoke(ar);
433        }
434        catch (Exception ex) {
435          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
436        }
437      }, null);
438    }
439
440    private void refreshPermissionsButton_Click(object sender, EventArgs e) {
441      if (this.Content.Job.Id == Guid.Empty) {
442        MessageBox.Show("You have to upload the Job first before you can share it.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Information);
443      } else {
444        hiveExperimentPermissionListView.Content = HiveClient.GetJobPermissions(this.Content.Job.Id);
445      }
446    }
447    #endregion
448
449    #region Helpers
450    private void SetEnabledStateOfExecutableButtons() {
451      if (Content == null) {
452        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
453      } else {
454        startButton.Enabled = Content.IsControllable && Content.HiveTasks != null && Content.HiveTasks.Count > 0 && (Content.ExecutionState == ExecutionState.Prepared || Content.ExecutionState == ExecutionState.Paused) && !Content.IsProgressing;
455        pauseButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
456        stopButton.Enabled = Content.IsControllable && Content.ExecutionState == ExecutionState.Started && !Content.IsProgressing;
457        resetButton.Enabled = false;
458      }
459    }
460    #endregion
461
462    #region Progress reporting
463    private void Content_IsProgressingChanged(object sender, EventArgs e) {
464      if (this.InvokeRequired) {
465        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
466      } else {
467        if (Content != null && Content.Progress != null && Content.IsProgressing) {
468          SetProgressView();
469        } else {
470          progressView.Progress = null;
471        }
472      }
473    }
474
475    private void SetProgressView() {
476      if (InvokeRequired) {
477        Invoke(new Action(SetProgressView));
478      } else {
479        progressView.Progress = Content.Progress;
480      }
481    }
482
483    private void SetProgressView(IProgress progress) {
484      if (InvokeRequired) {
485        Invoke(new Action<IProgress>(SetProgressView), progress);
486      } else {
487        progressView.Progress = progress;
488      }
489    }
490
491    private void FinishProgressView() {
492      if (InvokeRequired) {
493        Invoke(new Action(FinishProgressView));
494      } else {
495        if (Content != null && Content.Progress != null)
496          Content.Progress.Finish();
497        SetEnabledStateOfControls();
498      }
499    }
500    #endregion
501
502    #region Drag & Drop
503    private void jobsTreeView_DragOver(object sender, DragEventArgs e) {
504      jobsTreeView_DragEnter(sender, e);
505    }
506
507    private void jobsTreeView_DragEnter(object sender, DragEventArgs e) {
508      e.Effect = DragDropEffects.None;
509      var obj = e.Data.GetData(Constants.DragDropDataFormat);
510      if (obj is IOptimizer) {
511        if (Content.Id != Guid.Empty) e.Effect = DragDropEffects.None;
512        else if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
513        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
514      }
515    }
516
517    private void jobsTreeView_DragDrop(object sender, DragEventArgs e) {
518      if (e.Effect != DragDropEffects.None) {
519        var obj = e.Data.GetData(Constants.DragDropDataFormat);
520
521        var optimizer = obj as IOptimizer;
522        if (optimizer != null) {
523          IOptimizer newOptimizer = null;
524          if (e.Effect.HasFlag(DragDropEffects.Copy)) {
525            newOptimizer = (IOptimizer)optimizer.Clone();
526          } else {
527            newOptimizer = optimizer;
528          }
529          if (newOptimizer.ExecutionState != ExecutionState.Prepared) {
530            newOptimizer.Prepare();
531          }
532
533          Content.HiveTasks.Add(new OptimizerHiveTask(newOptimizer));
534        }
535      }
536    }
537    #endregion
538
539    private void tabControl_SelectedIndexChanged(object sender, EventArgs e) {
540      if (tabControl.SelectedTab == permissionTabPage) {
541        if (!Content.IsSharable) {
542          MessageBox.Show("Unable to load permissions. You have insufficient access privileges.", "HeuristicLab Hive Job Manager", MessageBoxButtons.OK, MessageBoxIcon.Information);
543          tabControl.SelectedTab = tasksTabPage;
544        }
545      }
546    }
547
548    private RunCollection GetAllRunsFromJob(RefreshableJob job) {
549      if (job != null) {
550        RunCollection runs = new RunCollection();
551
552        foreach (HiveTask subTask in job.HiveTasks) {
553          if (subTask is OptimizerHiveTask) {
554            OptimizerHiveTask ohTask = subTask as OptimizerHiveTask;
555            runs.AddRange(ohTask.ItemTask.Item.Runs);
556          }
557        }
558        return runs;
559      } else {
560        return null;
561      }
562    }
563  }
564}
Note: See TracBrowser for help on using the repository browser.