Index: /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs	(revision 3565)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.Designer.cs	(revision 3565)
@@ -0,0 +1,246 @@
+#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Views {
+  partial class CheckedItemListView<T> {
+    /// <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) {
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+        foreach (ListViewItem item in itemsListView.Items) {
+          ((T)item.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+          ((T)item.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
+        }
+        if (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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.moveUpButton = new System.Windows.Forms.Button();
+      this.moveDownButton = new System.Windows.Forms.Button();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.listViewColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.addButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveUpButton);
+      this.splitContainer.Panel1.Controls.Add(this.moveDownButton);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(493, 323);
+      this.splitContainer.SplitterDistance = 200;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // removeButton
+      // 
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Remove;
+      this.removeButton.Location = new System.Drawing.Point(93, 3);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(24, 24);
+      this.removeButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.removeButton, "Remove");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // moveUpButton
+      // 
+      this.moveUpButton.Enabled = false;
+      this.moveUpButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.ArrowUp;
+      this.moveUpButton.Location = new System.Drawing.Point(33, 3);
+      this.moveUpButton.Name = "moveUpButton";
+      this.moveUpButton.Size = new System.Drawing.Size(24, 24);
+      this.moveUpButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.moveUpButton, "Move Up");
+      this.moveUpButton.UseVisualStyleBackColor = true;
+      this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
+      // 
+      // moveDownButton
+      // 
+      this.moveDownButton.Enabled = false;
+      this.moveDownButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.ArrowDown;
+      this.moveDownButton.Location = new System.Drawing.Point(63, 3);
+      this.moveDownButton.Name = "moveDownButton";
+      this.moveDownButton.Size = new System.Drawing.Size(24, 24);
+      this.moveDownButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.moveDownButton, "Move Down");
+      this.moveDownButton.UseVisualStyleBackColor = true;
+      this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.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.itemsListView.CheckBoxes = true;
+      this.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.listViewColumnHeader});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(194, 286);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 4;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.itemsListView_ItemChecked);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      // 
+      // 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;
+      // 
+      // addButton
+      // 
+      this.addButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Add;
+      this.addButton.Location = new System.Drawing.Point(3, 3);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(24, 24);
+      this.addButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.addButton, "Add");
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.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.detailsGroupBox.Controls.Add(this.viewHost);
+      this.detailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(283, 294);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // viewHost
+      // 
+      this.viewHost.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.viewHost.Caption = null;
+      this.viewHost.Content = null;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(271, 269);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(499, 342);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // CheckedItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "CheckedItemListView";
+      this.Size = new System.Drawing.Size(499, 342);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader listViewColumnHeader;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button addButton;
+    protected Button removeButton;
+    protected Button moveUpButton;
+    protected Button moveDownButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+  }
+}
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 3565)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/CheckedItemListView.cs	(revision 3565)
@@ -0,0 +1,431 @@
+#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Core.Views {
+  /// <summary>
+  /// The visual representation of a list of checked items.
+  /// </summary>
+  [View("CheckedItemList View")]
+  [Content(typeof(CheckedItemList<>), true)]
+  [Content(typeof(ICheckedItemList<>), false)]
+  public partial class CheckedItemListView<T> : ItemView where T : class, IItem {
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    /// <summary>
+    /// Gets or sets the content to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemView.Content"/> of base class <see cref="ItemView"/>
+    /// </remarks>
+    public new ICheckedItemList<T> Content {
+      get { return (ICheckedItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="CheckedItemListView"/> with caption "Checked Item List".
+    /// </summary>
+    public CheckedItemListView() {
+      InitializeComponent();
+      Caption = "Checked Item List";
+    }
+    public CheckedItemListView(ICheckedItemList<T> content)
+      : this() {
+      Content = content;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="ICheckedItemList"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemView.DeregisterContentEvents"/> of base class <see cref="ItemView"/>.</remarks>
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
+      Content.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+      Content.CheckedItemsChanged -= new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged);
+      base.DeregisterContentEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="ICheckedItemList"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemView.RegisterContentEvents"/> of base class <see cref="ItemView"/>.</remarks>
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved);
+      Content.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced);
+      Content.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset);
+      Content.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged);
+    }
+
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      Caption = "Checked Item List";
+      while (itemsListView.Items.Count > 0) RemoveListViewItem(itemsListView.Items[0]);
+      viewHost.Content = null;
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (T item in Content)
+          AddListViewItem(CreateListViewItem(item));
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void OnReadOnlyChanged() {
+      base.OnReadOnlyChanged();
+      SetEnabledStateOfControls();
+    }
+
+    private void SetEnabledStateOfControls() {
+      if (Content == null) {
+        addButton.Enabled = false;
+        moveUpButton.Enabled = false;
+        moveDownButton.Enabled = false;
+        removeButton.Enabled = false;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = !Content.IsReadOnly && !ReadOnly;
+        moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                                 itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                                 !Content.IsReadOnly && !ReadOnly;
+        removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                               !Content.IsReadOnly && !ReadOnly;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = true;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, false);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(T item) {
+      ListViewItem listViewItem = new ListViewItem();
+      listViewItem.Text = item.ToString();
+      listViewItem.ToolTipText = item.ItemName + ": " + item.ItemDescription;
+      listViewItem.Tag = item;
+      listViewItem.Checked = Content.ItemChecked(item);
+      itemsListView.SmallImageList.Images.Add(item.ItemImage);
+      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      itemsListView.Items.Add(listViewItem);
+      ((T)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      ((T)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
+      AdjustListViewColumnSizes();
+    }
+    protected virtual void InsertListViewItem(int index, ListViewItem listViewItem) {
+      itemsListView.Items.Insert(index, listViewItem);
+      ((T)listViewItem.Tag).ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      ((T)listViewItem.Tag).ToStringChanged += new EventHandler(Item_ToStringChanged);
+      AdjustListViewColumnSizes();
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      ((T)listViewItem.Tag).ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      ((T)listViewItem.Tag).ToStringChanged -= new EventHandler(Item_ToStringChanged);
+      listViewItem.Remove();
+      foreach (ListViewItem other in itemsListView.Items)
+        if (other.ImageIndex > listViewItem.ImageIndex) other.ImageIndex--;
+      itemsListView.SmallImageList.Images.RemoveAt(listViewItem.ImageIndex);
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      int i = listViewItem.ImageIndex;
+      listViewItem.ImageList.Images[i] = ((T)listViewItem.Tag).ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      if (!listViewItem.Text.Equals(listViewItem.Tag.ToString()))
+        listViewItem.Text = listViewItem.Tag.ToString();
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      moveUpButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                             itemsListView.SelectedIndices[0] != 0 &&
+                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      moveDownButton.Enabled = itemsListView.SelectedItems.Count == 1 &&
+                               itemsListView.SelectedIndices[0] != itemsListView.Items.Count - 1 &&
+                               (Content != null) && !Content.IsReadOnly && !ReadOnly;
+      removeButton.Enabled = itemsListView.SelectedItems.Count > 0 &&
+                             (Content != null) && !Content.IsReadOnly && !ReadOnly;
+
+      if (itemsListView.SelectedItems.Count == 1) {
+        T item = (T)itemsListView.SelectedItems[0].Tag;
+        detailsGroupBox.Enabled = true;
+        viewHost.ViewType = null;
+        viewHost.Content = item;
+      } else {
+        viewHost.Content = null;
+        detailsGroupBox.Enabled = false;
+      }
+    }
+
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !Content.IsReadOnly && !ReadOnly) {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.RemoveAt(item.Index);
+        }
+      }
+    }
+
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        T item = (T)itemsListView.SelectedItems[0].Tag;
+        IContentView view = MainFormManager.MainForm.ShowContent(item);
+        if (view != null) {
+          view.ReadOnly = ReadOnly;
+          view.Locked = Locked;
+        }
+      }
+    }
+
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        ListViewItem listViewItem = (ListViewItem)e.Item;
+        T item = (T)listViewItem.Tag;
+        DataObject data = new DataObject();
+        data.SetData("Type", item.GetType());
+        data.SetData("Value", item);
+        if (Content.IsReadOnly || ReadOnly) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((result & DragDropEffects.Move) == DragDropEffects.Move)
+            Content.RemoveAt(listViewItem.Index);
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+        if ((e.KeyState & 8) == 8) e.Effect = DragDropEffects.Link;  // CTRL key
+        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
+        else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        T item = e.Data.GetData("Value") as T;
+        if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
+
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
+        if (listViewItem != null) Content.Insert(listViewItem.Index, item);
+        else Content.Add(item);
+      }
+    }
+
+    protected virtual void itemsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      var checkedItem = (T)e.Item.Tag;
+      if (Content.ItemChecked(checkedItem) != e.Item.Checked)
+        Content.SetItemCheckedState(checkedItem, e.Item.Checked);
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      T item = CreateItem();
+      if (item != null)
+        Content.Add(item);
+    }
+    protected virtual void moveUpButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        T item = Content[index - 1];
+        Content[index - 1] = Content[index];
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index - 1].Selected = true;
+        Content[index] = item;
+      }
+    }
+    protected virtual void moveDownButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        int index = itemsListView.SelectedIndices[0];
+        T item = Content[index + 1];
+        Content[index + 1] = Content[index];
+        itemsListView.Items[index].Selected = false;
+        itemsListView.Items[index + 1].Selected = true;
+        Content[index] = item;
+      }
+    }
+    protected virtual void removeButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in itemsListView.SelectedItems)
+          Content.RemoveAt(item.Index);
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsAdded), sender, e);
+      else
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsRemoved), sender, e);
+      else {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.Items)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+      }
+    }
+    protected virtual void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsReplaced), sender, e);
+      else {
+        int[] selected = new int[itemsListView.SelectedIndices.Count];
+        itemsListView.SelectedIndices.CopyTo(selected, 0);
+
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+
+        for (int i = 0; i < selected.Length; i++)
+          itemsListView.Items[selected[i]].Selected = true;
+      }
+    }
+    protected virtual void Content_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_ItemsMoved), sender, e);
+      else {
+        foreach (IndexedItem<T> item in e.Items) {
+          ListViewItem listViewItem = itemsListView.Items[item.Index];
+          listViewItem.Tag = item.Value;
+          UpdateListViewItemImage(listViewItem);
+          UpdateListViewItemText(listViewItem);
+        }
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CollectionReset), sender, e);
+      else {
+        List<ListViewItem> listViewItems = new List<ListViewItem>();
+        foreach (IndexedItem<T> item in e.OldItems)
+          listViewItems.Add(itemsListView.Items[item.Index]);
+        foreach (ListViewItem listViewItem in listViewItems)
+          RemoveListViewItem(listViewItem);
+
+        foreach (IndexedItem<T> item in e.Items)
+          InsertListViewItem(item.Index, CreateListViewItem(item.Value));
+      }
+    }
+    protected virtual void Content_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<T>>(Content_CheckedItemsChanged), sender, e);
+      else {
+        foreach (var item in e.Items) {
+          if (itemsListView.Items[item.Index].Checked != Content.ItemChecked(item.Value))
+            itemsListView.Items[item.Index].Checked = Content.ItemChecked(item.Value);
+        }
+      }
+    }
+
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in itemsListView.Items) {
+          if (((T)listViewItem.Tag) == item)
+            UpdateListViewItemImage(listViewItem);
+        }
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        T item = (T)sender;
+        foreach (ListViewItem listViewItem in itemsListView.Items) {
+          if (((T)listViewItem.Tag) == item)
+            UpdateListViewItemText(listViewItem);
+        }
+        AdjustListViewColumnSizes();
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 3564)
+++ /trunk/sources/HeuristicLab.Core.Views/3.3/HeuristicLab.Core.Views-3.3.csproj	(revision 3565)
@@ -99,4 +99,10 @@
       <DependentUpon>Clipboard.cs</DependentUpon>
     </Compile>
+    <Compile Include="CheckedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CheckedItemListView.Designer.cs">
+      <DependentUpon>CheckedItemListView.cs</DependentUpon>
+    </Compile>
     <Compile Include="LogView.cs">
       <SubType>UserControl</SubType>
@@ -302,4 +308,9 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CheckedItemListView.resx">
+      <DependentUpon>CheckedItemListView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /trunk/sources/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 3565)
+++ /trunk/sources/HeuristicLab.Core/3.3/Collections/CheckedItemList.cs	(revision 3565)
@@ -0,0 +1,143 @@
+#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Text;
+using System.Drawing;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Core {
+  [StorableClass]
+  [Item("CheckedItemList<T>", "Represents a list of items that can be checked or unchecked.")]
+  public class CheckedItemList<T> : ItemList<T>, ICheckedItemList<T> where T : class, IItem {
+    [Storable]
+    private Dictionary<T, bool> checkedState;
+
+    public IEnumerable<IndexedItem<T>> CheckedItems {
+      get {
+        return from i in Enumerable.Range(0, list.Count)
+               where ItemChecked(i)
+               select new IndexedItem<T>(i, list[i]);
+      }
+    }
+    public CheckedItemList()
+      : base() {
+      checkedState = new Dictionary<T, bool>();
+    }
+    public CheckedItemList(int capacity)
+      : base(capacity) {
+      checkedState = new Dictionary<T, bool>();
+    }
+    public CheckedItemList(IEnumerable<T> collection)
+      : base(collection) {
+      checkedState = new Dictionary<T, bool>();
+      foreach (var item in collection) {
+        if (!checkedState.ContainsKey(item))
+          checkedState.Add(item, false);
+      }
+    }
+    [StorableConstructor]
+    protected CheckedItemList(bool deserializing) : base(deserializing) { }
+
+    public bool ItemChecked(T item) {
+      return checkedState[item];
+    }
+
+    public bool ItemChecked(int itemIndex) {
+      return ItemChecked(this[itemIndex]);
+    }
+
+    public void SetItemCheckedState(T item, bool checkedState) {
+      if (!this.checkedState.ContainsKey(item)) throw new ArgumentException();
+      if (this.checkedState[item] != checkedState) {
+        this.checkedState[item] = checkedState;
+        OnCheckedItemsChanged(new IndexedItem<T>[] { new IndexedItem<T>(IndexOf(item), item) });
+      }
+    }
+
+    public void SetItemCheckedState(int itemIndex, bool checkedState) {
+      SetItemCheckedState(this[itemIndex], checkedState);
+    }
+
+    protected override void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
+      foreach (var oldIndexedItem in oldItems) {
+        checkedState.Remove(oldIndexedItem.Value);
+      }
+      foreach (var indexedItem in items) {
+        if (!checkedState.ContainsKey(indexedItem.Value))
+          checkedState.Add(indexedItem.Value, false);
+      }
+      base.OnCollectionReset(items, oldItems);
+    }
+
+    protected override void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
+      foreach (var indexedItem in items)
+        if (!checkedState.ContainsKey(indexedItem.Value))
+          checkedState.Add(indexedItem.Value, false);
+      base.OnItemsAdded(items);
+    }
+
+    protected override void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
+      foreach (var indexedItem in items)
+        checkedState.Remove(indexedItem.Value);
+      base.OnItemsRemoved(items);
+    }
+
+    protected override void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
+      foreach (var oldIndexedItem in oldItems)
+        checkedState.Remove(oldIndexedItem.Value);
+      foreach (var indexedItem in items)
+        if (!checkedState.ContainsKey(indexedItem.Value))
+          checkedState.Add(indexedItem.Value, false);
+      base.OnItemsReplaced(items, oldItems);
+    }
+
+    protected virtual void OnCheckedItemsChanged(IEnumerable<IndexedItem<T>> items) {
+      RaiseCheckedItemsChanged(new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+    }
+
+    public event CollectionItemsChangedEventHandler<IndexedItem<T>> CheckedItemsChanged;
+    private void RaiseCheckedItemsChanged(CollectionItemsChangedEventArgs<IndexedItem<T>> e) {
+      var handler = CheckedItemsChanged;
+      if (handler != null) handler(this, e);
+    }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      CheckedItemList<T> clone = (CheckedItemList<T>)Activator.CreateInstance(this.GetType());
+      cloner.RegisterClonedObject(this, clone);
+      clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
+      clone.checkedState = new Dictionary<T, bool>();
+      foreach (var pair in checkedState)
+        clone.checkedState.Add((T)cloner.Clone(pair.Key), pair.Value);
+      return clone;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 3564)
+++ /trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 3565)
@@ -103,4 +103,5 @@
     <None Include="HeuristicLabCorePlugin.cs.frame" />
     <Compile Include="Collections\CheckedItemCollection.cs" />
+    <Compile Include="Collections\CheckedItemList.cs" />
     <Compile Include="Collections\ReadOnlyItemDictionary.cs" />
     <Compile Include="Collections\ItemDictionary.cs" />
@@ -124,4 +125,5 @@
     <Compile Include="Collections\ValueParameterCollection.cs" />
     <Compile Include="Collections\VariableCollection.cs" />
+    <Compile Include="Interfaces\ICheckedItemList.cs" />
     <Compile Include="Interfaces\ICheckedItemCollection.cs" />
     <Compile Include="PersistenceContentManager.cs" />
Index: /trunk/sources/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs	(revision 3565)
+++ /trunk/sources/HeuristicLab.Core/3.3/Interfaces/ICheckedItemList.cs	(revision 3565)
@@ -0,0 +1,32 @@
+#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 <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Collections;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Core {
+  public interface ICheckedItemList<T> : IItemList<T> where T : class, IItem {
+    event CollectionItemsChangedEventHandler<IndexedItem<T>> CheckedItemsChanged;
+    IEnumerable<IndexedItem<T>> CheckedItems { get; }
+    bool ItemChecked(T item);
+    void SetItemCheckedState(T item, bool checkedState);
+  }
+}
