#region License Information
/* HeuristicLab
* Copyright (C) 2002-2013 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 System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace HeuristicLab.MainForm.WindowsForms {
public partial class View : UserControl, IView {
private bool initialized;
public View() {
InitializeComponent();
this.initialized = false;
this.isShown = false;
this.closeReason = CloseReason.None;
this.readOnly = false;
if (ViewAttribute.HasViewAttribute(this.GetType()))
this.Caption = ViewAttribute.GetViewName(this.GetType());
else
this.Caption = "View";
}
private string caption;
public string Caption {
get { return caption; }
set {
if (InvokeRequired) {
Action action = delegate(string s) { this.Caption = s; };
Invoke(action, value);
} else {
if (value != caption) {
caption = value;
OnCaptionChanged();
}
}
}
}
private bool readOnly;
public virtual bool ReadOnly {
get { return this.readOnly; }
set {
if (InvokeRequired) {
Action action = delegate(bool b) { this.ReadOnly = b; };
Invoke(action, value);
} else {
if (value != readOnly) {
this.readOnly = value;
OnReadOnlyChanged();
PropertyInfo prop = typeof(IView).GetProperty("ReadOnly");
PropagateStateChanges(this, typeof(IView), prop);
SetEnabledStateOfControls();
OnChanged();
}
}
}
}
public new bool Enabled {
get { return base.Enabled; }
set {
if (base.Enabled != value) {
this.SuspendRepaint();
base.Enabled = value;
this.ResumeRepaint(true);
OnChanged();
}
}
}
bool IView.Enabled {
get { return Enabled; }
set { Enabled = value; }
}
protected override void OnEnabledChanged(EventArgs e) {
base.OnEnabledChanged(e);
if (Enabled) SetEnabledStateOfControls();
}
///
/// This method is called if the ReadyOnly property of the View changes to update the controls of the view.
///
protected virtual void SetEnabledStateOfControls() {
}
private bool isShown;
public bool IsShown {
get { return this.isShown; }
private set { this.isShown = value; }
}
public new void Show() {
MainForm mainform = MainFormManager.GetMainForm();
bool firstTimeShown = mainform.GetForm(this) == null;
this.IsShown = true;
mainform.ShowView(this);
if (firstTimeShown) {
Form form = mainform.GetForm(this);
form.FormClosed += new FormClosedEventHandler(OnClosedHelper);
form.FormClosing += new FormClosingEventHandler(OnClosingHelper);
}
this.OnShown(new ViewShownEventArgs(this, firstTimeShown));
}
public void Close() {
MainForm mainform = MainFormManager.GetMainForm();
Form form = mainform.GetForm(this);
if (form != null) {
this.IsShown = false;
mainform.CloseView(this);
}
}
public void Close(CloseReason closeReason) {
MainForm mainform = MainFormManager.GetMainForm();
Form form = mainform.GetForm(this);
if (form != null) {
this.IsShown = false;
mainform.CloseView(this, closeReason);
}
}
public new void Hide() {
this.IsShown = false;
MainFormManager.GetMainForm().HideView(this);
this.OnHidden(EventArgs.Empty);
}
public event EventHandler CaptionChanged;
protected virtual void OnCaptionChanged() {
if (InvokeRequired)
Invoke((MethodInvoker)OnCaptionChanged);
else {
EventHandler handler = CaptionChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
public event EventHandler ReadOnlyChanged;
protected virtual void OnReadOnlyChanged() {
if (InvokeRequired)
Invoke((MethodInvoker)OnReadOnlyChanged);
else {
EventHandler handler = ReadOnlyChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
protected virtual void PropagateStateChanges(Control control, Type type, PropertyInfo propertyInfo) {
if (!type.GetProperties().Contains(propertyInfo))
throw new ArgumentException("The specified type " + type + "implement the property " + propertyInfo.Name + ".");
if (!type.IsAssignableFrom(this.GetType()))
throw new ArgumentException("The specified type " + type + "must be the same or a base class / interface of this object.");
if (!propertyInfo.CanWrite)
throw new ArgumentException("The specified property " + propertyInfo.Name + " must have a setter.");
foreach (Control c in control.Controls) {
Type controlType = c.GetType();
PropertyInfo controlPropertyInfo = controlType.GetProperty(propertyInfo.Name, propertyInfo.PropertyType);
if (type.IsAssignableFrom(controlType) && controlPropertyInfo != null) {
var thisValue = propertyInfo.GetValue(this, null);
controlPropertyInfo.SetValue(c, thisValue, null);
} else PropagateStateChanges(c, type, propertyInfo);
}
}
public event EventHandler Changed;
protected virtual void OnChanged() {
if (InvokeRequired)
Invoke((MethodInvoker)OnChanged);
else {
EventHandler handler = Changed;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
internal protected virtual void OnShown(ViewShownEventArgs e) {
}
internal protected virtual void OnHidden(EventArgs e) {
}
private CloseReason closeReason;
internal CloseReason CloseReason {
get { return this.closeReason; }
set { this.closeReason = value; }
}
internal void OnClosingHelper(object sender, FormClosingEventArgs e) {
FormClosingEventArgs eventArgs = new FormClosingEventArgs(this.closeReason, e.Cancel);
if (this.closeReason != CloseReason.None) {
this.OnClosing(eventArgs);
if (eventArgs.Cancel != e.Cancel)
e.Cancel = eventArgs.Cancel;
} else
this.OnClosing(e);
this.closeReason = CloseReason.None;
}
internal protected virtual void OnClosing(FormClosingEventArgs e) {
}
internal void OnClosedHelper(object sender, FormClosedEventArgs e) {
if (this.closeReason != CloseReason.None)
this.OnClosed(new FormClosedEventArgs(this.closeReason));
else
this.OnClosed(e);
Form form = (Form)sender;
form.FormClosed -= new FormClosedEventHandler(OnClosedHelper);
form.FormClosing -= new FormClosingEventHandler(OnClosingHelper);
this.closeReason = CloseReason.None;
}
internal protected virtual void OnClosed(FormClosedEventArgs e) {
}
private void View_Load(object sender, EventArgs e) {
if (!this.initialized && !this.DesignMode) {
this.OnInitialized(e);
this.initialized = true;
}
}
protected virtual void OnInitialized(EventArgs e) {
SetEnabledStateOfControls();
}
public void SuspendRepaint() {
if (InvokeRequired)
Invoke((MethodInvoker)SuspendRepaint);
else
((Control)this).SuspendRepaint();
}
public void ResumeRepaint(bool refresh) {
if (InvokeRequired)
Invoke((Action)ResumeRepaint, refresh);
else
((Control)this).ResumeRepaint(refresh);
}
}
}