Index: trunk/sources/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj	(revision 2676)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj	(revision 2677)
@@ -57,10 +57,4 @@
       <DependentUpon>BoolDataView.cs</DependentUpon>
     </Compile>
-    <Compile Include="StringConvertibleArrayDataView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="StringConvertibleArrayDataView.Designer.cs">
-      <DependentUpon>StringConvertibleArrayDataView.cs</DependentUpon>
-    </Compile>
     <Compile Include="StringConvertibleDataView.cs">
       <SubType>UserControl</SubType>
@@ -71,4 +65,10 @@
     <Compile Include="HeuristicLabDataViewsPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StringConvertibleMatrixDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixDataView.Designer.cs">
+      <DependentUpon>StringConvertibleMatrixDataView.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayDataView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayDataView.Designer.cs	(revision 2676)
+++ 	(revision )
@@ -1,124 +1,0 @@
-#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.Views {
-  partial class StringConvertibleArrayDataView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (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.components = new System.ComponentModel.Container();
-      this.sizeLabel = new System.Windows.Forms.Label();
-      this.sizeTextBox = new System.Windows.Forms.TextBox();
-      this.dataGridView = new System.Windows.Forms.DataGridView();
-      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // sizeLabel
-      // 
-      this.sizeLabel.AutoSize = true;
-      this.sizeLabel.Location = new System.Drawing.Point(3, 3);
-      this.sizeLabel.Name = "sizeLabel";
-      this.sizeLabel.Size = new System.Drawing.Size(30, 13);
-      this.sizeLabel.TabIndex = 0;
-      this.sizeLabel.Text = "&Size:";
-      // 
-      // sizeTextBox
-      // 
-      this.sizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.sizeTextBox.Location = new System.Drawing.Point(50, 0);
-      this.sizeTextBox.Name = "sizeTextBox";
-      this.sizeTextBox.Size = new System.Drawing.Size(374, 20);
-      this.sizeTextBox.TabIndex = 1;
-      this.sizeTextBox.Validated += new System.EventHandler(this.sizeTextBox_Validated);
-      this.sizeTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.sizeTextBox_KeyDown);
-      this.sizeTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.sizeTextBox_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.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
-      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.dataGridView.ColumnHeadersVisible = false;
-      this.dataGridView.Location = new System.Drawing.Point(0, 26);
-      this.dataGridView.Name = "dataGridView";
-      this.dataGridView.Size = new System.Drawing.Size(424, 378);
-      this.dataGridView.TabIndex = 2;
-      this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
-      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
-      this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
-      // 
-      // errorProvider
-      // 
-      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
-      this.errorProvider.ContainerControl = this;
-      // 
-      // StringConvertibleArrayDataView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.dataGridView);
-      this.Controls.Add(this.sizeTextBox);
-      this.Controls.Add(this.sizeLabel);
-      this.Name = "StringConvertibleArrayDataView";
-      this.Size = new System.Drawing.Size(424, 404);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Label sizeLabel;
-    private System.Windows.Forms.TextBox sizeTextBox;
-    private System.Windows.Forms.DataGridView dataGridView;
-    private System.Windows.Forms.ErrorProvider errorProvider;
-
-  }
-}
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayDataView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayDataView.cs	(revision 2676)
+++ 	(revision )
@@ -1,139 +1,0 @@
-#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.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Data.Views {
-  [Content(typeof(IStringConvertibleArrayData), true)]
-  public partial class StringConvertibleArrayDataView : ObjectView {
-    public IStringConvertibleArrayData StringConvertibleArrayData {
-      get { return (IStringConvertibleArrayData)Object; }
-      set { base.Object = value; }
-    }
-
-    public StringConvertibleArrayDataView() {
-      InitializeComponent();
-      Caption = "StringConvertibleArrayDataView View";
-      errorProvider.SetIconAlignment(sizeTextBox, ErrorIconAlignment.MiddleLeft);
-      errorProvider.SetIconPadding(sizeTextBox, 2);
-    }
-    public StringConvertibleArrayDataView(IStringConvertibleArrayData stringConvertibleArrayData)
-      : this() {
-      StringConvertibleArrayData = stringConvertibleArrayData;
-    }
-
-    protected override void DeregisterObjectEvents() {
-      StringConvertibleArrayData.ItemChanged -= new EventHandler<EventArgs<int>>(StringConvertibleArrayData_ItemChanged);
-      StringConvertibleArrayData.Reset -= new EventHandler(StringConvertibleArrayData_Reset);
-      base.DeregisterObjectEvents();
-    }
-
-
-    protected override void RegisterObjectEvents() {
-      base.RegisterObjectEvents();
-      StringConvertibleArrayData.ItemChanged += new EventHandler<EventArgs<int>>(StringConvertibleArrayData_ItemChanged);
-      StringConvertibleArrayData.Reset += new EventHandler(StringConvertibleArrayData_Reset);
-    }
-
-    protected override void OnObjectChanged() {
-      base.OnObjectChanged();
-      if (StringConvertibleArrayData == null) {
-        Caption = "StringConvertibleData View";
-        sizeTextBox.Text = "";
-        sizeTextBox.Enabled = false;
-        dataGridView.Rows.Clear();
-        dataGridView.Enabled = false;
-      } else {
-        Caption = "StringConvertibleArrayData (" + StringConvertibleArrayData.GetType().Name + ")";
-        UpdateContent();
-      }
-    }
-
-    private void UpdateContent() {
-      sizeTextBox.Text = StringConvertibleArrayData.Length.ToString();
-      sizeTextBox.Enabled = true;
-      dataGridView.Rows.Clear();
-      dataGridView.ColumnCount = 1;
-      dataGridView.RowCount = StringConvertibleArrayData.Length;
-      for (int i = 0; i < StringConvertibleArrayData.Length; i++)
-        dataGridView.Rows[i].Cells[0].Value = StringConvertibleArrayData.GetValue(i);
-      dataGridView.Enabled = true;
-    }
-
-    private void StringConvertibleArrayData_ItemChanged(object sender, EventArgs<int> e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler<EventArgs<int>>(StringConvertibleArrayData_ItemChanged), sender, e);
-      else
-        dataGridView.Rows[e.Value].Cells[0].Value = StringConvertibleArrayData.GetValue(e.Value);
-    }
-    private void StringConvertibleArrayData_Reset(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(StringConvertibleArrayData_Reset), sender, e);
-      else
-        UpdateContent();
-    }
-
-    private void sizeTextBox_Validating(object sender, CancelEventArgs e) {
-      int i = 0;
-      if (!int.TryParse(sizeTextBox.Text, out i) || (i < 0)) {
-        e.Cancel = true;
-        errorProvider.SetError(sizeTextBox, "Invalid Array Length");
-        sizeTextBox.SelectAll();
-      }
-    }
-    private void sizeTextBox_Validated(object sender, EventArgs e) {
-      StringConvertibleArrayData.Length = int.Parse(sizeTextBox.Text);
-      errorProvider.SetError(sizeTextBox, string.Empty);
-    }
-    private void sizeTextBox_KeyDown(object sender, KeyEventArgs e) {
-      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
-        sizeLabel.Focus();  // set focus on label to validate data
-      if (e.KeyCode == Keys.Escape) {
-        sizeTextBox.Text = StringConvertibleArrayData.Length.ToString();
-        sizeLabel.Focus();  // set focus on label to validate data
-      }
-    }
-    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
-      if (!StringConvertibleArrayData.Validate(e.FormattedValue.ToString())) {
-        e.Cancel = true;
-        dataGridView.Rows[e.RowIndex].ErrorText = "Invalid Value";
-      }
-    }
-    private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) {
-      string value = e.Value.ToString();
-      e.ParsingApplied = StringConvertibleArrayData.SetValue(value, e.RowIndex);
-      if (e.ParsingApplied) e.Value = StringConvertibleArrayData.GetValue(e.RowIndex);
-    }
-    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
-      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.Designer.cs	(revision 2677)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.Designer.cs	(revision 2677)
@@ -0,0 +1,151 @@
+#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.Views {
+  partial class StringConvertibleMatrixDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (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.components = new System.ComponentModel.Container();
+      this.rowsLabel = new System.Windows.Forms.Label();
+      this.rowsTextBox = new System.Windows.Forms.TextBox();
+      this.dataGridView = new System.Windows.Forms.DataGridView();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.columnsTextBox = new System.Windows.Forms.TextBox();
+      this.columnsLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsLabel
+      // 
+      this.rowsLabel.AutoSize = true;
+      this.rowsLabel.Location = new System.Drawing.Point(3, 3);
+      this.rowsLabel.Name = "rowsLabel";
+      this.rowsLabel.Size = new System.Drawing.Size(37, 13);
+      this.rowsLabel.TabIndex = 0;
+      this.rowsLabel.Text = "&Rows:";
+      // 
+      // rowsTextBox
+      // 
+      this.rowsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.rowsTextBox.Location = new System.Drawing.Point(69, 0);
+      this.rowsTextBox.Name = "rowsTextBox";
+      this.rowsTextBox.Size = new System.Drawing.Size(355, 20);
+      this.rowsTextBox.TabIndex = 1;
+      this.rowsTextBox.Validated += new System.EventHandler(this.rowsTextBox_Validated);
+      this.rowsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.rowsTextBox_KeyDown);
+      this.rowsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.rowsTextBox_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.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.ColumnHeadersVisible = false;
+      this.dataGridView.Location = new System.Drawing.Point(0, 52);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.Size = new System.Drawing.Size(424, 352);
+      this.dataGridView.TabIndex = 4;
+      this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.errorProvider.ContainerControl = this;
+      // 
+      // columnsTextBox
+      // 
+      this.columnsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.columnsTextBox.Location = new System.Drawing.Point(69, 26);
+      this.columnsTextBox.Name = "columnsTextBox";
+      this.columnsTextBox.Size = new System.Drawing.Size(355, 20);
+      this.columnsTextBox.TabIndex = 3;
+      this.columnsTextBox.Validated += new System.EventHandler(this.columnsTextBox_Validated);
+      this.columnsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.columnsTextBox_KeyDown);
+      this.columnsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.columnsTextBox_Validating);
+      // 
+      // columnsLabel
+      // 
+      this.columnsLabel.AutoSize = true;
+      this.columnsLabel.Location = new System.Drawing.Point(3, 29);
+      this.columnsLabel.Name = "columnsLabel";
+      this.columnsLabel.Size = new System.Drawing.Size(50, 13);
+      this.columnsLabel.TabIndex = 2;
+      this.columnsLabel.Text = "&Columns:";
+      // 
+      // StringConvertibleMatrixDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.columnsTextBox);
+      this.Controls.Add(this.rowsTextBox);
+      this.Controls.Add(this.columnsLabel);
+      this.Controls.Add(this.rowsLabel);
+      this.Name = "StringConvertibleMatrixDataView";
+      this.Size = new System.Drawing.Size(424, 404);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label rowsLabel;
+    private System.Windows.Forms.TextBox rowsTextBox;
+    private System.Windows.Forms.DataGridView dataGridView;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.TextBox columnsTextBox;
+    private System.Windows.Forms.Label columnsLabel;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.cs	(revision 2677)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixDataView.cs	(revision 2677)
@@ -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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [Content(typeof(IStringConvertibleMatrixData), true)]
+  public partial class StringConvertibleMatrixDataView : ObjectView {
+    public IStringConvertibleMatrixData StringConvertibleMatrixData {
+      get { return (IStringConvertibleMatrixData)Object; }
+      set { base.Object = value; }
+    }
+
+    public StringConvertibleMatrixDataView() {
+      InitializeComponent();
+      Caption = "StringConvertibleMatrixDataView View";
+      errorProvider.SetIconAlignment(rowsTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(rowsTextBox, 2);
+      errorProvider.SetIconAlignment(columnsTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(columnsTextBox, 2);
+    }
+    public StringConvertibleMatrixDataView(IStringConvertibleMatrixData stringConvertibleArrayData)
+      : this() {
+      StringConvertibleMatrixData = stringConvertibleArrayData;
+    }
+
+    protected override void DeregisterObjectEvents() {
+      StringConvertibleMatrixData.ItemChanged -= new EventHandler<EventArgs<int, int>>(StringConvertibleMatrixData_ItemChanged);
+      StringConvertibleMatrixData.Reset -= new EventHandler(StringConvertibleMatrixData_Reset);
+      base.DeregisterObjectEvents();
+    }
+
+
+    protected override void RegisterObjectEvents() {
+      base.RegisterObjectEvents();
+      StringConvertibleMatrixData.ItemChanged += new EventHandler<EventArgs<int, int>>(StringConvertibleMatrixData_ItemChanged);
+      StringConvertibleMatrixData.Reset += new EventHandler(StringConvertibleMatrixData_Reset);
+    }
+
+    protected override void OnObjectChanged() {
+      base.OnObjectChanged();
+      if (StringConvertibleMatrixData == null) {
+        Caption = "StringConvertibleMatrixData View";
+        rowsTextBox.Text = "";
+        rowsTextBox.Enabled = false;
+        columnsTextBox.Text = "";
+        columnsTextBox.Enabled = false;
+        dataGridView.Rows.Clear();
+        dataGridView.Columns.Clear();
+        dataGridView.Enabled = false;
+      } else {
+        Caption = "StringConvertibleMatrixData (" + StringConvertibleMatrixData.GetType().Name + ")";
+        UpdateContent();
+      }
+    }
+
+    private void UpdateContent() {
+      rowsTextBox.Text = StringConvertibleMatrixData.Rows.ToString();
+      rowsTextBox.Enabled = (StringConvertibleMatrixData.Dimensions & StringConvertibleArrayDataDimensions.Rows) == StringConvertibleArrayDataDimensions.Rows;
+      columnsTextBox.Text = StringConvertibleMatrixData.Columns.ToString();
+      columnsTextBox.Enabled = (StringConvertibleMatrixData.Dimensions & StringConvertibleArrayDataDimensions.Columns) == StringConvertibleArrayDataDimensions.Columns;
+      dataGridView.Rows.Clear();
+      dataGridView.Columns.Clear();
+      if ((StringConvertibleMatrixData.Rows > 0) && (StringConvertibleMatrixData.Columns > 0)) {
+        for (int i = 0; i < StringConvertibleMatrixData.Columns; i++) {
+          dataGridView.ColumnCount++;
+          dataGridView.Columns[dataGridView.ColumnCount - 1].FillWeight = float.Epsilon;  // sum of all fill weights must not be larger than 65535
+        }
+        dataGridView.RowCount = StringConvertibleMatrixData.Rows;
+        for (int i = 0; i < StringConvertibleMatrixData.Rows; i++) {
+          for (int j = 0; j < StringConvertibleMatrixData.Columns; j++)
+            dataGridView.Rows[i].Cells[j].Value = StringConvertibleMatrixData.GetValue(i, j);
+        }
+        for (int i = 0; i < StringConvertibleMatrixData.Columns; i++)
+          dataGridView.Columns[i].Width = dataGridView.Columns[i].GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
+      }
+      dataGridView.Enabled = true;
+    }
+
+    private void StringConvertibleMatrixData_ItemChanged(object sender, EventArgs<int, int> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<int, int>>(StringConvertibleMatrixData_ItemChanged), sender, e);
+      else {
+        dataGridView.Rows[e.Value].Cells[e.Value2].Value = StringConvertibleMatrixData.GetValue(e.Value, e.Value2);
+        Size size = dataGridView.Rows[e.Value].Cells[e.Value2].PreferredSize;
+        dataGridView.Columns[e.Value2].Width = Math.Max(dataGridView.Columns[e.Value2].Width, size.Width);
+      }
+    }
+    private void StringConvertibleMatrixData_Reset(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(StringConvertibleMatrixData_Reset), sender, e);
+      else
+        UpdateContent();
+    }
+
+    #region TextBox Events
+    private void rowsTextBox_Validating(object sender, CancelEventArgs e) {
+      int i = 0;
+      if (!int.TryParse(rowsTextBox.Text, out i) || (i < 0)) {
+        e.Cancel = true;
+        errorProvider.SetError(rowsTextBox, "Invalid Number of Rows");
+        rowsTextBox.SelectAll();
+      }
+    }
+    private void rowsTextBox_Validated(object sender, EventArgs e) {
+      StringConvertibleMatrixData.Rows = int.Parse(rowsTextBox.Text);
+      errorProvider.SetError(rowsTextBox, string.Empty);
+    }
+    private void rowsTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
+        rowsLabel.Focus();  // set focus on label to validate data
+      if (e.KeyCode == Keys.Escape) {
+        rowsTextBox.Text = StringConvertibleMatrixData.Columns.ToString();
+        rowsLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    private void columnsTextBox_Validating(object sender, CancelEventArgs e) {
+      int i = 0;
+      if (!int.TryParse(columnsTextBox.Text, out i) || (i < 0)) {
+        e.Cancel = true;
+        errorProvider.SetError(columnsTextBox, "Invalid Number of Columns");
+        columnsTextBox.SelectAll();
+      }
+    }
+    private void columnsTextBox_Validated(object sender, EventArgs e) {
+      StringConvertibleMatrixData.Columns = int.Parse(columnsTextBox.Text);
+      errorProvider.SetError(columnsTextBox, string.Empty);
+    }
+    private void columnsTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
+        columnsLabel.Focus();  // set focus on label to validate data
+      if (e.KeyCode == Keys.Escape) {
+        columnsTextBox.Text = StringConvertibleMatrixData.Columns.ToString();
+        columnsLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    #endregion
+
+    #region DataGridView Events
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (!StringConvertibleMatrixData.Validate(e.FormattedValue.ToString())) {
+        e.Cancel = true;
+        dataGridView.Rows[e.RowIndex].ErrorText = "Invalid Value";
+      }
+    }
+    private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) {
+      string value = e.Value.ToString();
+      e.ParsingApplied = StringConvertibleMatrixData.SetValue(value, e.RowIndex, e.ColumnIndex);
+      if (e.ParsingApplied) e.Value = StringConvertibleMatrixData.GetValue(e.RowIndex, e.ColumnIndex);
+    }
+    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolArrayData.cs	(revision 2677)
@@ -32,9 +32,9 @@
   [Item("BoolArrayData", "Represents an array of boolean values.")]
   [Creatable("Test")]
-  public sealed class BoolArrayData : ValueTypeArrayData<bool>, IStringConvertibleArrayData {
+  public sealed class BoolArrayData : ValueTypeArrayData<bool>, IStringConvertibleMatrixData {
     public BoolArrayData() : base() { }
     public BoolArrayData(int length) : base(length) { }
     public BoolArrayData(bool[] elements) : base(elements) { }
-    protected BoolArrayData(BoolArrayData elements) : base(elements) { }
+    private BoolArrayData(BoolArrayData elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -44,20 +44,28 @@
     }
 
-    #region IStringConvertibleArrayData Members
-    int IStringConvertibleArrayData.Length {
+    #region IStringConvertibleMatrixData Members
+    StringConvertibleArrayDataDimensions IStringConvertibleMatrixData.Dimensions {
+      get { return StringConvertibleArrayDataDimensions.Rows; }
+    }
+    int IStringConvertibleMatrixData.Rows {
       get { return Length; }
       set { Length = value; }
     }
-    bool IStringConvertibleArrayData.Validate(string value) {
-      bool b;
-      return bool.TryParse(value, out b);
+    int IStringConvertibleMatrixData.Columns {
+      get { return 1; }
+      set { throw new NotSupportedException("Columns cannot be changed."); }
     }
-    string IStringConvertibleArrayData.GetValue(int index) {
-      return this[index].ToString();
+
+    bool IStringConvertibleMatrixData.Validate(string value) {
+      int i;
+      return int.TryParse(value, out i);
     }
-    bool IStringConvertibleArrayData.SetValue(string value, int index) {
+    string IStringConvertibleMatrixData.GetValue(int rowIndex, int columIndex) {
+      return this[rowIndex].ToString();
+    }
+    bool IStringConvertibleMatrixData.SetValue(string value, int rowIndex, int columnIndex) {
       bool b;
       if (bool.TryParse(value, out b)) {
-        this[index] = b;
+        this[rowIndex] = b;
         return true;
       } else {
@@ -65,9 +73,9 @@
       }
     }
-    event EventHandler<EventArgs<int>> IStringConvertibleArrayData.ItemChanged {
+    event EventHandler<EventArgs<int, int>> IStringConvertibleMatrixData.ItemChanged {
       add { base.ItemChanged += value; }
       remove { base.ItemChanged -= value; }
     }
-    event EventHandler IStringConvertibleArrayData.Reset {
+    event EventHandler IStringConvertibleMatrixData.Reset {
       add { base.Reset += value; }
       remove { base.Reset -= value; }
Index: trunk/sources/HeuristicLab.Data/3.3/BoolMatrixData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolMatrixData.cs	(revision 2676)
+++ 	(revision )
@@ -1,77 +1,0 @@
-#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;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A two-dimensional matrix consisting of boolean values.
-  /// </summary>
-  [EmptyStorableClass]
-  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>
-    /// 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 2676)
+++ 	(revision )
@@ -1,53 +1,0 @@
-#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 2676)
+++ 	(revision )
@@ -1,90 +1,0 @@
-#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.MainForm;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The visual representation of the class <see cref="BoolMatrixData"/>, symbolizing a two-dimensional
-  /// matrix of boolean values.
-  /// </summary>
-  [Content(typeof(BoolMatrixData), true)]
-  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/DoubleMatrixData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleMatrixData.cs	(revision 2676)
+++ 	(revision )
@@ -1,88 +1,0 @@
-#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;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A two-dimensional matrix consisting of double values.
-  /// </summary>
-  [EmptyStorableClass]
-  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>
-    /// 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 2676)
+++ 	(revision )
@@ -1,53 +1,0 @@
-#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 2676)
+++ 	(revision )
@@ -1,94 +1,0 @@
-#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.MainForm;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The visual representation of the class <see cref="DoubleMatrixData"/>, symbolizing a two-dimensional
-  /// matrix of double values.
-  /// </summary>
-  [Content(typeof(DoubleMatrixData), true)]
-  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/HeuristicLab.Data-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj	(revision 2677)
@@ -104,5 +104,8 @@
     </Compile>
     <Compile Include="BoolArrayData.cs" />
-    <Compile Include="IStringConvertibleArrayData.cs" />
+    <Compile Include="IntMatrixData.cs" />
+    <Compile Include="ValueTypeMatrixData.cs" />
+    <Compile Include="StringConvertibleMatrixDataDimensions.cs" />
+    <Compile Include="IStringConvertibleMatrixData.cs" />
     <Compile Include="ValueTypeArrayData.cs" />
     <Compile Include="IntArrayData.cs" />
Index: trunk/sources/HeuristicLab.Data/3.3/IObjectData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IObjectData.cs	(revision 2676)
+++ 	(revision )
@@ -1,37 +1,0 @@
-#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/IStringConvertibleArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArrayData.cs	(revision 2676)
+++ 	(revision )
@@ -1,40 +1,0 @@
-#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.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Data {
-  public interface IStringConvertibleArrayData {
-    int Length { get; set; }
-
-    bool Validate(string value);
-    string GetValue(int index);
-    bool SetValue(string value, int index);
-
-    event EventHandler<EventArgs<int>> ItemChanged;
-    event EventHandler Reset;
-  }
-}
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrixData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrixData.cs	(revision 2677)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrixData.cs	(revision 2677)
@@ -0,0 +1,42 @@
+#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.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  public interface IStringConvertibleMatrixData {
+    StringConvertibleArrayDataDimensions Dimensions { get; }
+    int Rows { get; set; }
+    int Columns { get; set; }
+
+    bool Validate(string value);
+    string GetValue(int rowIndex, int columnIndex);
+    bool SetValue(string value, int rowIndex, int columnIndex);
+
+    event EventHandler<EventArgs<int, int>> ItemChanged;
+    event EventHandler Reset;
+  }
+}
Index: trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/IntArrayData.cs	(revision 2677)
@@ -32,9 +32,9 @@
   [Item("IntArrayData", "Represents an array of integer values.")]
   [Creatable("Test")]
-  public sealed class IntArrayData : ValueTypeArrayData<int>, IStringConvertibleArrayData {
+  public sealed class IntArrayData : ValueTypeArrayData<int>, IStringConvertibleMatrixData {
     public IntArrayData() : base() { }
     public IntArrayData(int length) : base(length) { }
     public IntArrayData(int[] elements) : base(elements) { }
-    protected IntArrayData(IntArrayData elements) : base(elements) { }
+    private IntArrayData(IntArrayData elements) : base(elements) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -44,20 +44,28 @@
     }
 
-    #region IStringConvertibleArrayData Members
-    int IStringConvertibleArrayData.Length {
+    #region IStringConvertibleMatrixData Members
+    StringConvertibleArrayDataDimensions IStringConvertibleMatrixData.Dimensions {
+      get { return StringConvertibleArrayDataDimensions.Rows; }
+    }
+    int IStringConvertibleMatrixData.Rows {
       get { return Length; }
       set { Length = value; }
     }
-    bool IStringConvertibleArrayData.Validate(string value) {
+    int IStringConvertibleMatrixData.Columns {
+      get { return 1; }
+      set { throw new NotSupportedException("Columns cannot be changed."); }
+    }
+
+    bool IStringConvertibleMatrixData.Validate(string value) {
       int i;
       return int.TryParse(value, out i);
     }
-    string IStringConvertibleArrayData.GetValue(int index) {
-      return this[index].ToString();
+    string IStringConvertibleMatrixData.GetValue(int rowIndex, int columIndex) {
+      return this[rowIndex].ToString();
     }
-    bool IStringConvertibleArrayData.SetValue(string value, int index) {
+    bool IStringConvertibleMatrixData.SetValue(string value, int rowIndex, int columnIndex) {
       int i;
       if (int.TryParse(value, out i)) {
-        this[index] = i;
+        this[rowIndex] = i;
         return true;
       } else {
@@ -65,9 +73,9 @@
       }
     }
-    event EventHandler<EventArgs<int>> IStringConvertibleArrayData.ItemChanged {
+    event EventHandler<EventArgs<int, int>> IStringConvertibleMatrixData.ItemChanged {
       add { base.ItemChanged += value; }
       remove { base.ItemChanged -= value; }
     }
-    event EventHandler IStringConvertibleArrayData.Reset {
+    event EventHandler IStringConvertibleMatrixData.Reset {
       add { base.Reset += value; }
       remove { base.Reset -= value; }
Index: trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/IntMatrixData.cs	(revision 2677)
@@ -24,65 +24,62 @@
 using System.Text;
 using System.Xml;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using System.Globalization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Data {
-  /// <summary>
-  /// A two-dimensional matrix of integer values.
-  /// </summary>
   [EmptyStorableClass]
-  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; }
+  [Item("IntMatrixData", "Represents a matrix of integer values.")]
+  [Creatable("Test")]
+  public sealed class IntMatrixData : ValueTypeMatrixData<int>, IStringConvertibleMatrixData {
+    public IntMatrixData() : base() { }
+    public IntMatrixData(int rows, int columns) : base(rows, columns) { }
+    public IntMatrixData(int[,] elements) : base(elements) { }
+    private IntMatrixData(IntMatrixData elements) : base(elements) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      IntMatrixData clone = new IntMatrixData(this);
+      cloner.RegisterClonedObject(this, clone);
+      return clone;
     }
 
-    /// <summary>
-    /// Initializes a new instance of <see cref="IntMatrixData"/>.
-    /// </summary>
-    public IntMatrixData() {
-      Data = new int[1, 1];
+    #region IStringConvertibleMatrixData Members
+    StringConvertibleArrayDataDimensions IStringConvertibleMatrixData.Dimensions {
+      get { return StringConvertibleArrayDataDimensions.Both; }
     }
-    /// <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;
+    int IStringConvertibleMatrixData.Rows {
+      get { return Rows; }
+      set { Rows = value; }
+    }
+    int IStringConvertibleMatrixData.Columns {
+      get { return Columns; }
+      set { Columns = value; }
     }
 
-    /// <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);
+    bool IStringConvertibleMatrixData.Validate(string value) {
+      int i;
+      return int.TryParse(value, out i);
     }
-
-    /// <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));
-        }
+    string IStringConvertibleMatrixData.GetValue(int rowIndex, int columIndex) {
+      return this[rowIndex, columIndex].ToString();
+    }
+    bool IStringConvertibleMatrixData.SetValue(string value, int rowIndex, int columnIndex) {
+      int i;
+      if (int.TryParse(value, out i)) {
+        this[rowIndex, columnIndex] = i;
+        return true;
+      } else {
+        return false;
       }
-      if (builder.Length > 0) builder.Remove(0, 1);
-      return builder.ToString();
     }
+    event EventHandler<EventArgs<int, int>> IStringConvertibleMatrixData.ItemChanged {
+      add { base.ItemChanged += value; }
+      remove { base.ItemChanged -= value; }
+    }
+    event EventHandler IStringConvertibleMatrixData.Reset {
+      add { base.Reset += value; }
+      remove { base.Reset -= value; }
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntMatrixDataView.Designer.cs	(revision 2676)
+++ 	(revision )
@@ -1,53 +1,0 @@
-#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 2676)
+++ 	(revision )
@@ -1,90 +1,0 @@
-#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.MainForm;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The visual representation of the class <see cref="IntMatrixData"/>, symbolizing a two-dimensional
-  /// matrix of int values.
-  /// </summary>
-  [Content(typeof(IntMatrixData), true)]
-  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/MatrixDataBaseView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/MatrixDataBaseView.Designer.cs	(revision 2676)
+++ 	(revision )
@@ -1,138 +1,0 @@
-#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 2676)
+++ 	(revision )
@@ -1,185 +1,0 @@
-#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;
-using HeuristicLab.Core.Views;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The basic visual representation of a two-dimensional matrix.
-  /// </summary>
-  public partial class MatrixDataBaseView : ItemViewBase {
-
-    /// <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 2676)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?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 2676)
+++ 	(revision )
@@ -1,63 +1,0 @@
-#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 HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A class that represents <c>null</c>.
-  /// </summary>
-  [EmptyStorableClass]
-  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 IItem Clone(ICloner cloner) {
-      NullData clone = new NullData();
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Data/3.3/ObjectData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ObjectData.cs	(revision 2676)
+++ 	(revision )
@@ -1,128 +1,0 @@
-#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 HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// Represents the base class for all base data types.
-  /// </summary>
-  public class ObjectData : ItemBase, IObjectData {
-
-    [Storable]
-    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.cloner.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 IItem Clone(ICloner cloner) {
-      ObjectData clone = (ObjectData)base.Clone(cloner);
-      if (Data is IItem)
-        clone.myData = cloner.Clone((IItem)Data);
-      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() {
-      if ( Data != null )        
-        return Data.GetHashCode();
-      return 0;
-    }
-
-    /// <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/StringConvertibleMatrixDataDimensions.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringConvertibleMatrixDataDimensions.cs	(revision 2677)
+++ trunk/sources/HeuristicLab.Data/3.3/StringConvertibleMatrixDataDimensions.cs	(revision 2677)
@@ -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 System.Xml;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Data {
+  [Flags]
+  public enum StringConvertibleArrayDataDimensions {
+    None    = 0,
+    Rows    = 1,
+    Columns = 2,
+    Both    = 3
+  }
+}
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs	(revision 2676)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeArrayData.cs	(revision 2677)
@@ -37,9 +37,8 @@
       get { return array.Length; }
       protected set {
-        if (value < 0) throw new ArgumentException("Array length cannot be smaller than 0.");
-        T[] newArray = new T[value];
-        Array.Copy(array, newArray, Math.Min(value, array.Length));
-        array = newArray;
-        OnReset();
+        if (value != Length) {
+          Array.Resize<T>(ref array, value);
+          OnReset();
+        }
       }
     }
@@ -91,8 +90,8 @@
     }
 
-    protected event EventHandler<EventArgs<int>> ItemChanged;
+    protected event EventHandler<EventArgs<int, int>> ItemChanged;
     private void OnItemChanged(int index) {
       if (ItemChanged != null)
-        ItemChanged(this, new EventArgs<int>(index));
+        ItemChanged(this, new EventArgs<int, int>(index, 0));
       OnChanged();
     }
Index: trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrixData.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrixData.cs	(revision 2677)
+++ trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrixData.cs	(revision 2677)
@@ -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;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Data {
+  [Item("ValueTypeMatrixData<T>", "A base class for representing matrices of value types.")]
+  public class ValueTypeMatrixData<T> : Item, IEnumerable where T : struct {
+    private T[,] array;
+
+    public int Rows {
+      get { return array.GetLength(0); }
+      protected set {
+        if (value != Rows) {
+          T[,] newArray = new T[value, Columns];
+          Array.Copy(array, newArray, Math.Min(value * Columns, array.Length));
+          array = newArray;
+          OnReset();
+        }
+      }
+    }
+    public int Columns {
+      get { return array.GetLength(1); }
+      protected set {
+        if (value != Columns) {
+          T[,] newArray = new T[Rows, value];
+          for (int i = 0; i < Rows; i++)
+            Array.Copy(array, i * Columns, newArray, i * value, Math.Min(value, Columns));
+          array = newArray;
+          OnReset();
+        }
+      }
+    }
+    public T this[int rowIndex, int columnIndex] {
+      get { return array[rowIndex, columnIndex]; }
+      set {
+        if (!value.Equals(array[rowIndex, columnIndex])) {
+          array[rowIndex, columnIndex] = value;
+          OnItemChanged(rowIndex, columnIndex);
+        }
+      }
+    }
+
+    public ValueTypeMatrixData() {
+      array = new T[0, 0];
+    }
+    public ValueTypeMatrixData(int rows, int columns) {
+      array = new T[rows, columns];
+    }
+    public ValueTypeMatrixData(T[,] elements) {
+      if (elements == null) throw new ArgumentNullException();
+      array = (T[,])elements.Clone();
+    }
+    protected ValueTypeMatrixData(ValueTypeMatrixData<T> elements) {
+      if (elements == null) throw new ArgumentNullException();
+      array = (T[,])elements.array.Clone();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      ValueTypeMatrixData<T> clone = (ValueTypeMatrixData<T>)base.Clone(cloner);
+      clone.array = (T[,])array.Clone();
+      return clone;
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("[");
+      if (array.Length > 0) {
+        for (int i = 0; i < Rows; i++) {
+          sb.Append("[").Append(array[i, 0].ToString());
+          for (int j = 1; j < Columns; j++)
+            sb.Append(";").Append(array[i, j].ToString());
+          sb.Append("]");
+        }
+      }
+      sb.Append("]");
+      return sb.ToString();
+    }
+
+    public IEnumerator GetEnumerator() {
+      return array.GetEnumerator();
+    }
+
+    protected event EventHandler<EventArgs<int, int>> ItemChanged;
+    private void OnItemChanged(int rowIndex, int columnIndex) {
+      if (ItemChanged != null)
+        ItemChanged(this, new EventArgs<int, int>(rowIndex, columnIndex));
+      OnChanged();
+    }
+    protected event EventHandler Reset;
+    private void OnReset() {
+      if (Reset != null)
+        Reset(this, EventArgs.Empty);
+      OnChanged();
+    }
+  }
+}
