#region License Information
/* HeuristicLab
* Copyright (C) 2002-2019 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.Windows.Forms;
using HeuristicLab.Common;
namespace HeuristicLab.MainForm {
public class Progress : IProgress {
private ProgressState progressState;
public ProgressState ProgressState {
get { return progressState; }
private set {
if (progressState != value) {
progressState = value;
OnProgressStateChanged();
}
}
}
private string message;
public string Message {
get { return message; }
set {
if (message != value) {
message = value;
OnMessageChanged();
}
}
}
private ProgressMode progressMode;
public ProgressMode ProgressMode {
get { return progressMode; }
set {
if (progressMode != value) {
progressMode = value;
OnProgressBarModeChanged();
}
}
}
private double progressValue;
public double ProgressValue {
get { return progressValue; }
set {
if (progressMode == ProgressMode.Indeterminate)
throw new InvalidOperationException("Cannot set ProgressValue while ProgressBar is in Indeterminate-Mode");
if (progressValue != value) {
progressValue = Math.Max(Math.Min(value, 1.0), 0.0);
OnProgressChanged();
}
}
}
private bool canBeStopped;
public bool CanBeStopped {
get { return canBeStopped; }
set {
if (canBeStopped != value) {
canBeStopped = value;
OnCanBeStoppedChanged();
}
}
}
private bool canBeCanceled;
public bool CanBeCanceled {
get { return canBeCanceled; }
set {
if (canBeCanceled != value) {
canBeCanceled = value;
OnCanBeCanceledChanged();
}
}
}
public Progress() {
progressState = ProgressState.Finished;
canBeStopped = false;
canBeCanceled = false;
progressMode = ProgressMode.Indeterminate;
progressValue = 0.0;
}
public void Start(string message, ProgressMode mode = ProgressMode.Determinate) {
ProgressState = ProgressState.Started;
ProgressMode = mode;
if (mode == ProgressMode.Determinate)
ProgressValue = 0.0;
Message = message;
}
public void Finish() {
if (ProgressMode == ProgressMode.Determinate && ProgressValue != 1.0)
ProgressValue = 1.0;
ProgressState = ProgressState.Finished;
}
public void Stop() {
if (canBeStopped) {
ProgressState = ProgressState.StopRequested;
OnStopRequested();
} else throw new NotSupportedException("This progress cannot be stopped.");
}
public void Cancel() {
if (canBeCanceled) {
ProgressState = ProgressState.CancelRequested;
OnCancelRequested();
} else throw new NotSupportedException("This progress cannot be canceled.");
}
#region Show and Hide Progress
///
/// Shows a started Progress on all Views of the specified content.
///
public static IProgress Show(IContent content, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null, bool addToObjectGraphObjects = true) {
var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
Show(content, progress, addToObjectGraphObjects);
return progress;
}
///
/// Shows a started Progress on the specified view.
///
public static IProgress Show(IView view, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null) {
var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
Show(view, progress);
return progress;
}
///
/// Shows a started Progress on the specified control.
///
/// For backwards compatibility. Use Progress.Show(IView, ...) if possible.
public static IProgress ShowOnControl(Control control, string progressMessage, ProgressMode mode = ProgressMode.Determinate, Action stopRequestHandler = null, Action cancelRequestHandler = null) {
var progress = CreateAndStartProgress(progressMessage, mode, stopRequestHandler, cancelRequestHandler);
ShowOnControl(control, progress);
return progress;
}
private static IProgress CreateAndStartProgress(string progressMessage, ProgressMode mode, Action stopRequestHandler, Action cancelRequestHandler) {
var progress = new Progress();
if (stopRequestHandler != null) {
progress.CanBeStopped = true;
progress.StopRequested += (s, a) => stopRequestHandler();
}
if (cancelRequestHandler != null) {
progress.CanBeCanceled = true;
progress.CancelRequested += (s, a) => cancelRequestHandler();
}
progress.Start(progressMessage, mode);
return progress;
}
///
/// Shows an existing progress on all Views of the specified content.
///
public static IProgress Show(IContent content, IProgress progress, bool addToObjectGraphObjects = true) {
MainFormManager.GetMainForm().AddProgressToContent(content, progress, addToObjectGraphObjects);
return progress;
}
///
/// Shows an existing progress on the specified View.
///
public static IProgress Show(IView view, IProgress progress) {
return ShowOnControl((Control)view, progress);
}
///
/// Shows an existing progress on the specified control.
///
/// For backwards compatibility. Use Progress.Show(IView, ...) if possible.
public static IProgress ShowOnControl(Control control, IProgress progress) {
MainFormManager.GetMainForm().AddProgressToControl(control, progress);
return progress;
}
///
/// Hides the Progress from all Views of the specified content.
///
public static void Hide(IContent content, bool finishProgress = true) {
MainFormManager.GetMainForm().RemoveProgressFromContent(content, finishProgress);
}
///
/// Hides the Progress from the specified view.
///
public static void Hide(IView view, bool finishProgress = true) {
HideFromControl((Control)view, finishProgress);
}
///
/// Hides the Progress from the specified control.
///
/// For backwards compatibility. Use Progress.Hide(IView) if possible.
public static void HideFromControl(Control control, bool finishProgress = true) {
MainFormManager.GetMainForm().RemoveProgressFromControl(control, finishProgress);
}
#endregion
#region Event Handler
public event EventHandler ProgressStateChanged;
private void OnProgressStateChanged() {
var handler = ProgressStateChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler MessageChanged;
private void OnMessageChanged() {
var handler = MessageChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler ProgressBarModeChanged;
private void OnProgressBarModeChanged() {
var handler = ProgressBarModeChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler ProgressValueChanged;
private void OnProgressChanged() {
var handler = ProgressValueChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler CanBeStoppedChanged;
private void OnCanBeStoppedChanged() {
var handler = CanBeStoppedChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler CanBeCanceledChanged;
private void OnCanBeCanceledChanged() {
var handler = CanBeCanceledChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler StopRequested;
private void OnStopRequested() {
var handler = StopRequested;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler CancelRequested;
private void OnCancelRequested() {
var handler = CancelRequested;
if (handler != null) handler(this, EventArgs.Empty);
}
#endregion
}
}