Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.Designer.cs	(revision 12160)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class BoolValueView {
+    /// <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.valueCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // valueCheckBox
+      // 
+      this.valueCheckBox.AutoSize = true;
+      this.valueCheckBox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.valueCheckBox.Location = new System.Drawing.Point(3, 0);
+      this.valueCheckBox.Name = "valueCheckBox";
+      this.valueCheckBox.Size = new System.Drawing.Size(56, 17);
+      this.valueCheckBox.TabIndex = 0;
+      this.valueCheckBox.Text = "&Value:";
+      this.valueCheckBox.UseVisualStyleBackColor = true;
+      this.valueCheckBox.CheckedChanged += new System.EventHandler(this.valueCheckBox_CheckedChanged);
+      // 
+      // BoolValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueCheckBox);
+      this.Name = "BoolValueView";
+      this.Size = new System.Drawing.Size(71, 27);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckBox valueCheckBox;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 12160)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [View("BoolValue View")]
+  [Content(typeof(BoolValue), true)]
+  public partial class BoolValueView : ItemView {
+    public new BoolValue Content {
+      get { return (BoolValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public BoolValueView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        valueCheckBox.Checked = false;
+      } else {
+        valueCheckBox.Checked = Content.Value;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) valueCheckBox.Enabled = false;
+      else valueCheckBox.Enabled = !ReadOnly;
+    }
+
+    private void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else
+        valueCheckBox.Checked = Content.Value;
+    }
+
+    private void valueCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null && !Content.ReadOnly) Content.Value = valueCheckBox.Checked;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.Designer.cs	(revision 12160)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class ColumnsVisibilityDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.checkedListBox = new System.Windows.Forms.CheckedListBox();
+      this.btnShowAll = new System.Windows.Forms.Button();
+      this.btnHideAll = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // checkedListBox
+      // 
+      this.checkedListBox.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.checkedListBox.CheckOnClick = true;
+      this.checkedListBox.FormattingEnabled = true;
+      this.checkedListBox.Location = new System.Drawing.Point(12, 12);
+      this.checkedListBox.Name = "checkedListBox";
+      this.checkedListBox.Size = new System.Drawing.Size(309, 289);
+      this.checkedListBox.TabIndex = 0;
+      this.checkedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox_ItemCheck);
+      // 
+      // btnShowAll
+      // 
+      this.btnShowAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnShowAll.Location = new System.Drawing.Point(12, 315);
+      this.btnShowAll.Name = "btnShowAll";
+      this.btnShowAll.Size = new System.Drawing.Size(75, 23);
+      this.btnShowAll.TabIndex = 1;
+      this.btnShowAll.Text = "Show all";
+      this.btnShowAll.UseVisualStyleBackColor = true;
+      this.btnShowAll.Click += new System.EventHandler(this.btnShowAll_Click);
+      // 
+      // btnHideAll
+      // 
+      this.btnHideAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnHideAll.Location = new System.Drawing.Point(101, 315);
+      this.btnHideAll.Name = "btnHideAll";
+      this.btnHideAll.Size = new System.Drawing.Size(75, 23);
+      this.btnHideAll.TabIndex = 2;
+      this.btnHideAll.Text = "Hide all";
+      this.btnHideAll.UseVisualStyleBackColor = true;
+      this.btnHideAll.Click += new System.EventHandler(this.btnHideAll_Click);
+      // 
+      // ColumnsVisibilityDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(332, 350);
+      this.Controls.Add(this.btnHideAll);
+      this.Controls.Add(this.btnShowAll);
+      this.Controls.Add(this.checkedListBox);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ColumnsVisibilityDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Show/Hide Columns";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckedListBox checkedListBox;
+    private System.Windows.Forms.Button btnShowAll;
+    private System.Windows.Forms.Button btnHideAll;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ColumnsVisibilityDialog.cs	(revision 12160)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data.Views {
+  public partial class ColumnsVisibilityDialog : Form {
+    public ColumnsVisibilityDialog() {
+      InitializeComponent();
+    }
+
+    public ColumnsVisibilityDialog(IEnumerable<DataGridViewColumn> columns)
+      : this() {
+      this.Columns = columns;
+    }
+
+    private List<DataGridViewColumn> columns;
+    public IEnumerable<DataGridViewColumn> Columns {
+      get { return this.columns; }
+      set {
+        this.columns = new List<DataGridViewColumn>(value);
+        UpdateCheckBoxes();
+      }
+    }
+
+    private void UpdateCheckBoxes() {
+      this.checkedListBox.Items.Clear();
+      foreach (DataGridViewColumn column in columns)
+        checkedListBox.Items.Add(column.HeaderText, column.Visible);
+    }
+
+    private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
+      this.columns[e.Index].Visible = e.NewValue == CheckState.Checked;
+    }
+
+    private void btnShowAll_Click(object sender, System.EventArgs e) {
+      for (int i = 0; i < checkedListBox.Items.Count; i++)
+        checkedListBox.SetItemChecked(i, true);
+    }
+    private void btnHideAll_Click(object sender, System.EventArgs e) {
+      for (int i = 0; i < checkedListBox.Items.Count; i++)
+        checkedListBox.SetItemChecked(i, false);
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.Designer.cs	(revision 12160)
@@ -0,0 +1,92 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class ComparisonView {
+    /// <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.valueLabel = new System.Windows.Forms.Label();
+      this.valueComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(3, 3);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(37, 13);
+      this.valueLabel.TabIndex = 0;
+      this.valueLabel.Text = "&Value:";
+      // 
+      // valueComboBox
+      // 
+      this.valueComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.valueComboBox.Enabled = false;
+      this.valueComboBox.FormattingEnabled = true;
+      this.valueComboBox.Location = new System.Drawing.Point(46, 0);
+      this.valueComboBox.Name = "valueComboBox";
+      this.valueComboBox.Size = new System.Drawing.Size(219, 21);
+      this.valueComboBox.TabIndex = 1;
+      this.valueComboBox.SelectedIndexChanged += new System.EventHandler(this.valueComboBox_SelectedIndexChanged);
+      // 
+      // ComparisonView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueComboBox);
+      this.Controls.Add(this.valueLabel);
+      this.Name = "ComparisonView";
+      this.Size = new System.Drawing.Size(265, 29);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label valueLabel;
+    private System.Windows.Forms.ComboBox valueComboBox;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 12160)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [View("Comparison View")]
+  [Content(typeof(Comparison), true)]
+  public partial class ComparisonView : ItemView {
+    public new Comparison Content {
+      get { return (Comparison)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public ComparisonView() {
+      InitializeComponent();
+      valueComboBox.DataSource = Enum.GetValues(typeof(ComparisonType));
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null)
+        valueComboBox.Enabled = false;
+      else
+        valueComboBox.SelectedItem = Content.Value;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) valueComboBox.Enabled = false;
+      else valueComboBox.Enabled = !ReadOnly;
+    }
+
+    private void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else
+        valueComboBox.SelectedItem = Content.Value;
+    }
+
+    private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if ((Content != null) && !Content.ReadOnly) Content.Value = (ComparisonType)valueComboBox.SelectedItem;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.Designer.cs	(revision 12160)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.Data.Views {
+  public partial class DoubleRangeView {
+    /// <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.SuspendLayout();
+      // 
+      // Item1Label
+      // 
+      this.Item1Label.Size = new System.Drawing.Size(32, 13);
+      this.Item1Label.Text = "Start:";
+      // 
+      // Item2Label
+      // 
+      this.Item2Label.Size = new System.Drawing.Size(29, 13);
+      this.Item2Label.Text = "End:";
+      // 
+      // IntRangeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "IntRangeView";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+    }
+
+    #endregion
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/DoubleRangeView.cs	(revision 12160)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("DoubleRange View")]
+  [Content(typeof(DoubleRange), true)]
+  public partial class DoubleRangeView : StringConvertibleValueTupleView {
+
+    public new DoubleRange Content {
+      get { return (DoubleRange)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DoubleRangeView() {
+      InitializeComponent();
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.Designer.cs	(revision 12160)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class EnhancedStringConvertibleMatrixView {
+    /// <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.showHideRows = new System.Windows.Forms.ToolStripMenuItem();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // rowsTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.rowsTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.rowsTextBox, 2);
+      //
+      // dataGridView
+      //
+      this.dataGridView.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(dataGridView_CellPainting);
+      // 
+      // contextMenu
+      // 
+      this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.showHideRows});
+      // 
+      // ShowHideRows
+      // 
+      this.showHideRows.Name = "ShowHideRows";
+      this.showHideRows.Size = new System.Drawing.Size(190, 22);
+      this.showHideRows.Text = "Show / Hide Rows";
+      this.showHideRows.Click += new System.EventHandler(this.ShowHideRows_Click);
+      // 
+      // ColoredStringConvertibleMatrixView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "ColoredStringConvertibleMatrixView";
+      this.ShowRowsAndColumnsTextBox = false;
+      this.ShowStatisticalInformation = false;
+      this.Controls.SetChildIndex(this.statisticsTextBox, 0);
+      this.Controls.SetChildIndex(this.rowsLabel, 0);
+      this.Controls.SetChildIndex(this.columnsLabel, 0);
+      this.Controls.SetChildIndex(this.rowsTextBox, 0);
+      this.Controls.SetChildIndex(this.columnsTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    protected System.Windows.Forms.ToolStripMenuItem showHideRows;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnhancedStringConvertibleMatrixView.cs	(revision 12160)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Data.Views {
+  public partial class EnhancedStringConvertibleMatrixView : StringConvertibleMatrixView {
+    private bool[] columnVisibility, rowVisibility;
+
+    // sets the visibility of its columns for the next time it is updated
+    public IEnumerable<bool> ColumnVisibility {
+      get { return columnVisibility; }
+      set { columnVisibility = value.ToArray(); }
+    }
+    // sets the visibility of its rows for the next time it is updated
+    public IEnumerable<bool> RowVisibility {
+      get { return rowVisibility; }
+      set { rowVisibility = value.ToArray(); }
+    }
+
+    public double Maximum { get; set; }
+    public double Minimum { get; set; }
+
+    public string FormatPattern { get; set; }
+
+    public new DoubleMatrix Content {
+      get { return (DoubleMatrix)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EnhancedStringConvertibleMatrixView() {
+      InitializeComponent();
+      FormatPattern = string.Empty;
+    }
+
+    public void ResetVisibility() {
+      columnVisibility = null;
+      rowVisibility = null;
+    }
+
+    protected override void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
+      if (Content != null && e.RowIndex < Content.Rows && e.ColumnIndex < Content.Columns) {
+        int rowIndex = virtualRowIndices[e.RowIndex];
+        e.Value = Content[rowIndex, e.ColumnIndex].ToString(FormatPattern);
+      }
+    }
+
+    protected override void UpdateColumnHeaders() {
+      base.UpdateColumnHeaders();
+      if (columnVisibility != null && Content != null && columnVisibility.Count() == dataGridView.ColumnCount) {
+        int i = 0;
+        foreach (var visibility in columnVisibility) {
+          dataGridView.Columns[i].Visible = visibility;
+          i++;
+        }
+      }
+    }
+    protected override void UpdateRowHeaders() {
+      if (Content == null) return;
+      if (rowVisibility != null && rowVisibility.Count() != dataGridView.RowCount) return;
+
+      for (int index = 0; index < dataGridView.RowCount; index++) {
+        dataGridView.Rows[index].HeaderCell.Value = Content.RowNames.ElementAt(virtualRowIndices[index]);
+
+        if (rowVisibility != null) {
+          dataGridView.Rows[index].Visible = rowVisibility.ElementAt(virtualRowIndices[index]);
+        } else {
+          dataGridView.Rows[index].Visible = true;
+        }
+      }
+    }
+
+    protected virtual void ShowHideRows_Click(object sender, EventArgs e) {
+      var dialog = new StringConvertibleMatrixRowVisibilityDialog(this.dataGridView.Rows.Cast<DataGridViewRow>());
+      dialog.ShowDialog();
+      RowVisibility = dialog.Visibility;
+    }
+
+    protected override void ShowHideColumns_Click(object sender, EventArgs e) {
+      var dialog = new StringConvertibleMatrixColumnVisibilityDialog(this.dataGridView.Columns.Cast<DataGridViewColumn>());
+      dialog.ShowDialog();
+      ColumnVisibility = dialog.Visibility;
+    }
+
+    protected void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
+      if (Content == null) return;
+      if (e.RowIndex < 0) return;
+      if (e.ColumnIndex < 0) return;
+      if (e.State.HasFlag(DataGridViewElementStates.Selected)) return;
+      if (!e.PaintParts.HasFlag(DataGridViewPaintParts.Background)) return;
+
+      int rowIndex = virtualRowIndices[e.RowIndex];
+      Color backColor = GetDataPointColor(Content[rowIndex, e.ColumnIndex], Minimum, Maximum);
+      using (Brush backColorBrush = new SolidBrush(backColor)) {
+        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
+      }
+      e.PaintContent(e.CellBounds);
+      e.Handled = true;
+    }
+
+    protected virtual Color GetDataPointColor(double value, double min, double max) {
+      if (double.IsNaN(value)) {
+        return Color.DarkGray;
+      }
+      IList<Color> colors = ColorGradient.Colors;
+      int index = (int)((colors.Count - 1) * (value - min) / (max - min));
+      if (index >= colors.Count) index = colors.Count - 1;
+      if (index < 0) index = 0;
+      return colors[index];
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.Designer.cs	(revision 12160)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class EnumValueView<T> {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (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.valueLabel = new System.Windows.Forms.Label();
+      this.valueComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(3, 3);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(56, 13);
+      this.valueLabel.TabIndex = 0;
+      this.valueLabel.Text = "&Value:";
+      // 
+      // valueComboBox
+      // 
+      this.valueComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.valueComboBox.Enabled = false;
+      this.valueComboBox.FormattingEnabled = true;
+      this.valueComboBox.Location = new System.Drawing.Point(65, 0);
+      this.valueComboBox.Name = "valueComboBox";
+      this.valueComboBox.Size = new System.Drawing.Size(212, 21);
+      this.valueComboBox.TabIndex = 1;
+      this.valueComboBox.SelectedIndexChanged += new System.EventHandler(this.valueComboBox_SelectedIndexChanged);
+      // 
+      // EnumValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.valueComboBox);
+      this.Controls.Add(this.valueLabel);
+      this.Name = "EnumValueView";
+      this.Size = new System.Drawing.Size(277, 29);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label valueLabel;
+    private System.Windows.Forms.ComboBox valueComboBox;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/EnumValueView.cs	(revision 12160)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [View("EnumValue View")]
+  [Content(typeof(EnumValue<>), true)]
+  public partial class EnumValueView<T> : ItemView where T : struct, IComparable {
+
+    public new EnumValue<T> Content {
+      get { return (EnumValue<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public EnumValueView() {
+      InitializeComponent();
+      valueComboBox.DataSource = Enum.GetValues(typeof(T));
+      this.Name = typeof(T).Name + "EnumView";
+    }
+    public EnumValueView(EnumValue<T> content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null)
+        valueComboBox.Enabled = false;
+      else
+        valueComboBox.SelectedItem = Content.Value;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content == null) valueComboBox.Enabled = false;
+      else valueComboBox.Enabled = !ReadOnly;
+    }
+
+    private void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else
+        valueComboBox.SelectedItem = Content.Value;
+    }
+
+    private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if ((Content != null) && !Content.ReadOnly)
+        Content.Value = (T)valueComboBox.SelectedItem;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/HeuristicLab.Data.Views-3.3.csproj	(revision 12160)
@@ -0,0 +1,309 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{72104A0B-90E7-42F3-9ABE-9BBBADD4B943}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Data.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Data.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DoubleRangeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DoubleRangeView.Designer.cs">
+      <DependentUpon>DoubleRangeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EnhancedStringConvertibleMatrixView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EnhancedStringConvertibleMatrixView.Designer.cs">
+      <DependentUpon>EnhancedStringConvertibleMatrixView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EnumValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EnumValueView.Designer.cs">
+      <DependentUpon>EnumValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="IntRangeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="IntRangeView.Designer.cs">
+      <DependentUpon>IntRangeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Path Views\DirectoryValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Path Views\DirectoryValueView.Designer.cs">
+      <DependentUpon>DirectoryValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Path Views\FileValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Path Views\FileValueView.Designer.cs">
+      <DependentUpon>FileValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Path Views\TextFileView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Path Views\TextFileView.Designer.cs">
+      <DependentUpon>TextFileView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="StringConvertibleMatrixColumnVisibilityDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixColumnVisibilityDialog.Designer.cs">
+      <DependentUpon>StringConvertibleMatrixColumnVisibilityDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixRowVisibilityDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixRowVisibilityDialog.Designer.cs">
+      <DependentUpon>StringConvertibleMatrixRowVisibilityDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StringConvertibleValueTupleView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleValueTupleView.Designer.cs">
+      <DependentUpon>StringConvertibleValueTupleView.cs</DependentUpon>
+    </Compile>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="BoolValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BoolValueView.Designer.cs">
+      <DependentUpon>BoolValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixVisibilityDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixVisibilityDialog.Designer.cs">
+      <DependentUpon>StringConvertibleMatrixVisibilityDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComparisonView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ComparisonView.Designer.cs">
+      <DependentUpon>ComparisonView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="StringConvertibleArrayView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleArrayView.Designer.cs">
+      <DependentUpon>StringConvertibleArrayView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleMatrixView.Designer.cs">
+      <DependentUpon>StringConvertibleMatrixView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StringConvertibleValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StringConvertibleValueView.Designer.cs">
+      <DependentUpon>StringConvertibleValueView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.Designer.cs	(revision 12160)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.Data.Views {
+  public partial class IntRangeView {
+    /// <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.SuspendLayout();
+      // 
+      // Item1Label
+      // 
+      this.Item1Label.Size = new System.Drawing.Size(32, 13);
+      this.Item1Label.Text = "Start:";
+      // 
+      // Item2Label
+      // 
+      this.Item2Label.Size = new System.Drawing.Size(29, 13);
+      this.Item2Label.Text = "End:";
+      // 
+      // IntRangeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Name = "IntRangeView";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/IntRangeView.cs	(revision 12160)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("IntRange View")]
+  [Content(typeof(IntRange), true)]
+  public partial class IntRangeView : StringConvertibleValueTupleView {
+
+    public new IntRange Content {
+      get { return (IntRange)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public IntRangeView() {
+      InitializeComponent();
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.Designer.cs	(revision 12160)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class DirectoryValueView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectoryValueView));
+      this.openButton = new System.Windows.Forms.Button();
+      this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
+      this.stringConvertibleValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.SuspendLayout();
+      // 
+      // openButton
+      // 
+      this.openButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openButton.Location = new System.Drawing.Point(167, 0);
+      this.openButton.Name = "openButton";
+      this.openButton.Size = new System.Drawing.Size(24, 24);
+      this.openButton.TabIndex = 3;
+      this.openButton.UseVisualStyleBackColor = true;
+      this.openButton.Click += new System.EventHandler(this.openButton_Click);
+      // 
+      // stringConvertibleValueView
+      // 
+      this.stringConvertibleValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.stringConvertibleValueView.Caption = "StringConvertibleValue View";
+      this.stringConvertibleValueView.Content = null;
+      this.stringConvertibleValueView.LabelVisible = true;
+      this.stringConvertibleValueView.Location = new System.Drawing.Point(4, 2);
+      this.stringConvertibleValueView.Name = "stringConvertibleValueView";
+      this.stringConvertibleValueView.ReadOnly = false;
+      this.stringConvertibleValueView.Size = new System.Drawing.Size(157, 21);
+      this.stringConvertibleValueView.TabIndex = 4;
+      // 
+      // DirectoryValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.stringConvertibleValueView);
+      this.Controls.Add(this.openButton);
+      this.Name = "DirectoryValueView";
+      this.Size = new System.Drawing.Size(194, 24);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button openButton;
+    protected System.Windows.Forms.FolderBrowserDialog folderBrowserDialog;
+    private StringConvertibleValueView stringConvertibleValueView;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/DirectoryValueView.cs	(revision 12160)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [View("DirectoryValueView")]
+  [Content(typeof(DirectoryValue), true)]
+  public partial class DirectoryValueView : ItemView {
+    public new DirectoryValue Content {
+      get { return (DirectoryValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DirectoryValueView() {
+      InitializeComponent();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      openButton.Enabled = !Locked && !ReadOnly && Content != null;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        stringConvertibleValueView.Content = null;
+        return;
+      }
+
+      stringConvertibleValueView.Content = Content.StringValue;
+    }
+
+    protected virtual void openButton_Click(object sender, EventArgs e) {
+      if (folderBrowserDialog.ShowDialog(this) != DialogResult.OK) return;
+      Content.Value = folderBrowserDialog.SelectedPath;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.Designer.cs	(revision 12160)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class FileValueView {
+    /// <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.openButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.stringConvertibleValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.SuspendLayout();
+      // 
+      // openButton
+      // 
+      this.openButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openButton.Location = new System.Drawing.Point(167, 0);
+      this.openButton.Name = "openButton";
+      this.openButton.Size = new System.Drawing.Size(24, 24);
+      this.openButton.TabIndex = 3;
+      this.openButton.UseVisualStyleBackColor = true;
+      this.openButton.Click += new System.EventHandler(this.openButton_Click);
+      // 
+      // stringConvertibleValueView
+      // 
+      this.stringConvertibleValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.stringConvertibleValueView.Caption = "StringConvertibleValue View";
+      this.stringConvertibleValueView.Content = null;
+      this.stringConvertibleValueView.LabelVisible = true;
+      this.stringConvertibleValueView.Location = new System.Drawing.Point(4, 2);
+      this.stringConvertibleValueView.Name = "stringConvertibleValueView";
+      this.stringConvertibleValueView.ReadOnly = false;
+      this.stringConvertibleValueView.Size = new System.Drawing.Size(157, 21);
+      this.stringConvertibleValueView.TabIndex = 0;
+      // 
+      // FileValueView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.stringConvertibleValueView);
+      this.Controls.Add(this.openButton);
+      this.Name = "FileValueView";
+      this.Size = new System.Drawing.Size(194, 24);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button openButton;
+    protected System.Windows.Forms.OpenFileDialog openFileDialog;
+    protected StringConvertibleValueView stringConvertibleValueView;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/FileValueView.cs	(revision 12160)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Data.Views {
+  [View("FileValueView")]
+  [Content(typeof(FileValue), true)]
+  public partial class FileValueView : ItemView {
+    public new FileValue Content {
+      get { return (FileValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public FileValueView() {
+      InitializeComponent();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      openButton.Enabled = !Locked && !ReadOnly && Content != null;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        stringConvertibleValueView.Content = null;
+        return;
+      }
+
+      stringConvertibleValueView.Content = Content.StringValue;
+      openFileDialog.Filter = Content.FileDialogFilter;
+    }
+
+    protected virtual void openButton_Click(object sender, EventArgs e) {
+      openFileDialog.Filter = Content.FileDialogFilter;
+      if (openFileDialog.ShowDialog(this) != DialogResult.OK) return;
+      Content.Value = openFileDialog.FileName;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.Designer.cs	(revision 12160)
@@ -0,0 +1,126 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.Data.Views {
+  partial class TextFileView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TextFileView));
+      this.saveButton = new System.Windows.Forms.Button();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.fileSystemWatcher = new System.IO.FileSystemWatcher();
+      this.textBox = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // openButton
+      // 
+      this.openButton.Location = new System.Drawing.Point(365, 0);
+      // 
+      // stringConvertibleValueView
+      // 
+      this.stringConvertibleValueView.Size = new System.Drawing.Size(355, 21);
+      // 
+      // saveButton
+      // 
+      this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.saveButton.CausesValidation = false;
+      this.saveButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Save;
+      this.saveButton.Location = new System.Drawing.Point(395, 0);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(24, 24);
+      this.saveButton.TabIndex = 2;
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // fileSystemWatcher
+      // 
+      this.fileSystemWatcher.EnableRaisingEvents = true;
+      this.fileSystemWatcher.NotifyFilter = ((System.IO.NotifyFilters)((System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.LastWrite)));
+      this.fileSystemWatcher.SynchronizingObject = this;
+      this.fileSystemWatcher.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher_Changed);
+      this.fileSystemWatcher.Created += new System.IO.FileSystemEventHandler(this.fileSystemWatcher_Changed);
+      this.fileSystemWatcher.Deleted += new System.IO.FileSystemEventHandler(this.fileSystemWatcher_Changed);
+      this.fileSystemWatcher.Renamed += new System.IO.RenamedEventHandler(this.fileSystemWatcher_Renamed);
+      // 
+      // textBox
+      // 
+      this.textBox.AcceptsReturn = true;
+      this.textBox.AcceptsTab = true;
+      this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.textBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.textBox.Location = new System.Drawing.Point(3, 30);
+      this.textBox.Multiline = true;
+      this.textBox.Name = "textBox";
+      this.textBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.textBox.Size = new System.Drawing.Size(415, 368);
+      this.textBox.TabIndex = 4;
+      this.textBox.TextChanged += new System.EventHandler(this.textBox_TextChanged);
+      this.textBox.Validated += new System.EventHandler(this.textBox_Validated);
+      // 
+      // TextFileView
+      // 
+      this.Controls.Add(this.textBox);
+      this.Controls.Add(this.saveButton);
+      this.Name = "TextFileView";
+      this.Size = new System.Drawing.Size(421, 401);
+      this.Controls.SetChildIndex(this.saveButton, 0);
+      this.Controls.SetChildIndex(this.textBox, 0);
+      this.Controls.SetChildIndex(this.openButton, 0);
+      this.Controls.SetChildIndex(this.stringConvertibleValueView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button saveButton;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.IO.FileSystemWatcher fileSystemWatcher;
+    private System.Windows.Forms.TextBox textBox;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Path Views/TextFileView.cs	(revision 12160)
@@ -0,0 +1,247 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.IO;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Data.Views {
+  [View("TextFileView")]
+  [Content(typeof(TextFileValue), true)]
+  public sealed partial class TextFileView : FileValueView {
+    private bool fileContentChanged;
+    private bool FileContentChanged {
+      get { return fileContentChanged; }
+      set {
+        if (fileContentChanged != value) {
+          fileContentChanged = value;
+          OnFileContentChanged();
+        }
+      }
+    }
+
+    public new TextFileValue Content {
+      get { return (TextFileValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public TextFileView() {
+      InitializeComponent();
+      fileContentChanged = false;
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.StringValue.ValueChanged += Content_FilePathChanged;
+    }
+    protected override void DeregisterContentEvents() {
+      Content.StringValue.ValueChanged -= Content_FilePathChanged;
+      fileSystemWatcher.EnableRaisingEvents = false;
+      base.DeregisterContentEvents();
+    }
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      textBox.ReadOnly = Locked || ReadOnly || Content == null;
+      saveButton.Enabled = !Locked && !ReadOnly && Content != null && FileContentChanged;
+
+      if (Content != null && Content.Exists()) {
+        fileSystemWatcher.Filter = Path.GetFileName(Content.Value);
+        var path = Path.GetDirectoryName(Content.Value);
+        if (string.IsNullOrEmpty(path)) path = Environment.CurrentDirectory;
+        fileSystemWatcher.Path = path;
+      }
+      fileSystemWatcher.EnableRaisingEvents = Content != null && File.Exists(Content.Value) && Visible;
+    }
+
+    protected override void OnVisibleChanged(EventArgs e) {
+      //mkommend: necessary to update the textbox to detect intermediate file changes.
+      if (Visible && Content != null) UpdateTextBox();
+      base.OnVisibleChanged(e);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      FileContentChanged = false;
+      if (Content == null) {
+        textBox.Text = string.Empty;
+        //mkommend: other properties of the file system watcher cannot be cleared (e.g., path) as this leads to an ArgumentException
+        fileSystemWatcher.EnableRaisingEvents = false;
+        return;
+      }
+      saveFileDialog.Filter = Content.FileDialogFilter;
+      UpdateTextBox();
+    }
+
+    private void Content_FilePathChanged(object sender, EventArgs e) {
+      UpdateTextBox();
+      SetEnabledStateOfControls();
+    }
+
+    private void textBox_TextChanged(object sender, EventArgs e) {
+      FileContentChanged = fileText != textBox.Text;
+    }
+
+    private void OnFileContentChanged() {
+      SetEnabledStateOfControls();
+      textBox.ForeColor = FileContentChanged ? Color.Red : Color.Black;
+    }
+
+    private bool fileSystemWatcherChangedFired = false;
+    private void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e) {
+      //mkommend: cannot react on visible changed, because this event is not fired when the parent control gets visible set to false
+      if (!Visible) return;
+      //FileSystemWatcher may fire multiple events depending on how file changes are implemented in the modifying program
+      //see: http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice
+      if (fileSystemWatcherChangedFired) return;
+      fileSystemWatcherChangedFired = true;
+
+      string newContent = ReadFile(Content.Value);
+      if (newContent == textBox.Text) {
+        fileSystemWatcherChangedFired = false;
+        return;
+      }
+
+      //File created
+      if (e.ChangeType == WatcherChangeTypes.Created) {
+        UpdateTextBox();
+      }
+
+      //File changed
+      else if (e.ChangeType == WatcherChangeTypes.Changed) {
+        string msg = string.Format("The content of the file \"{0}\" has changed.\nDo you want to reload the file?", Content.Value);
+        var result = MessageBox.Show(this, msg, "Reload the file?", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
+        if (result == DialogResult.Yes) {
+          UpdateTextBox();
+        } else {
+          fileText = newContent;
+          FileContentChanged = true;
+        }
+      }
+
+      //File deleted
+      else if (e.ChangeType == WatcherChangeTypes.Deleted) {
+        string msg = string.Format("The file \"{0}\" is not present anymore. Do you want to restore the file from the given content?", Content.Value);
+        var result = MessageBox.Show(this, msg, "Restore file?", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
+        if (result == DialogResult.Yes) {
+          SaveFile();
+        }
+        UpdateTextBox();
+      }
+      fileSystemWatcherChangedFired = false;
+    }
+
+    private void fileSystemWatcher_Renamed(object sender, RenamedEventArgs e) {
+      //mkommend: cannot react on visible changed, because this event is not fired when the parent control gets visible set to false
+      if (!Visible) return;
+      string msg = string.Format("The file \"{0}\" got renamed to \"{1}\". Do you want to update the file path?", e.OldName, e.Name);
+      var result = MessageBox.Show(this, msg, "Update file path?", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
+      if (result == DialogResult.Yes) {
+        Content.Value = e.FullPath;
+        fileSystemWatcher.Filter = e.Name;
+      }
+      UpdateTextBox();
+    }
+
+    private void SaveFile() {
+      //omit circular events by changing the file from HL
+      fileSystemWatcher.EnableRaisingEvents = false;
+      string path = Content.Value;
+      if (string.IsNullOrEmpty(path)) {
+        if (saveFileDialog.ShowDialog(this) != DialogResult.OK) return;
+        path = saveFileDialog.FileName;
+      }
+
+      WriteFile(path, textBox.Text);
+      Content.Value = path;
+      FileContentChanged = false;
+      fileSystemWatcher.EnableRaisingEvents = true;
+    }
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      SaveFile();
+    }
+
+    private string fileText;
+    private void UpdateTextBox() {
+      if (string.IsNullOrEmpty(Content.Value)) {
+        textBox.Enabled = false;
+        textBox.Text = string.Format("No file path is specified.");
+        return;
+      }
+
+      fileText = ReadFile(Content.Value);
+      if (fileText == null) {
+        textBox.Enabled = false;
+        textBox.Text = string.Format("The specified file \"{0}\" cannot be found.", Content.Value);
+        return;
+      }
+
+      textBox.Enabled = true;
+      textBox.Text = fileText;
+    }
+    private void textBox_Validated(object sender, EventArgs e) {
+      if (!FileContentChanged) return;
+      string msg = string.Format("You have not saved the changes in the file \"{0}\" yet. Do you want to save the changes?", Content.Value);
+      var result = MessageBox.Show(this, msg, "Save changes?", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
+      if (result == DialogResult.Yes) SaveFile();
+    }
+
+    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
+      if (keyData == (Keys.Control | Keys.S)) {
+        SaveFile();
+        return true;
+      }
+      return base.ProcessCmdKey(ref msg, keyData);
+    }
+
+    private static string ReadFile(string path) {
+      if (!File.Exists(path)) return null;
+      string fileContent = string.Empty;
+      try {
+        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
+          using (StreamReader streamReader = new StreamReader(fileStream)) {
+            fileContent = streamReader.ReadToEnd();
+          }
+        }
+      }
+      catch (Exception e) {
+        ErrorHandling.ShowErrorDialog(e);
+      }
+      return fileContent;
+    }
+
+    private static void WriteFile(string path, string fileContent) {
+      try {
+        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) {
+          using (StreamWriter streamWriter = new StreamWriter(fileStream)) {
+            streamWriter.Write(fileContent);
+          }
+        }
+      }
+      catch (Exception e) {
+        ErrorHandling.ShowErrorDialog(e);
+      }
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Plugin.cs.frame	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Plugin.cs.frame	(revision 12160)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Data.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Data.Views plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Data.Views", "3.3.11.$WCREV$")]
+  [PluginFile("HeuristicLab.Data.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  public class HeuristicLabDataViewsPlugin : PluginBase {
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 12160)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Data.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab data classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("873e5298-dd66-4a00-902f-b891ca77669a")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.11.$WCREV$")]
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.Designer.cs	(revision 12160)
@@ -0,0 +1,125 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleArrayView {
+    /// <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.lengthLabel = new System.Windows.Forms.Label();
+      this.lengthTextBox = 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();
+      // 
+      // lengthLabel
+      // 
+      this.lengthLabel.AutoSize = true;
+      this.lengthLabel.Location = new System.Drawing.Point(3, 3);
+      this.lengthLabel.Name = "lengthLabel";
+      this.lengthLabel.Size = new System.Drawing.Size(43, 13);
+      this.lengthLabel.TabIndex = 0;
+      this.lengthLabel.Text = "&Length:";
+      // 
+      // lengthTextBox
+      // 
+      this.lengthTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lengthTextBox.Location = new System.Drawing.Point(52, 0);
+      this.lengthTextBox.Name = "lengthTextBox";
+      this.lengthTextBox.Size = new System.Drawing.Size(372, 20);
+      this.lengthTextBox.TabIndex = 1;
+      this.lengthTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lengthTextBox_KeyDown);
+      this.lengthTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.lengthTextBox_Validating);
+      this.lengthTextBox.Validated += new System.EventHandler(this.lengthTextBox_Validated);
+      // 
+      // 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.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+      this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      this.dataGridView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView_KeyDown);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.errorProvider.ContainerControl = this;
+      // 
+      // StringConvertibleArrayView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.lengthTextBox);
+      this.Controls.Add(this.lengthLabel);
+      this.Name = "StringConvertibleArrayView";
+      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
+
+    protected System.Windows.Forms.DataGridView dataGridView;
+    protected System.Windows.Forms.Label lengthLabel;
+    protected System.Windows.Forms.TextBox lengthTextBox;
+    protected System.Windows.Forms.ErrorProvider errorProvider;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 12160)
@@ -0,0 +1,228 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("StringConvertibleArray View")]
+  [Content(typeof(IStringConvertibleArray), true)]
+  public partial class StringConvertibleArrayView : AsynchronousContentView {
+    public new IStringConvertibleArray Content {
+      get { return (IStringConvertibleArray)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public StringConvertibleArrayView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(lengthTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(lengthTextBox, 2);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ElementNamesChanged -= new EventHandler(Content_ElementNamesChanged);
+      Content.ItemChanged -= new EventHandler<EventArgs<int>>(Content_ItemChanged);
+      Content.Reset -= new EventHandler(Content_Reset);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemChanged += new EventHandler<EventArgs<int>>(Content_ItemChanged);
+      Content.Reset += new EventHandler(Content_Reset);
+      Content.ElementNamesChanged += new EventHandler(Content_ElementNamesChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        lengthTextBox.Text = "";
+        dataGridView.Rows.Clear();
+        dataGridView.Columns.Clear();
+      } else
+        UpdateData();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      lengthTextBox.Enabled = Content != null;
+      dataGridView.Enabled = Content != null;
+      lengthTextBox.ReadOnly = ReadOnly;
+      dataGridView.ReadOnly = ReadOnly;
+    }
+
+    private void UpdateData() {
+      lengthTextBox.Text = Content.Length.ToString();
+      lengthTextBox.Enabled = true;
+      dataGridView.Rows.Clear();
+      dataGridView.Columns.Clear();
+      if (Content.Length > 0) {
+        dataGridView.ColumnCount++;
+        dataGridView.Columns[0].FillWeight = float.Epsilon;  // sum of all fill weights must not be larger than 65535
+        dataGridView.RowCount = Content.Length;
+        for (int i = 0; i < Content.Length; i++) {
+          dataGridView.Rows[i].Cells[0].Value = Content.GetValue(i);
+        }
+        dataGridView.Columns[0].Width = dataGridView.Columns[0].GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
+      }
+      UpdateRowHeaders();
+      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+      dataGridView.Enabled = true;
+    }
+
+    protected virtual void UpdateRowHeaders() {
+      int i = 0;
+      foreach (string elementName in Content.ElementNames) {
+        dataGridView.Rows[i].HeaderCell.Value = elementName;
+        i++;
+      }
+      for (; i < dataGridView.RowCount; i++) {
+        dataGridView.Rows[i].HeaderCell.Value = string.Empty;
+      }
+    }
+
+    private void Content_ElementNamesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ElementNamesChanged), sender, e);
+      else
+        UpdateRowHeaders();
+    }
+
+    private void Content_ItemChanged(object sender, EventArgs<int> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<int>>(Content_ItemChanged), sender, e);
+      else {
+        // if a resize of the array occurs and some other class handles the event and provides default values
+        //then the itemChanged will occur before the reset event. hence the check was added
+        if (dataGridView.RowCount <= e.Value) return;
+        dataGridView.Rows[e.Value].Cells[0].Value = Content.GetValue(e.Value);
+        Size size = dataGridView.Rows[e.Value].Cells[0].PreferredSize;
+        dataGridView.Columns[0].Width = Math.Max(dataGridView.Columns[0].Width, size.Width);
+      }
+    }
+    private void Content_Reset(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Reset), sender, e);
+      else
+        UpdateData();
+    }
+
+    #region TextBox Events
+    private void lengthTextBox_Validating(object sender, CancelEventArgs e) {
+      int i = 0;
+      if (!int.TryParse(lengthTextBox.Text, out i) || (i < 0)) {
+        e.Cancel = true;
+        errorProvider.SetError(lengthTextBox, "Invalid Array Length (Valid Values: Positive Integers Larger or Equal to 0)");
+        lengthTextBox.SelectAll();
+      }
+    }
+    private void lengthTextBox_Validated(object sender, EventArgs e) {
+      if (!Content.ReadOnly) Content.Length = int.Parse(lengthTextBox.Text);
+      errorProvider.SetError(lengthTextBox, string.Empty);
+    }
+    private void lengthTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
+        lengthLabel.Focus();  // set focus on label to validate data
+      if (e.KeyCode == Keys.Escape) {
+        lengthTextBox.Text = Content.Length.ToString();
+        lengthLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    #endregion
+
+    #region DataGridView Events
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      string errorMessage;
+      if (Content != null && !Content.Validate(e.FormattedValue.ToString(), out errorMessage)) {
+        e.Cancel = true;
+        dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+      }
+    }
+    private void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) {
+      string value = e.Value.ToString();
+      e.ParsingApplied = Content.SetValue(value, e.RowIndex);
+      if (e.ParsingApplied) e.Value = Content.GetValue(e.RowIndex);
+    }
+    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+    }
+    private void dataGridView_KeyDown(object sender, KeyEventArgs e) {
+      if (!ReadOnly && e.Control && e.KeyCode == Keys.V)
+        PasteValuesToDataGridView();
+      else if (e.Control && e.KeyCode == Keys.C)
+        CopyValuesFromDataGridView();
+      else if (e.Control && e.KeyCode == Keys.A)
+        dataGridView.SelectAll();
+    }
+    private void CopyValuesFromDataGridView() {
+      if (dataGridView.SelectedCells.Count == 0) return;
+      StringBuilder s = new StringBuilder();
+      int minRowIndex = dataGridView.SelectedCells[0].RowIndex;
+      int maxRowIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].RowIndex;
+
+      if (minRowIndex > maxRowIndex) {
+        int temp = minRowIndex;
+        minRowIndex = maxRowIndex;
+        maxRowIndex = temp;
+      }
+
+      for (int i = minRowIndex; i <= maxRowIndex; i++) {
+        DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+        DataGridViewCell cell = dataGridView[column.Index, i];
+        if (cell.Selected) {
+          s.Append(Content.GetValue(i));
+          s.Append(Environment.NewLine);
+        }
+      }
+      Clipboard.SetText(s.ToString());
+    }
+    private void PasteValuesToDataGridView() {
+      string[] values = SplitClipboardString(Clipboard.GetText());
+      int rowIndex = 0;
+      if (dataGridView.CurrentCell != null)
+        rowIndex = dataGridView.CurrentCell.RowIndex;
+
+      if (Content.Length < rowIndex + values.Length) Content.Length = rowIndex + values.Length;
+      for (int row = 0; row < values.Length; row++)
+        Content.SetValue(values[row], row + rowIndex);
+    }
+    private string[] SplitClipboardString(string clipboardText) {
+      if (clipboardText.EndsWith(Environment.NewLine))
+        clipboardText = clipboardText.Remove(clipboardText.Length - Environment.NewLine.Length);  //remove last newline constant
+      return clipboardText.Split(new string[] { Environment.NewLine, "\t" }, StringSplitOptions.None);
+    }
+    #endregion
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.Designer.cs	(revision 12160)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleMatrixColumnVisibilityDialog {
+    /// <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;
+      this.Text = "Show/Hide Columns";
+      this.Name = "ColumnsVisibilityDialog";
+    }
+
+    #endregion
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixColumnVisibilityDialog.cs	(revision 12160)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data.Views {
+  public partial class StringConvertibleMatrixColumnVisibilityDialog : StringConvertibleMatrixVisibilityDialog<DataGridViewColumn> {
+    public StringConvertibleMatrixColumnVisibilityDialog() {
+      InitializeComponent();
+    }
+
+    public StringConvertibleMatrixColumnVisibilityDialog(IEnumerable<DataGridViewColumn> columns)
+      : base(columns) {
+      InitializeComponent();
+    }
+
+    protected override void UpdateCheckBoxes() {
+      this.checkedListBox.Items.Clear();
+      foreach (DataGridViewColumn column in Bands) {
+        checkedListBox.Items.Add(column.HeaderText, column.Visible);
+      }
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.Designer.cs	(revision 12160)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleMatrixRowVisibilityDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Text = "Show/Hide Rows";
+      this.Name = "RowsVisibilityDialog";
+    }
+
+    #endregion
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixRowVisibilityDialog.cs	(revision 12160)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data.Views {
+  public partial class StringConvertibleMatrixRowVisibilityDialog : StringConvertibleMatrixVisibilityDialog<DataGridViewRow> {
+    public StringConvertibleMatrixRowVisibilityDialog() {
+      InitializeComponent();
+    }
+
+    public StringConvertibleMatrixRowVisibilityDialog(IEnumerable<DataGridViewRow> rows)
+      : base(rows) {
+      InitializeComponent();
+    }
+
+    protected override void UpdateCheckBoxes() {
+      this.checkedListBox.Items.Clear();
+      foreach (DataGridViewRow row in Bands) {
+        checkedListBox.Items.Add(row.HeaderCell.Value, row.Visible);
+      }
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.Designer.cs	(revision 12160)
@@ -0,0 +1,193 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleMatrixView {
+    /// <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();
+      this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.ShowHideColumns = new System.Windows.Forms.ToolStripMenuItem();
+      this.statisticsTextBox = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.contextMenu.SuspendLayout();
+      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.KeyDown += new System.Windows.Forms.KeyEventHandler(this.rowsTextBox_KeyDown);
+      this.rowsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.rowsTextBox_Validating);
+      this.rowsTextBox.Validated += new System.EventHandler(this.rowsTextBox_Validated);
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.AllowUserToAddRows = false;
+      this.dataGridView.AllowUserToDeleteRows = false;
+      this.dataGridView.AllowUserToOrderColumns = true;
+      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.Disable;
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
+      this.dataGridView.Location = new System.Drawing.Point(0, 52);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.RowHeadersWidth = 160;
+      this.dataGridView.Size = new System.Drawing.Size(424, 330);
+      this.dataGridView.TabIndex = 4;
+      this.dataGridView.VirtualMode = true;
+      this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+      this.dataGridView.CellParsing += new System.Windows.Forms.DataGridViewCellParsingEventHandler(this.dataGridView_CellParsing);
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      this.dataGridView.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.dataGridView_CellValueNeeded);
+      this.dataGridView.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView_ColumnHeaderMouseClick);
+      this.dataGridView.Scroll += new System.Windows.Forms.ScrollEventHandler(this.dataGridView_Scroll);
+      this.dataGridView.SelectionChanged += new System.EventHandler(this.dataGridView_SelectionChanged);
+      this.dataGridView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView_KeyDown);
+      this.dataGridView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.dataGridView_MouseClick);
+      this.dataGridView.Resize += new System.EventHandler(this.dataGridView_Resize);
+      // 
+      // 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.KeyDown += new System.Windows.Forms.KeyEventHandler(this.columnsTextBox_KeyDown);
+      this.columnsTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.columnsTextBox_Validating);
+      this.columnsTextBox.Validated += new System.EventHandler(this.columnsTextBox_Validated);
+      // 
+      // 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:";
+      // 
+      // contextMenu
+      // 
+      this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.ShowHideColumns});
+      this.contextMenu.Name = "contextMenu";
+      this.contextMenu.Size = new System.Drawing.Size(191, 26);
+      // 
+      // ShowHideColumns
+      // 
+      this.ShowHideColumns.Name = "ShowHideColumns";
+      this.ShowHideColumns.Size = new System.Drawing.Size(190, 22);
+      this.ShowHideColumns.Text = "Show / Hide Columns";
+      this.ShowHideColumns.Click += new System.EventHandler(this.ShowHideColumns_Click);
+      // 
+      // statisticsTextBox
+      // 
+      this.statisticsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statisticsTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.statisticsTextBox.Location = new System.Drawing.Point(3, 388);
+      this.statisticsTextBox.Name = "statisticsTextBox";
+      this.statisticsTextBox.Size = new System.Drawing.Size(418, 13);
+      this.statisticsTextBox.TabIndex = 5;
+      this.statisticsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+      // 
+      // StringConvertibleMatrixView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.columnsTextBox);
+      this.Controls.Add(this.dataGridView);
+      this.Controls.Add(this.rowsTextBox);
+      this.Controls.Add(this.columnsLabel);
+      this.Controls.Add(this.rowsLabel);
+      this.Controls.Add(this.statisticsTextBox);
+      this.Name = "StringConvertibleMatrixView";
+      this.Size = new System.Drawing.Size(424, 404);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.contextMenu.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    protected System.Windows.Forms.Label rowsLabel;
+    protected System.Windows.Forms.TextBox rowsTextBox;
+    protected System.Windows.Forms.ErrorProvider errorProvider;
+    protected System.Windows.Forms.TextBox columnsTextBox;
+    protected System.Windows.Forms.Label columnsLabel;
+    protected System.Windows.Forms.ContextMenuStrip contextMenu;
+    protected System.Windows.Forms.ToolStripMenuItem ShowHideColumns;
+    protected System.Windows.Forms.DataGridView dataGridView;
+    protected System.Windows.Forms.TextBox statisticsTextBox;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 12160)
@@ -0,0 +1,568 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("StringConvertibleMatrix View")]
+  [Content(typeof(IStringConvertibleMatrix), true)]
+  public partial class StringConvertibleMatrixView : AsynchronousContentView {
+    protected int[] virtualRowIndices;
+    protected List<KeyValuePair<int, SortOrder>> sortedColumnIndices;
+    private RowComparer rowComparer;
+
+    public new IStringConvertibleMatrix Content {
+      get { return (IStringConvertibleMatrix)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public DataGridView DataGridView {
+      get { return dataGridView; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    private bool showRowsAndColumnsTextBox;
+    public bool ShowRowsAndColumnsTextBox {
+      get { return showRowsAndColumnsTextBox; }
+      set {
+        showRowsAndColumnsTextBox = value;
+        UpdateVisibilityOfTextBoxes();
+      }
+    }
+
+    private bool showStatisticalInformation;
+    public bool ShowStatisticalInformation {
+      get { return showStatisticalInformation; }
+      set {
+        showStatisticalInformation = value;
+        UpdateVisibilityOfStatisticalInformation();
+      }
+    }
+
+    public StringConvertibleMatrixView() {
+      InitializeComponent();
+      ShowRowsAndColumnsTextBox = true;
+      ShowStatisticalInformation = true;
+      errorProvider.SetIconAlignment(rowsTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(rowsTextBox, 2);
+      errorProvider.SetIconAlignment(columnsTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(columnsTextBox, 2);
+      sortedColumnIndices = new List<KeyValuePair<int, SortOrder>>();
+      rowComparer = new RowComparer();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemChanged -= new EventHandler<EventArgs<int, int>>(Content_ItemChanged);
+      Content.Reset -= new EventHandler(Content_Reset);
+      Content.ColumnNamesChanged -= new EventHandler(Content_ColumnNamesChanged);
+      Content.RowNamesChanged -= new EventHandler(Content_RowNamesChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemChanged += new EventHandler<EventArgs<int, int>>(Content_ItemChanged);
+      Content.Reset += new EventHandler(Content_Reset);
+      Content.ColumnNamesChanged += new EventHandler(Content_ColumnNamesChanged);
+      Content.RowNamesChanged += new EventHandler(Content_RowNamesChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        rowsTextBox.Text = "";
+        columnsTextBox.Text = "";
+        dataGridView.Rows.Clear();
+        dataGridView.Columns.Clear();
+        virtualRowIndices = new int[0];
+      } else
+        UpdateData();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      rowsTextBox.Enabled = Content != null;
+      columnsTextBox.Enabled = Content != null;
+      dataGridView.Enabled = Content != null;
+      rowsTextBox.ReadOnly = ReadOnly;
+      columnsTextBox.ReadOnly = ReadOnly;
+      dataGridView.ReadOnly = ReadOnly;
+    }
+
+    protected virtual void UpdateData() {
+      rowsTextBox.Text = Content.Rows.ToString();
+      rowsTextBox.Enabled = true;
+      columnsTextBox.Text = Content.Columns.ToString();
+      columnsTextBox.Enabled = true;
+      virtualRowIndices = Enumerable.Range(0, Content.Rows).ToArray();
+
+      if (Content.Columns == 0 && dataGridView.ColumnCount != Content.Columns && !Content.ReadOnly)
+        Content.Columns = dataGridView.ColumnCount;
+      else {
+        DataGridViewColumn[] columns = new DataGridViewColumn[Content.Columns];
+        for (int i = 0; i < columns.Length; ++i) {
+          var column = new DataGridViewTextBoxColumn();
+          column.FillWeight = 1;
+          columns[i] = column;
+        }
+        dataGridView.Columns.Clear();
+        dataGridView.Columns.AddRange(columns);
+      }
+
+      //DataGridViews with rows but no columns are not allowed !
+      if (Content.Rows == 0 && dataGridView.RowCount != Content.Rows && !Content.ReadOnly)
+        Content.Rows = dataGridView.RowCount;
+      else
+        dataGridView.RowCount = Content.Rows;
+
+
+      ClearSorting();
+      UpdateColumnHeaders();
+      UpdateRowHeaders();
+
+      dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.ColumnHeader);
+      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);
+      dataGridView.Enabled = true;
+    }
+
+    protected virtual void UpdateColumnHeaders() {
+      HashSet<string> invisibleColumnNames = new HashSet<string>(dataGridView.Columns.OfType<DataGridViewColumn>()
+      .Where(c => !c.Visible && !string.IsNullOrEmpty(c.HeaderText)).Select(c => c.HeaderText));
+
+      for (int i = 0; i < dataGridView.ColumnCount; i++) {
+        if (i < Content.ColumnNames.Count())
+          dataGridView.Columns[i].HeaderText = Content.ColumnNames.ElementAt(i);
+        else
+          dataGridView.Columns[i].HeaderText = "Column " + (i + 1);
+        dataGridView.Columns[i].Visible = !invisibleColumnNames.Contains(dataGridView.Columns[i].HeaderText);
+      }
+    }
+    protected virtual void UpdateRowHeaders() {
+      int index = dataGridView.FirstDisplayedScrollingRowIndex;
+      if (index == -1) index = 0;
+      int updatedRows = 0;
+      int count = dataGridView.DisplayedRowCount(true);
+
+      while (updatedRows < count) {
+        if (virtualRowIndices[index] < Content.RowNames.Count())
+          dataGridView.Rows[index].HeaderCell.Value = Content.RowNames.ElementAt(virtualRowIndices[index]);
+        else
+          dataGridView.Rows[index].HeaderCell.Value = "Row " + (index + 1);
+        if (dataGridView.Rows[index].Visible)
+          updatedRows++;
+        index++;
+      }
+    }
+
+    private void Content_RowNamesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RowNamesChanged), sender, e);
+      else
+        UpdateRowHeaders();
+    }
+    private void Content_ColumnNamesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ColumnNamesChanged), sender, e);
+      else
+        UpdateColumnHeaders();
+    }
+    private void Content_ItemChanged(object sender, EventArgs<int, int> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<int, int>>(Content_ItemChanged), sender, e);
+      else
+        dataGridView.InvalidateCell(e.Value2, e.Value);
+    }
+    private void Content_Reset(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Reset), sender, e);
+      else
+        UpdateData();
+    }
+
+    #region TextBox Events
+    private void rowsTextBox_Validating(object sender, CancelEventArgs e) {
+      if (ReadOnly || Locked)
+        return;
+      int i = 0;
+      if (!int.TryParse(rowsTextBox.Text, out i) || (i <= 0)) {
+        e.Cancel = true;
+        errorProvider.SetError(rowsTextBox, "Invalid Number of Rows (Valid values are positive integers larger than 0)");
+        rowsTextBox.SelectAll();
+      }
+    }
+    private void rowsTextBox_Validated(object sender, EventArgs e) {
+      if (!Content.ReadOnly) Content.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 = Content.Rows.ToString();
+        rowsLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    private void columnsTextBox_Validating(object sender, CancelEventArgs e) {
+      if (ReadOnly || Locked)
+        return;
+      int i = 0;
+      if (!int.TryParse(columnsTextBox.Text, out i) || (i <= 0)) {
+        e.Cancel = true;
+        errorProvider.SetError(columnsTextBox, "Invalid Number of Columns (Valid values are positive integers larger than 0)");
+        columnsTextBox.SelectAll();
+      }
+    }
+    private void columnsTextBox_Validated(object sender, EventArgs e) {
+      if (!Content.ReadOnly) Content.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 = Content.Columns.ToString();
+        columnsLabel.Focus();  // set focus on label to validate data
+      }
+    }
+    #endregion
+
+    #region DataGridView Events
+    protected virtual void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (!dataGridView.ReadOnly) {
+        string errorMessage;
+        if (Content != null && !Content.Validate(e.FormattedValue.ToString(), out errorMessage)) {
+          e.Cancel = true;
+          dataGridView.Rows[e.RowIndex].ErrorText = errorMessage;
+        }
+      }
+    }
+    protected virtual void dataGridView_CellParsing(object sender, DataGridViewCellParsingEventArgs e) {
+      if (!dataGridView.ReadOnly) {
+        string value = e.Value.ToString();
+        int rowIndex = virtualRowIndices[e.RowIndex];
+        e.ParsingApplied = Content.SetValue(value, rowIndex, e.ColumnIndex);
+        if (e.ParsingApplied) e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
+      }
+    }
+    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+    }
+    protected virtual void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) {
+      if (Content != null && e.RowIndex < Content.Rows && e.ColumnIndex < Content.Columns) {
+        int rowIndex = virtualRowIndices[e.RowIndex];
+        e.Value = Content.GetValue(rowIndex, e.ColumnIndex);
+      }
+    }
+
+    private void dataGridView_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e) {
+      this.UpdateRowHeaders();
+    }
+    private void dataGridView_Resize(object sender, EventArgs e) {
+      this.UpdateRowHeaders();
+    }
+
+    private void dataGridView_KeyDown(object sender, KeyEventArgs e) {
+      if (!ReadOnly && e.Control && e.KeyCode == Keys.V)
+        PasteValuesToDataGridView();
+      else if (e.Control && e.KeyCode == Keys.C)
+        CopyValuesFromDataGridView();
+    }
+
+    private void CopyValuesFromDataGridView() {
+      if (dataGridView.SelectedCells.Count == 0) return;
+      StringBuilder s = new StringBuilder();
+      int minRowIndex = dataGridView.SelectedCells[0].RowIndex;
+      int maxRowIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].RowIndex;
+      int minColIndex = dataGridView.SelectedCells[0].ColumnIndex;
+      int maxColIndex = dataGridView.SelectedCells[dataGridView.SelectedCells.Count - 1].ColumnIndex;
+
+      if (minRowIndex > maxRowIndex) {
+        int temp = minRowIndex;
+        minRowIndex = maxRowIndex;
+        maxRowIndex = temp;
+      }
+      if (minColIndex > maxColIndex) {
+        int temp = minColIndex;
+        minColIndex = maxColIndex;
+        maxColIndex = temp;
+      }
+
+      bool addRowNames = dataGridView.AreAllCellsSelected(false) && Content.RowNames.Count() > 0;
+      bool addColumnNames = dataGridView.AreAllCellsSelected(false) && Content.ColumnNames.Count() > 0;
+
+      //add colum names
+      if (addColumnNames) {
+        if (addRowNames)
+          s.Append('\t');
+
+        DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+        while (column != null) {
+          s.Append(column.HeaderText);
+          s.Append('\t');
+          column = dataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+        }
+        s.Remove(s.Length - 1, 1); //remove last tab
+        s.Append(Environment.NewLine);
+      }
+
+      for (int i = minRowIndex; i <= maxRowIndex; i++) {
+        if (!dataGridView.Rows[i].Visible) continue;
+
+        int rowIndex = this.virtualRowIndices[i];
+        if (addRowNames) {
+          s.Append(Content.RowNames.ElementAt(rowIndex));
+          s.Append('\t');
+        }
+
+        DataGridViewColumn column = dataGridView.Columns.GetFirstColumn(DataGridViewElementStates.Visible);
+        while (column != null) {
+          DataGridViewCell cell = dataGridView[column.Index, i];
+          if (cell.Selected) {
+            s.Append(Content.GetValue(rowIndex, column.Index));
+            s.Append('\t');
+          }
+
+          column = dataGridView.Columns.GetNextColumn(column, DataGridViewElementStates.Visible, DataGridViewElementStates.None);
+        }
+        s.Remove(s.Length - 1, 1); //remove last tab
+        s.Append(Environment.NewLine);
+      }
+      Clipboard.SetText(s.ToString());
+    }
+
+    protected virtual void PasteValuesToDataGridView() {
+      string[,] values = SplitClipboardString(Clipboard.GetText());
+      int rowIndex = 0;
+      int columnIndex = 0;
+      if (dataGridView.CurrentCell != null) {
+        rowIndex = dataGridView.CurrentCell.RowIndex;
+        columnIndex = dataGridView.CurrentCell.ColumnIndex;
+      }
+      if (Content.Rows < values.GetLength(1) + rowIndex) Content.Rows = values.GetLength(1) + rowIndex;
+      if (Content.Columns < values.GetLength(0) + columnIndex) Content.Columns = values.GetLength(0) + columnIndex;
+
+      for (int row = 0; row < values.GetLength(1); row++) {
+        for (int col = 0; col < values.GetLength(0); col++) {
+          Content.SetValue(values[col, row], row + rowIndex, col + columnIndex);
+        }
+      }
+      ClearSorting();
+    }
+    private string[,] SplitClipboardString(string clipboardText) {
+      if (clipboardText.EndsWith(Environment.NewLine))
+        clipboardText = clipboardText.Remove(clipboardText.Length - Environment.NewLine.Length);  //remove last newline constant
+      string[,] values = null;
+      string[] lines = clipboardText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
+      string[] cells;
+      for (int i = 0; i < lines.Length; i++) {
+        cells = lines[i].Split('\t');
+        if (values == null)
+          values = new string[cells.Length, lines.Length];
+        for (int j = 0; j < cells.Length; j++)
+          values[j, i] = string.IsNullOrEmpty(cells[j]) ? string.Empty : cells[j];
+      }
+      return values;
+    }
+
+    private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
+      if (Content != null) {
+        if (e.Button == MouseButtons.Left && Content.SortableView) {
+          bool addToSortedIndices = (Control.ModifierKeys & Keys.Control) == Keys.Control;
+          SortOrder newSortOrder = SortOrder.Ascending;
+          if (sortedColumnIndices.Any(x => x.Key == e.ColumnIndex)) {
+            SortOrder oldSortOrder = sortedColumnIndices.Where(x => x.Key == e.ColumnIndex).First().Value;
+            int enumLength = Enum.GetValues(typeof(SortOrder)).Length;
+            newSortOrder = oldSortOrder = (SortOrder)Enum.Parse(typeof(SortOrder), ((((int)oldSortOrder) + 1) % enumLength).ToString());
+          }
+
+          if (!addToSortedIndices)
+            sortedColumnIndices.Clear();
+
+          if (sortedColumnIndices.Any(x => x.Key == e.ColumnIndex)) {
+            int sortedIndex = sortedColumnIndices.FindIndex(x => x.Key == e.ColumnIndex);
+            if (newSortOrder != SortOrder.None)
+              sortedColumnIndices[sortedIndex] = new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder);
+            else
+              sortedColumnIndices.RemoveAt(sortedIndex);
+          } else
+            if (newSortOrder != SortOrder.None)
+              sortedColumnIndices.Add(new KeyValuePair<int, SortOrder>(e.ColumnIndex, newSortOrder));
+          Sort();
+        }
+      }
+    }
+
+    protected virtual void ClearSorting() {
+      virtualRowIndices = Enumerable.Range(0, Content.Rows).ToArray();
+      sortedColumnIndices.Clear();
+      UpdateSortGlyph();
+    }
+
+    protected void Sort() {
+      virtualRowIndices = Sort(sortedColumnIndices);
+      UpdateSortGlyph();
+      UpdateRowHeaders();
+      dataGridView.Invalidate();
+    }
+    protected virtual int[] Sort(IEnumerable<KeyValuePair<int, SortOrder>> sortedColumns) {
+      int[] newSortedIndex = Enumerable.Range(0, Content.Rows).ToArray();
+      if (sortedColumns.Count() != 0) {
+        rowComparer.SortedIndices = sortedColumns;
+        rowComparer.Matrix = Content;
+        Array.Sort(newSortedIndex, rowComparer);
+      }
+      return newSortedIndex;
+    }
+    private void UpdateSortGlyph() {
+      foreach (DataGridViewColumn col in this.dataGridView.Columns)
+        col.HeaderCell.SortGlyphDirection = SortOrder.None;
+      foreach (KeyValuePair<int, SortOrder> p in sortedColumnIndices)
+        this.dataGridView.Columns[p.Key].HeaderCell.SortGlyphDirection = p.Value;
+    }
+    #endregion
+
+    public int GetRowIndex(int originalIndex) {
+      return virtualRowIndices[originalIndex];
+    }
+
+    public class RowComparer : IComparer<int> {
+      public RowComparer() {
+      }
+
+      private List<KeyValuePair<int, SortOrder>> sortedIndices;
+      public IEnumerable<KeyValuePair<int, SortOrder>> SortedIndices {
+        get { return this.sortedIndices; }
+        set { sortedIndices = new List<KeyValuePair<int, SortOrder>>(value); }
+      }
+      private IStringConvertibleMatrix matrix;
+      public IStringConvertibleMatrix Matrix {
+        get { return this.matrix; }
+        set { this.matrix = value; }
+      }
+
+      public int Compare(int x, int y) {
+        int result = 0;
+        double double1, double2;
+        DateTime dateTime1, dateTime2;
+        TimeSpan timeSpan1, timeSpan2;
+        string string1, string2;
+
+        if (matrix == null)
+          throw new InvalidOperationException("Could not sort IStringConvertibleMatrix if the matrix member is null.");
+        if (sortedIndices == null)
+          return 0;
+
+        foreach (KeyValuePair<int, SortOrder> pair in sortedIndices.Where(p => p.Value != SortOrder.None)) {
+          string1 = matrix.GetValue(x, pair.Key);
+          string2 = matrix.GetValue(y, pair.Key);
+          if (double.TryParse(string1, out double1) && double.TryParse(string2, out double2))
+            result = double1.CompareTo(double2);
+          else if (DateTime.TryParse(string1, out dateTime1) && DateTime.TryParse(string2, out dateTime2))
+            result = dateTime1.CompareTo(dateTime2);
+          else if (TimeSpan.TryParse(string1, out timeSpan1) && TimeSpan.TryParse(string2, out timeSpan2))
+            result = timeSpan1.CompareTo(timeSpan2);
+          else {
+            if (string1 != null)
+              result = string1.CompareTo(string2);
+            else if (string2 != null)
+              result = string2.CompareTo(string1) * -1;
+          }
+          if (pair.Value == SortOrder.Descending)
+            result *= -1;
+          if (result != 0)
+            return result;
+        }
+        return result;
+      }
+    }
+
+    private void dataGridView_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
+      if (Content == null) return;
+      if (e.Button == MouseButtons.Right && Content.ColumnNames.Count() != 0)
+        contextMenu.Show(MousePosition);
+    }
+    protected virtual void ShowHideColumns_Click(object sender, EventArgs e) {
+      new StringConvertibleMatrixColumnVisibilityDialog(this.dataGridView.Columns.Cast<DataGridViewColumn>()).ShowDialog();
+      columnsTextBox.Text = dataGridView.Columns.GetColumnCount(DataGridViewElementStates.Visible).ToString();
+    }
+
+    private void UpdateVisibilityOfTextBoxes() {
+      rowsTextBox.Visible = columnsTextBox.Visible = showRowsAndColumnsTextBox;
+      rowsLabel.Visible = columnsLabel.Visible = showRowsAndColumnsTextBox;
+      UpdateDataGridViewSizeAndLocation();
+    }
+
+    private void UpdateVisibilityOfStatisticalInformation() {
+      statisticsTextBox.Visible = showStatisticalInformation;
+      UpdateDataGridViewSizeAndLocation();
+    }
+
+    private void UpdateDataGridViewSizeAndLocation() {
+      int headerSize = columnsTextBox.Location.Y + columnsTextBox.Size.Height +
+       columnsTextBox.Margin.Bottom + dataGridView.Margin.Top;
+
+      int offset = showRowsAndColumnsTextBox ? headerSize : 0;
+      dataGridView.Location = new Point(0, offset);
+
+      int statisticsTextBoxHeight = showStatisticalInformation ? statisticsTextBox.Height + statisticsTextBox.Margin.Top + statisticsTextBox.Margin.Bottom : 0;
+      dataGridView.Size = new Size(Size.Width, Size.Height - offset - statisticsTextBoxHeight);
+    }
+
+    protected virtual void dataGridView_SelectionChanged(object sender, EventArgs e) {
+      string stringFormat = "{0,20:0.0000}";
+      statisticsTextBox.Text = string.Empty;
+      if (dataGridView.SelectedCells.Count > 1) {
+        List<double> selectedValues = new List<double>();
+        foreach (DataGridViewCell cell in dataGridView.SelectedCells) {
+          double value;
+          if (!double.TryParse(cell.Value.ToString(), out value)) return;
+          selectedValues.Add(value);
+        }
+        if (selectedValues.Count > 1) {
+          StringBuilder labelText = new StringBuilder();
+          labelText.Append("Count: " + string.Format(stringFormat, selectedValues.Count) + "    ");
+          labelText.Append("Sum: " + string.Format(stringFormat, selectedValues.Sum()) + "    ");
+          labelText.Append("Min: " + string.Format(stringFormat, selectedValues.Min()) + "    ");
+          labelText.Append("Max: " + string.Format(stringFormat, selectedValues.Max()) + "    ");
+          labelText.Append("Average: " + string.Format(stringFormat, selectedValues.Average()) + "    ");
+          labelText.Append("Standard Deviation: " + string.Format(stringFormat, selectedValues.StandardDeviation()) + "    ");
+
+          statisticsTextBox.Text = labelText.ToString();
+        }
+      }
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.Designer.cs	(revision 12160)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleMatrixVisibilityDialog<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.checkedListBox = new System.Windows.Forms.CheckedListBox();
+      this.btnShowAll = new System.Windows.Forms.Button();
+      this.btnHideAll = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // checkedListBox
+      // 
+      this.checkedListBox.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.checkedListBox.CheckOnClick = true;
+      this.checkedListBox.FormattingEnabled = true;
+      this.checkedListBox.Location = new System.Drawing.Point(12, 12);
+      this.checkedListBox.Name = "checkedListBox";
+      this.checkedListBox.Size = new System.Drawing.Size(309, 289);
+      this.checkedListBox.TabIndex = 0;
+      this.checkedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox_ItemCheck);
+      // 
+      // btnShowAll
+      // 
+      this.btnShowAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnShowAll.Location = new System.Drawing.Point(12, 315);
+      this.btnShowAll.Name = "btnShowAll";
+      this.btnShowAll.Size = new System.Drawing.Size(75, 23);
+      this.btnShowAll.TabIndex = 1;
+      this.btnShowAll.Text = "Show all";
+      this.btnShowAll.UseVisualStyleBackColor = true;
+      this.btnShowAll.Click += new System.EventHandler(this.btnShowAll_Click);
+      // 
+      // btnHideAll
+      // 
+      this.btnHideAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.btnHideAll.Location = new System.Drawing.Point(101, 315);
+      this.btnHideAll.Name = "btnHideAll";
+      this.btnHideAll.Size = new System.Drawing.Size(75, 23);
+      this.btnHideAll.TabIndex = 2;
+      this.btnHideAll.Text = "Hide all";
+      this.btnHideAll.UseVisualStyleBackColor = true;
+      this.btnHideAll.Click += new System.EventHandler(this.btnHideAll_Click);
+      // 
+      // ColumnsVisibilityDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(332, 350);
+      this.Controls.Add(this.btnHideAll);
+      this.Controls.Add(this.btnShowAll);
+      this.Controls.Add(this.checkedListBox);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ColumnsVisibilityDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Show/Hide";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.CheckedListBox checkedListBox;
+    protected System.Windows.Forms.Button btnShowAll;
+    protected System.Windows.Forms.Button btnHideAll;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixVisibilityDialog.cs	(revision 12160)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Data.Views {
+  public abstract partial class StringConvertibleMatrixVisibilityDialog<T> : Form where T : DataGridViewBand {
+    public StringConvertibleMatrixVisibilityDialog() {
+      InitializeComponent();
+    }
+
+    public StringConvertibleMatrixVisibilityDialog(IEnumerable<T> bands)
+      : this() {
+      this.Bands = bands;
+      this.visibility = bands.Select(b => b.Visible).ToList();
+      UpdateCheckBoxes();
+    }
+
+    private List<T> bands;
+    public IEnumerable<T> Bands {
+      get { return this.bands; }
+      set { this.bands = new List<T>(value); }
+    }
+
+    private List<bool> visibility;
+    public IList<bool> Visibility {
+      get { return this.visibility; }
+    }
+
+    protected abstract void UpdateCheckBoxes();
+
+    protected void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
+      this.bands[e.Index].Visible = e.NewValue == CheckState.Checked;
+      this.visibility[e.Index] = e.NewValue == CheckState.Checked;
+    }
+
+    protected void btnShowAll_Click(object sender, System.EventArgs e) {
+      for (int i = 0; i < checkedListBox.Items.Count; i++)
+        checkedListBox.SetItemChecked(i, true);
+    }
+    protected void btnHideAll_Click(object sender, System.EventArgs e) {
+      for (int i = 0; i < checkedListBox.Items.Count; i++)
+        checkedListBox.SetItemChecked(i, false);
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.Designer.cs	(revision 12160)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.Data.Views {
+  public partial class StringConvertibleValueTupleView {
+    /// <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.Item1View = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.Item2View = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.Item1Label = new System.Windows.Forms.Label();
+      this.Item2Label = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // Item1View
+      // 
+      this.Item1View.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.Item1View.Caption = "StringConvertibleValue View";
+      this.Item1View.Content = null;
+      this.Item1View.LabelVisible = false;
+      this.Item1View.Location = new System.Drawing.Point(45, 0);
+      this.Item1View.Name = "Item1View";
+      this.Item1View.ReadOnly = false;
+      this.Item1View.Size = new System.Drawing.Size(260, 20);
+      this.Item1View.TabIndex = 0;
+      // 
+      // Item2View
+      // 
+      this.Item2View.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.Item2View.Caption = "StringConvertibleValue View";
+      this.Item2View.Content = null;
+      this.Item2View.LabelVisible = false;
+      this.Item2View.Location = new System.Drawing.Point(45, 26);
+      this.Item2View.Name = "Item2View";
+      this.Item2View.ReadOnly = false;
+      this.Item2View.Size = new System.Drawing.Size(260, 20);
+      this.Item2View.TabIndex = 1;
+      // 
+      // Item1Label
+      // 
+      this.Item1Label.AutoSize = true;
+      this.Item1Label.Location = new System.Drawing.Point(3, 3);
+      this.Item1Label.Name = "Item1Label";
+      this.Item1Label.Size = new System.Drawing.Size(36, 13);
+      this.Item1Label.TabIndex = 2;
+      this.Item1Label.Text = "Item1:";
+      // 
+      // Item2Label
+      // 
+      this.Item2Label.AutoSize = true;
+      this.Item2Label.Location = new System.Drawing.Point(3, 29);
+      this.Item2Label.Name = "Item2Label";
+      this.Item2Label.Size = new System.Drawing.Size(36, 13);
+      this.Item2Label.TabIndex = 3;
+      this.Item2Label.Text = "Item2:";
+      // 
+      // StringConvertibleValueTupleView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.Item1Label);
+      this.Controls.Add(this.Item2Label);
+      this.Controls.Add(this.Item1View);
+      this.Controls.Add(this.Item2View);
+      this.Name = "StringConvertibleValueTupleView";
+      this.Size = new System.Drawing.Size(308, 47);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected StringConvertibleValueView Item1View;
+    protected StringConvertibleValueView Item2View;
+    protected System.Windows.Forms.Label Item1Label;
+    protected System.Windows.Forms.Label Item2Label;
+
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueTupleView.cs	(revision 12160)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("StringConvertibleValueTuple View")]
+  [Content(typeof(IStringConvertibleValueTuple), false)]
+  public partial class StringConvertibleValueTupleView : AsynchronousContentView {
+
+    public new IStringConvertibleValueTuple Content {
+      get { return (IStringConvertibleValueTuple)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public StringConvertibleValueTupleView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        Item1View.Content = Content.Item1;
+        Item2View.Content = Content.Item2;
+      } else {
+        Item1View.Content = null;
+        Item2View.Content = null;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      Item1View.Enabled = Content != null;
+      Item2View.Enabled = Content != null;
+    }
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.Designer.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.Designer.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.Designer.cs	(revision 12160)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Data.Views {
+  partial class StringConvertibleValueView {
+    /// <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.valueTextBox = new System.Windows.Forms.TextBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.valueLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueTextBox
+      // 
+      this.valueTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueTextBox.Location = new System.Drawing.Point(17, 0);
+      this.valueTextBox.Name = "valueTextBox";
+      this.valueTextBox.Size = new System.Drawing.Size(135, 20);
+      this.valueTextBox.TabIndex = 2;
+      this.valueTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.valueTextBox_KeyDown);
+      this.valueTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.valueTextBox_Validating);
+      this.valueTextBox.Validated += new System.EventHandler(this.valueTextBox_Validated);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.errorProvider.ContainerControl = this;
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(3, 3);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(37, 13);
+      this.valueLabel.TabIndex = 1;
+      this.valueLabel.Text = "&Value:";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.IsSplitterFixed = true;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.valueLabel);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.valueTextBox);
+      this.splitContainer.Size = new System.Drawing.Size(194, 21);
+      this.splitContainer.SplitterDistance = 41;
+      this.splitContainer.SplitterWidth = 1;
+      this.splitContainer.TabIndex = 0;
+      this.splitContainer.TabStop = false;
+      // 
+      // StringConvertibleValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "StringConvertibleValueView";
+      this.Size = new System.Drawing.Size(194, 21);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox valueTextBox;
+    protected System.Windows.Forms.ErrorProvider errorProvider;
+    protected System.Windows.Forms.Label valueLabel;
+    protected System.Windows.Forms.SplitContainer splitContainer;
+  }
+}
Index: branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs
===================================================================
--- branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 12160)
+++ branches/DataPreprocessingImprovements/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 12160)
@@ -0,0 +1,112 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Data.Views {
+  [View("StringConvertibleValue View")]
+  [Content(typeof(IStringConvertibleValue), true)]
+  public partial class StringConvertibleValueView : AsynchronousContentView {
+    public new IStringConvertibleValue Content {
+      get { return (IStringConvertibleValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
+
+    public bool LabelVisible {
+      get { return !splitContainer.Panel1Collapsed; }
+      set { splitContainer.Panel1Collapsed = !value; }
+    }
+
+    public StringConvertibleValueView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(valueTextBox, ErrorIconAlignment.MiddleLeft);
+      errorProvider.SetIconPadding(valueTextBox, 2);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        valueTextBox.Text = string.Empty;
+      } else
+        valueTextBox.Text = Content.GetValue();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      valueTextBox.Enabled = Content != null;
+      valueTextBox.ReadOnly = ReadOnly;
+    }
+
+    protected virtual void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      else
+        valueTextBox.Text = Content.GetValue();
+    }
+
+    protected virtual void valueTextBox_KeyDown(object sender, KeyEventArgs e) {
+      if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
+        valueLabel.Select();  // select label to validate data
+
+      if (e.KeyCode == Keys.Escape) {
+        valueTextBox.Text = Content.GetValue();
+        valueLabel.Select();  // select label to validate data
+      }
+    }
+    protected virtual void valueTextBox_Validating(object sender, CancelEventArgs e) {
+      if (ReadOnly) return;
+      string errorMessage;
+      if (!Content.Validate(valueTextBox.Text, out errorMessage)) {
+        e.Cancel = true;
+        errorProvider.SetError(valueTextBox, errorMessage);
+        valueTextBox.SelectAll();
+      }
+    }
+    protected virtual void valueTextBox_Validated(object sender, EventArgs e) {
+      if (ReadOnly) return;
+      if (!Content.ReadOnly) Content.SetValue(valueTextBox.Text);
+      errorProvider.SetError(valueTextBox, string.Empty);
+      valueTextBox.Text = Content.GetValue();
+    }
+  }
+}
