Index: /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBase.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBase.cs	(revision 1668)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// An abstract base class for all kinds of arrays.
+  /// </summary>
+  public abstract class ArrayDataBase : ObjectData {
+    /// <summary>
+    /// Gets or sets the elements of the array.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ObjectData.Data"/> of base class <see cref="ObjectData"/>. 
+    /// No own data storage present.</remarks>
+    public new virtual Array Data {
+      get { return (Array)base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// The string representation of the array.
+    /// </summary>
+    /// <returns>The elements of the array as a string seperated by a semicolon.</returns>
+    public override string ToString() {
+      if (Data.Length <= 0) return "Empty Array";
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data.GetValue(i).ToString());
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.Designer.cs	(revision 1668)
@@ -0,0 +1,109 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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;
+namespace HeuristicLab.Data {
+  partial class ArrayDataBaseView {
+    /// <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.sizeLabel = new System.Windows.Forms.Label();
+      this.lengthTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // sizeLabel
+      // 
+      this.sizeLabel.AutoSize = true;
+      this.sizeLabel.Location = new System.Drawing.Point(3, 4);
+      this.sizeLabel.Name = "sizeLabel";
+      this.sizeLabel.Size = new System.Drawing.Size(30, 13);
+      this.sizeLabel.TabIndex = 0;
+      this.sizeLabel.Text = "Size:";
+      // 
+      // lengthTextBox
+      // 
+      this.lengthTextBox.AcceptsReturn = true;
+      this.lengthTextBox.Location = new System.Drawing.Point(39, 1);
+      this.lengthTextBox.Name = "lengthTextBox";
+      this.lengthTextBox.Size = new System.Drawing.Size(110, 20);
+      this.lengthTextBox.TabIndex = 1;
+      this.lengthTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lengthTextBox_Validating);
+      this.lengthTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lengthTextBox_KeyDown);
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.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.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Location = new System.Drawing.Point(3, 30);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(155, 226);
+      this.dataGridView.TabIndex = 2;
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      // 
+      // ArrayDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.lengthTextBox);
+      this.Controls.Add(this.sizeLabel);
+      this.Name = "ArrayDataView";
+      this.Size = new System.Drawing.Size(163, 259);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label sizeLabel;
+    private System.Windows.Forms.TextBox lengthTextBox;
+    protected System.Windows.Forms.DataGridView dataGridView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.cs	(revision 1668)
@@ -0,0 +1,166 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="ArrayDataBase"/>.
+  /// </summary>
+  public partial class ArrayDataBaseView : ViewBase {
+    /// <summary>
+    /// Gets or sets the instance of the array to represent.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public ArrayDataBase ArrayDataBase {
+      get { return (ArrayDataBase)Item; }
+      protected set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ArrayDataBaseView"/>.
+    /// </summary>
+    public ArrayDataBaseView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="ArrayDataBase"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ArrayDataBase.Changed -= new EventHandler(ArrayDataBase_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="ArrayDataBase"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ArrayDataBase.Changed += new EventHandler(ArrayDataBase_Changed);
+    }
+
+    /// <summary>
+    /// Validates the given data.
+    /// <note type="caution"> Needs to be overridden in each inherited class!</note>
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when method is not 
+    /// overridden in inherited class.</exception>
+    /// <param name="element">The data to validate.</param>
+    /// <returns><c>true</c> if the data is valid, <c>false</c> otherwise.</returns>
+    protected virtual bool ValidateData(string element) {
+      throw new InvalidOperationException("ValidateData has to be overridden in each inherited class");
+    }
+    /// <summary>
+    /// Replaces an element at the given <paramref name="index"/> 
+    /// with the given <paramref name="element"/>.
+    /// <note type="caution"> Needs to be overridden in each inherited class!</note>
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when method is not 
+    /// overridden in inherited class.</exception>
+    /// <param name="index">The position where to substitute the element.</param>
+    /// <param name="element">The element to insert.</param>
+    protected virtual void SetArrayElement(int index, string element) {
+      throw new InvalidOperationException("SetArrayElement has to be overridden in each inherited class");
+    }
+
+    /// <summary>
+    /// Updates all controls and the elements of the table with the latest values.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ArrayDataBase != null) {
+        int length = ArrayDataBase.Data.Length;
+        lengthTextBox.Text = length + "";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = length;
+        for (int i = 0; i < length; i++) {
+          dataGridView.Rows[i].Cells[0].Value = ArrayDataBase.Data.GetValue(i);
+        }
+      } else {
+        lengthTextBox.Text = "0";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = 0;
+      }
+    }
+
+    private void lengthTextBox_Validating(object sender, CancelEventArgs e) {
+      int newLength;
+      if (int.TryParse(lengthTextBox.Text, out newLength)) {
+        if (newLength > 0) {
+          e.Cancel = false;
+          if (newLength != ArrayDataBase.Data.Length) {
+            CreateAndCopyArray(newLength);
+          }
+        } else {
+          // only allow values greater than 0
+          e.Cancel = true;
+        }
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    /// <summary>
+    /// Creates a new array having the specified number (<paramref name="newLength"/>) of elements of the 
+    /// current instance (starting from the beginning).
+    /// </summary>
+    /// <param name="newLength">The size/number of elements of the new array.</param>
+    private void CreateAndCopyArray(int newLength) {
+      Array newArray = Array.CreateInstance(ArrayDataBase.Data.GetType().GetElementType(), newLength);
+      Array.Copy(ArrayDataBase.Data, newArray, Math.Min(newLength, ArrayDataBase.Data.Length));
+      ArrayDataBase.Data = newArray;
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (ValidateData((string)e.FormattedValue)) {
+        SetArrayElement(e.RowIndex, (string)e.FormattedValue);
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void lengthTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) {
+        e.SuppressKeyPress = true;
+        dataGridView.Focus();
+      }
+    }
+
+    #region ArrayDataBase Events
+    private void ArrayDataBase_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ArrayDataBaseView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 1668)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// An array consisting of boolean values.
+  /// </summary>
+  public class BoolArrayData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the boolean elements of the array.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase.Data"/> of base class <see cref="ArrayDataBase"/>. 
+    /// No own data storage present.</remarks>
+    public new bool[] Data {
+      get { return (bool[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BoolArrayData"/> class.
+    /// </summary>
+    public BoolArrayData() {
+      Data = new bool[0];
+    }
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BoolArrayData"/> class. 
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The boolean array the instance should represent.</param>
+    public BoolArrayData(bool[] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the <see cref="BoolArrayDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance of the <see cref="BoolArrayDataView"/>.</returns>
+    public override IView CreateView() {
+      return new BoolArrayDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The boolean elements of the array are saved as string in the node's inner text, each element separated by a semicolon.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString();
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted boolean array from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks> The elements of the boolean array must be saved in the node's inner 
+    /// text as a string, each element separated by a semicolon 
+    /// (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">A Dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      string[] tokens = node.InnerText.Split(';');
+      bool[] data = new bool[tokens.Length];
+      for (int i = 0; i < data.Length; i++)
+        data[i] = bool.Parse(tokens[i]);
+      Data = data;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class BoolArrayDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArrayDataView.cs	(revision 1668)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="BoolArrayData"/>, 
+  /// symbolizing an array of boolean values.
+  /// </summary>
+  public partial class BoolArrayDataView : ArrayDataBaseView {
+    /// <summary>
+    /// Gets or sets the instance of the boolean array to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of 
+    /// base class <see cref="ArrayDataBaseView"/>. No own data storage present.</remarks>
+    public BoolArrayData BoolArrayData {
+      get { return (BoolArrayData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolArrayDataView"/>.
+    /// </summary>
+    public BoolArrayDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolArrayDataView"/> 
+    /// with the given <paramref name="boolArrayData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="boolArrayData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="boolArrayData">The boolean array to represent visually.</param>
+    public BoolArrayDataView(BoolArrayData boolArrayData)
+      : this() {
+      BoolArrayData = boolArrayData;
+    }
+
+    /// <summary>
+    /// Sets the element on position <paramref name="index"/> to the
+    /// given <paramref name="element"/> as boolean value.
+    /// </summary>
+    /// <param name="index">The position where to substitute the element.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int index, string element) {
+      bool result;
+      bool.TryParse(element, out result);
+
+      BoolArrayData.Data[index] = result;
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted to a boolean value.
+    /// </summary>
+    /// <param name="element">The data to validate.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      bool result;
+      return element != null && bool.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolData.cs	(revision 1668)
@@ -0,0 +1,102 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Class to represent boolean values.
+  /// </summary>
+  public class BoolData : ObjectData {
+    /// <summary>
+    /// Gets or sets the boolean value.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ObjectData.Data"/>
+    /// of base class <see cref="ObjectData"/>. No own data storage present.</remarks>
+    public new bool Data {
+      get { return (bool)base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="BoolData"/> with default value <c>false</c>.
+    /// </summary>
+    public BoolData() {
+      Data = false;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="BoolData"/> with the boolean value <paramref name="data"/>.
+    /// </summary>
+    /// <param name="data">The boolean value to assign.</param>
+    public BoolData(bool data) {
+      Data = data;
+    }
+    /// <summary>
+    /// Creates a new instance of the <see cref="BoolDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance of the <see cref="BoolDataView"/>.</returns>
+    public override IView CreateView() {
+      return new BoolDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>The cloned instance is added to the <paramref name="dictionary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="BoolData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      BoolData clone = new BoolData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The boolean value is saved as string in the inner text of the node.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString();
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted boolean value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks> The boolean value must be saved as string in the node's inner text 
+    /// (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the boolean value is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = bool.Parse(node.InnerText);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class BoolDataView {
+    /// <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.dataCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // dataCheckBox
+      // 
+      this.dataCheckBox.AutoSize = true;
+      this.dataCheckBox.Location = new System.Drawing.Point(0, 0);
+      this.dataCheckBox.Name = "dataCheckBox";
+      this.dataCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.dataCheckBox.TabIndex = 1;
+      this.dataCheckBox.UseVisualStyleBackColor = true;
+      this.dataCheckBox.CheckedChanged += new System.EventHandler(this.dataCheckBox_CheckedChanged);
+      // 
+      // BoolDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataCheckBox);
+      this.Name = "BoolDataView";
+      this.Size = new System.Drawing.Size(19, 18);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox dataCheckBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.cs	(revision 1668)
@@ -0,0 +1,103 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="BoolData"/>, symbolizing a boolean value. 
+  /// </summary>
+  public partial class BoolDataView : ViewBase {
+    /// <summary>
+    /// Gets or sets the boolean value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public BoolData BoolData {
+      get { return (BoolData)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolDataView"/>.
+    /// </summary>
+    public BoolDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolDataView"/> with the given 
+    /// <paramref name="boolData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="boolData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="boolData">The boolean value to represent visually.</param>
+    public BoolDataView(BoolData boolData)
+      : this() {
+      BoolData = boolData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="BoolData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      BoolData.Changed -= new EventHandler(BoolData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="BoolData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      BoolData.Changed += new EventHandler(BoolData_Changed);
+    }
+
+    /// <summary>
+    /// Sets the <c>dataCheckBox</c> checked or unchecked according to the latest value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (BoolData == null) {
+        dataCheckBox.Enabled = false;
+      } else {
+        dataCheckBox.Enabled = true;
+        dataCheckBox.Checked = BoolData.Data;
+      }
+    }
+
+    private void dataCheckBox_CheckedChanged(object sender, EventArgs e) {
+      BoolData.Data = dataCheckBox.Checked;
+    }
+
+    private void BoolData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixData.cs	(revision 1668)
@@ -0,0 +1,125 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A two-dimensional matrix consisting of boolean values.
+  /// </summary>
+  public class BoolMatrixData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the boolean elements of the matrix.
+    /// </summary>
+    /// <remarks>Uses the property <see cref="ArrayDataBase.Data"/> of base 
+    /// class <see cref="ArrayDataBase"/>. No own data storage present.</remarks>
+    public new bool[,] Data {
+      get { return (bool[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BoolMatrixData"/> class.
+    /// </summary>
+    public BoolMatrixData() {
+      Data = new bool[1, 1];
+    }
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BoolMatrixData"/> class.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The boolean matrix the instance should represent.</param>
+    public BoolMatrixData(bool[,] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the <see cref="BoolMatrixDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance of the <see cref="BoolMatrixDataView"/>.</returns>
+    public override IView CreateView() {
+      return new BoolMatrixDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix are saved as attributes (<c>Dimension1</c>,<c>Dimension2</c>).<br/>
+    /// The elements of the matrix are saved as string in the node's inner text, 
+    /// each element separated by a semicolon, all line by line.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString();
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted boolean matrix from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix must be saved as Attributes (<c>Dimension1</c>, <c>Dimension2</c>). <br/>
+    /// The elements of the matrix must be saved in the node's inner text as string, 
+    /// each element separated by a semicolon, line by line (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      bool[,] data = new bool[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          data[i, j] = bool.Parse(tokens[i * dim2 + j]);
+        }
+      }
+      Data = data;
+    }
+    /// <summary>
+    /// The string representation of the matrix.
+    /// </summary>
+    /// <returns>The elements of the matrix as a string seperated by semicolons, line by line.</returns>
+    public override string ToString() {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString());
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class BoolMatrixDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolMatrixDataView.cs	(revision 1668)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="BoolMatrixData"/>, symbolizing a two-dimensional
+  /// matrix of boolean values.
+  /// </summary>
+  public partial class BoolMatrixDataView : MatrixDataBaseView {
+    /// <summary>
+    /// Gets or sets the instance of the boolean matrix to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of 
+    /// base class <see cref="ArrayDataBaseView"/>. No own data storage present.</remarks>
+    public BoolMatrixData BoolMatrixData {
+      get { return (BoolMatrixData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolMatrixDataView"/>.
+    /// </summary>
+    public BoolMatrixDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="BoolMatrixDataView"/> with the given
+    /// <paramref name="boolMatrixData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="boolMatrixData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="boolMatrixData">The boolean matrix to represent visually.</param>
+    public BoolMatrixDataView(BoolMatrixData boolMatrixData)
+      : this() {
+      BoolMatrixData = boolMatrixData;
+    }
+
+    /// <summary>
+    /// Subsitutes an element in the given <paramref name="row"/> and the given 
+    /// <paramref name="column"/> with the given <paramref name="element"/>.
+    /// </summary>
+    /// <param name="row">The row of the element to substitute.</param>
+    /// <param name="column">The column of the element to substitute.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int row, int column, string element) {
+      bool result;
+      bool.TryParse(element, out result);
+
+      BoolMatrixData.Data[row, column] = result;
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted to a boolean value.
+    /// </summary>
+    /// <param name="element">The element to check.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      bool result;
+      return element != null && bool.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleData.cs	(revision 1668)
@@ -0,0 +1,113 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Represents a double value having some constraints (e.g. smaller than 5.3).
+  /// </summary>
+  public class ConstrainedDoubleData : ConstrainedObjectData {
+    /// <summary>
+    /// Gets or sets the double value of the current instance as <see cref="DoubleData"/>.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ConstrainedObjectData.Data"/> of base 
+    /// class <see cref="ConstrainedObjectData"/>. No own data storage present.</remarks>
+    public new double Data {
+      get { return ((DoubleData)base.Data).Data; }
+      set { ((DoubleData)base.Data).Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedDoubleData"/> with default value <c>0.0</c>.
+    /// </summary>
+    public ConstrainedDoubleData() : this (0.0) {
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedDoubleData"/> with the specified 
+    /// double value <paramref name="data"/> as <see cref="DoubleData"/>.
+    /// </summary>
+    /// <param name="data">The double value to represent.</param>
+    public ConstrainedDoubleData(double data) : base() {
+      base.Data = new DoubleData(data);
+    }
+
+    /// <inheritdoc cref="ConstrainedObjectData.TrySetData(object)"/>
+    public virtual bool TrySetData(double data) {
+      return base.TrySetData(new DoubleData(data));
+    }
+    /// <inheritdoc cref="ConstrainedObjectData.TrySetData(object, out System.Collections.Generic.ICollection&lt;HeuristicLab.Core.IConstraint&gt;)"/>
+    public virtual bool TrySetData(double data, out ICollection<IConstraint> violatedConstraints) {
+      return base.TrySetData(new DoubleData(data), out violatedConstraints);
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ConstrainedDoubleDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ConstrainedDoubleDataView"/>.</returns>
+    public override IView CreateView() {
+      return new ConstrainedDoubleDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>Uses the <see cref="ConstrainedObjectData.Clone"/> implementation of base class <see cref="ConstrainedObjectData"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="ConstrainedDoubleData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedDoubleData clone = (ConstrainedDoubleData)base.Clone(clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Uses the <see cref="ConstrainedItemBase.GetXmlNode"/> implementation of base class 
+    /// <see cref="ConstrainedObjectData"/>. The double value is saved as a <see cref="DoubleData"/> 
+    /// in a child node having the tag name <c>Value</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Value", (DoubleData) base.Data, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted double value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The double value must be saved in the child node as a persisted <see cref="DoubleData"/>
+    /// having the tag name <c>Value</c> (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the double is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      base.Data = (DoubleData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class ConstrainedDoubleDataView {
+    /// <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.dataTextBox = new System.Windows.Forms.TextBox();
+      this.constrainedDataBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(344, 20);
+      this.dataTextBox.TabIndex = 0;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // constrainedDataBaseView
+      // 
+      this.constrainedDataBaseView.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.constrainedDataBaseView.Caption = "Constrained Data";
+      this.constrainedDataBaseView.ConstrainedItem = null;
+      this.constrainedDataBaseView.Location = new System.Drawing.Point(0, 26);
+      this.constrainedDataBaseView.Name = "constrainedDataBaseView";
+      this.constrainedDataBaseView.Size = new System.Drawing.Size(344, 204);
+      this.constrainedDataBaseView.TabIndex = 1;
+      // 
+      // ConstrainedIntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.constrainedDataBaseView);
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "ConstrainedIntDataView";
+      this.Size = new System.Drawing.Size(344, 230);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedDataBaseView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.cs	(revision 1668)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="ConstrainedDoubleData"/>, 
+  /// symbolizing a double value being restricted to some constraints.
+  /// </summary>
+  public partial class ConstrainedDoubleDataView : ViewBase {
+    /// <summary>
+    /// Gets or sets the double value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>,
+    /// but also own data storage present.</remarks>
+    public ConstrainedDoubleData ConstrainedDoubleData {
+      get { return (ConstrainedDoubleData)Item; }
+      set {
+        base.Item = value;
+        constrainedDataBaseView.ConstrainedItem = value;
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ConstrainedDoubleDataView"/>.
+    /// </summary>
+    public ConstrainedDoubleDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ConstrainedDoubleDataView"/> with the given
+    /// <paramref name="constraintDoubleData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="constraintDoubleData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="constraintDoubleData">The double value to represent visually.</param>
+    public ConstrainedDoubleDataView(ConstrainedDoubleData constraintDoubleData)
+      : this() {
+      ConstrainedDoubleData = constraintDoubleData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="ConstrainedDoubleData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ConstrainedDoubleData.Changed -= new EventHandler(ConstrainedDoubleData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="ConstrainedDoubleData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedDoubleData.Changed += new EventHandler(ConstrainedDoubleData_Changed);
+    }
+
+    /// <summary>
+    /// Updates the constrols with the latest double value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ConstrainedDoubleData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = ConstrainedDoubleData.Data.ToString("r");
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      double value;
+      try {
+        value = double.Parse(dataTextBox.Text);
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedDoubleData.TrySetData(value, out violatedConstraints)) {
+          if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes)
+            ConstrainedDoubleData.Data = value;
+          else
+            e.Cancel = true;
+        }
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void ConstrainedDoubleData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedDoubleDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntData.cs	(revision 1668)
@@ -0,0 +1,113 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The representation of an int value having some constraints (e.g. smaller than 2).
+  /// </summary>
+  public class ConstrainedIntData : ConstrainedObjectData {
+    /// <summary>
+    /// Gets or sets the int value of the current instance as <see cref="IntData"/>.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ConstrainedObjectData.Data"/> of base class 
+    /// <see cref="ConstrainedObjectData"/>. No own data storage present.</remarks>
+    public new int Data {
+      get { return ((IntData)base.Data).Data; }
+      set { ((IntData)base.Data).Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedIntData"/> with default value <c>0</c>.
+    /// </summary>
+    public ConstrainedIntData() : this (0) {
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedIntData"/> with the specified 
+    /// int value <paramref name="data"/> as <see cref="IntData"/>.
+    /// </summary>
+    /// <param name="data">The integer value to represent.</param>
+    public ConstrainedIntData(int data) : base() {
+      base.Data = new IntData(data);
+    }
+
+    /// <inheritdoc cref="ConstrainedObjectData.TrySetData(object)"/>
+    public virtual bool TrySetData(int data) {
+      return base.TrySetData(new IntData(data));
+    }
+    /// <inheritdoc cref="ConstrainedObjectData.TrySetData(object, out System.Collections.Generic.ICollection&lt;HeuristicLab.Core.IConstraint&gt;)"/>
+    public virtual bool TrySetData(int data, out ICollection<IConstraint> violatedConstraints) {
+      return base.TrySetData(new IntData(data), out violatedConstraints);
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ConstrainedIntDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ConstrainedIntDataView"/>.</returns>
+    public override IView CreateView() {
+      return new ConstrainedIntDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>Uses the <see cref="ConstrainedObjectData.Clone"/> implementation of base class <see cref="ConstrainedObjectData"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The clone instance as <see cref="ConstrainedIntData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedIntData clone = (ConstrainedIntData)base.Clone(clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Uses the <see cref="ConstrainedItemBase.GetXmlNode"/> implementation of base class 
+    /// <see cref="ConstrainedObjectData"/>. The int value is saved as a <see cref="IntData"/> 
+    /// in a child node having the tag name <c>Value</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Value", ((IntData)base.Data), document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted int value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The int value must be saved in the child node as a persisted <see cref="IntData"/>
+    /// having the tag name <c>Value</c> (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the int is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      base.Data = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class ConstrainedIntDataView {
+    /// <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.dataTextBox = new System.Windows.Forms.TextBox();
+      this.constrainedDataBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(344, 20);
+      this.dataTextBox.TabIndex = 0;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // constrainedDataBaseView
+      // 
+      this.constrainedDataBaseView.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.constrainedDataBaseView.Caption = "Constrained Data";
+      this.constrainedDataBaseView.ConstrainedItem = null;
+      this.constrainedDataBaseView.Location = new System.Drawing.Point(0, 26);
+      this.constrainedDataBaseView.Name = "constrainedDataBaseView";
+      this.constrainedDataBaseView.Size = new System.Drawing.Size(344, 204);
+      this.constrainedDataBaseView.TabIndex = 1;
+      // 
+      // ConstrainedIntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.constrainedDataBaseView);
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "ConstrainedIntDataView";
+      this.Size = new System.Drawing.Size(344, 230);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constrainedDataBaseView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.cs	(revision 1668)
@@ -0,0 +1,122 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="ConstrainedIntDataView"/>, 
+  /// symbolizing an int value with some constraints.
+  /// </summary>
+  public partial class ConstrainedIntDataView : ViewBase {
+    /// <summary>
+    /// Gets or sets the int value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>,
+    /// but also own data storage present.</remarks>
+    public ConstrainedIntData ConstrainedIntData {
+      get { return (ConstrainedIntData)Item; }
+      set {
+        base.Item = value;
+        constrainedDataBaseView.ConstrainedItem = value;
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of class <see cref="ConstrainedIntDataView"/>.
+    /// </summary>
+    public ConstrainedIntDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of class <see cref="ConstrainedIntDataView"/> with the given
+    /// <paramref name="constraintIntData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="constraintIntData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="constraintIntData">The int value to represent visually.</param>
+    public ConstrainedIntDataView(ConstrainedIntData constraintIntData)
+      : this() {
+      ConstrainedIntData = constraintIntData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="ConstrainedIntData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ConstrainedIntData.Changed -= new EventHandler(ConstrainedIntData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="ConstrainedIntData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedIntData.Changed += new EventHandler(ConstrainedIntData_Changed);
+    }
+
+    /// <summary>
+    /// Updates the controls with the latest int value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ConstrainedIntData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = ConstrainedIntData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      int value;
+      try {
+        value = int.Parse(dataTextBox.Text);
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedIntData.TrySetData(value, out violatedConstraints)) {
+          if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes)
+            ConstrainedIntData.Data = value;
+          else
+            e.Cancel = true;
+        }
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void ConstrainedIntData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedIntDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemList.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemList.cs	(revision 1668)
@@ -0,0 +1,358 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A class representing a list of elements 
+  /// (which are implementing the interface <see cref="IItem"/>) having some constraints.
+  /// </summary>
+  public class ConstrainedItemList : ConstrainedItemBase, IEnumerable, IEnumerable<IItem> {
+    private List<IItem> list;
+    private bool suspendConstraintCheck;
+
+    /// <summary>
+    /// Checks whether the test for the constraints is suspended. 
+    /// </summary>
+    public bool ConstraintCheckSuspended {
+      get { return suspendConstraintCheck; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedItemList"/> with the constraint check enabled.
+    /// </summary>
+    public ConstrainedItemList()
+      : base() {
+      list = new List<IItem>();
+      suspendConstraintCheck = false;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ConstrainedItemListView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ConstrainedItemListView"/>.</returns>
+    public override IView CreateView() {
+      return new ConstrainedItemListView(this);
+    }
+
+    #region Clone & Persistence
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>The elements of the current instance are cloned with the 
+    /// <see cref="HeuristicLab.Core.Auxiliary.Clone"/> method of the class <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="ConstrainedItemList"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedItemList clone = new ConstrainedItemList();
+      clonedObjects.Add(Guid, clone);
+      foreach (IConstraint constraint in Constraints)
+        clone.AddConstraint((IConstraint)Auxiliary.Clone(constraint, clonedObjects));
+      clone.suspendConstraintCheck = suspendConstraintCheck;
+      foreach (IItem item in list) {
+        clone.list.Add((IItem)Auxiliary.Clone(item, clonedObjects));
+      }
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The basic instance is saved through the call of 
+    /// <see cref="HeuristicLab.Core.ConstrainedItemBase.GetXmlNode"/> of base class 
+    /// <see cref="ConstrainedItemBase"/>. <br/>
+    /// The list itself is saved as child node having the tag name <c>ListItems</c> 
+    /// and each element is saved as a child node of the <c>ListItems</c> node. 
+    /// The <c>suspendConstraintCheck</c> attribute is saved as an attribute of the list node 
+    /// having the tag name <c>SuspendConstraintCheck</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode listNode = document.CreateNode(XmlNodeType.Element, "ListItems", null);
+      for (int i = 0; i < list.Count; i++)
+        listNode.AppendChild(PersistenceManager.Persist(list[i], document, persistedObjects));
+      XmlAttribute sccAttrib = document.CreateAttribute("SuspendConstraintCheck");
+      sccAttrib.Value = suspendConstraintCheck.ToString();
+      listNode.Attributes.Append(sccAttrib);
+      node.AppendChild(listNode);
+      return node;
+    }
+
+    /// <summary>
+    /// Loads the persisted int value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The elements of the list must be saved as child nodes of 
+    /// the node with the tag name <c>ListItems</c>, which itself is a child node of the current instance.<br/>
+    /// The <c>suspendConstraintCheck</c> must be saved as attribute of the list node 
+    /// with the tag name <c>SuspendConstraintCheck</c> (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the int is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode listNode = node.SelectSingleNode("ListItems");
+      list = new List<IItem>();
+      for (int i = 0; i < listNode.ChildNodes.Count; i++)
+        list.Add((IItem)PersistenceManager.Restore(listNode.ChildNodes[i], restoredObjects));
+      suspendConstraintCheck = bool.Parse(listNode.Attributes["SuspendConstraintCheck"].Value);
+    }
+    #endregion
+
+    /// <summary>
+    /// The string representation of the current list instance.
+    /// </summary>
+    /// <returns>The current list as string, each element separated by a semicolon. 
+    /// "Empty List" if the list has no elements.</returns>
+    public override string ToString() {
+      if (list.Count > 0) {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(list[0].ToString());
+        for (int i = 1; i < list.Count; i++) {
+          builder.Append(";");
+          builder.Append(list[i].ToString());
+        }
+        return builder.ToString();
+      } else {
+        return "Empty List";
+      }
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.IndexOf(T)"/>
+    public int IndexOf(IItem item) {
+      return list.IndexOf(item);
+    }
+
+    /// <summary>
+    /// Sets <c>suspendConstraintCheck</c> to <c>true</c>.
+    /// </summary>
+    public void BeginCombinedOperation() {
+      suspendConstraintCheck = true;
+    }
+
+    /// <summary>
+    /// Checks whether the current instance fulfills all constraints.
+    /// </summary>
+    /// <param name="violatedConstraints">Output parameter, 
+    /// contains all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if all constraints could be fulfilled, <c>false</c> otherwise.</returns>
+    public bool EndCombinedOperation(out ICollection<IConstraint> violatedConstraints) {
+      if (IsValid(out violatedConstraints))
+        suspendConstraintCheck = false;
+      else
+        suspendConstraintCheck = true;
+
+      return !suspendConstraintCheck;
+    }
+
+    /// <summary>
+    /// Adds a new <paramref name="item"/> at a specified <paramref name="index"/> to the current instance if all constraints are fulfilled.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemAdded"/> if the insertion was successful.</remarks>
+    /// <param name="index">The position where to insert the new element.</param>
+    /// <param name="item">The new element to insert.</param>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the insertion was successful, <c>false</c> otherwise.</returns>
+    public bool TryInsert(int index, IItem item, out ICollection<IConstraint> violatedConstraints) {
+      list.Insert(index, item);
+      violatedConstraints = new List<IConstraint>();
+      if (suspendConstraintCheck || IsValid(out violatedConstraints)) {
+        OnItemAdded(item, index);
+        return true;
+      } else {
+        list.RemoveAt(index);
+        return false;
+      }
+    }
+
+    /// <summary>
+    /// Removes an element at the specified <paramref name="index"/> 
+    /// from the current instance if all constraints are fulfilled.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemRemoved"/> if the deletion was successful.</remarks>
+    /// <param name="index">The position where to remove the element.</param>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the element could be removed successfully, <c>false</c> otherwise.</returns>
+    public bool TryRemoveAt(int index, out ICollection<IConstraint> violatedConstraints) {
+      IItem item = list[index];
+      list.RemoveAt(index);
+      violatedConstraints = new List<IConstraint>();
+      if (suspendConstraintCheck || IsValid(out violatedConstraints)) {
+        OnItemRemoved(item, index);
+        return true;
+      } else {
+        list.Insert(index, item);
+        return false;
+      }
+    }
+
+    /// <summary>
+    /// Gets the element of the current instance at the specified <paramref name="index"/>.
+    /// </summary>
+    /// <param name="index">The position of the searched element.</param>
+    /// <returns>The searched element as <see cref="IItem"/>.</returns>
+    public IItem this[int index] {
+      get { return list[index]; }
+    }
+
+    /// <summary>
+    /// Changes the element at a specified position if all constraints are fulfilled.
+    /// </summary>
+    /// <param name="index">The position where to change the element.</param>
+    /// <param name="item">The element that replaces the current one.</param>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the substitution was successful, <c>false</c> otherwise.</returns>
+    public bool TrySetAt(int index, IItem item, out ICollection<IConstraint> violatedConstraints) {
+      IItem backup = this[index];
+      list[index] = item;
+      violatedConstraints = new List<IConstraint>();
+      if (suspendConstraintCheck || IsValid(out violatedConstraints)) {
+        return true;
+      } else {
+        list[index] = backup;
+        return false;
+      }
+    }
+
+    /// <summary>
+    /// Adds a new <paramref name="item"/> to the current list if all constraints are fulfilled.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemAdded"/> if the add was successful.</remarks>
+    /// <param name="item">The element to add.</param>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the element could be successfully added, <c>false</c> otherwise.</returns>
+    public bool TryAdd(IItem item, out ICollection<IConstraint> violatedConstraints) {
+      list.Add(item);
+      violatedConstraints = new List<IConstraint>();
+      if (suspendConstraintCheck || IsValid(out violatedConstraints)) {
+        OnItemAdded(item, list.Count - 1);
+        return true;
+      } else {
+        list.RemoveAt(list.Count - 1);
+        return false;
+      }
+    }
+    /// <summary>
+    /// Empties the current list.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnCleared"/>.</remarks>
+    public void Clear() {
+      list.Clear();
+      OnCleared();
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.Contains"/>
+    public bool Contains(IItem item) {
+      return list.Contains(item);
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.CopyTo(T[],int)"/>
+    public void CopyTo(IItem[] array, int arrayIndex) {
+      list.CopyTo(array, arrayIndex);
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.Count"/>
+    public int Count {
+      get { return list.Count; }
+    }
+    /// <summary>
+    /// Checks whether the current instance is read-only.
+    /// </summary>
+    /// <remarks>Always returns <c>false</c>.</remarks>
+    public bool IsReadOnly {
+      get { return false; }
+    }
+    /// <summary>
+    /// Removes a specified <paramref name="item"/> from the 
+    /// current instance if all constraints are fulfilled.
+    /// </summary>
+    /// <param name="item">The element to remove.</param>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the deletion was successful, <c>false</c> otherwise.</returns>
+    public bool TryRemove(IItem item, out ICollection<IConstraint> violatedConstraints) {
+      int index = list.IndexOf(item);
+      if (index >= 0) {
+        return TryRemoveAt(index, out violatedConstraints);
+      } else {
+        violatedConstraints = new List<IConstraint>();
+        return false;
+      }
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.GetEnumerator"/>
+    public IEnumerator<IItem> GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.GetEnumerator"/>
+    IEnumerator IEnumerable.GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    /// <summary>
+    /// Occurs when a new item is added.
+    /// </summary>
+    public event EventHandler<ItemIndexEventArgs> ItemAdded;
+    /// <summary>
+    /// Fires a new <c>ItemAdded</c> event.
+    /// </summary>         
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="item">The element that was added.</param>
+    /// <param name="index">The position where the element was added.</param>
+    protected virtual void OnItemAdded(IItem item, int index) {
+      if (ItemAdded != null)
+        ItemAdded(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    /// <summary>
+    /// Occurs when an element is removed from the current instance.
+    /// </summary>
+    public event EventHandler<ItemIndexEventArgs> ItemRemoved;
+    /// <summary>
+    /// Fires a new <c>ItemRemoved</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="item">The element that has been removed.</param>
+    /// <param name="index">The position from where it has been removed.</param>
+    protected virtual void OnItemRemoved(IItem item, int index) {
+      if (ItemRemoved != null)
+        ItemRemoved(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    /// <summary>
+    /// Occurs when the current list is emptied.
+    /// </summary>
+    public event EventHandler Cleared;
+    /// <summary>
+    /// Fires a new <c>Cleared</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    protected virtual void OnCleared() {
+      if (Cleared != null)
+        Cleared(this, new EventArgs());
+      OnChanged();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.Designer.cs	(revision 1668)
@@ -0,0 +1,218 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class ConstrainedItemListView {
+    /// <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.itemsSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.removeItemButton = new System.Windows.Forms.Button();
+      this.addItemButton = new System.Windows.Forms.Button();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.itemsTabPage = new System.Windows.Forms.TabPage();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constraintsConstrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.itemsSplitContainer.Panel1.SuspendLayout();
+      this.itemsSplitContainer.Panel2.SuspendLayout();
+      this.itemsSplitContainer.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.itemsTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // itemsSplitContainer
+      // 
+      this.itemsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.itemsSplitContainer.Name = "itemsSplitContainer";
+      // 
+      // itemsSplitContainer.Panel1
+      // 
+      this.itemsSplitContainer.Panel1.Controls.Add(this.itemsGroupBox);
+      // 
+      // itemsSplitContainer.Panel2
+      // 
+      this.itemsSplitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.itemsSplitContainer.Size = new System.Drawing.Size(367, 378);
+      this.itemsSplitContainer.SplitterDistance = 162;
+      this.itemsSplitContainer.TabIndex = 2;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.itemsListView);
+      this.itemsGroupBox.Controls.Add(this.removeItemButton);
+      this.itemsGroupBox.Controls.Add(this.addItemButton);
+      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(162, 378);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // itemsListView
+      // 
+      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.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.Location = new System.Drawing.Point(6, 19);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowGroups = false;
+      this.itemsListView.Size = new System.Drawing.Size(153, 324);
+      this.itemsListView.TabIndex = 0;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.List;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyUp);
+      // 
+      // removeItemButton
+      // 
+      this.removeItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeItemButton.Location = new System.Drawing.Point(84, 349);
+      this.removeItemButton.Name = "removeItemButton";
+      this.removeItemButton.Size = new System.Drawing.Size(75, 23);
+      this.removeItemButton.TabIndex = 4;
+      this.removeItemButton.Text = "Remove";
+      this.removeItemButton.UseVisualStyleBackColor = true;
+      this.removeItemButton.Click += new System.EventHandler(this.removeItemButton_Click);
+      // 
+      // addItemButton
+      // 
+      this.addItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addItemButton.Location = new System.Drawing.Point(3, 349);
+      this.addItemButton.Name = "addItemButton";
+      this.addItemButton.Size = new System.Drawing.Size(75, 23);
+      this.addItemButton.TabIndex = 3;
+      this.addItemButton.Text = "Add";
+      this.addItemButton.UseVisualStyleBackColor = true;
+      this.addItemButton.Click += new System.EventHandler(this.addItemButton_Click);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(201, 378);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.itemsTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(381, 410);
+      this.tabControl.TabIndex = 5;
+      // 
+      // itemsTabPage
+      // 
+      this.itemsTabPage.Controls.Add(this.itemsSplitContainer);
+      this.itemsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.itemsTabPage.Name = "itemsTabPage";
+      this.itemsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.itemsTabPage.Size = new System.Drawing.Size(373, 384);
+      this.itemsTabPage.TabIndex = 0;
+      this.itemsTabPage.Text = "Items";
+      this.itemsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constraintsConstrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(373, 384);
+      this.constraintsTabPage.TabIndex = 1;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constraintsConstrainedItemBaseView
+      // 
+      this.constraintsConstrainedItemBaseView.Caption = "Constrained Item";
+      this.constraintsConstrainedItemBaseView.ConstrainedItem = null;
+      this.constraintsConstrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsConstrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constraintsConstrainedItemBaseView.Name = "constraintsConstrainedItemBaseView";
+      this.constraintsConstrainedItemBaseView.Size = new System.Drawing.Size(367, 378);
+      this.constraintsConstrainedItemBaseView.TabIndex = 0;
+      // 
+      // ConstrainedItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "ConstrainedItemListView";
+      this.Size = new System.Drawing.Size(381, 410);
+      this.itemsSplitContainer.Panel1.ResumeLayout(false);
+      this.itemsSplitContainer.Panel2.ResumeLayout(false);
+      this.itemsSplitContainer.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.itemsTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer itemsSplitContainer;
+    private System.Windows.Forms.Button addItemButton;
+    private System.Windows.Forms.Button removeItemButton;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage itemsTabPage;
+    private System.Windows.Forms.TabPage constraintsTabPage;
+    private System.Windows.Forms.GroupBox itemsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private HeuristicLab.Core.ConstrainedItemBaseView constraintsConstrainedItemBaseView;
+    private System.Windows.Forms.ListView itemsListView;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.cs	(revision 1668)
@@ -0,0 +1,208 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="ConstrainedItemList"/>.
+  /// </summary>
+  public partial class ConstrainedItemListView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+
+    /// <summary>
+    /// Gets or sets the item list to represent.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.</remarks>
+    public ConstrainedItemList ConstrainedItemList {
+      get { return (ConstrainedItemList)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ConstrainedItemListView"/>.
+    /// </summary>
+    public ConstrainedItemListView() {
+      InitializeComponent();
+      //itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ConstrainedItemListView"/> with the given
+    /// <paramref name="constrainedItemList"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="constrainedItemList"/> is not copied!</note>
+    /// </summary>
+    /// <param name="constrainedItemList">The item list to represent visually.</param>
+    public ConstrainedItemListView(ConstrainedItemList constrainedItemList)
+      : this() {
+      ConstrainedItemList = constrainedItemList;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="ConstrainedItemList"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ConstrainedItemList.ItemAdded -= new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded);
+      ConstrainedItemList.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved);
+      ConstrainedItemList.Cleared -= new EventHandler(ConstrainedItemList_Cleared);
+      base.RemoveItemEvents();
+    }
+    
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="ConstrainedItemList"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedItemList.ItemAdded += new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded);
+      ConstrainedItemList.ItemRemoved += new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved);
+      ConstrainedItemList.Cleared += new EventHandler(ConstrainedItemList_Cleared);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest elements in the list.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Enabled = false;
+      detailsGroupBox.Controls.Clear();
+      removeItemButton.Enabled = false;
+
+      if (ConstrainedItemList == null) {
+        itemsGroupBox.Enabled = false;
+        itemsSplitContainer.Enabled = false;
+        constraintsConstrainedItemBaseView.Enabled = false;
+      } else {
+        foreach (ListViewItem item in itemsListView.Items) {
+          ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+        }
+        itemsListView.Items.Clear();
+        foreach (IItem data in ConstrainedItemList) {
+          ListViewItem item = new ListViewItem();
+          item.Text = data.ToString();
+          item.Tag = data;
+          itemsListView.Items.Add(item);
+          data.Changed += new EventHandler(Item_Changed);
+        }
+        itemsSplitContainer.Enabled = true;
+        constraintsConstrainedItemBaseView.ConstrainedItem = ConstrainedItemList;
+        constraintsConstrainedItemBaseView.Enabled = true;
+      }
+    }
+
+    private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      detailsGroupBox.Enabled = false;
+      if (detailsGroupBox.Controls.Count > 0) detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      if (itemsListView.SelectedItems.Count == 1) {
+        IItem data = (IItem)itemsListView.SelectedItems[0].Tag;
+        Control view = (Control)data.CreateView();
+        detailsGroupBox.Controls.Add(view);
+        view.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+      removeItemButton.Enabled = (itemsListView.SelectedItems.Count == 1);
+    }
+
+    #region ConstrainedItemList changes
+    void ConstrainedItemList_ItemAdded(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemAdded), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Item.ToString();
+        item.Tag = e.Item;
+        itemsListView.Items.Insert(e.Index, item);
+        e.Item.Changed += new EventHandler(Item_Changed);
+      }
+    }
+
+    void ConstrainedItemList_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ConstrainedItemList_ItemRemoved), sender, e);
+      else {
+        itemsListView.Items.RemoveAt(e.Index);
+        e.Item.Changed -= new EventHandler(Item_Changed);
+      }
+    }
+
+    void ConstrainedItemList_Cleared(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    void Item_Changed(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_Changed), sender, e);
+      else {
+        IItem data = (IItem)sender;
+        foreach (ListViewItem item in itemsListView.Items) {
+          if (item.Tag == data)
+            item.Text = data.ToString();
+        }
+      }
+    }
+    #endregion
+
+    #region Button events
+    private void addItemButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Item";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedItemList.TryAdd(chooseItemDialog.Item, out violatedConstraints)) {
+          Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+        }
+      }
+    }
+
+    private void removeItemButton_Click(object sender, EventArgs e) {
+      ICollection<IConstraint> violatedConstraints;
+      if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) {
+        Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+      }
+    }
+    #endregion
+
+    #region Key events
+    private void itemsListView_KeyUp(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        ICollection<IConstraint> violatedConstraints;
+        if (!ConstrainedItemList.TryRemoveAt(itemsListView.SelectedIndices[0], out violatedConstraints)) {
+          Auxiliary.ShowConstraintViolationMessageBox(violatedConstraints);
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedItemListView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/ConstrainedObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ConstrainedObjectData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ConstrainedObjectData.cs	(revision 1668)
@@ -0,0 +1,140 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A class representing all basic data types having some constraints.
+  /// </summary>
+  public class ConstrainedObjectData : ConstrainedItemBase, IObjectData {
+    private object myData;
+    /// <summary>
+    /// Gets or sets the object with constraints to represent.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/> in the setter.
+    /// </remarks>
+    public virtual object Data {
+      get { return myData; }
+      set {
+        if (myData != value) {
+          myData = value;
+          OnChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Assigns the new <paramref name="data"/> if it is valid according to the constraints.
+    /// </summary>
+    /// <param name="data">The data to assign.</param>
+    /// <returns><c>true</c> if the new <paramref name="data"/> could be assigned, <c>false</c> otherwise.</returns>
+    public virtual bool TrySetData(object data) {
+      if (myData != data) {
+        object backup = myData;
+        myData = data;
+        if (IsValid()) {
+          OnChanged();
+          return true;
+        } else {
+          myData = backup;
+          return false;
+        }
+      }
+      return true;
+    }
+    /// <summary>
+    /// Assigns the new object <paramref name="data"/> if it is valid according to the constraints.
+    /// </summary>
+    /// <param name="data">The data to assign.</param>
+    /// <param name="violatedConstraints">Output parameter, containing all constraints that could not be fulfilled.</param>
+    /// <returns><c>true</c> if the new <paramref name="data"/> could be assigned, <c>false</c> otherwise.</returns>
+    public virtual bool TrySetData(object data, out ICollection<IConstraint> violatedConstraints) {
+      if (myData != data) {
+        object backup = myData;
+        myData = data;
+        if (IsValid(out violatedConstraints)) {
+          OnChanged();
+          return true;
+        } else {
+          myData = backup;
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+
+    /// <summary>
+    /// Clones the current object.
+    /// </summary>
+    /// <remarks>HeuristicLab data items are cloned with the <see cref="HeuristicLab.Core.Auxiliary.Clone"/> method of 
+    /// class <see cref="Auxiliary"/> (deep copy), all other items (like basic data types) 
+    /// are cloned with their own <c>Clone</c> methods (shadow copy).</remarks>
+    /// <param name="clonedObjects">All already cloned objects.</param>
+    /// <returns>The cloned object as <see cref="ConstrainedObjectData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedObjectData clone = (ConstrainedObjectData)base.Clone(clonedObjects);
+      if (Data is IStorable)
+        clone.myData = Auxiliary.Clone((IStorable)Data, clonedObjects);
+      else if (Data is ICloneable)
+        clone.myData = ((ICloneable)Data).Clone();
+      else
+        throw new InvalidOperationException("contained object is not cloneable");
+      return clone;
+    }
+
+    /// <summary>
+    /// Compares the current instance to the given <paramref name="obj"/>.
+    /// </summary>
+    /// <remarks>Can also compare basic data types with their representing HeuristicLab data types 
+    /// (e.g. a <see cref="ConstrainedDoubleData"/> with a double value).</remarks>
+    /// <exception cref="InvalidOperationException">Thrown when the current 
+    /// instance does not implement the interface <see cref="IComparable"/></exception>
+    /// <param name="obj">The object to compare the current instance to.</param>
+    /// <returns><c>0</c> if the objects are the same, a value smaller than zero when the current instance
+    /// is smaller than the given <paramref name="obj"/> and a value greater than zero 
+    /// when the current instance is greater than the given <paramref name="obj"/>.</returns>
+    public int CompareTo(object obj) {
+      IComparable comparable = Data as IComparable;
+      if (comparable != null) {
+        IObjectData other = obj as IObjectData;
+        if (other != null)
+          return comparable.CompareTo(other.Data);
+        else
+          return comparable.CompareTo(obj);
+      }
+      throw new InvalidOperationException("Cannot compare as contained object doesn't implement IComparable");
+    }
+
+    /// <summary>
+    /// The string representation of the current instance.
+    /// </summary>
+    /// <returns>The current instance as a string.</returns>
+    public override string ToString() {
+      return Data.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayData.cs	(revision 1668)
@@ -0,0 +1,120 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The representation of an array of double values.
+  /// </summary>
+  public class DoubleArrayData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the double elements of the array.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase.Data"/> of base class 
+    /// <see cref="ArrayDataBase"/>. No own data storage present.</remarks>
+    public new double[] Data {
+      get { return (double[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DoubleArrayData"/> class.
+    /// </summary>
+    public DoubleArrayData() {
+      Data = new double[0];
+    }
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DoubleArrayData"/> class.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The double array the instance should represent.</param>
+    public DoubleArrayData(double[] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the <see cref="DoubleArrayDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance of the <see cref="DoubleArrayDataView"/>.</returns>
+    public override IView CreateView() {
+      return new DoubleArrayDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The double elements of the array are saved in the node's inner text as string, 
+    /// each element, whose format depends on the locale culture info, separated by a semicolon.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"></see>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    
+    /// <summary>
+    /// Loads the persisted double array from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The double elemets of the array must be saved in the inner text of the node as string, 
+    /// each element separated by a semicolon and formatted according to the locale culture info and 
+    /// its number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <exception cref="System.FormatException">Thrown when a saved element cannot be parsed as a double value.</exception>
+    /// <param name="node">The <see cref="XmlNode"></see> where the instance is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      string[] tokens = node.InnerText.Split(';');
+      double[] data = new double[tokens.Length];
+      for(int i = 0; i < data.Length; i++)
+        if(double.TryParse(tokens[i], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i]) == false) {
+          throw new FormatException("Can't parse " + tokens[i] + " as double value.");
+        }
+      Data = data;
+    }
+
+    /// <summary>
+    /// The string representation of the array, formatted according to the given <paramref name="format"/>.
+    /// </summary>
+    /// <param name="format">The <see cref="NumberFormatInfo"></see> the single double 
+    /// values should be formatted accordingly.</param>
+    /// <returns>The elements of the array as string, each element separated by a semicolon and 
+    /// formatted according to the parameter <paramref name="format"/>.</returns>
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for(int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data[i].ToString("r", format));
+      }
+      if(builder.Length > 0)
+        builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class DoubleArrayDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArrayDataView.cs	(revision 1668)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="DoubleArrayData"/>, 
+  /// symbolizing an array of double values.
+  /// </summary>
+  public partial class DoubleArrayDataView : ArrayDataBaseView {
+    /// <summary>
+    /// Gets or sets the double array to represent as <see cref="DoubleArrayData"/>.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of 
+    /// base class <see cref="ArrayDataBaseView"/>. No own data storage present.</remarks>
+    public DoubleArrayData DoubleArrayData {
+      get { return (DoubleArrayData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleArrayDataView"/>.
+    /// </summary>
+    public DoubleArrayDataView() {
+      InitializeComponent();
+      // round-trip format for all cells
+      dataGridView.DefaultCellStyle.Format = "r";
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleArrayDataView"/> with the given
+    /// <paramref name="doubleArrayData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="doubleArrayData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="doubleArrayData">The double array to represent visually.</param>
+    public DoubleArrayDataView(DoubleArrayData doubleArrayData)
+      : this() {
+      DoubleArrayData = doubleArrayData;
+    }
+
+    /// <summary>
+    /// Sets the element on position <paramref name="index"/> to the
+    /// given <paramref name="element"/> as double value.
+    /// </summary>
+    /// <param name="index">The position where to substitute the element.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int index, string element) {
+      double result;
+      double.TryParse(element, out result);
+
+      DoubleArrayData.Data[index] = result;
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted to a double value.
+    /// </summary>
+    /// <param name="element">The data to validate.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      double result;
+      return element != null && double.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleData.cs	(revision 1668)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Class to represent double values.
+  /// </summary>
+  public class DoubleData : ObjectData {
+    /// <summary>
+    /// Gets or sets the double value.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ObjectData.Data"/> of base class <see cref="ObjectData"></see>. 
+    /// No own data storage present.</remarks>
+    public new double Data {
+      get { return (double)base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleData"/> with default value <c>0.0</c>.
+    /// </summary>
+    public DoubleData() {
+      Data = 0.0;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="DoubleData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The double value the instance should represent.</param>
+    public DoubleData(double data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the <see cref="DoubleDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance of <see cref="DoubleDataView"/>.</returns>
+    public override IView CreateView() {
+      return new DoubleDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance and adds it to the dictionary <paramref name="clonedObjects"/>.
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="DoubleData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      DoubleData clone = new DoubleData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The double value is saved in the node's inner text as string, 
+    /// its format depending on the local culture info and its number format.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data.ToString("r", CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted double value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The double value must be saved in the node's inner text as a string and 
+    /// formatted according to the locale culture info and 
+    /// its number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <exception cref="System.FormatException">Thrown when the saved value cannot be parsed as a double value.</exception>
+    /// <param name="node">The <see cref="XmlNode"/> where the double is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      double data;
+      if(double.TryParse(node.InnerText, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data) == true) {
+        Data = data;
+      } else {
+        throw new FormatException("Can't parse " + node.InnerText + " as double value.");       
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class DoubleDataView {
+    /// <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.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(274, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // DoubleDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "DoubleDataView";
+      this.Size = new System.Drawing.Size(274, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.cs	(revision 1668)
@@ -0,0 +1,110 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="DoubleData"/>, symbolizing a double value.
+  /// </summary>
+  public partial class DoubleDataView : ViewBase {
+    /// <summary>
+    /// Gets or sets the double value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class 
+    /// <see cref="ViewBase"/>. No own data storage present.</remarks>
+    public DoubleData DoubleData {
+      get { return (DoubleData)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleDataView"/>.
+    /// </summary>
+    public DoubleDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleDataView"/> with the given 
+    /// <paramref name="doubleData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="doubleData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="doubleData">The double value to represent visually.</param>
+    public DoubleDataView(DoubleData doubleData)
+      : this() {
+      DoubleData = doubleData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="DoubleData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      DoubleData.Changed -= new EventHandler(DoubleData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="DoubleData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      DoubleData.Changed += new EventHandler(DoubleData_Changed);
+    }
+
+    /// <summary>
+    /// Updates the controls with the latest double value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (DoubleData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = DoubleData.Data.ToString("r");
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        DoubleData.Data = double.Parse(dataTextBox.Text);
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void DoubleData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixData.cs	(revision 1668)
@@ -0,0 +1,144 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Globalization;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A two-dimensional matrix consisting of double values.
+  /// </summary>
+  public class DoubleMatrixData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the double elements of the matrix.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase.Data"/> of base 
+    /// class <see cref="ArrayDataBase"/>. No own data storage present.</remarks>
+    public new double[,] Data {
+      get { return (double[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DoubleMatrixData"/> class.
+    /// </summary>
+    public DoubleMatrixData() {
+      Data = new double[1, 1];
+    }
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DoubleMatrixData"/> class.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The two-dimensional double matrix the instance should represent.</param>
+    public DoubleMatrixData(double[,] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the <see cref="DoubleMatrixDataView"/> class.
+    /// </summary>
+    /// <returns>The created instance as <see cref="DoubleMatrixDataView"/>.</returns>
+    public override IView CreateView() {
+      return new DoubleMatrixDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix are saved as attributes (<c>Dimension1</c>,<c>Dimension2</c>), 
+    /// formatted according to the local culture info and its number format.<br/>
+    /// The elements of the matrix are saved as string in the node's inner text, 
+    /// each element separated by a semicolon, all line by line, formatted according to the 
+    /// local number format.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted matrix from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix must be saved as Attributes (<c>Dimension1</c>, <c>Dimension2</c>),
+    /// formatted in the local number format. <br/>
+    /// The elements of the matrix must be saved in the node's inner text as string, 
+    /// each element separated by a semicolon, line by line, formatted according to the local 
+    /// culture info and its number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <exception cref="System.FormatException">Thrown when a saved element cannot be parsed as a double value.</exception>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      double[,] data = new double[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          if(double.TryParse(tokens[i * dim2 + j], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i, j])==false) {
+            throw new FormatException("Can't parse " + tokens[i * dim2 + j] + " as double value.");
+          }
+        }
+      }
+      Data = data;
+    }
+
+    /// <summary>
+    /// The string representation of the matrix.
+    /// </summary>
+    /// <returns>The elements of the matrix as a string, line by line, each element separated by a 
+    /// semicolon and formatted according to local number format.</returns>
+    public override string ToString() {
+      return ToString(CultureInfo.CurrentCulture.NumberFormat);
+    }
+    
+    /// <summary>
+    /// The string representation of the matrix, considering a specified <paramref name="format"/>.
+    /// </summary>
+    /// <param name="format">The <see cref="NumberFormatInfo"/> the double values are formatted accordingly.</param>
+    /// <returns>The elements of the matrix as a string, line by line, each element separated by a 
+    /// semicolon and formatted according to the specified <paramref name="format"/>.</returns>
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString("r", format));
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class DoubleMatrixDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixDataView.cs	(revision 1668)
@@ -0,0 +1,92 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="DoubleMatrixData"/>, symbolizing a two-dimensional
+  /// matrix of double values.
+  /// </summary>
+  public partial class DoubleMatrixDataView : MatrixDataBaseView {
+    /// <summary>
+    /// Gets or sets the double matrix to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of base class 
+    /// <see cref="MatrixDataBaseView"/>. No own data storage present.</remarks>
+    public DoubleMatrixData DoubleMatrixData {
+      get { return (DoubleMatrixData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleMatrixDataView"/>.
+    /// </summary>
+    public DoubleMatrixDataView() {
+      InitializeComponent();
+      // round-trip format for all cells
+      dataGridView.DefaultCellStyle.Format = "r";
+    }   
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="DoubleMatrixDataView"/> with the given
+    /// <paramref name="doubleMatrixData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="doubleMatrixData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="doubleMatrixData">The matrix of doubles to represent visually.</param>
+    public DoubleMatrixDataView(DoubleMatrixData doubleMatrixData)
+      : this() {
+      DoubleMatrixData = doubleMatrixData;
+    }
+
+    /// <summary>
+    /// Subsitutes an element in the given <paramref name="row"/> and the given 
+    /// <paramref name="column"/> with the given <paramref name="element"/>.
+    /// </summary>
+    /// <param name="row">The row of the element to substitute.</param>
+    /// <param name="column">The column of the element to substitute.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int row, int column, string element) {
+      double result;
+      double.TryParse(element, out result);
+      if(result != DoubleMatrixData.Data[row, column]) {
+        DoubleMatrixData.Data[row, column] = result;
+        DoubleMatrixData.FireChanged();
+      }
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted to a double value.
+    /// </summary>
+    /// <param name="element">The element to check.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      double result;
+      return element != null && double.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.cs	(revision 1668)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core; 
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A visual representation to visualize a key-value pair.
+  /// </summary>
+  public partial class EditKeyValueDialog : Form {
+    private IItem key; 
+    /// <summary>
+    /// Gets the current key.
+    /// </summary>
+    public IItem Key {
+      get { return key; }
+    }
+
+    private IItem value;
+    /// <summary>
+    /// Gets the current value.
+    /// </summary>
+    public IItem Value {
+      get { return value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="EditKeyValueDialog"/> with the given types of 
+    /// key and value.
+    /// </summary>
+    /// <param name="keyType">The type of the key.</param>
+    /// <param name="valueType">The type of the value.</param>
+    public EditKeyValueDialog(Type keyType, Type valueType) {
+      InitializeComponent();
+      key = (IItem) Activator.CreateInstance(keyType);
+      value = (IItem) Activator.CreateInstance(valueType); 
+      keyPanel.Controls.Add((Control) key.CreateView());
+      valuePanel.Controls.Add((Control) value.CreateView()); 
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      this.DialogResult = DialogResult.OK;
+      this.Close();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.designer.cs	(revision 1668)
@@ -0,0 +1,131 @@
+﻿namespace HeuristicLab.Data {
+  partial class EditKeyValueDialog {
+    /// <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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.keyPanel = new System.Windows.Forms.Panel();
+      this.valuePanel = new System.Windows.Forms.Panel();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.groupBox2 = new System.Windows.Forms.GroupBox();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(135, 198);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(216, 198);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 1;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // keyPanel
+      // 
+      this.keyPanel.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.keyPanel.AutoScroll = true;
+      this.keyPanel.Location = new System.Drawing.Point(15, 31);
+      this.keyPanel.Name = "keyPanel";
+      this.keyPanel.Size = new System.Drawing.Size(276, 39);
+      this.keyPanel.TabIndex = 2;
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.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.valuePanel.AutoScroll = true;
+      this.valuePanel.Location = new System.Drawing.Point(9, 19);
+      this.valuePanel.Name = "valuePanel";
+      this.valuePanel.Size = new System.Drawing.Size(270, 80);
+      this.valuePanel.TabIndex = 3;
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.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.groupBox1.Controls.Add(this.valuePanel);
+      this.groupBox1.Location = new System.Drawing.Point(12, 82);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(283, 109);
+      this.groupBox1.TabIndex = 4;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Value: ";
+      // 
+      // groupBox2
+      // 
+      this.groupBox2.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.groupBox2.Location = new System.Drawing.Point(12, 12);
+      this.groupBox2.Name = "groupBox2";
+      this.groupBox2.Size = new System.Drawing.Size(283, 64);
+      this.groupBox2.TabIndex = 5;
+      this.groupBox2.TabStop = false;
+      this.groupBox2.Text = "Key:";
+      // 
+      // EditKeyValueDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(301, 233);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.keyPanel);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.groupBox2);
+      this.Name = "EditKeyValueDialog";
+      this.Text = "KeyValuePair";
+      this.groupBox1.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Panel keyPanel;
+    private System.Windows.Forms.Panel valuePanel;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.GroupBox groupBox2;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/EditKeyValueDialog.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.2.csproj	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.2.csproj	(revision 1668)
@@ -0,0 +1,331 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Data</RootNamespace>
+    <AssemblyName>HeuristicLab.Data-3.2</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/HeuristicLab.Data/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Data-3.2.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Data-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Data-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ArrayDataBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ArrayDataBaseView.Designer.cs">
+      <DependentUpon>ArrayDataBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolArrayData.cs" />
+    <Compile Include="BoolArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolArrayDataView.Designer.cs">
+      <DependentUpon>BoolArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolData.cs" />
+    <Compile Include="BoolDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolDataView.Designer.cs">
+      <DependentUpon>BoolDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BoolMatrixData.cs" />
+    <Compile Include="ArrayDataBase.cs" />
+    <Compile Include="BoolMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolMatrixDataView.Designer.cs">
+      <DependentUpon>BoolMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="ConstrainedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemListView.Designer.cs">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedObjectData.cs" />
+    <Compile Include="ConstrainedIntData.cs" />
+    <Compile Include="ConstrainedIntDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedIntDataView.Designer.cs">
+      <DependentUpon>ConstrainedIntDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedDoubleData.cs" />
+    <Compile Include="ConstrainedDoubleDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedDoubleDataView.Designer.cs">
+      <DependentUpon>ConstrainedDoubleDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EditKeyValueDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EditKeyValueDialog.designer.cs">
+      <DependentUpon>EditKeyValueDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemDictionaryView_T.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemDictionaryView_T.designer.cs">
+      <DependentUpon>ItemDictionaryView_T.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemDictionary_T.cs" />
+    <Compile Include="NullData.cs" />
+    <Compile Include="IntMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntMatrixDataView.Designer.cs">
+      <DependentUpon>IntMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleMatrixDataView.Designer.cs">
+      <DependentUpon>DoubleMatrixDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntArrayDataView.Designer.cs">
+      <DependentUpon>IntArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleArrayDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleArrayDataView.Designer.cs">
+      <DependentUpon>DoubleArrayDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleDataView.Designer.cs">
+      <DependentUpon>DoubleDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntDataView.Designer.cs">
+      <DependentUpon>IntDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IObjectData.cs" />
+    <Compile Include="ItemList.cs" />
+    <Compile Include="ItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemListView_T.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemListView_T.Designer.cs">
+      <DependentUpon>ItemListView_T.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemList_T.cs">
+    </Compile>
+    <Compile Include="MatrixDataBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MatrixDataBaseView.Designer.cs">
+      <DependentUpon>MatrixDataBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ObjectData.cs" />
+    <Compile Include="StringDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringDataView.Designer.cs">
+      <DependentUpon>StringDataView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DoubleArrayData.cs" />
+    <Compile Include="DoubleData.cs" />
+    <Compile Include="DoubleMatrixData.cs" />
+    <Compile Include="HeuristicLabDataPlugin.cs" />
+    <Compile Include="IntArrayData.cs" />
+    <Compile Include="IntData.cs" />
+    <Compile Include="IntMatrixData.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StringData.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.2\HeuristicLab.Core-3.2.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ArrayDataBaseView.resx">
+      <DependentUpon>ArrayDataBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="BoolDataView.resx">
+      <DependentUpon>BoolDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedIntDataView.resx">
+      <DependentUpon>ConstrainedIntDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedDoubleDataView.resx">
+      <DependentUpon>ConstrainedDoubleDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedItemListView.resx">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DoubleDataView.resx">
+      <DependentUpon>DoubleDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditKeyValueDialog.resx">
+      <DependentUpon>EditKeyValueDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="IntDataView.resx">
+      <DependentUpon>IntDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemDictionaryView_T.resx">
+      <DependentUpon>ItemDictionaryView_T.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemListView_T.resx">
+      <DependentUpon>ItemListView_T.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MatrixDataBaseView.resx">
+      <DependentUpon>MatrixDataBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StringDataView.resx">
+      <DependentUpon>StringDataView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /trunk/sources/HeuristicLab.Data/3.3/HeuristicLabDataPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/HeuristicLabDataPlugin.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/HeuristicLabDataPlugin.cs	(revision 1668)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Data plugin.
+  /// </summary>
+  [ClassInfo(Name = "HeuristicLab.Data-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Data-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  public class HeuristicLabDataPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IObjectData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IObjectData.cs	(revision 1668)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Public interface to represent basic data types
+  /// </summary>
+  public interface IObjectData : IItem, IComparable {
+    /// <summary>
+    /// Gets or sets the value of the object.
+    /// </summary>
+    object Data { get; set; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 1668)
@@ -0,0 +1,117 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The representation of an array of integer values.
+  /// </summary>
+  public class IntArrayData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the int elements of the array.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase.Data"/> of base class <see cref="ArrayDataBase"/>. 
+    /// No own data storage present.</remarks>
+    public new int[] Data {
+      get { return (int[])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntArrayData"/>.
+    /// </summary>
+    public IntArrayData() {
+      Data = new int[0];
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntArrayData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The array of integers to represent.</param>
+    public IntArrayData(int[] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a enw instance of <see cref="IntArrayDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="IntArrayDataView"/>.</returns>
+    public override IView CreateView() {
+      return new IntArrayDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The int elements of the array are saved in the node's inner text as string, 
+    /// each element, whose format depends on the locale culture info, separated by a semicolon.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"></see>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted int array from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The int elemets of the array must be saved in the inner text of the node as string, 
+    /// each element separated by a semicolon and formatted according to the locale culture info and 
+    /// its number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"></see> where the instance is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      if (!node.InnerText.Equals("")) {
+        string[] tokens = node.InnerText.Split(';');
+        int[] data = new int[tokens.Length];
+        for (int i = 0; i < data.Length; i++)
+          data[i] = int.Parse(tokens[i], CultureInfo.InvariantCulture.NumberFormat);
+        Data = data;
+      }
+    }
+
+    /// <summary>
+    /// The string representation of the array, formatted according to the given <paramref name="format"/>.
+    /// </summary>
+    /// <param name="format">The <see cref="NumberFormatInfo"></see> the single int values 
+    /// should be formatted accordingly.</param>
+    /// <returns>The elements of the array as string, each element separated by a semicolon 
+    /// and formatted according to the parameter <paramref name="format"/>.</returns>
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.Length; i++) {
+        builder.Append(";");
+        builder.Append(Data[i].ToString(format));
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class IntArrayDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArrayDataView.cs	(revision 1668)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="IntArrayData"/>, 
+  /// symbolizing an array of int values.
+  /// </summary>
+  public partial class IntArrayDataView : ArrayDataBaseView {
+    /// <summary>
+    /// Gets or set the int array to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of base class
+    /// <see cref="ArrayDataBaseView"/>. No own data storage present.</remarks>
+    public IntArrayData IntArrayData {
+      get { return (IntArrayData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntArrayDataView"/>.
+    /// </summary>
+    public IntArrayDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntArrayDataView"/> with the given
+    /// <paramref name="intArrayData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="intArrayData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="intArrayData">The int array to represent visually.</param>
+    public IntArrayDataView(IntArrayData intArrayData)
+      : this() {
+      IntArrayData = intArrayData;
+    }
+
+    /// <summary>
+    /// Subsitutes an element at the given 
+    /// <paramref name="index"/> with the given <paramref name="element"/>.
+    /// </summary>
+    /// <param name="index">The position of the element to substitute.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int index, string element) {
+      int result;
+      int.TryParse(element, out result);
+
+      IntArrayData.Data[index] = result;
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted into a bool value.
+    /// </summary>
+    /// <param name="element">The element to check.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      int result;
+      return element != null && int.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntData.cs	(revision 1668)
@@ -0,0 +1,106 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The representation of an int value.
+  /// </summary>
+  public class IntData : ObjectData {
+    /// <summary>
+    /// Gets or sets the int value.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ObjectData.Data"/> of base class <see cref="ObjectData"/>. 
+    /// No own data storage present.</remarks>
+    public new int Data {
+      get { return (int)base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntData"/> with default value <c>0</c>.
+    /// </summary>
+    public IntData() {
+      Data = 0;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntData"/>.
+    /// </summary>
+    /// <param name="data">The int value the current instance should represent.</param>
+    public IntData(int data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of the class <see cref="IntDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="IntDataView"/>.</returns>
+    public override IView CreateView() {
+      return new IntDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance. 
+    /// </summary>
+    /// <remarks>Adds the cloned instance to the dictionary <paramref name="clonedObjects"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="IntData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      IntData clone = new IntData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The int value is saved as string in the node's inner text, 
+    /// formatted according to the local culture info and its number format.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects.(Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data.ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    /// <summary>
+    ///  Loads the persisted int value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The int value must be saved in the node's inner text as a string and 
+    /// formatted according to the locale culture info and 
+    /// its number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the int is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = int.Parse(node.InnerText, CultureInfo.InvariantCulture.NumberFormat);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class IntDataView {
+    /// <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.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(265, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // IntDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "IntDataView";
+      this.Size = new System.Drawing.Size(265, 26);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntDataView.cs	(revision 1668)
@@ -0,0 +1,110 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="IntData"/>, symbolizing an int value.
+  /// </summary>
+  public partial class IntDataView : ViewBase {
+    /// <summary>
+    /// Gets or set the int value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IntData IntData {
+      get { return (IntData)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntDataView"/>.
+    /// </summary>
+    public IntDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntDataView"/> with the 
+    /// given <paramref name="intData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="intData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="intData">The integer value to represent visually.</param>
+    public IntDataView(IntData intData)
+      : this() {
+      IntData = intData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="IntData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      IntData.Changed -= new EventHandler(IntData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="IntData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      IntData.Changed += new EventHandler(IntData_Changed);
+    }
+
+    /// <summary>
+    /// Updates the controls with the latest int value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (IntData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = IntData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      try {
+        IntData.Data = int.Parse(dataTextBox.Text);
+      }
+      catch (Exception) {
+        dataTextBox.SelectAll();
+        e.Cancel = true;
+      }
+    }
+
+    private void IntData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs	(revision 1668)
@@ -0,0 +1,142 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using System.Globalization;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A two-dimensional matrix of integer values.
+  /// </summary>
+  public class IntMatrixData : ArrayDataBase {
+    /// <summary>
+    /// Gets or sets the int values of the matrix.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase.Data"/> of base class <see cref="ArrayDataBase"/>. 
+    /// No own data storage present.</remarks>
+    public new int[,] Data {
+      get { return (int[,])base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntMatrixData"/>.
+    /// </summary>
+    public IntMatrixData() {
+      Data = new int[1, 1];
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="IntMatrixData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="data"/> is not copied!</note>
+    /// </summary>
+    /// <param name="data">The two-dimensional int matrix the instance should represent.</param>
+    public IntMatrixData(int[,] data) {
+      Data = data;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="IntMatrixDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="IntMatrixDataView"/>.</returns>
+    public override IView CreateView() {
+      return new IntMatrixDataView(this);
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix are saved as attributes (<c>Dimension1</c>,<c>Dimension2</c>),
+    /// formatted according to the local culture info and its number format.<br/>
+    /// The elements of the matrix are saved as string in the node's inner text, 
+    /// each element separated by a semicolon, all line by line, formatted according to 
+    /// the local number format.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute dim1 = document.CreateAttribute("Dimension1");
+      dim1.Value = Data.GetLength(0).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim1);
+      XmlAttribute dim2 = document.CreateAttribute("Dimension2");
+      dim2.Value = Data.GetLength(1).ToString(CultureInfo.InvariantCulture.NumberFormat);
+      node.Attributes.Append(dim2);
+      node.InnerText = ToString(CultureInfo.InvariantCulture.NumberFormat);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted int matrix from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The dimensions of the matrix must be saved as Attributes 
+    /// (<c>Dimension1</c>, <c>Dimension2</c>), formatted in the local number format. <br/>
+    /// The elements of the matrix must be saved in the node's inner text as string, 
+    /// each element separated by a semicolon, line by line, formatted according to 
+    /// the local number format (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      int dim1 = int.Parse(node.Attributes["Dimension1"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      int dim2 = int.Parse(node.Attributes["Dimension2"].Value, CultureInfo.InvariantCulture.NumberFormat);
+      string[] tokens = node.InnerText.Split(';');
+      int[,] data = new int[dim1, dim2];
+      for (int i = 0; i < dim1; i++) {
+        for (int j = 0; j < dim2; j++) {
+          data[i, j] = int.Parse(tokens[i * dim2 + j], CultureInfo.InvariantCulture.NumberFormat);
+        }
+      }
+      Data = data;
+    }
+
+    /// <summary>
+    /// The string representation of the matrix.
+    /// </summary> 
+    /// <returns>The elements of the matrix as a string, line by line, each element separated by a 
+    /// semicolon and formatted according to the local number format.</returns>
+    public override string ToString() {
+      return ToString(CultureInfo.CurrentCulture.NumberFormat);
+    }
+
+    /// <summary>
+    /// The string representation of the matrix, considering a specified <paramref name="format"/>.
+    /// </summary>
+    /// <param name="format">The <see cref="NumberFormatInfo"/> the int values are formatted accordingly.</param>
+    /// <returns>The elements of the matrix as a string, line by line, each element separated by a 
+    /// semicolon and formatted according to the specified <paramref name="format"/>.</returns>
+    private string ToString(NumberFormatInfo format) {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < Data.GetLength(0); i++) {
+        for (int j = 0; j < Data.GetLength(1); j++) {
+          builder.Append(";");
+          builder.Append(Data[i, j].ToString(format));
+        }
+      }
+      if (builder.Length > 0) builder.Remove(0, 1);
+      return builder.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class IntMatrixDataView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.cs	(revision 1668)
@@ -0,0 +1,88 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="IntMatrixData"/>, symbolizing a two-dimensional
+  /// matrix of int values.
+  /// </summary>
+  public partial class IntMatrixDataView : MatrixDataBaseView {
+    /// <summary>
+    /// Gets or set the int matrix to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ArrayDataBase"/> of base class 
+    /// <see cref="MatrixDataBaseView"/>. No own data storage present.</remarks>
+    public IntMatrixData IntMatrixData {
+      get { return (IntMatrixData)base.ArrayDataBase; }
+      set { base.ArrayDataBase = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntMatrixDataView"/>.
+    /// </summary>
+    public IntMatrixDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="IntMatrixDataView"/> with the given
+    /// <paramref name="intMatrixData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="intMatrixData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="intMatrixData">The matrix of integers to represent visually.</param>
+    public IntMatrixDataView(IntMatrixData intMatrixData)
+      : this() {
+      IntMatrixData = intMatrixData;
+    }
+
+    /// <summary>
+    /// Subsitutes an element in the given <paramref name="row"/> and the given 
+    /// <paramref name="column"/> with the given <paramref name="element"/>.
+    /// </summary>
+    /// <param name="row">The row of the element to substitute.</param>
+    /// <param name="column">The column of the element to substitute.</param>
+    /// <param name="element">The element to insert.</param>
+    protected override void SetArrayElement(int row, int column, string element) {
+      int result;
+      int.TryParse(element, out result);
+
+      IntMatrixData.Data[row, column] = result;
+    }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="element"/> can be converted to an int value.
+    /// </summary>
+    /// <param name="element">The element to check.</param>
+    /// <returns><c>true</c> if the <paramref name="element"/> could be converted,
+    /// <c>false</c> otherwise.</returns>
+    protected override bool ValidateData(string element) {
+      int result;
+      return element != null && int.TryParse(element, out result);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.cs	(revision 1668)
@@ -0,0 +1,215 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
+  /// </summary>
+  /// <typeparam name="K">The type of the keys of the dictionary.</typeparam>
+  /// <typeparam name="V">The type of the values of the dictionary.</typeparam>
+  public partial class ItemDictionaryView<K, V> : ViewBase
+    where K : IItem
+    where V : IItem {
+
+    private EditKeyValueDialog editKeyValueDialog;
+
+    /// <summary>
+    /// Gets or sets the dictionary to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public ItemDictionary<K, V> ItemDictionary {
+      get { return (ItemDictionary<K, V>) Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Creates a new list view item with the given <paramref name="key"/> and <paramref name="value"/>.
+    /// </summary>
+    /// <param name="key">The key to show in the list item.</param>
+    /// <param name="value">The value to show in the list item.</param>
+    /// <returns>The created list item as <see cref="ListViewItem"/>.</returns>
+    private ListViewItem CreateListViewItem(K key, V value) {
+      ListViewItem item = new ListViewItem(key.ToString());
+      item.Name = key.ToString();
+      item.SubItems.Add(value.ToString());
+      item.SubItems[0].Tag = key;
+      item.SubItems[1].Tag = value;
+      return item;
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ItemDictionaryView&lt;K,V&gt;"/>.
+    /// </summary>
+    public ItemDictionaryView() {
+      InitializeComponent();
+      listView.View = View.Details;
+      listView.Columns[0].Text = "Key";
+      listView.Columns[1].Text = "Value";
+      valueTypeTextBox.Text = typeof(V).ToString();
+      keyTypeTextBox.Text = typeof(K).ToString();
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ItemDictionaryView&lt;K,V&gt;"/> with the given
+    /// <paramref name="dictionary"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="dictionary"/> is not copied!</note>
+    /// </summary>
+    /// <param name="dictionary">The dictionary to represent visually.</param>
+    public ItemDictionaryView(ItemDictionary<K, V> dictionary)
+      : this() {
+      ItemDictionary = dictionary;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying 
+    /// <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ItemDictionary.ItemAdded -= new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemInserted);
+      ItemDictionary.ItemRemoved -= new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemRemoved);
+      ItemDictionary.Cleared -= new EventHandler(ItemDictionary_Cleared);
+      base.RemoveItemEvents();
+    }
+
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="HeuristicLab.Data.ItemDictionary&lt;K,V&gt;"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ItemDictionary.ItemAdded += new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemInserted);
+      ItemDictionary.ItemRemoved += new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemRemoved);
+      ItemDictionary.Cleared += new EventHandler(ItemDictionary_Cleared);
+    }
+
+    private void listView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (detailsPanel.Controls.Count > 0)
+        detailsPanel.Controls[0].Dispose();
+      if (keyPanel.Controls.Count > 0)
+        keyPanel.Controls[0].Dispose();
+      detailsPanel.Controls.Clear();
+      keyPanel.Controls.Clear();
+      detailsPanel.Enabled = false;
+      keyPanel.Enabled = false;
+      removeButton.Enabled = false;
+      if (listView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+      if (listView.SelectedItems.Count == 1) {
+        K key = (K) listView.SelectedItems[0].SubItems[0].Tag;
+        V data = (V) listView.SelectedItems[0].SubItems[1].Tag;
+        Control keyView = (Control) key.CreateView();
+        Control dataView = (Control) data.CreateView();
+        keyPanel.Controls.Add(keyView);
+        detailsPanel.Controls.Add(dataView);
+        detailsPanel.Enabled = true;
+      }
+      keyPanel.Enabled = false;
+    }
+
+    #region Item and ItemDictionary Events
+    private void ItemDictionary_ItemInserted(object sender, KeyValueEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemInserted), sender, e);
+      else {
+        ListViewItem item = CreateListViewItem((K) e.Key, (V) e.Value);
+        listView.Items.Insert(listView.Items.Count, item);
+        item.Name = e.Key.ToString();
+        e.Value.Changed += new EventHandler(Item_Changed);
+        e.Key.Changed += new EventHandler(Item_Changed);
+      }
+    }
+
+    private void ItemDictionary_ItemRemoved(object sender, KeyValueEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<KeyValueEventArgs>(ItemDictionary_ItemRemoved), sender, e);
+      else {
+        int index = listView.Items.IndexOfKey(e.Key.ToString());
+        listView.Items.RemoveAt(index);
+        e.Key.Changed -= new EventHandler(Item_Changed);
+        e.Value.Changed += new EventHandler(Item_Changed);
+      }
+    }
+
+    private void ItemDictionary_Cleared(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void Item_Changed(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_Changed), sender, e);
+      else {
+        IItem data = (IItem) sender;
+        foreach (ListViewItem item in listView.Items) {
+          if (item.SubItems[0].Tag == data) {
+            item.SubItems[0].Text = data.ToString();
+            item.Name = data.ToString();
+          } else if (item.SubItems[1].Tag == data) {
+            item.SubItems[1].Text = data.ToString();
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Update Controls
+    /// <summary>
+    /// Updates the controls with the latest elements of the dictionary.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsPanel.Controls.Clear();
+      keyPanel.Controls.Clear();
+      detailsPanel.Enabled = false;
+      keyPanel.Enabled = false;
+      removeButton.Enabled = false;
+      if (ItemDictionary != null) {
+        foreach (ListViewItem item in listView.Items) {
+          ((IItem) item.SubItems[0]).Changed -= new EventHandler(Item_Changed);
+          ((IItem) item.SubItems[1]).Changed -= new EventHandler(Item_Changed);
+        }
+        listView.Items.Clear();
+        foreach (KeyValuePair<K, V> data in ItemDictionary) {
+          ListViewItem item = CreateListViewItem(data.Key, data.Value);
+          listView.Items.Add(item);
+          data.Key.Changed += new EventHandler(Item_Changed);
+          data.Value.Changed += new EventHandler(Item_Changed);
+        }
+        addButton.Enabled = true; 
+      } else {
+        addButton.Enabled = false; 
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      editKeyValueDialog = new EditKeyValueDialog(typeof(K), typeof(V));
+      if (editKeyValueDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (!ItemDictionary.ContainsKey((K) editKeyValueDialog.Key)) {
+            ItemDictionary.Add((K) editKeyValueDialog.Key, (V) editKeyValueDialog.Value);
+          }
+        } catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+
+    private void removeButton_Click(object sender, EventArgs e) {
+      while (listView.SelectedIndices.Count > 0)
+        ItemDictionary.Remove((K) listView.SelectedItems[0].SubItems[0].Tag);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.designer.cs	(revision 1668)
@@ -0,0 +1,210 @@
+﻿namespace HeuristicLab.Data {
+  partial class ItemDictionaryView<K, V> {
+    /// <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.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.listView = new System.Windows.Forms.ListView();
+      this.keyHeader = new System.Windows.Forms.ColumnHeader();
+      this.valueHeader = new System.Windows.Forms.ColumnHeader();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.keyTypeTextBox = new System.Windows.Forms.TextBox();
+      this.valueTypeTextBox = new System.Windows.Forms.TextBox();
+      this.detailsPanel = new System.Windows.Forms.Panel();
+      this.keyPanel = new System.Windows.Forms.Panel();
+      this.groupBox2 = new System.Windows.Forms.GroupBox();
+      this.groupBox3 = new System.Windows.Forms.GroupBox();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.groupBox1.Controls.Add(this.removeButton);
+      this.groupBox1.Controls.Add(this.addButton);
+      this.groupBox1.Controls.Add(this.listView);
+      this.groupBox1.Location = new System.Drawing.Point(5, 70);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(170, 175);
+      this.groupBox1.TabIndex = 0;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "KeyValuePairs:";
+      // 
+      // removeButton
+      // 
+      this.removeButton.Location = new System.Drawing.Point(89, 145);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Location = new System.Drawing.Point(8, 145);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "&Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // listView
+      // 
+      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.keyHeader,
+            this.valueHeader});
+      this.listView.Location = new System.Drawing.Point(7, 19);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(157, 120);
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(11, 12);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(52, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "KeyType:";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(11, 40);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(61, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "ValueType:";
+      // 
+      // keyTypeTextBox
+      // 
+      this.keyTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.keyTypeTextBox.BackColor = System.Drawing.SystemColors.ControlLight;
+      this.keyTypeTextBox.Location = new System.Drawing.Point(73, 5);
+      this.keyTypeTextBox.Name = "keyTypeTextBox";
+      this.keyTypeTextBox.Size = new System.Drawing.Size(301, 20);
+      this.keyTypeTextBox.TabIndex = 3;
+      // 
+      // valueTypeTextBox
+      // 
+      this.valueTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueTypeTextBox.BackColor = System.Drawing.SystemColors.ControlLight;
+      this.valueTypeTextBox.Location = new System.Drawing.Point(73, 33);
+      this.valueTypeTextBox.Name = "valueTypeTextBox";
+      this.valueTypeTextBox.Size = new System.Drawing.Size(301, 20);
+      this.valueTypeTextBox.TabIndex = 4;
+      // 
+      // detailsPanel
+      // 
+      this.detailsPanel.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.detailsPanel.AutoScroll = true;
+      this.detailsPanel.ForeColor = System.Drawing.SystemColors.ControlText;
+      this.detailsPanel.Location = new System.Drawing.Point(187, 164);
+      this.detailsPanel.Name = "detailsPanel";
+      this.detailsPanel.Size = new System.Drawing.Size(187, 76);
+      this.detailsPanel.TabIndex = 9;
+      // 
+      // keyPanel
+      // 
+      this.keyPanel.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.keyPanel.AutoScroll = true;
+      this.keyPanel.ForeColor = System.Drawing.SystemColors.ControlText;
+      this.keyPanel.Location = new System.Drawing.Point(187, 90);
+      this.keyPanel.Name = "keyPanel";
+      this.keyPanel.Size = new System.Drawing.Size(187, 43);
+      this.keyPanel.TabIndex = 0;
+      // 
+      // groupBox2
+      // 
+      this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox2.Location = new System.Drawing.Point(180, 70);
+      this.groupBox2.Name = "groupBox2";
+      this.groupBox2.Size = new System.Drawing.Size(198, 69);
+      this.groupBox2.TabIndex = 10;
+      this.groupBox2.TabStop = false;
+      this.groupBox2.Text = "Key:";
+      // 
+      // groupBox3
+      // 
+      this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox3.Location = new System.Drawing.Point(181, 145);
+      this.groupBox3.Name = "groupBox3";
+      this.groupBox3.Size = new System.Drawing.Size(197, 100);
+      this.groupBox3.TabIndex = 11;
+      this.groupBox3.TabStop = false;
+      this.groupBox3.Text = "Value:";
+      // 
+      // ItemDictionaryView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.keyPanel);
+      this.Controls.Add(this.detailsPanel);
+      this.Controls.Add(this.valueTypeTextBox);
+      this.Controls.Add(this.keyTypeTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.groupBox2);
+      this.Controls.Add(this.groupBox3);
+      this.Name = "ItemDictionaryView";
+      this.Size = new System.Drawing.Size(381, 253);
+      this.groupBox1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ListView listView;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox keyTypeTextBox;
+    private System.Windows.Forms.TextBox valueTypeTextBox;
+    private System.Windows.Forms.ColumnHeader keyHeader;
+    private System.Windows.Forms.ColumnHeader valueHeader;
+    private System.Windows.Forms.Panel detailsPanel;
+    private System.Windows.Forms.Panel keyPanel;
+    private System.Windows.Forms.GroupBox groupBox2;
+    private System.Windows.Forms.GroupBox groupBox3;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemDictionaryView_T.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemDictionary_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemDictionary_T.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemDictionary_T.cs	(revision 1668)
@@ -0,0 +1,352 @@
+﻿using System;
+using System.Collections; 
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A dictionary having key-value pairs of the type <see cref="IItem"/>.
+  /// </summary>
+  /// <typeparam name="K">The type of the keys, which must implement the interface <see cref="IItem"/>.</typeparam>
+  /// <typeparam name="V">The type of the values, which must imlement the interface <see cref="IItem"/>.</typeparam>
+  public class ItemDictionary<K,V> : ItemBase, IDictionary<K,V> 
+    where K : IItem
+    where V : IItem{
+    private Dictionary<K, V> dict;
+
+    /// <summary>
+    /// Gets the dictionary of key-value pairs.
+    /// </summary>
+    public Dictionary<K, V> Dictionary {
+      get { return dict; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemDictionary&lt;TKey,TValue&gt;"/>.
+    /// </summary>
+    /// <remarks>Creates a new <see cref="Dictionary"/> 
+    /// having <see cref="IItem"/> as type of keys and values 
+    /// and a new <see cref="IItemKeyComparer&lt;T&gt;"/> as <see cref="IEqualityComparer"/>.</remarks>
+    public ItemDictionary() {
+      dict = new Dictionary<K, V>(new IItemKeyComparer<K>());
+    }
+
+    #region ItemBase Members
+    /// <summary>
+    /// Creates a new instance of <see cref="ItemDictionaryView&lt;K,V&gt;"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ItemDictionaryView&lt;K,V&gt;"/>.</returns>
+    public override IView CreateView() {
+      return new ItemDictionaryView<K,V>(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance and adds it to the dictionary <paramref name="clonedObjects"/>.
+    /// </summary>
+    /// <remarks>Also the keys and values in the dictionary are cloned and saved to the dictionary <paramref name="clonedObjects"/>,
+    /// when they are not already contained (deep copy).</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="ItemDictionary&lt;K,V&gt;"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemDictionary<K,V> clone = new ItemDictionary<K,V>();
+      clonedObjects.Add(Guid, clone);
+      foreach (KeyValuePair<K, V> item in dict) {
+        clone.dict.Add((K) Auxiliary.Clone(item.Key, clonedObjects), (V) Auxiliary.Clone(item.Value, clonedObjects));
+      }
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Every key-value pair is saved as new child node with the tag name "KeyValuePair".<br/>
+    /// In the child node the key is saved as a new child node with the tag name "Key".<br/>
+    /// The value is also saved as new child node with the tag name "Val".
+    /// </remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      foreach (KeyValuePair<K, V> item in dict) {
+        XmlNode keyNode = PersistenceManager.Persist("Key", item.Key, document, persistedObjects);
+        XmlNode valueNode = PersistenceManager.Persist("Val", item.Value, document, persistedObjects); 
+        XmlNode pairNode = document.CreateNode(XmlNodeType.Element, "KeyValuePair", null); 
+        pairNode.AppendChild(keyNode); 
+        pairNode.AppendChild(valueNode); 
+        node.AppendChild(pairNode); 
+      }
+      return node; 
+    }
+
+    /// <summary>
+    /// Loads the persisted matrix from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>All key-value pairs must be saved as child nodes of the node. <br/>
+    /// Every child node has to contain two child nodes itself, one for the key, having the tag name "Key",
+    /// and one for the value, having the tag name "Val" (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      for (int i = 0; i < node.ChildNodes.Count; i++) {
+        K key = (K) PersistenceManager.Restore(node.ChildNodes[i].SelectSingleNode("Key"), restoredObjects);
+        V val = (V) PersistenceManager.Restore(node.ChildNodes[i].SelectSingleNode("Val"), restoredObjects);
+        dict[key] = val; 
+      }
+    }
+
+    /// <summary>
+    /// The string representation of the dictionary
+    /// </summary>
+    /// <returns>The elements of the dictionary as string, each key-value pair in the format 
+    /// <c>Key:Value</c>, separated by a semicolon. <br/>
+    /// If the dictionary contains no entries, "Empty Dictionary" is returned.</returns>
+    public override string ToString() {
+      if (dict.Count > 0) {
+        StringBuilder builder = new StringBuilder();
+        foreach (KeyValuePair<K, V> item in dict) {
+          builder.Append(item.Key.ToString());
+          builder.Append(":");
+          builder.Append(item.Value.ToString());
+          builder.Append("; ");
+        }
+        return builder.ToString();
+      } else {
+        return "Empty Dictionary";
+      }
+    }
+    #endregion
+
+    #region IDictionary<K,V> Members
+
+    ///// <summary>
+    ///// Adds a new key value pair to the dictionary.
+    ///// </summary>
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Add"/>
+    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
+    ///// <param name="key">The key to add.</param>
+    ///// <param name="value">The value to add.</param>
+    public void Add(K key, V value) {
+      dict.Add(key, value);
+      OnItemAdded(key, value);
+    }
+
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.ContainsKey"/>
+    public bool ContainsKey(K key) {
+      return dict.ContainsKey(key);
+    }
+
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.Keys"/>
+    public ICollection<K> Keys {
+      get { return dict.Keys; }
+    }
+
+    /// <summary>
+    /// Removes a key-value pair having the specified <paramref name="key"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemRemoved"/>.</remarks>
+    /// <param name="key">The key of the key-value pair, which should be removed.</param>
+    /// <returns><c>true</c> if the key was found and successfully removed, 
+    /// <c>false</c> if the key was not found.</returns>
+    public bool Remove(K key) {
+      V value = dict[key]; 
+      bool removed = dict.Remove(key);
+      OnItemRemoved(key, value); 
+      return removed; 
+    }
+
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.TryGetValue"/>
+    public bool TryGetValue(K key, out V value) {
+      return dict.TryGetValue(key, out value);
+    }
+
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;.Values"/>
+    public ICollection<V> Values {
+      get { return dict.Values; }
+    }
+
+    /// <summary>
+    /// Gets or sets the value of a specified <paramref name="key"/>.
+    /// </summary>
+    /// <param name="key">The key of the value which should be received or changed.</param>
+    /// <returns>The value of the <paramref name="key"/>.</returns>
+    public V this[K key] {
+      get { return dict[key]; }
+      set { dict[key] = value; }
+    }
+
+    #endregion
+
+    #region ICollection<KeyValuePair<K,V>> Members
+
+    /// <summary>
+    /// Adds a key-value pair to the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
+    /// <param name="item">The key-value pair to add.</param>
+    public void Add(KeyValuePair<K, V> item) {
+      dict.Add(item.Key, item.Value);
+      OnItemAdded(item.Key, item.Value); 
+    }
+
+    ///// <summary>
+    ///// Empties the dictionary.
+    ///// </summary>
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Clear"/>
+    /// <remarks>Calls <see cref="OnCleared"/>.</remarks>
+    public void Clear() {
+      dict.Clear();
+      OnCleared(); 
+    }
+
+    /// <summary>
+    /// Checks whether the specified key-value pair exists in the current instance of the dictionary.
+    /// </summary>
+    /// <param name="item">The key-value pair to check.</param>
+    /// <returns><c>true</c> if both, the key and the value exist in the dictionary, 
+    /// <c>false</c> otherwise.</returns>
+    public bool Contains(KeyValuePair<K, V> item) {
+      return (dict.ContainsKey(item.Key) && dict[item.Key].Equals(item.Value));
+    }
+
+    /// <summary>
+    /// TODO
+    /// </summary>
+    /// <param name="array"></param>
+    /// <param name="arrayIndex"></param>
+    public void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex) {
+      throw new NotImplementedException(); 
+    }
+
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.Count"/>
+    public int Count {
+      get { return dict.Count; }
+    }
+
+    /// <summary>
+    /// Checks whether the dictionary is read-only.
+    /// </summary>
+    /// <remarks>Always returns <c>false</c>.</remarks>
+    public bool IsReadOnly {
+      get { return false; }
+    }
+
+    /// <summary>
+    /// Removes the specified key-value pair.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemRemoved"/> when the removal was successful.</remarks>
+    /// <param name="item">The key-value pair to remove.</param>
+    /// <returns><c>true</c> if the removal was successful, <c>false</c> otherwise.</returns>
+    public bool Remove(KeyValuePair<K, V> item) {
+      bool removed = dict.Remove(item.Key);
+      if (removed) {
+        OnItemRemoved(item.Key, item.Value);
+      } 
+      return removed; 
+    }
+    #endregion
+
+    #region IEnumerable<KeyValuePair<K,V>> Members
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.GetEnumerator"/>
+    public IEnumerator<KeyValuePair<K, V>> GetEnumerator() {
+      return dict.GetEnumerator();
+    }
+    #endregion
+
+    #region IEnumerable Members
+    /// <inheritdoc cref="System.Collections.Generic.Dictionary&lt;K,V&gt;.GetEnumerator"/>
+    IEnumerator IEnumerable.GetEnumerator() {
+      return dict.GetEnumerator();
+    }
+    #endregion
+
+    #region Event Handler
+    /// <summary>
+    /// Occurs when a new item is added to the dictionary.
+    /// </summary>
+    public event EventHandler<KeyValueEventArgs> ItemAdded;
+    /// <summary>
+    /// Fires a new <c>ItemAdded</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="key">The key that was added.</param>
+    /// <param name="value">The value that was added.</param>
+    protected virtual void OnItemAdded(K key, V value) {
+      if (ItemAdded != null)
+        ItemAdded(this, new KeyValueEventArgs(key, value));
+      OnChanged();
+    }
+
+    /// <summary>
+    /// Occurs when an item is removed from the dictionary.
+    /// </summary>
+    public event EventHandler<KeyValueEventArgs> ItemRemoved;
+    /// <summary>
+    /// Fires a new <c>ItemRemoved</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="key">The key that was removed.</param>
+    /// <param name="value">The value that was removed</param>
+    protected virtual void OnItemRemoved(K key, V value) {
+      if (ItemRemoved != null)
+        ItemRemoved(this, new KeyValueEventArgs(key, value));
+      OnChanged();
+    }
+
+    /// <summary>
+    /// Occurs when the dictionary is emptied.
+    /// </summary>
+    public event EventHandler Cleared;
+    /// <summary>
+    /// Fires a new <c>Cleared</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    protected virtual void OnCleared() {
+      if (Cleared != null)
+        Cleared(this, new EventArgs());
+      OnChanged();
+    }
+    #endregion
+
+    #region IEqualityComparer
+    /// <summary>
+    /// Compares two keys with each other.
+    /// </summary>
+    /// <typeparam name="T">The type of the keys.</typeparam>
+    internal sealed class IItemKeyComparer<T> : IEqualityComparer<T>
+        where T : IItem {
+      /// <summary>
+      /// Checks whether two keys are equal to each other.
+      /// </summary>
+      /// <param name="x">Key number one.</param>
+      /// <param name="y">Key number two.</param>
+      /// <returns><c>true</c> if the two keys are the same, <c>false</c> otherwise.</returns>
+      public bool Equals(T x, T y) {
+        if (x is IComparable) {
+          return (((IComparable) x).CompareTo(y) == 0); 
+        }
+        if (y is IComparable) {
+          return (((IComparable) y).CompareTo(x) == 0); 
+        }
+        return x.Equals(y); 
+      }
+
+      /// <summary>
+      /// Serves as a hash function for a particular type.
+      /// </summary>
+      /// <param name="obj">The object where the hash code is searched for.</param>
+      /// <returns>A hash code for the given <paramref name="obj"/>.</returns>
+      public int GetHashCode(T obj) {
+        if (obj is IObjectData) {
+          return ((IObjectData) obj).Data.GetHashCode(); 
+        }
+        return obj.Guid.GetHashCode(); 
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemList.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemList.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemList.cs	(revision 1668)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Generic list of elements that implement the interface <see cref="IItem"/>.
+  /// </summary>
+  public class ItemList : ItemList<IItem> {
+    /// <summary>
+    /// Clones the current list and all its elements.
+    /// </summary>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="ItemList"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemList clone = new ItemList();
+      clonedObjects.Add(Guid, clone);
+      base.CloneElements(clone, clonedObjects);
+      return clone;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemListView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemListView.cs	(revision 1668)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="ItemList"/>.
+  /// </summary>
+  public class ItemListView : ItemListView<IItem> {
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ItemListView"/>.
+    /// </summary>
+    public ItemListView() { }
+    /// <summary>
+    /// Initializes a new instnace of the class <see cref="ItemListView"/> with the given 
+    /// <paramref name="itemList"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="itemList"/> is not copied!</note>
+    /// </summary>
+    /// <param name="itemList">The list of items to represent.</param>
+    public ItemListView(ItemList itemList)
+      : this() {
+      ItemList = itemList;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.Designer.cs	(revision 1668)
@@ -0,0 +1,209 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  partial class ItemListView<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 (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in itemsListView.Items)
+        ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+      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.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.itemTypeLabel = new System.Windows.Forms.Label();
+      this.typeTextBox = new System.Windows.Forms.TextBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.itemsGroupBox.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.Enabled = false;
+      this.splitContainer.Location = new System.Drawing.Point(0, 27);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.itemsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 246);
+      this.splitContainer.SplitterDistance = 198;
+      this.splitContainer.TabIndex = 2;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.removeButton);
+      this.itemsGroupBox.Controls.Add(this.addButton);
+      this.itemsGroupBox.Controls.Add(this.itemsListView);
+      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(198, 246);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "&Items:";
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(87, 217);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addButton.Location = new System.Drawing.Point(6, 217);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "&Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_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.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(6, 19);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(186, 192);
+      this.itemsListView.TabIndex = 0;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.elementsListView_SelectedIndexChanged);
+      this.itemsListView.SizeChanged += new System.EventHandler(this.elementsListView_SizeChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragEnter);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.elementsListView_KeyDown);
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.elementsListView_ItemDrag);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.elementsListView_DragOver);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Enabled = false;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(221, 246);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "&Details:";
+      // 
+      // itemTypeLabel
+      // 
+      this.itemTypeLabel.AutoSize = true;
+      this.itemTypeLabel.Location = new System.Drawing.Point(3, 3);
+      this.itemTypeLabel.Name = "itemTypeLabel";
+      this.itemTypeLabel.Size = new System.Drawing.Size(57, 13);
+      this.itemTypeLabel.TabIndex = 0;
+      this.itemTypeLabel.Text = "&Item Type:";
+      // 
+      // typeTextBox
+      // 
+      this.typeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.typeTextBox.Location = new System.Drawing.Point(66, 0);
+      this.typeTextBox.Name = "typeTextBox";
+      this.typeTextBox.ReadOnly = true;
+      this.typeTextBox.Size = new System.Drawing.Size(357, 20);
+      this.typeTextBox.TabIndex = 1;
+      // 
+      // ItemListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeTextBox);
+      this.Controls.Add(this.itemTypeLabel);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ItemListView";
+      this.Size = new System.Drawing.Size(423, 273);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox itemsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.ListView itemsListView;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private Label itemTypeLabel;
+    private TextBox typeTextBox;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.cs	(revision 1668)
@@ -0,0 +1,263 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="HeuristicLab.Data.ItemList&lt;T&gt;"/>.
+  /// </summary>
+  /// <typeparam name="T">The type of the items in the list.</typeparam>
+  public partial class ItemListView<T> : ViewBase where T : IItem {
+    private ChooseItemDialog chooseItemDialog;
+
+    /// <summary>
+    /// Gets or sets the item list to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public ItemList<T> ItemList {
+      get { return (ItemList<T>)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="HeuristicLab.Data.ItemListView&lt;T&gt;"/>.
+    /// </summary>
+    public ItemListView() {
+      InitializeComponent();
+      itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="HeuristicLab.Data.ItemListView&lt;T&gt;"/> with the given
+    /// <paramref name="itemList"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="itemList"/> is not copied!</note>
+    /// </summary>
+    /// <param name="itemList">The list of items to represent visually.</param>
+    public ItemListView(ItemList<T> itemList)
+      : this() {
+      ItemList = itemList;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="HeuristicLab.Data.ItemList&lt;T&gt;"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ItemList.ItemAdded -= new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted);
+      ItemList.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved);
+      ItemList.Cleared -= new EventHandler(ItemList_Cleared);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="HeuristicLab.Data.ItemList&lt;T&gt;"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ItemList.ItemAdded += new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted);
+      ItemList.ItemRemoved += new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved);
+      ItemList.Cleared += new EventHandler(ItemList_Cleared);
+    }
+
+    /// <summary>
+    /// Update all controls with the lastest elements in the list.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if(ItemList == null) {
+        typeTextBox.Text = "";
+        splitContainer.Enabled = false;
+      } else {
+        typeTextBox.Text = typeof(T).FullName;
+        splitContainer.Enabled = true;
+        foreach(ListViewItem item in itemsListView.Items) {
+          ((IItem)item.Tag).Changed -= new EventHandler(Item_Changed);
+        }
+        itemsListView.Items.Clear();
+        foreach(IItem data in ItemList) {
+          ListViewItem item = new ListViewItem();
+          item.Text = data.ToString();
+          item.Tag = data;
+          itemsListView.Items.Add(item);
+          data.Changed += new EventHandler(Item_Changed);
+        }
+      }
+    }
+
+    private void elementsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if(detailsGroupBox.Controls.Count > 0)
+        detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if(itemsListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+      if(itemsListView.SelectedItems.Count == 1) {
+        IItem data = (IItem)itemsListView.SelectedItems[0].Tag;
+        Control view = (Control)data.CreateView();
+        detailsGroupBox.Controls.Add(view);
+        view.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void elementsListView_SizeChanged(object sender, EventArgs e) {
+      if(itemsListView.Columns.Count > 0)
+        itemsListView.Columns[0].Width = Math.Max(0, itemsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void elementsListView_KeyDown(object sender, KeyEventArgs e) {
+      if(e.KeyCode == Keys.Delete) {
+        while(itemsListView.SelectedIndices.Count > 0)
+          ItemList.RemoveAt(itemsListView.SelectedIndices[0]);
+        e.Handled = true;
+      } else if((e.KeyCode == Keys.C) && (e.Modifiers == Keys.Control)) {
+        // copy contents of itemlist to clipboard
+        StringBuilder buffer = new StringBuilder();
+        for(int i = 0; i < itemsListView.Items.Count; i++) {
+          buffer.Append(itemsListView.Items[i].Text.Replace(';','\t'));
+          buffer.Append("\n");
+        }
+        Clipboard.SetText(buffer.ToString());
+        e.Handled = true;
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      if(chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog(typeof(T));
+        chooseItemDialog.Caption = "Add Item";
+      }
+      if(chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          ItemList.Add((T)chooseItemDialog.Item);
+        } catch(Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      while(itemsListView.SelectedIndices.Count > 0)
+        ItemList.RemoveAt(itemsListView.SelectedIndices[0]);
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void elementsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem item = (ListViewItem)e.Item;
+      IItem data = (IItem)item.Tag;
+      DataObject dataObject = new DataObject();
+      dataObject.SetData("IItem", data);
+      dataObject.SetData("DragSource", itemsListView);
+      DoDragDrop(dataObject, DragDropEffects.Move);
+    }
+    private void elementsListView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IItem")) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+        if(item != null)
+          e.Effect = DragDropEffects.Move;
+      }
+    }
+    private void elementsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if(e.Data.GetDataPresent("IItem")) {
+        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+        ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+        if(item != null)
+          e.Effect = DragDropEffects.Move;
+      }
+    }
+    private void elementsListView_DragDrop(object sender, DragEventArgs e) {
+      if(e.Effect != DragDropEffects.None) {
+        if(e.Data.GetDataPresent("IItem")) {
+          IItem data = (IItem)e.Data.GetData("IItem");
+          Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
+          ListViewItem item = itemsListView.GetItemAt(p.X, p.Y);
+          if(item != null) {
+            int index = item.Index;
+            ItemList.Remove((T)data);
+            ItemList.Insert(index, (T)data);
+            itemsListView.SelectedIndices.Clear();
+            itemsListView.SelectedIndices.Add(index);
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Item and Item List Events
+    private void ItemList_ItemInserted(object sender, ItemIndexEventArgs e) {
+      if(InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ItemList_ItemInserted), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Item.ToString();
+        item.Tag = e.Item;
+        itemsListView.Items.Insert(e.Index, item);
+        e.Item.Changed += new EventHandler(Item_Changed);
+      }
+    }
+    private void ItemList_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if(InvokeRequired)
+        Invoke(new EventHandler<ItemIndexEventArgs>(ItemList_ItemRemoved), sender, e);
+      else {
+        itemsListView.Items.RemoveAt(e.Index);
+        e.Item.Changed -= new EventHandler(Item_Changed);
+      }
+    }
+    private void ItemList_Cleared(object sender, EventArgs e) {
+      Refresh();
+    }
+    private void Item_Changed(object sender, EventArgs e) {
+      if(InvokeRequired)
+        Invoke(new EventHandler(Item_Changed), sender, e);
+      else {
+        IItem data = (IItem)sender;
+        foreach(ListViewItem item in itemsListView.Items) {
+          if(item.Tag == data)
+            item.Text = data.ToString();
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemListView_T.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/ItemList_T.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ItemList_T.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ItemList_T.cs	(revision 1668)
@@ -0,0 +1,400 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Represents a list of items where the items are of the type <typeparamref name="T"/>.
+  /// </summary>
+  /// <typeparam name="T">The type of the items in this list. <paramref name="T"/> must implement <see cref="IItem"/>.</typeparam>
+  public class ItemList<T> : ItemBase, IList<T> where T : IItem {
+    private List<T> list;
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="ItemList&lt;T&gt;"/>.
+    /// </summary>
+    public ItemList() {
+      list = new List<T>();
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ItemListView&lt;T&gt;"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ItemListView&lt;T&gt;"/>.</returns>
+    public override IView CreateView() {
+      return new ItemListView<T>(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>Saves the cloned instance in the dictionary <paramref name="clonedObjects"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="ItemList&lt;T&gt;"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ItemList<T> clone = new ItemList<T>();
+      clonedObjects.Add(Guid, clone);
+      CloneElements(clone, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Clones all elements in the current list.
+    /// </summary>
+    /// <remarks>Clones only elements that have not already been cloned 
+    /// (and therefore exist in the dictionary <paramref name="clonedObjects"/>).</remarks>
+    /// <param name="destination">The <see cref="ItemList&lt;T&gt;"/> where to save the cloned objects.</param>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    protected void CloneElements(ItemList<T> destination, IDictionary<Guid, object> clonedObjects) {
+      for (int i = 0; i < list.Count; i++)
+        destination.list.Add((T) Auxiliary.Clone(list[i], clonedObjects));
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Each element in the list is saved as child node.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where the data is saved.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      for (int i = 0; i < list.Count; i++)
+        node.AppendChild(PersistenceManager.Persist(list[i], document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted item list from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The single elements of the list must be saved as child nodes (see <see cref="GetXmlNode"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the instance is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      for (int i = 0; i < node.ChildNodes.Count; i++)
+        list.Add((T) PersistenceManager.Restore(node.ChildNodes[i], restoredObjects));
+    }
+
+    /// <summary>
+    /// The string representation of the list.
+    /// </summary>
+    /// <returns>The elements of the list as string, each element separated by a semicolon. <br/>
+    /// If the list is empty, "Empty List" is returned.</returns>
+    public override string ToString() {
+      if (list.Count > 0) {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(list[0].ToString());
+        for (int i = 1; i < list.Count; i++) {
+          builder.Append(";");
+          builder.Append(list[i].ToString());
+        }
+        return builder.ToString();
+      } else {
+        return "Empty List";
+      }
+    }
+
+    #region IList<T> Members
+    /// <inheritdoc cref="List&lt;T&gt;.IndexOf(T)"/>
+    public int IndexOf(T item) {
+      return list.IndexOf(item);
+    }
+    ///// <summary>
+    ///// Inserts a specified <paramref name="item"/> at a specific position <paramref name="index"/>.
+    ///// </summary>
+    ///// <remarks>Calls <see cref="M:ItemList&lt;T&gt;.OnItemAdded"/>.</remarks>
+    ///// <param name="index">The position where to insert the <paramref name="item"/>.</param>
+    ///// <param name="item">The element to insert.</param>
+    /// <inheritdoc cref="List&lt;T&gt;.Insert"/>
+    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
+    public void Insert(int index, T item) {
+      list.Insert(index, item);
+      OnItemAdded(item, index);
+    }
+    ///// <summary>
+    ///// Removes the element at the specified <paramref name="index"/>.
+    ///// </summary>
+    ///// <remarks>Calls <see cref="M:ItemList&lt;T&gt;.OnItemRemoved"/>.</remarks>
+    ///// <param name="index">The position where to remove the element.</param>
+    /// <inheritdoc cref="List&lt;T&gt;.RemoveAt"/>
+    /// <remarks>Calls <see cref="OnItemRemoved"/>.</remarks>
+    public void RemoveAt(int index) {
+      IItem item = list[index];
+      list.RemoveAt(index);
+      OnItemRemoved(item, index);
+    }
+    /// <summary>
+    /// Gets or sets the element at the specified <paramref name="index"/>.
+    /// </summary>
+    /// <param name="index">The position where to get or set the element.</param>
+    /// <returns>The element at the specified <paramref name="index"/>.</returns>
+    public T this[int index] {
+      get { return list[index]; }
+      set { list[index] = value; }
+    }
+    #endregion
+
+    #region ICollection<T> Members
+    ///// <summary>
+    ///// Adds an item to the current list.
+    ///// </summary>
+    ///// <remarks>Calls <see cref="M:ItemList&lt;T&gt;.OnItemAdded"/>.</remarks>
+    ///// <param name="item">The element to add.</param>
+    /// <inheritdoc cref="List&lt;T&gt;.Add"/>
+    /// <remarks>Calls <see cref="OnItemAdded"/>.</remarks>
+    public void Add(T item) {
+      list.Add(item);
+      OnItemAdded(item, list.Count - 1);
+    }
+    ///// <summary>
+    ///// Empties the list.
+    ///// </summary>
+    ///// <remarks>Calls <see cref="M:ItemList&lt;T&gt;.OnCleared"/>.</remarks>
+    /// <inheritdoc cref="List&lt;T&gt;.Clear"/>
+    /// <remarks>Calls <see cref="OnCleared"/>.</remarks>
+    public void Clear() {
+      list.Clear();
+      OnCleared();
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.Contains"/>
+    public bool Contains(T item) {
+      return list.Contains(item);
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.CopyTo(T[], int)"/>
+    public void CopyTo(T[] array, int arrayIndex) {
+      list.CopyTo(array, arrayIndex);
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.Count"/>
+    public int Count {
+      get { return list.Count; }
+    }
+    /// <summary>
+    /// Checks whether the current list is read-only.
+    /// </summary>
+    /// <remarks>Always returns <c>false</c>.</remarks>
+    public bool IsReadOnly {
+      get { return false; }
+    }
+    /// <summary>
+    /// Removes the specified <paramref name="item"/>.
+    /// </summary>
+    /// <remarks>If the <paramref name="item"/> can be successfully removed, 
+    /// <see cref="OnItemRemoved"/> is called.</remarks>
+    /// <param name="item">The element to remove.</param>
+    /// <returns><c>true</c>, if the element could be removed successfully, <c>false</c> otherwise.</returns>
+    public bool Remove(T item) {
+      int index = list.IndexOf(item);
+      if (list.Remove(item)) {
+        OnItemRemoved(item, index);
+        return true;
+      } else {
+        return false;
+      }
+    }
+    #endregion
+
+    #region IEnumerable<T> Members
+    /// <inheritdoc cref="List&lt;T&gt;.GetEnumerator"/>
+    public IEnumerator<T> GetEnumerator() {
+      return list.GetEnumerator();
+    }
+    #endregion
+
+    #region IEnumerable Members
+    /// <inheritdoc cref="List&lt;T&gt;.GetEnumerator"/>
+    IEnumerator IEnumerable.GetEnumerator() {
+      return list.GetEnumerator();
+    }
+    #endregion
+
+    #region List<T> Methods
+    /// <inheritdoc cref="List&lt;T&gt;.LastIndexOf(T)"/>
+    public int LastIndexOf(T item) {
+      return list.LastIndexOf(item);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.LastIndexOf(T, int)"/>
+    public int LastIndexOf(T item, int index) {
+      return list.LastIndexOf(item, index);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.LastIndexOf(T, int, int)"/>
+    public int LastIndexOf(T item, int index, int count) {
+      return list.LastIndexOf(item, index, count);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.IndexOf(T, int)"/>
+    public int IndexOf(T item, int index) {
+      return list.IndexOf(item, index);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.IndexOf(T, int, int)"/>
+    public int IndexOf(T item, int index, int count) {
+      return list.IndexOf(item, index, count);
+    }
+    /// <summary>
+    /// Adds all the elements in the specified <paramref name="collection"/> to the current list.
+    /// </summary>
+    /// <param name="collection">The elements to add to the current list.</param>
+    public void AddRange(IEnumerable<T> collection) {
+      foreach (T obj in collection) {
+        this.Add(obj);
+      }
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.Exists"/>
+    public bool Exists(Predicate<T> match) {
+      return list.Exists(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.BinarySearch(T)"/>
+    public int BinarySearch(T item) {
+      return list.BinarySearch(item);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.BinarySearch(T, System.Collections.Generic.IComparer&lt;T&gt;)"/>
+    public int BinarySearch(T item, IComparer<T> comparer) {
+      return list.BinarySearch(item, comparer);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.BinarySearch(int, int, T, System.Collections.Generic.IComparer&lt;T&gt;)"/>
+    public int BinarySearch(int index, int count, T item, IComparer<T> comparer) {
+      return list.BinarySearch(index, count, item, comparer);
+    }
+    /// <inheritdoc cref="List&lt;T&gt;.Find"/>
+    public T Find(Predicate<T> match) {
+      return list.Find(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.FindAll"/>
+    public List<T> FindAll(Predicate<T> match) {
+      return list.FindAll(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.FindIndex(System.Predicate&lt;T&gt;)"/>
+    public int FindIndex(Predicate<T> match) {
+      return list.FindIndex(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.FindLast"/>
+    public T FindLast(Predicate<T> match) {
+      return list.FindLast(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.FindLastIndex(System.Predicate&lt;T&gt;)"/>
+    public int FindLastIndex(Predicate<T> match) {
+      return list.FindLastIndex(match);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.Sort()"/>
+    public void Sort() {
+      list.Sort();
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.Sort(System.Collections.Generic.IComparer&lt;T&gt;)"/>
+    public void Sort(IComparer<T> comparer) {
+      list.Sort(comparer);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.Sort(System.Comparison&lt;T&gt;)"/>
+    public void Sort(Comparison<T> comparison) {
+      list.Sort(comparison);
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.Reverse()"/>
+    public void Reverse() {
+      list.Reverse();
+    }
+
+    /// <summary>
+    /// Converts all elements in the current list to a specified type <typeparamref name="TOutput"/>.
+    /// </summary>
+    /// <typeparam name="TOutput">The type to convert the items to, which must implement <see cref="IItem"/>.</typeparam>
+    /// <param name="converter">A delegate that converts elements from type <c>T</c> to type <typeparamref name="TOutput"/>.</param>
+    /// <returns>A list containing the converted elements.</returns>
+    public ItemList<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter) where TOutput : IItem {
+      ItemList<TOutput> targetList = new ItemList<TOutput>();
+      foreach (T item in list) {
+        targetList.Add(converter.Invoke(item));
+      }
+      return targetList;
+    }
+
+    /// <inheritdoc cref="List&lt;T&gt;.TrueForAll"/>
+    public bool TrueForAll(Predicate<T> match) {
+      return list.TrueForAll(match);
+    }
+
+    #endregion
+
+    /// <summary>
+    /// Occurs where a new item is added to the list.
+    /// </summary>
+    public event EventHandler<ItemIndexEventArgs> ItemAdded;
+    /// <summary>
+    /// Fires a new <c>ItemAdded</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="item">The added element.</param>
+    /// <param name="index">The position where the new element was added.</param>
+    protected virtual void OnItemAdded(IItem item, int index) {
+      if (ItemAdded != null)
+        ItemAdded(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    /// <summary>
+    /// Occurs when an element is deleted from the list.
+    /// </summary>
+    public event EventHandler<ItemIndexEventArgs> ItemRemoved;
+    /// <summary>
+    /// Fires a new <c>ItemRemoved</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    /// <param name="item">The removed element.</param>
+    /// <param name="index">The position from where the element was removed.</param>
+    protected virtual void OnItemRemoved(IItem item, int index) {
+      if (ItemRemoved != null)
+        ItemRemoved(this, new ItemIndexEventArgs(item, index));
+      OnChanged();
+    }
+    /// <summary>
+    /// Occurs when the list is emptied.
+    /// </summary>
+    public event EventHandler Cleared;
+    /// <summary>
+    /// Fires a new <c>Cleared</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    protected virtual void OnCleared() {
+      if (Cleared != null)
+        Cleared(this, new EventArgs());
+      OnChanged();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.Designer.cs	(revision 1668)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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;
+namespace HeuristicLab.Data {
+  partial class MatrixDataBaseView {
+    /// <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.rowsLabel = new System.Windows.Forms.Label();
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.AutoSize = true;
+      this.rowsLabel.Location = new System.Drawing.Point(3, 4);
+      this.rowsLabel.Name = "rowsLabel";
+      this.rowsLabel.Size = new System.Drawing.Size(37, 13);
+      this.rowsLabel.TabIndex = 0;
+      this.rowsLabel.Text = "Rows:";
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.AcceptsReturn = true;
+      this.rowsTextBox.Location = new System.Drawing.Point(39, 1);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.Size = new System.Drawing.Size(110, 20);
+      this.rowsTextBox.TabIndex = 1;
+      this.rowsTextBox.Text = "0";
+      this.rowsTextBox.Validated += new System.EventHandler(this.textBox_Validated);
+      this.rowsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox_KeyDown);
+      this.rowsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.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.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Location = new System.Drawing.Point(3, 27);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(383, 293);
+      this.dataGridView.TabIndex = 2;
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.AcceptsReturn = true;
+      this.columnsTextBox.Location = new System.Drawing.Point(215, 1);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.Size = new System.Drawing.Size(110, 20);
+      this.columnsTextBox.TabIndex = 4;
+      this.columnsTextBox.Text = "0";
+      this.columnsTextBox.Validated += new System.EventHandler(this.textBox_Validated);
+      this.columnsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox_KeyDown);
+      this.columnsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(159, 4);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(50, 13);
+      this.columnsLabel.TabIndex = 3;
+      this.columnsLabel.Text = "Columns:";
+      // 
+      // MatrixDataBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.columnsTextBox);
+      this.Controls.Add(this.columnsLabel);
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.rowsTextBox);
+      this.Controls.Add(this.rowsLabel);
+      this.Name = "MatrixDataBaseView";
+      this.Size = new System.Drawing.Size(391, 323);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label rowsLabel;
+    private System.Windows.Forms.TextBox rowsTextBox;
+    protected System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.Label columnsLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.cs	(revision 1668)
@@ -0,0 +1,184 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The basic visual representation of a two-dimensional matrix.
+  /// </summary>
+  public partial class MatrixDataBaseView : ViewBase {
+
+    /// <summary>
+    /// Gets or sets the matrix to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public ArrayDataBase ArrayDataBase {
+      get { return (ArrayDataBase)Item; }
+      protected set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="MatrixDataBaseView"/>.
+    /// </summary>
+    public MatrixDataBaseView() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="ArrayDataBase"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      ArrayDataBase.Changed -= new EventHandler(ArrayDataBase_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="ArrayDataBase"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ArrayDataBase.Changed += new EventHandler(ArrayDataBase_Changed);
+    }
+
+    /// <summary>
+    /// Validates the given data.
+    /// <note type="caution"> Needs to be overriden in each inherited class!</note>
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when method is not 
+    /// overridden in inherited class.</exception>
+    /// <param name="element">The data to validate.</param>
+    /// <returns><c>true</c> if the data is valid, <c>false</c> otherwise.</returns>
+    protected virtual bool ValidateData(string element) {
+      throw new InvalidOperationException("ValidateData has to be overridden in each inherited class");
+    }
+    /// <summary>
+    /// Sets an element of the current instance at the given <paramref name="index"/> 
+    /// to the given <paramref name="element"/>.
+    /// <note type="caution"> Needs to be overridden in each inherited class!</note>
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when method is not 
+    /// overridden in inherited class.</exception>
+    /// <param name="row">The row where to substitute the element.</param>
+    /// <param name="column">The column where to substitute the element.</param>
+    /// <param name="element">The element to insert.</param>        
+    protected virtual void SetArrayElement(int row, int column, string element) {
+      throw new InvalidOperationException("SetArrayElement has to be overridden in each inherited class");
+    }
+
+    /// <summary>
+    /// Update all controls with the latest element of the matrix.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (ArrayDataBase != null) {
+        int rows = ArrayDataBase.Data.GetLength(0);
+        int columns = ArrayDataBase.Data.GetLength(1);
+
+        rowsTextBox.Text = rows + "";
+        columnsTextBox.Text = columns + "";
+        dataGridView.ColumnCount = columns;
+        dataGridView.RowCount = rows;
+        for (int i = 0; i < rows; i++) {
+          for (int j = 0; j < columns; j++) {
+            dataGridView.Rows[i].Cells[j].Value = ArrayDataBase.Data.GetValue(i, j);
+          }
+        }
+      } else {
+        rowsTextBox.Text = "1";
+        columnsTextBox.Text = "1";
+        dataGridView.ColumnCount = 1;
+        dataGridView.RowCount = 1;
+      }
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      int newValue;
+      TextBox source = (TextBox)sender;
+      if (int.TryParse(source.Text, out newValue)) {
+        if (newValue > 0) {
+          e.Cancel = false;
+        } else {
+          e.Cancel = true;
+        }
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    /// <summary>
+    /// Creates a new matrix having the specified number (<paramref name="newRows"/>) 
+    /// of rows and the specified number (<paramref name="newColumns"/>) of columns of the 
+    /// current instance.
+    /// </summary>
+    /// <param name="newRows">The number of rows of the new matrix.</param>
+    /// <param name="newColumns">The number of columns of the new matrix</param>
+    private void CreateAndCopyArray(int newRows, int newColumns) {
+      Array newArray = Array.CreateInstance(ArrayDataBase.Data.GetType().GetElementType(), newRows, newColumns);
+      Array.Copy(ArrayDataBase.Data, newArray, Math.Min(newArray.Length, ArrayDataBase.Data.Length));
+      ArrayDataBase.Data = newArray;
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (ValidateData((string)e.FormattedValue)) {
+        SetArrayElement(e.RowIndex, e.ColumnIndex, (string)e.FormattedValue);
+        e.Cancel = false;
+        Refresh();
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private void textBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) {
+        e.SuppressKeyPress = true;
+        dataGridView.Focus();
+      }
+    }
+
+    private void textBox_Validated(object sender, EventArgs e) {
+      int newRows;
+      int newColumns;
+      if (int.TryParse(columnsTextBox.Text, out newColumns) && int.TryParse(rowsTextBox.Text, out newRows)) {
+        CreateAndCopyArray(newRows, newColumns);
+      } else {
+        throw new FormatException();
+      }
+    }
+
+    #region ArrayDataBase Events
+    private void ArrayDataBase_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.Data/3.3/NullData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/NullData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/NullData.cs	(revision 1668)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// A class that represents <c>null</c>.
+  /// </summary>
+  public class NullData : ObjectData {
+    /// <summary>
+    /// Gets <c>null</c> and throws an exception in the setter.
+    /// </summary>
+    /// <exception cref="InvalidOperationException">Thrown when the setter is called.</exception>
+    public override object Data {
+      get { return null; }
+      set { throw new InvalidOperationException("Data property of NullData cannot be set"); }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NullData"/> with <c>null</c>.
+    /// </summary>
+    public NullData() {
+      base.Data = null;
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>Adds the cloned instance to the dictionary <paramref name="clonedObjects"/>.</remarks>
+    /// <param name="clonedObjects">All already cloned objects.</param>
+    /// <returns>The cloned instance as <see cref="NullData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      NullData clone = new NullData();
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/ObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ObjectData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/ObjectData.cs	(revision 1668)
@@ -0,0 +1,123 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// Represents the base class for all base data types.
+  /// </summary>
+  public class ObjectData : ItemBase, IObjectData {
+    private object myData;
+    /// <summary>
+    /// Gets or sets the data to represent.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ItemBase.OnChanged"/>.</remarks>
+    public virtual object Data {
+      get { return myData; }
+      set {
+        if (myData != value) {
+          myData = value;
+          OnChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>HeuristicLab data items are cloned with the <see cref="HeuristicLab.Core.Auxiliary.Clone"/> method of 
+    /// class <see cref="Auxiliary"/> (deep copy), all other items (like basic data types) 
+    /// are cloned with their own <c>Clone</c> methods (shadow copy).</remarks>
+    /// <exception cref="InvalidOperationException">Thrown when the current instance is not cloneable.</exception>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The clone instance.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ObjectData clone = (ObjectData)base.Clone(clonedObjects);
+      if (Data is IStorable)
+        clone.myData = Auxiliary.Clone((IStorable)Data, clonedObjects);
+      else if (Data is ICloneable)
+        clone.myData = ((ICloneable)Data).Clone();
+      else
+        throw new InvalidOperationException("contained object is not cloneable");
+      return clone;
+    }
+
+    /// <summary>
+    /// Checks whether the current instance equals the specified <paramref name="obj"/>.
+    /// </summary>
+    /// <param name="obj">The object to compare with.</param>
+    /// <returns><c>true</c>, if both objects are the same or 
+    /// the contained data is the same, <c>false</c> otherwise.</returns>
+    public override bool Equals(object obj) {
+      if(obj == this) return true; // same instance
+      IObjectData other = obj as IObjectData;
+      if(other != null)
+        return Data.Equals(other.Data); // are the contained Data the same?
+      else
+        return false;
+    }
+
+    /// <inheritdoc cref="object.GetHashCode"/>
+    public override int GetHashCode() {
+      return Data.GetHashCode();
+    }
+
+    /// <summary>
+    /// Compares the current instance to the given <paramref name="obj"/>.
+    /// </summary>
+    /// <remarks>Can also compare basic data types with their representing HeuristicLab data types 
+    /// (e.g. a <see cref="BoolData"/> with a boolean value).</remarks>
+    /// <exception cref="InvalidOperationException">Thrown when the current 
+    /// instance does not implement the interface <see cref="IComparable"/></exception>
+    /// <param name="obj">The object to compare the current instance to.</param>
+    /// <returns><c>0</c> if the objects are the same, a value smaller than zero when the current instance
+    /// is smaller than the given <paramref name="obj"/> and a value greater than zero 
+    /// when the current instance is greater than the given <paramref name="obj"/>.</returns>
+    public int CompareTo(object obj) {
+      IComparable comparable = Data as IComparable;
+      if (comparable != null) {
+        IObjectData other = obj as IObjectData;
+        if (other != null)
+          return comparable.CompareTo(other.Data);
+        else
+          return comparable.CompareTo(obj);
+      }
+      throw new InvalidOperationException("Cannot compare as contained object doesn't implement IComparable");
+    }
+
+    /// <summary>
+    /// The string representation of the current instance.
+    /// </summary>
+    /// <returns>"null" if property <see cref="Data"/> is <c>null</c>, else 
+    /// the string representation of the current instance.</returns>
+    public override string ToString() {
+      if (Data == null)
+        return "null";
+      else
+        return Data.ToString();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/Properties/AssemblyInfo.frame
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/Properties/AssemblyInfo.frame	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/Properties/AssemblyInfo.frame	(revision 1668)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Data")]
+[assembly: AssemblyDescription("HeuristicLab data classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f1be1f44-c421-4749-9d25-160611dc18b3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyBuildDate("$WCNOW$")]
Index: /trunk/sources/HeuristicLab.Data/3.3/StringData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringData.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringData.cs	(revision 1668)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Xml;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The representation of a string.
+  /// </summary>
+  public class StringData : ObjectData {
+    /// <summary>
+    /// Gets or sets the string value.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ObjectData.Data"/> of base class <see cref="ObjectData"/>. 
+    /// No own data storage present.</remarks>
+    public new string Data {
+      get { return (string)base.Data; }
+      set { base.Data = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="StringData"/> 
+    /// with the name of the type of the current instance as default value.
+    /// </summary>
+    public StringData() {
+      Data = this.GetType().Name;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="StringData"/> with the specified <paramref name="data"/>.
+    /// </summary>
+    /// <param name="data">The string value the current instance should represent.</param>
+    public StringData(string data) {
+      Data = data;
+    }
+    
+    /// <summary>
+    /// Creates a new instance of <see cref="StringDataView"/>.
+    /// </summary>
+    /// <returns>The created instance as <see cref="StringDataView"/>.</returns>
+    public override IView CreateView() {
+      return new StringDataView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>The current instance is added to the dictionary <paramref name="clonedObjects"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects.</param>
+    /// <returns>The coned instance as <see cref="StringData"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      StringData clone = new StringData();
+      clonedObjects.Add(Guid, clone);
+      clone.Data = Data;
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The string value is saved in the node's inner text.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">A dictionary of all already persisted objects.(Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.InnerText = Data;
+      return node;
+    }
+    /// <summary>
+    ///  Loads the persisted string value from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The string value must be saved in the node's inner text 
+    /// (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the string is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      Data = node.InnerText;
+    }
+
+    /// <summary>
+    /// The string representation of the current instance.
+    /// </summary>
+    /// <returns>The string value.</returns>
+    public override string ToString() {
+      return Data;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/StringDataView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringDataView.Designer.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringDataView.Designer.cs	(revision 1668)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Data {
+  partial class StringDataView {
+    /// <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.dataTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // dataTextBox
+      // 
+      this.dataTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTextBox.Location = new System.Drawing.Point(0, 0);
+      this.dataTextBox.Name = "dataTextBox";
+      this.dataTextBox.Size = new System.Drawing.Size(200, 20);
+      this.dataTextBox.TabIndex = 1;
+      this.dataTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dataTextBox_Validating);
+      // 
+      // StringDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataTextBox);
+      this.Name = "StringDataView";
+      this.Size = new System.Drawing.Size(200, 25);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox dataTextBox;
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/StringDataView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringDataView.cs	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringDataView.cs	(revision 1668)
@@ -0,0 +1,104 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  /// <summary>
+  /// The visual representation of the class <see cref="StringData"/>, symbolizing a string value.
+  /// </summary>
+  public partial class StringDataView : ViewBase {
+    /// <summary>
+    /// Gets or sets the string value to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="HeuristicLab.Core.ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public StringData StringData {
+      get { return (StringData)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="StringDataView"/>.
+    /// </summary>
+    public StringDataView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="StringDataView"/> with the given
+    /// <paramref name="stringData"/>.
+    /// <note type="caution"> No CopyConstructor! <paramref name="stringData"/> is not copied!</note>
+    /// </summary>
+    /// <param name="stringData">The string value to represent visually.</param>
+    public StringDataView(StringData stringData)
+      : this() {
+      StringData = stringData;
+    }
+
+    /// <summary>
+    /// Removes the eventhandler from the underlying <see cref="StringData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void RemoveItemEvents() {
+      StringData.Changed -= new EventHandler(StringData_Changed);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds an eventhandler to the underlying <see cref="StringData"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.
+    /// </remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      StringData.Changed += new EventHandler(StringData_Changed);
+    }
+
+    /// <summary>
+    /// Update the controls with the latest string value.
+    /// </summary>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (StringData == null) {
+        dataTextBox.Enabled = false;
+      } else {
+        dataTextBox.Enabled = true;
+        dataTextBox.Text = StringData.ToString();
+      }
+    }
+
+    private void dataTextBox_Validating(object sender, CancelEventArgs e) {
+      e.Cancel = false;
+      StringData.Data = dataTextBox.Text;
+    }
+
+    private void StringData_Changed(object sender, EventArgs e) {
+      Refresh();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Data/3.3/StringDataView.resx
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringDataView.resx	(revision 1668)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringDataView.resx	(revision 1668)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
