Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/HeuristicLab.Optimization.BubbleChart-3.3.csproj
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/HeuristicLab.Optimization.BubbleChart-3.3.csproj	(revision 12378)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/HeuristicLab.Optimization.BubbleChart-3.3.csproj	(revision 12379)
@@ -49,4 +49,8 @@
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -74,7 +78,24 @@
     </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="RecursiveDataItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RecursiveDataItemListView.Designer.cs">
+      <DependentUpon>RecursiveDataItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="RecursiveDataItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RecursiveDataItemView.Designer.cs">
+      <DependentUpon>RecursiveDataItemView.cs</DependentUpon>
+    </Compile>
     <None Include="Plugin.cs.frame" />
+    <Compile Include="RecursiveDataItem.cs" />
     <Compile Include="Plugin.cs" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItem.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItem.cs	(revision 12379)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItem.cs	(revision 12379)
@@ -0,0 +1,131 @@
+﻿#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;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.BubbleChart {
+  [Item("RecursiveDataItem", "")]
+  [StorableClass]
+  public class RecursiveDataItem : NamedItem, IEnumerable<RecursiveDataItem>, IEnumerable<KeyValuePair<string, IItem>> {
+    private readonly ObservableDictionary<string, IItem> data;
+    private readonly ObservableList<RecursiveDataItem> children;
+
+    public ObservableDictionary<string, IItem> Data { get { return data; } }
+    public ObservableList<RecursiveDataItem> Children { get { return children; } }
+
+    [StorableConstructor]
+    private RecursiveDataItem(bool deserializing) : base(deserializing) { }
+    private RecursiveDataItem(RecursiveDataItem original, Cloner cloner)
+      : base(original, cloner) {
+      data = new ObservableDictionary<string, IItem>(original.Data.ToDictionary(x => x.Key, x => cloner.Clone(x.Value)));
+      children = new ObservableList<RecursiveDataItem>(original.Children.Select(x => cloner.Clone(x)));
+    }
+    public RecursiveDataItem()
+      : base() {
+      data = new ObservableDictionary<string, IItem>();
+      children = new ObservableList<RecursiveDataItem>();
+    }
+    public RecursiveDataItem(string name)
+      : base(name) {
+      data = new ObservableDictionary<string, IItem>();
+      children = new ObservableList<RecursiveDataItem>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RecursiveDataItem(this, cloner);
+    }
+
+    IEnumerator<KeyValuePair<string, IItem>> IEnumerable<KeyValuePair<String, IItem>>.GetEnumerator() {
+      return data.GetEnumerator();
+    }
+    IEnumerator<RecursiveDataItem> IEnumerable<RecursiveDataItem>.GetEnumerator() {
+      return children.GetEnumerator();
+    }
+    IEnumerator IEnumerable.GetEnumerator() {
+      throw new NotImplementedException();
+    }
+
+    public void Add(string key, IItem item) {
+      data.Add(key, item);
+    }
+    public void Add(RecursiveDataItem child) {
+      children.Add(child);
+    }
+
+  }
+
+  static class test {
+    static test() {
+      var run = new RecursiveDataItem("Run") {
+          {"CurrentBestQuality", new DoubleValue(100)},
+          {"Selector", new StringValue("TournamentSelector")},
+          new RecursiveDataItem("Layers") {
+            new RecursiveDataItem("Layer0") {
+               {"CurrentBestQuality", new DoubleValue(10)}
+            },
+            new RecursiveDataItem("Layer1") {
+               {"CurrentBestQuality", new DoubleValue(50)}
+            },
+            new RecursiveDataItem("Layer2") {
+               {"CurrentBestQuality", new DoubleValue(100)}
+            }
+          }
+      };
+      //var run = new RecursiveDataItem(
+      //  name: "Run",
+      //  data: new Dictionary<string, IItem> {
+      //    {"CurrentBestQuality", new DoubleValue(100)},
+      //    {"Selector", new StringValue("TournamentSelector")}, {
+      //      "Layers", new RecursiveDataItem("Layers") {
+      //        new RecursiveDataItem(
+      //          name: "Layer0",
+      //          data: new Dictionary<string, IItem> {
+      //            {"CurrentBestQuality", new DoubleValue(10)}
+      //          }
+      //        ),
+      //        new RecursiveDataItem(
+      //          name: "Layer1",
+      //          data: new Dictionary<string, IItem> {
+      //            {"CurrentBestQuality", new DoubleValue(50)}
+      //          }
+      //        ),
+      //        new RecursiveDataItem(
+      //          name: "Layer2",
+      //          data: new Dictionary<string, IItem> {
+      //            {"CurrentBestQuality", new DoubleValue(100)}
+      //          }
+      //        )
+      //      }
+      //    }
+      //  }
+      //);
+
+    }
+  }
+}
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.Designer.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.Designer.cs	(revision 12379)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.Designer.cs	(revision 12379)
@@ -0,0 +1,119 @@
+﻿#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.Optimization.BubbleChart {
+  partial class RecursiveDataItemListView {
+    /// <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 Component 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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(6, 26);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.treeView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.viewHost);
+      this.splitContainer.Size = new System.Drawing.Size(342, 270);
+      this.splitContainer.SplitterDistance = 166;
+      this.splitContainer.TabIndex = 3;
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.Location = new System.Drawing.Point(0, 0);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(166, 270);
+      this.treeView.TabIndex = 0;
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(172, 270);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // RecursiveDataItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "RecursiveDataItemListView";
+      this.Size = new System.Drawing.Size(351, 299);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TreeView treeView;
+    private HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+  }
+}
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.cs	(revision 12379)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemListView.cs	(revision 12379)
@@ -0,0 +1,73 @@
+﻿#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.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.BubbleChart {
+  [View("RecursiveDataItem View")]
+  [Content(typeof(ItemCollection<RecursiveDataItem>))]
+  public partial class RecursiveDataItemListView : ItemView {
+
+    public new ItemCollection<RecursiveDataItem> Content {
+      get { return (ItemCollection<RecursiveDataItem>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RecursiveDataItemListView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      treeView.Nodes.Clear();
+      viewHost.Content = null;
+
+      if (Content != null) {
+        foreach (var dataItem in Content) {
+          treeView.Nodes.Add(CreateTreeNode(dataItem));
+        }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    private TreeNode CreateTreeNode(RecursiveDataItem dataItem) {
+      var node = new TreeNode(dataItem.Name) {
+        Tag = dataItem
+      };
+      foreach (var child in dataItem.Children) {
+        node.Nodes.Add(CreateTreeNode(child));
+      }
+      return node;
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      var dataItem = (RecursiveDataItem)e.Node.Tag;
+      viewHost.Content = dataItem;
+    }
+  }
+}
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.Designer.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.Designer.cs	(revision 12379)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.Designer.cs	(revision 12379)
@@ -0,0 +1,130 @@
+﻿#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.Optimization.BubbleChart {
+  partial class RecursiveDataItemView {
+    /// <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 Component 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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.listView = new System.Windows.Forms.ListView();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Location = new System.Drawing.Point(3, 26);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.listView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.viewHost);
+      this.splitContainer.Size = new System.Drawing.Size(345, 261);
+      this.splitContainer.SplitterDistance = 115;
+      this.splitContainer.TabIndex = 3;
+      // 
+      // listView
+      // 
+      this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.MultiSelect = false;
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(115, 261);
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(226, 261);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = true;
+      this.viewHost.ViewType = null;
+      // 
+      // RecursiveDataItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "RecursiveDataItemView";
+      this.Size = new System.Drawing.Size(351, 290);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.splitContainer, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ListView listView;
+    private HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+  }
+}
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.cs	(revision 12379)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/RecursiveDataItemView.cs	(revision 12379)
@@ -0,0 +1,72 @@
+﻿#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.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.BubbleChart {
+  [View("RecursiveDataItem View")]
+  [Content(typeof(RecursiveDataItem))]
+  public partial class RecursiveDataItemView : NamedItemView {
+
+    public new RecursiveDataItem Content {
+      get { return (RecursiveDataItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RecursiveDataItemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      listView.Clear();
+      viewHost.Content = null;
+
+      if (Content != null) {
+        foreach (var data in Content.Data) {
+          listView.Items.Add(CreateListViewItem(data));
+        }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    private ListViewItem CreateListViewItem(KeyValuePair<string, IItem> data) {
+      return new ListViewItem(data.Key) {
+        Tag = data.Value
+      };
+    }
+
+    private void listView_SelectedIndexChanged(object sender, System.EventArgs e) {
+      if (listView.SelectedItems.Count == 1) {
+        var item = (IItem)listView.SelectedItems[0].Tag;
+        viewHost.Content = item;
+      } else {
+        viewHost.Content = null;
+      }
+    }
+  }
+}
