Index: /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/HeuristicLab.PluginInfrastructure.UI-4.0.csproj
===================================================================
--- /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/HeuristicLab.PluginInfrastructure.UI-4.0.csproj	(revision 13359)
+++ /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/HeuristicLab.PluginInfrastructure.UI-4.0.csproj	(revision 13360)
@@ -17,5 +17,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -25,5 +25,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>..\..\bin\</OutputPath>
+    <OutputPath>..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -90,4 +90,10 @@
       <DependentUpon>MultiSelectListView.cs</DependentUpon>
     </Compile>
+    <Compile Include="PluginInformationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PluginInformationDialog.Designer.cs">
+      <DependentUpon>PluginInformationDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="PluginView.cs">
       <SubType>Form</SubType>
@@ -114,4 +120,7 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="PluginInformationDialog.resx">
+      <DependentUpon>PluginInformationDialog.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Resources\Error.ico" />
     <EmbeddedResource Include="Resources\HeuristicLab.ico" />
Index: /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.Designer.cs
===================================================================
--- /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.Designer.cs	(revision 13360)
+++ /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.Designer.cs	(revision 13360)
@@ -0,0 +1,330 @@
+﻿#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.UI {
+  partial class PluginInformationDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.okButton = new System.Windows.Forms.Button();
+      this.pluginListView = new System.Windows.Forms.ListView();
+      this.pluginNameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.pluginVersionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.pluginDescriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.productTextBox = new System.Windows.Forms.TextBox();
+      this.contactTextBox = new System.Windows.Forms.TextBox();
+      this.textBox = new System.Windows.Forms.RichTextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.label4 = new System.Windows.Forms.Label();
+      this.webLinkLabel = new System.Windows.Forms.LinkLabel();
+      this.mailLinkLabel = new System.Windows.Forms.LinkLabel();
+      this.label3 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.label = new System.Windows.Forms.Label();
+      this.panel2 = new System.Windows.Forms.Panel();
+      this.panel1.SuspendLayout();
+      this.panel2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(800, 13);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&Close";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // pluginListView
+      // 
+      this.pluginListView.Activation = System.Windows.Forms.ItemActivation.OneClick;
+      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.pluginListView.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameColumnHeader,
+            this.pluginVersionColumnHeader,
+            this.pluginDescriptionColumnHeader});
+      this.pluginListView.FullRowSelect = true;
+      this.pluginListView.GridLines = true;
+      this.pluginListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.pluginListView.HideSelection = false;
+      this.pluginListView.Location = new System.Drawing.Point(12, 12);
+      this.pluginListView.MultiSelect = false;
+      this.pluginListView.Name = "pluginListView";
+      this.pluginListView.ShowGroups = false;
+      this.pluginListView.Size = new System.Drawing.Size(303, 514);
+      this.pluginListView.SmallImageList = this.imageList;
+      this.pluginListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginListView.TabIndex = 0;
+      this.pluginListView.TileSize = new System.Drawing.Size(300, 60);
+      this.pluginListView.UseCompatibleStateImageBehavior = false;
+      this.pluginListView.View = System.Windows.Forms.View.Tile;
+      this.pluginListView.ItemActivate += new System.EventHandler(this.pluginListView_ItemActivate);
+      this.pluginListView.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.pluginListView_ItemSelectionChanged);
+      this.pluginListView.ClientSizeChanged += new System.EventHandler(this.pluginListView_ClientSizeChanged);
+      // 
+      // pluginNameColumnHeader
+      // 
+      this.pluginNameColumnHeader.Text = "Name";
+      // 
+      // pluginVersionColumnHeader
+      // 
+      this.pluginVersionColumnHeader.Text = "Version";
+      // 
+      // pluginDescriptionColumnHeader
+      // 
+      this.pluginDescriptionColumnHeader.Text = "Description";
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productTextBox
+      // 
+      this.productTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.productTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.productTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.productTextBox.Location = new System.Drawing.Point(87, 3);
+      this.productTextBox.Name = "productTextBox";
+      this.productTextBox.ReadOnly = true;
+      this.productTextBox.Size = new System.Drawing.Size(355, 13);
+      this.productTextBox.TabIndex = 2;
+      this.productTextBox.Text = "HeuristicLab";
+      // 
+      // contactTextBox
+      // 
+      this.contactTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.contactTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.contactTextBox.Location = new System.Drawing.Point(87, 41);
+      this.contactTextBox.Name = "contactTextBox";
+      this.contactTextBox.ReadOnly = true;
+      this.contactTextBox.Size = new System.Drawing.Size(355, 13);
+      this.contactTextBox.TabIndex = 6;
+      this.contactTextBox.Text = "(C)";
+      // 
+      // textBox
+      // 
+      this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.textBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.textBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.textBox.Location = new System.Drawing.Point(6, 98);
+      this.textBox.Name = "textBox";
+      this.textBox.ReadOnly = true;
+      this.textBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
+      this.textBox.Size = new System.Drawing.Size(526, 394);
+      this.textBox.TabIndex = 11;
+      this.textBox.Text = "Files and License Text";
+      this.textBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.licenseTextBox_LinkClicked);
+      this.textBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 60);
+      this.label2.Margin = new System.Windows.Forms.Padding(3);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(49, 13);
+      this.label2.TabIndex = 7;
+      this.label2.Text = "Website:";
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.BackColor = System.Drawing.SystemColors.Control;
+      this.panel1.Controls.Add(this.okButton);
+      this.panel1.Location = new System.Drawing.Point(0, 538);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(888, 48);
+      this.panel1.TabIndex = 0;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(3, 79);
+      this.label4.Margin = new System.Windows.Forms.Padding(3);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(47, 13);
+      this.label4.TabIndex = 9;
+      this.label4.Text = "Contact:";
+      // 
+      // webLinkLabel
+      // 
+      this.webLinkLabel.AutoSize = true;
+      this.webLinkLabel.Location = new System.Drawing.Point(84, 60);
+      this.webLinkLabel.Name = "webLinkLabel";
+      this.webLinkLabel.Size = new System.Drawing.Size(135, 13);
+      this.webLinkLabel.TabIndex = 8;
+      this.webLinkLabel.TabStop = true;
+      this.webLinkLabel.Text = "http://dev.heuristiclab.com";
+      this.webLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.webLinkLabel_LinkClicked);
+      // 
+      // mailLinkLabel
+      // 
+      this.mailLinkLabel.AutoSize = true;
+      this.mailLinkLabel.Location = new System.Drawing.Point(84, 79);
+      this.mailLinkLabel.Name = "mailLinkLabel";
+      this.mailLinkLabel.Size = new System.Drawing.Size(129, 13);
+      this.mailLinkLabel.TabIndex = 10;
+      this.mailLinkLabel.TabStop = true;
+      this.mailLinkLabel.Text = "support@heuristiclab.com";
+      this.mailLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.mailLinkLabel_LinkClicked);
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 41);
+      this.label3.Margin = new System.Windows.Forms.Padding(3);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(54, 13);
+      this.label3.TabIndex = 5;
+      this.label3.Text = "Copyright:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 22);
+      this.label1.Margin = new System.Windows.Forms.Padding(3);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(45, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Version:";
+      // 
+      // versionTextBox
+      // 
+      this.versionTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.versionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.versionTextBox.Location = new System.Drawing.Point(87, 22);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.ReadOnly = true;
+      this.versionTextBox.Size = new System.Drawing.Size(355, 13);
+      this.versionTextBox.TabIndex = 4;
+      this.versionTextBox.Text = "1.0";
+      // 
+      // label
+      // 
+      this.label.AutoSize = true;
+      this.label.Location = new System.Drawing.Point(3, 3);
+      this.label.Margin = new System.Windows.Forms.Padding(3);
+      this.label.Name = "label";
+      this.label.Size = new System.Drawing.Size(38, 13);
+      this.label.TabIndex = 1;
+      this.label.Text = "Name:";
+      // 
+      // panel2
+      // 
+      this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel2.Controls.Add(this.contactTextBox);
+      this.panel2.Controls.Add(this.mailLinkLabel);
+      this.panel2.Controls.Add(this.label);
+      this.panel2.Controls.Add(this.webLinkLabel);
+      this.panel2.Controls.Add(this.label1);
+      this.panel2.Controls.Add(this.label4);
+      this.panel2.Controls.Add(this.label3);
+      this.panel2.Controls.Add(this.productTextBox);
+      this.panel2.Controls.Add(this.label2);
+      this.panel2.Controls.Add(this.versionTextBox);
+      this.panel2.Controls.Add(this.textBox);
+      this.panel2.Location = new System.Drawing.Point(321, 31);
+      this.panel2.Name = "panel2";
+      this.panel2.Size = new System.Drawing.Size(554, 495);
+      this.panel2.TabIndex = 13;
+      // 
+      // PluginInformationDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.SystemColors.Window;
+      this.CancelButton = this.okButton;
+      this.ClientSize = new System.Drawing.Size(887, 586);
+      this.Controls.Add(this.pluginListView);
+      this.Controls.Add(this.panel2);
+      this.Controls.Add(this.panel1);
+      this.Icon = global::HeuristicLab.PluginInfrastructure.UI.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "PluginInformationDialog";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "About Plugins";
+      this.panel1.ResumeLayout(false);
+      this.panel2.ResumeLayout(false);
+      this.panel2.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.ListView pluginListView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ColumnHeader pluginNameColumnHeader;
+    private System.Windows.Forms.ColumnHeader pluginVersionColumnHeader;
+    private System.Windows.Forms.ColumnHeader pluginDescriptionColumnHeader;
+    private System.Windows.Forms.TextBox productTextBox;
+    private System.Windows.Forms.TextBox contactTextBox;
+    private System.Windows.Forms.RichTextBox textBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.LinkLabel webLinkLabel;
+    private System.Windows.Forms.LinkLabel mailLinkLabel;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox versionTextBox;
+    private System.Windows.Forms.Label label;
+    private System.Windows.Forms.Panel panel2;
+  }
+}
Index: /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.cs
===================================================================
--- /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.cs	(revision 13360)
+++ /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/PluginInformationDialog.cs	(revision 13360)
@@ -0,0 +1,167 @@
+﻿#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.UI {
+  /// <summary>
+  /// Shows information on all discovered plugins.
+  /// </summary>
+  public partial class PluginInformationDialog : Form {
+    public PluginInformationDialog(IEnumerable<IPluginDescription> plugins) {
+      InitializeComponent();
+      var entryAssembly = Assembly.GetEntryAssembly();
+      productTextBox.Text = GetProduct(entryAssembly);
+      versionTextBox.Text = entryAssembly.GetFileVersion();
+      contactTextBox.Text = GetCopyright(entryAssembly);
+      imageList.Images.Add(Resources.Plugin);
+      textBox.Text = Resources.LicenseText;
+      PopulatePluginList(plugins);
+      ActiveControl = okButton;
+    }
+
+    private void PopulatePluginList(IEnumerable<IPluginDescription> plugins) {
+      pluginListView.Items.Clear();
+      foreach (var plugin in plugins) {
+        ListViewItem pluginItem = CreateListViewItem(plugin);
+        pluginListView.Items.Add(pluginItem);
+      }
+      Util.ResizeColumns(pluginListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description }) {
+        Name = plugin.Name,
+        Tag = plugin,
+        ImageIndex = 0
+      };
+
+      // set sub-item names to make sure they are shown in the corresponding columns of the ListView
+      item.SubItems[0].Name = "Name";
+      item.SubItems[1].Name = "Version";
+      item.SubItems[2].Name = "Description";
+      return item;
+    }
+
+    private string GetCopyright(Assembly asm) {
+      AssemblyCopyrightAttribute attribute = GetAttribute<AssemblyCopyrightAttribute>(asm);
+      return attribute.Copyright;
+    }
+
+    private string GetProduct(Assembly asm) {
+      AssemblyProductAttribute attribute = GetAttribute<AssemblyProductAttribute>(asm);
+      return attribute.Product;
+    }
+
+    private T GetAttribute<T>(Assembly asm) {
+      return (T)asm.GetCustomAttributes(typeof(T), false).Single();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+
+    private void pluginListView_ItemActivate(object sender, EventArgs e) {
+
+    }
+    private void pluginListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
+      if (e.IsSelected) {
+        pluginListView.EnsureVisible(e.ItemIndex);
+        ShowPluginInformation((IPluginDescription)e.Item.Tag);
+        pluginListView.Select(); // focus plugin list view to highlight selected tile
+      }
+    }
+
+    private void ShowPluginInformation(IPluginDescription pluginDescription) {
+      productTextBox.Text = pluginDescription.Name;
+      versionTextBox.Text = pluginDescription.Version.ToString();
+      contactTextBox.Text =
+        pluginDescription.ContactName + " " + pluginDescription.ContactEmail;
+
+      // build text and later replace plugindependency names with RTF links (too lazy to create RTF document)
+      textBox.Text =
+        pluginDescription.Description +
+        Environment.NewLine + Environment.NewLine +
+        "Files:" + Environment.NewLine +
+        string.Join(Environment.NewLine, pluginDescription.Files) +
+        Environment.NewLine + Environment.NewLine +
+        "Dependencies:" + Environment.NewLine;
+
+      // foreach dependency add a new line and set the formatting
+
+      foreach (var d in pluginDescription.Dependencies) {
+        // remember starting pos for selection
+        var start = textBox.Text.Length;
+        textBox.AppendText(d.Name);
+        textBox.SelectionStart = start;
+        textBox.SelectionLength = d.Name.Length;
+        textBox.SelectionColor = Color.RoyalBlue;
+        textBox.AppendText(Environment.NewLine);
+      }
+      textBox.AppendText(Environment.NewLine);
+      textBox.AppendText(pluginDescription.LicenseText);
+    }
+
+    private void licenseTextBox_LinkClicked(object sender, LinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(e.LinkText);
+    }
+
+    private void webLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(webLinkLabel.Text);
+    }
+
+    private void mailLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start("mailto:" + mailLinkLabel.Text);
+    }
+
+    // automatically adjust tile size to 100% width of listview
+    private void pluginListView_ClientSizeChanged(object sender, EventArgs e) {
+      pluginListView.TileSize = new Size(pluginListView.ClientSize.Width, pluginListView.TileSize.Height);
+    }
+
+    private void textBox_MouseClick(object sender, MouseEventArgs e) {
+      int i = textBox.GetCharIndexFromPosition(e.Location);
+      var text = textBox.Text;
+      // extract clicked string (left and right are whitespace
+      int startPos = i; while (startPos >= 0 && !char.IsWhiteSpace(text[startPos])) startPos--;
+      int endPos = i; while (endPos < textBox.TextLength && !char.IsWhiteSpace(text[endPos])) endPos++;
+      string clickedWord = text.Substring(startPos + 1, endPos - startPos - 1);
+
+      pluginListView.SelectedItems.Clear();
+
+      // find and select first matching item
+      for (int pi = 0; pi < pluginListView.Items.Count; pi++) {
+        if (pluginListView.Items[pi].Text == clickedWord) {
+          pluginListView.Items[pi].Selected = true;
+          break;
+        }
+      }
+    }
+
+  }
+}
Index: /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/StarterForm.cs
===================================================================
--- /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/StarterForm.cs	(revision 13359)
+++ /branches/RefactorPluginInfrastructure-2522/HeuristicLab.PluginInfrastructure.UI/StarterForm.cs	(revision 13360)
@@ -35,5 +35,5 @@
   /// </summary>
   public partial class StarterForm : Form {
-    private const string pluginManagerItemName = "Plugin Manager";
+    private const string pluginManagerItemName = "Plugins";
     // private const string updatePluginsItemName = "Updates Available";
     private const string optimizerItemName = "Optimizer"; // TODO: encoding a specific name of an application here is problematic (applications are discovered dynamically)
@@ -100,18 +100,11 @@
         ListViewItem selected = applicationsListView.SelectedItems[0];
         if (selected.Text == pluginManagerItemName) {
-          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;
-              using (InstallationManagerForm form = new InstallationManagerForm(pluginManager)) {
-                form.ShowDialog(this);
-              }
-              UpdateApplicationsList();
-            } finally {
-              Cursor = Cursors.Arrow;
+          try {
+            Cursor = Cursors.AppStarting;
+            using (var form = new PluginInformationDialog(pluginManager.Plugins)) {
+              form.ShowDialog(this);
             }
+          } finally {
+            Cursor = Cursors.Arrow;
           }
         } else {
@@ -176,8 +169,8 @@
     private void AddPluginManagerItem() {
       pluginManagerListViewItem = new ListViewItem(pluginManagerItemName, 0);
-      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Information"];
       pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, AssemblyExtensions.GetFileVersion(GetType().Assembly)));
-      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
-      pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Show detailed plugin information"));
+      pluginManagerListViewItem.ToolTipText = "Show detailed plugin information";
 
       applicationsListView.Items.Add(pluginManagerListViewItem);
