#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 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.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using HeuristicLab.PluginInfrastructure;
using System.Threading;
using HeuristicLab.PluginInfrastructure.Manager;
using System.IO;
using HeuristicLab.PluginInfrastructure.Advanced;
namespace HeuristicLab.PluginInfrastructure.Starter {
///
/// The starter form is responsible for initializing the plugin infrastructure
/// and shows a list of installed applications.
///
public partial class StarterForm : Form {
private ListViewItem pluginManagerListViewItem;
private bool abortRequested;
private PluginManager pluginManager;
private SplashScreen splashScreen;
///
/// Initializes an instance of the starter form.
/// The starter form shows a splashscreen and initializes the plugin infrastructure.
///
public StarterForm()
: base() {
InitializeComponent();
Text = "HeuristicLab " + this.GetType().Assembly.GetName().Version;
string pluginPath = Path.GetFullPath(Application.StartupPath);
pluginManager = new PluginManager(pluginPath);
splashScreen = new SplashScreen(pluginManager, 1000);
splashScreen.Show("Loading HeuristicLab...");
pluginManager.DiscoverAndCheckPlugins();
UpdateApplicationsList();
}
///
/// Creates a new StarterForm and tries to start application with immediately.
///
/// Name of the application
public StarterForm(string appName)
: this() {
var appDesc = (from desc in pluginManager.Applications
where desc.Name == appName
select desc).SingleOrDefault();
if (appDesc != null) {
StartApplication(appDesc);
} else {
MessageBox.Show("Cannot start application " + appName + ".",
"HeuristicLab",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
private void applicationsListView_ItemActivate(object sender, EventArgs e) {
if (applicationsListView.SelectedItems.Count > 0) {
ListViewItem selected = applicationsListView.SelectedItems[0];
if (selected == pluginManagerListViewItem) {
if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
MessageBox.Show("Installation Manager cannot be started while another HeuristicLab application is active." + Environment.NewLine +
"Please stop all active HeuristicLab applications and try again.", "Plugin Manager",
MessageBoxButtons.OK, MessageBoxIcon.Information);
} else {
try {
Cursor = Cursors.AppStarting;
InstallationManagerForm form = new InstallationManagerForm(pluginManager);
form.ShowDialog(this);
UpdateApplicationsList();
}
finally {
Cursor = Cursors.Arrow;
}
}
} else {
ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
StartApplication(app);
}
}
}
private void UpdateApplicationsList() {
applicationsListView.Items.Clear();
pluginManagerListViewItem = new ListViewItem("Plugin Manager", 0);
pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, GetType().Assembly.GetName().Version.ToString()));
pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
applicationsListView.Items.Add(pluginManagerListViewItem);
foreach (ApplicationDescription info in pluginManager.Applications) {
ListViewItem item = new ListViewItem(info.Name, 0);
item.Tag = info;
item.Group = applicationsListView.Groups["Applications"];
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Version.ToString()));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Description));
item.ToolTipText = info.Description;
applicationsListView.Items.Add(item);
}
}
private void StartApplication(ApplicationDescription app) {
splashScreen.Show("Loading " + app.Name);
Thread t = new Thread(delegate() {
bool stopped = false;
do {
try {
if (!abortRequested) {
pluginManager.Run(app);
}
stopped = true;
}
catch (Exception ex) {
stopped = false;
ThreadPool.QueueUserWorkItem(delegate(object exception) { ShowErrorMessageBox((Exception)exception); }, ex);
Thread.Sleep(5000); // sleep 5 seconds before autorestart
}
} while (!abortRequested && !stopped && app.AutoRestart);
});
t.SetApartmentState(ApartmentState.STA); // needed for the AdvancedOptimizationFrontent
t.Start();
}
private void applicationsListView_SelectedIndexChanged(object sender, EventArgs e) {
startButton.Enabled = applicationsListView.SelectedItems.Count > 0;
}
private void largeIconsButton_Click(object sender, EventArgs e) {
applicationsListView.View = View.LargeIcon;
}
private void detailsButton_Click(object sender, EventArgs e) {
applicationsListView.View = View.Details;
}
private void ShowErrorMessageBox(Exception ex) {
MessageBoxOptions options = RightToLeft == RightToLeft.Yes ? MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading : MessageBoxOptions.DefaultDesktopOnly;
MessageBox.Show(null,
BuildErrorMessage(ex),
"Error - " + ex.GetType().Name,
MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, options);
}
private static string BuildErrorMessage(Exception ex) {
string nl = Environment.NewLine;
StringBuilder sb = new StringBuilder();
sb.Append(ex.Message + nl + ex.StackTrace);
while (ex.InnerException != null) {
ex = ex.InnerException;
sb.Append(nl + "-----" + nl + ex.Message + nl + ex.StackTrace);
}
return sb.ToString();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
abortRequested = true;
}
}
}