#region License Information
/* HeuristicLab
* Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using HeuristicLab.Common;
using HeuristicLab.Common.Resources;
using HeuristicLab.Core;
using HeuristicLab.MainForm;
using HeuristicLab.MainForm.WindowsForms;
using HeuristicLab.Optimization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace HeuristicLab.OptimizationExpertSystem {
///
/// Displays the used view.
///
internal partial class AlgorithmControlForm : DockContent {
private IContentView view;
public IContentView View {
get { return this.view; }
}
private IAlgorithm Algorithm { get; set; }
private bool ShowOnlyFinalResult { get; set; }
public AlgorithmControlForm(IAlgorithm algorithm, bool showOnlyFinalResult = false) {
if (algorithm == null) throw new ArgumentNullException("algorithm");
InitializeComponent();
Algorithm = algorithm;
ShowOnlyFinalResult = showOnlyFinalResult;
this.view = MainFormManager.CreateDefaultView(algorithm.Results.GetType());
this.stopButton.Text = string.Empty;
this.stopButton.Image = VSImageLibrary.Stop;
InitializeView();
RegisterAlgorithmEvents();
SetEnabledStateOfControls();
}
private void InitializeView() {
if (view != null) {
var userControl = view as UserControl;
if (userControl != null) {
switch (userControl.Dock) {
case DockStyle.Left:
this.ShowHint = DockState.DockLeft;
break;
case DockStyle.Right:
this.ShowHint = DockState.DockRight;
break;
case DockStyle.Top:
this.ShowHint = DockState.DockTop;
break;
case DockStyle.Bottom:
this.ShowHint = DockState.DockBottom;
break;
}
var control = (Control)view;
control.Dock = DockStyle.Fill;
this.view.CaptionChanged += View_CaptionChanged;
UpdateText();
viewPanel.Controls.Add(control);
}
if (!ShowOnlyFinalResult) view.Content = Algorithm.Results;
} else {
var errorLabel = new Label();
errorLabel.Name = "errorLabel";
errorLabel.Text = "No view available";
errorLabel.AutoSize = false;
errorLabel.Dock = DockStyle.Fill;
viewPanel.Controls.Add(errorLabel);
}
}
private void RegisterAlgorithmEvents() {
Algorithm.ExecutionStateChanged += AlgorithmOnExecutionStateChanged;
}
protected override void Dispose(bool disposing) {
if (View != null)
View.CaptionChanged -= View_CaptionChanged;
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
private void SetEnabledStateOfControls() {
stopButton.Enabled = Algorithm.ExecutionState == ExecutionState.Started;
}
private void UpdateText() {
if (InvokeRequired)
Invoke(new MethodInvoker(UpdateText));
else
this.Text = this.View.Caption;
}
#region Algorithm Events
private void AlgorithmOnExecutionStateChanged(object sender, EventArgs e) {
if (InvokeRequired) { Invoke((Action