#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.Linq;
using System.Reflection;
using System.Windows.Forms;
using HeuristicLab.PluginInfrastructure.Manager;
namespace HeuristicLab.PluginInfrastructure.Starter {
internal partial class SplashScreen : Form {
private const int FADE_INTERVAL = 50;
private Timer fadeTimer;
private int initialInterval;
private PluginManager pluginManager;
internal SplashScreen() {
InitializeComponent();
}
internal SplashScreen(PluginManager manager, int initialInterval)
: this() {
this.initialInterval = initialInterval;
this.pluginManager = manager;
RegisterPluginManagerEventHandlers();
versionLabel.Text = "Version " + AssemblyHelpers.GetFileVersion(GetType().Assembly);
infoLabel.Text = "";
var attr = (AssemblyCopyrightAttribute)this.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false).Single();
copyrightLabel.Text = "Copyright " + attr.Copyright;
fadeTimer = new Timer();
fadeTimer.Tick += fadeTimer_Elapsed;
fadeTimer.Interval = initialInterval;
}
#region events
private void RegisterPluginManagerEventHandlers() {
pluginManager.ApplicationStarted += new EventHandler(manager_ApplicationStarted);
pluginManager.ApplicationStarting += new EventHandler(manager_ApplicationStarting);
pluginManager.Initializing += new EventHandler(manager_Initializing);
pluginManager.Initialized += new EventHandler(manager_Initialized);
pluginManager.PluginLoaded += new EventHandler(manager_PluginLoaded);
pluginManager.PluginUnloaded += new EventHandler(manager_PluginUnloaded);
}
private void DeregisterPluginManagerEventHandlers() {
pluginManager.ApplicationStarted -= new EventHandler(manager_ApplicationStarted);
pluginManager.ApplicationStarting -= new EventHandler(manager_ApplicationStarting);
pluginManager.Initializing -= new EventHandler(manager_Initializing);
pluginManager.Initialized -= new EventHandler(manager_Initialized);
pluginManager.PluginLoaded -= new EventHandler(manager_PluginLoaded);
pluginManager.PluginUnloaded -= new EventHandler(manager_PluginUnloaded);
}
private void manager_PluginUnloaded(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Unloaded " + e.Entity);
}
private void manager_PluginLoaded(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Loaded " + e.Entity);
}
private void manager_Initialized(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Initialized");
}
private void manager_Initializing(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Initializing");
}
private void manager_ApplicationStarting(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Starting " + e.Entity);
}
private void manager_ApplicationStarted(object sender, PluginInfrastructureEventArgs e) {
SafeUpdateMessage("Started " + e.Entity);
}
// called from event handlers
private void SafeUpdateMessage(string msg) {
try {
Invoke((Action)UpdateMessage, msg);
}
catch (ObjectDisposedException) { }
}
// each tick of the timer reduce opacity and restart timer
private void fadeTimer_Elapsed(object sender, EventArgs e) {
// only called from local timer: no need to invoke here
FadeOut();
}
#endregion
public void Show(string initialText) {
if (InvokeRequired) Invoke((Action)Show, initialText);
else {
Opacity = 1;
infoLabel.Text = initialText;
ResetFadeTimer();
Show();
}
}
public void Show(IWin32Window owner, string initialText) {
if (InvokeRequired) Invoke((Action)Show, owner, initialText);
else {
Opacity = 1;
infoLabel.Text = initialText;
ResetFadeTimer();
Show(owner);
}
}
private void ResetFadeTimer() {
// wait initialInterval again for the first tick
fadeTimer.Stop();
fadeTimer.Interval = initialInterval;
fadeTimer.Start();
}
private void UpdateMessage(string msg) {
ResetFadeTimer();
infoLabel.Text = msg;
Application.DoEvents(); // force immediate update of splash screen control
}
// reduces opacity of the splashscreen one step and restarts the fade-timer
private void FadeOut() {
fadeTimer.Stop();
fadeTimer.Interval = FADE_INTERVAL;
if (this.Opacity > 0) {
Opacity -= 0.1;
fadeTimer.Start();
} else {
Opacity = 0;
fadeTimer.Stop();
Hide();
}
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) {
// deregister events when form is closing
DeregisterPluginManagerEventHandlers();
base.OnClosing(e);
}
}
}