Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 17858)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 17902)
@@ -221,10 +221,4 @@
     <Compile Include="Interfaces\IDataPreprocessorStarter.cs" />
     <Compile Include="Interfaces\IPartialDependencePlot.cs" />
-    <Compile Include="IntervalCollectionView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="IntervalCollectionView.Designer.cs">
-      <DependentUpon>IntervalCollectionView.cs</DependentUpon>
-    </Compile>
     <Compile Include="MenuItems\ChangeDataOfOptimizersMenuItem.cs" />
     <Compile Include="MenuItems\ShrinkDataAnalysisRunsMenuItem.cs" />
@@ -242,4 +236,9 @@
       <DependentUpon>ProblemDataView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
     <Compile Include="Regression\ConfidenceRegressionSolutionEstimatedValuesView.cs">
       <SubType>UserControl</SubType>
@@ -254,4 +253,10 @@
       <DependentUpon>ConfidenceRegressionSolutionLineChartView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Regression\IntervalCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Regression\IntervalCollectionView.Designer.cs">
+      <DependentUpon>IntervalCollectionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Regression\RegressionEnsembleSolutionModelWeightsView.cs">
       <SubType>UserControl</SubType>
@@ -343,4 +348,16 @@
     <Compile Include="Regression\RegressionSolutionScatterPlotView.Designer.cs">
       <DependentUpon>RegressionSolutionScatterPlotView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Regression\ShapeConstraintsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Regression\ShapeConstraintsView.Designer.cs">
+      <DependentUpon>ShapeConstraintsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Regression\ShapeConstraintView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Regression\ShapeConstraintView.Designer.cs">
+      <DependentUpon>ShapeConstraintView.cs</DependentUpon>
     </Compile>
     <Compile Include="Solution Views\ClassificationSolutionView.cs">
@@ -605,11 +622,12 @@
       <DependentUpon>AbstractFeatureCorrelationView.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
-    <Reference Include="HEAL.Attic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\bin\HEAL.Attic.dll</HintPath>
-      <Private>False</Private>
-    </Reference>
+    <EmbeddedResource Include="Resources\shapeConstraintsHelp.rtf" />
+    <None Include="Resources\VS2008ImageLibrary_Annotations_Information.png" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalCollectionView.Designer.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalCollectionView.Designer.cs	(revision 17858)
+++ 	(revision )
@@ -1,82 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2019 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.Problems.DataAnalysis.Views {
-  partial class IntervalCollectionView {
-    /// <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.dataGridView = new System.Windows.Forms.DataGridView();
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // dataGridView
-      // 
-      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.dataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.dataGridView.Location = new System.Drawing.Point(0, 0);
-      this.dataGridView.Margin = new System.Windows.Forms.Padding(4);
-      this.dataGridView.Name = "dataGridView";
-      this.dataGridView.RowHeadersWidth = 120;
-      this.dataGridView.Size = new System.Drawing.Size(643, 505);
-      this.dataGridView.TabIndex = 1;
-      this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
-      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
-      this.dataGridView.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellValueChanged);
-      // 
-      // IntervalCollectionView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.dataGridView);
-      this.Margin = new System.Windows.Forms.Padding(4);
-      this.Name = "IntervalCollectionView";
-      this.Size = new System.Drawing.Size(643, 505);
-      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.DataGridView dataGridView;
-  }
-}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalCollectionView.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/IntervalCollectionView.cs	(revision 17858)
+++ 	(revision )
@@ -1,153 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2019 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.Problems.DataAnalysis.Views {
-
-  [View("IntervalCollection View")]
-  [Content(typeof(IntervalCollection), true)]
-  public sealed partial class IntervalCollectionView : AsynchronousContentView {
-
-    public new IntervalCollection Content {
-      get => (IntervalCollection)base.Content;
-      set => base.Content = value;
-    }
-
-    private DataGridView DataGridView {
-      get => dataGridView;
-    }
-
-    public IntervalCollectionView() {
-      InitializeComponent();
-      dataGridView.AutoGenerateColumns = false;
-      dataGridView.AllowUserToAddRows = false;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        DataGridView.Rows.Clear();
-        DataGridView.Columns.Clear();
-      } else {
-        UpdateData();
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      dataGridView.Enabled = Content != null;
-      dataGridView.ReadOnly = ReadOnly;
-    }
-
-    private void UpdateData() {
-      DataGridView.Rows.Clear();
-      DataGridView.Columns.Clear();
-      SetColumnNames();
-
-
-      var variablesCount = Content.Count;
-
-      DataGridViewRow[] rows = new DataGridViewRow[variablesCount];
-      for (var i = 0; i < variablesCount; ++i) {
-        var row = new DataGridViewRow();
-        rows[i] = row;
-      }
-      dataGridView.Rows.AddRange(rows);
-
-      var j = 0;
-      foreach (var variableInterval in Content.GetVariableIntervals()) {
-        dataGridView.Rows[j].HeaderCell.Value = variableInterval.Item1;
-        dataGridView.Rows[j].Cells[0].Value = variableInterval.Item2.LowerBound;
-        dataGridView.Rows[j].Cells[1].Value = variableInterval.Item2.UpperBound;
-        j++;
-      }
-
-      dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
-      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
-      dataGridView.Enabled = true;
-      //Disable Sorting
-      foreach (DataGridViewColumn column in dataGridView.Columns) {
-        column.SortMode = DataGridViewColumnSortMode.NotSortable;
-      }
-    }
-
-    private void SetColumnNames() {
-      dataGridView.Columns.Add("lowerBound", "Lower Bound");
-      dataGridView.Columns.Add("upperBound", "Upper Bound");
-    }
-
-    private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
-      if (e.ColumnIndex < 0 || e.RowIndex < 0) return;
-
-      var key = dataGridView.Rows[e.RowIndex].HeaderCell.Value.ToString();
-      var gridData = dataGridView[e.ColumnIndex, e.RowIndex].Value;
-      //Cells maybe null during initialization
-      var lowerBound = Content.GetInterval(key).LowerBound;
-      var upperBound = Content.GetInterval(key).UpperBound;
-
-      //Check if the input data is a string (user-defined input)
-      //if so parse the toString() of the value, otherwise do a hard-cast
-      //to not loose the double precision
-      double parsedValue;
-      if (gridData is string) {
-        parsedValue = double.Parse(gridData.ToString());
-      } else {
-        parsedValue = (double)gridData;
-      }
-
-      if (e.ColumnIndex == 0) lowerBound = parsedValue;
-      if (e.ColumnIndex == 1) upperBound = parsedValue;
-
-      var newInterval = new Interval(lowerBound, upperBound);
-
-      // update if there was a change
-      if (!Content.GetInterval(key).Equals(newInterval))
-        Content.SetInterval(key, newInterval);
-    }
-
-    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
-      if (!double.TryParse(e.FormattedValue.ToString(), out var value)) {
-        e.Cancel = true;
-        dataGridView.Rows[e.RowIndex].ErrorText = "Value must be a double value.";
-        return;
-      }
-
-      var lowerBound = double.Parse(dataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());
-      var upperBound = double.Parse(dataGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
-
-      if (e.ColumnIndex == 0 && value > upperBound || e.ColumnIndex == 1 && value < lowerBound) {
-        e.Cancel = true;
-        dataGridView.Rows[e.RowIndex].ErrorText = "Lower bound of interval must be smaller than upper bound.";
-        return;
-      }
-
-      dataGridView[e.ColumnIndex, e.RowIndex].Value = value;
-    }
-
-    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
-      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
-    }
-  }
-}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.Designer.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.Designer.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.Designer.cs	(revision 17902)
@@ -0,0 +1,89 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Problems.DataAnalysis.Views.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Problems.DataAnalysis.Views.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 Consolas;}{\f2\fnil\fcharset1 Cambria Math;}}
+        ///{\colortbl ;\red0\green0\blue0;}
+        ///{\*\generator Riched20 10.0.18362}{\*\mmathPr\mmathFont2\mwrapIndent1440 }\viewkind4\uc1 
+        ///\pard\sa200\sl276\slmult1\cf1\fs19\lang9 Within the text field you can define different types of shape constraints e.g. range constraints, monotonicity constraints.\par
+        ///
+        ///\pard\sl276\slmult1 To define a model constraint: \par
+        ///
+        ///\p [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string shapeConstraintsHelp_rtf {
+            get {
+                return ResourceManager.GetString("shapeConstraintsHelp.rtf", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap VS2008ImageLibrary_Annotations_Information {
+            get {
+                object obj = ResourceManager.GetObject("VS2008ImageLibrary_Annotations_Information", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.resx
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.resx	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Properties/Resources.resx	(revision 17902)
@@ -0,0 +1,127 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="shapeConstraintsHelp.rtf" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\shapeConstraintsHelp.rtf;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
+  </data>
+  <data name="VS2008ImageLibrary_Annotations_Information" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\VS2008ImageLibrary_Annotations_Information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.Designer.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.Designer.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.Designer.cs	(revision 17902)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Problems.DataAnalysis.Views {
+  partial class IntervalCollectionView {
+    /// <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.dataGridView = new System.Windows.Forms.DataGridView();
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // dataGridView
+      // 
+      this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.dataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.dataGridView.Location = new System.Drawing.Point(0, 0);
+      this.dataGridView.Margin = new System.Windows.Forms.Padding(4);
+      this.dataGridView.Name = "dataGridView";
+      this.dataGridView.RowHeadersWidth = 120;
+      this.dataGridView.Size = new System.Drawing.Size(643, 505);
+      this.dataGridView.TabIndex = 1;
+      this.dataGridView.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellEndEdit);
+      this.dataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView_CellValidating);
+      this.dataGridView.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_CellValueChanged);
+      // 
+      // IntervalCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataGridView);
+      this.Margin = new System.Windows.Forms.Padding(4);
+      this.Name = "IntervalCollectionView";
+      this.Size = new System.Drawing.Size(643, 505);
+      ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataGridView dataGridView;
+  }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/IntervalCollectionView.cs	(revision 17902)
@@ -0,0 +1,153 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 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.Problems.DataAnalysis.Views {
+
+  [View("IntervalCollection View")]
+  [Content(typeof(IntervalCollection), true)]
+  public sealed partial class IntervalCollectionView : AsynchronousContentView {
+
+    public new IntervalCollection Content {
+      get => (IntervalCollection)base.Content;
+      set => base.Content = value;
+    }
+
+    private DataGridView DataGridView {
+      get => dataGridView;
+    }
+
+    public IntervalCollectionView() {
+      InitializeComponent();
+      dataGridView.AutoGenerateColumns = false;
+      dataGridView.AllowUserToAddRows = false;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        DataGridView.Rows.Clear();
+        DataGridView.Columns.Clear();
+      } else {
+        UpdateData();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      dataGridView.Enabled = Content != null;
+      dataGridView.ReadOnly = ReadOnly;
+    }
+
+    private void UpdateData() {
+      DataGridView.Rows.Clear();
+      DataGridView.Columns.Clear();
+      SetColumnNames();
+
+
+      var variablesCount = Content.Count;
+
+      DataGridViewRow[] rows = new DataGridViewRow[variablesCount];
+      for (var i = 0; i < variablesCount; ++i) {
+        var row = new DataGridViewRow();
+        rows[i] = row;
+      }
+      dataGridView.Rows.AddRange(rows);
+
+      var j = 0;
+      foreach (var variableInterval in Content.GetVariableIntervals()) {
+        dataGridView.Rows[j].HeaderCell.Value = variableInterval.Item1;
+        dataGridView.Rows[j].Cells[0].Value = variableInterval.Item2.LowerBound;
+        dataGridView.Rows[j].Cells[1].Value = variableInterval.Item2.UpperBound;
+        j++;
+      }
+
+      dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
+      dataGridView.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
+      dataGridView.Enabled = true;
+      //Disable Sorting
+      foreach (DataGridViewColumn column in dataGridView.Columns) {
+        column.SortMode = DataGridViewColumnSortMode.NotSortable;
+      }
+    }
+
+    private void SetColumnNames() {
+      dataGridView.Columns.Add("lowerBound", "Lower bound");
+      dataGridView.Columns.Add("upperBound", "Upper bound");
+    }
+
+    private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
+      if (e.ColumnIndex < 0 || e.RowIndex < 0) return;
+
+      var key = dataGridView.Rows[e.RowIndex].HeaderCell.Value.ToString();
+      var gridData = dataGridView[e.ColumnIndex, e.RowIndex].Value;
+      //Cells maybe null during initialization
+      var lowerBound = Content.GetInterval(key).LowerBound;
+      var upperBound = Content.GetInterval(key).UpperBound;
+
+      //Check if the input data is a string (user-defined input)
+      //if so parse the toString() of the value, otherwise do a hard-cast
+      //to not loose the double precision
+      double parsedValue;
+      if (gridData is string) {
+        parsedValue = double.Parse(gridData.ToString());
+      } else {
+        parsedValue = (double)gridData;
+      }
+
+      if (e.ColumnIndex == 0) lowerBound = parsedValue;
+      if (e.ColumnIndex == 1) upperBound = parsedValue;
+
+      var newInterval = new Interval(lowerBound, upperBound);
+
+      // update if there was a change
+      if (!Content.GetInterval(key).Equals(newInterval))
+        Content.SetInterval(key, newInterval);
+    }
+
+    private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
+      if (!double.TryParse(e.FormattedValue.ToString(), out var value)) {
+        e.Cancel = true;
+        dataGridView.Rows[e.RowIndex].ErrorText = "Value must be a double value.";
+        return;
+      }
+
+      var lowerBound = double.Parse(dataGridView.Rows[e.RowIndex].Cells[0].Value.ToString());
+      var upperBound = double.Parse(dataGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
+
+      if (e.ColumnIndex == 0 && value > upperBound || e.ColumnIndex == 1 && value < lowerBound) {
+        e.Cancel = true;
+        dataGridView.Rows[e.RowIndex].ErrorText = "Lower bound of interval must be smaller than upper bound.";
+        return;
+      }
+
+      dataGridView[e.ColumnIndex, e.RowIndex].Value = value;
+    }
+
+    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
+      dataGridView.Rows[e.RowIndex].ErrorText = string.Empty;
+    }
+  }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.Designer.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.Designer.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.Designer.cs	(revision 17902)
@@ -0,0 +1,245 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 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.Problems.DataAnalysis.Views {
+  partial class ShapeConstraintView {
+    /// <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.components = new System.ComponentModel.Container();
+      this.lowerboundLabel = new System.Windows.Forms.Label();
+      this.upperboundLabel = new System.Windows.Forms.Label();
+      this.variableLabel = new System.Windows.Forms.Label();
+      this.numberOfDerivationLabel = new System.Windows.Forms.Label();
+      this.upperboundInput = new System.Windows.Forms.TextBox();
+      this.lowerboundInput = new System.Windows.Forms.TextBox();
+      this.variableInput = new System.Windows.Forms.TextBox();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.weightTextBox = new System.Windows.Forms.TextBox();
+      this.weightLabel = new System.Windows.Forms.Label();
+      this.regionLabel = new System.Windows.Forms.Label();
+      this.regionView = new HeuristicLab.Problems.DataAnalysis.Views.IntervalCollectionView();
+      this.numberOfDerivationsComboBox = new System.Windows.Forms.ComboBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.groupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // lowerboundLabel
+      // 
+      this.lowerboundLabel.AutoSize = true;
+      this.lowerboundLabel.Location = new System.Drawing.Point(8, 75);
+      this.lowerboundLabel.Name = "lowerboundLabel";
+      this.lowerboundLabel.Size = new System.Drawing.Size(72, 13);
+      this.lowerboundLabel.TabIndex = 4;
+      this.lowerboundLabel.Text = "Lower bound:";
+      // 
+      // upperboundLabel
+      // 
+      this.upperboundLabel.AutoSize = true;
+      this.upperboundLabel.Location = new System.Drawing.Point(8, 101);
+      this.upperboundLabel.Name = "upperboundLabel";
+      this.upperboundLabel.Size = new System.Drawing.Size(72, 13);
+      this.upperboundLabel.TabIndex = 6;
+      this.upperboundLabel.Text = "Upper bound:";
+      // 
+      // variableLabel
+      // 
+      this.variableLabel.AutoSize = true;
+      this.variableLabel.Location = new System.Drawing.Point(8, 22);
+      this.variableLabel.Name = "variableLabel";
+      this.variableLabel.Size = new System.Drawing.Size(48, 13);
+      this.variableLabel.TabIndex = 0;
+      this.variableLabel.Text = "Variable:";
+      // 
+      // numberderivationLabel
+      // 
+      this.numberOfDerivationLabel.AutoSize = true;
+      this.numberOfDerivationLabel.Location = new System.Drawing.Point(8, 48);
+      this.numberOfDerivationLabel.Name = "numberderivationLabel";
+      this.numberOfDerivationLabel.Size = new System.Drawing.Size(58, 13);
+      this.numberOfDerivationLabel.TabIndex = 2;
+      this.numberOfDerivationLabel.Text = "Derivative:";
+      // 
+      // upperboundInput
+      // 
+      this.upperboundInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.upperboundInput.Location = new System.Drawing.Point(86, 98);
+      this.upperboundInput.Name = "upperboundInput";
+      this.upperboundInput.Size = new System.Drawing.Size(495, 20);
+      this.upperboundInput.TabIndex = 7;
+      this.upperboundInput.Validating += new System.ComponentModel.CancelEventHandler(this.upperboundInput_Validating);
+      this.upperboundInput.Validated += new System.EventHandler(this.upperboundInput_Validated);
+      // 
+      // lowerboundInput
+      // 
+      this.lowerboundInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.lowerboundInput.Location = new System.Drawing.Point(86, 72);
+      this.lowerboundInput.Name = "lowerboundInput";
+      this.lowerboundInput.Size = new System.Drawing.Size(495, 20);
+      this.lowerboundInput.TabIndex = 5;
+      this.lowerboundInput.Validating += new System.ComponentModel.CancelEventHandler(this.lowerboundInput_Validating);
+      this.lowerboundInput.Validated += new System.EventHandler(this.lowerboundInput_Validated);
+      // 
+      // variableInput
+      // 
+      this.variableInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.variableInput.Location = new System.Drawing.Point(86, 19);
+      this.variableInput.Name = "variableInput";
+      this.variableInput.Size = new System.Drawing.Size(495, 20);
+      this.variableInput.TabIndex = 1;
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.weightTextBox);
+      this.groupBox.Controls.Add(this.weightLabel);
+      this.groupBox.Controls.Add(this.regionLabel);
+      this.groupBox.Controls.Add(this.regionView);
+      this.groupBox.Controls.Add(this.numberOfDerivationsComboBox);
+      this.groupBox.Controls.Add(this.variableInput);
+      this.groupBox.Controls.Add(this.lowerboundInput);
+      this.groupBox.Controls.Add(this.upperboundInput);
+      this.groupBox.Controls.Add(this.numberOfDerivationLabel);
+      this.groupBox.Controls.Add(this.variableLabel);
+      this.groupBox.Controls.Add(this.upperboundLabel);
+      this.groupBox.Controls.Add(this.lowerboundLabel);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(587, 380);
+      this.groupBox.TabIndex = 0;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Shape Constraint Detail";
+      // 
+      // weightInput
+      // 
+      this.weightTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.weightTextBox.Location = new System.Drawing.Point(86, 124);
+      this.weightTextBox.Name = "weightInput";
+      this.weightTextBox.Size = new System.Drawing.Size(495, 20);
+      this.weightTextBox.TabIndex = 9;
+      this.weightTextBox.TextChanged += new System.EventHandler(this.weightInput_TextChanged);
+      // 
+      // WeightLab
+      // 
+      this.weightLabel.AutoSize = true;
+      this.weightLabel.Location = new System.Drawing.Point(8, 127);
+      this.weightLabel.Name = "WeightLab";
+      this.weightLabel.Size = new System.Drawing.Size(44, 13);
+      this.weightLabel.TabIndex = 8;
+      this.weightLabel.Text = "Weight:";
+      // 
+      // regionLab
+      // 
+      this.regionLabel.AutoSize = true;
+      this.regionLabel.Location = new System.Drawing.Point(8, 150);
+      this.regionLabel.Name = "regionLab";
+      this.regionLabel.Size = new System.Drawing.Size(49, 13);
+      this.regionLabel.TabIndex = 10;
+      this.regionLabel.Text = "Regions:";
+      // 
+      // regionView
+      // 
+      this.regionView.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.regionView.Caption = "IntervalCollection View";
+      this.regionView.Content = null;
+      this.regionView.Location = new System.Drawing.Point(86, 150);
+      this.regionView.Name = "regionView";
+      this.regionView.ReadOnly = false;
+      this.regionView.Size = new System.Drawing.Size(495, 224);
+      this.regionView.TabIndex = 11;
+      this.regionView.TabStop = false;
+      // 
+      // numberderivationInput
+      // 
+      this.numberOfDerivationsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.numberOfDerivationsComboBox.FormattingEnabled = true;
+      this.numberOfDerivationsComboBox.Location = new System.Drawing.Point(86, 45);
+      this.numberOfDerivationsComboBox.Name = "numberderivationInput";
+      this.numberOfDerivationsComboBox.Size = new System.Drawing.Size(495, 21);
+      this.numberOfDerivationsComboBox.TabIndex = 3;
+      this.numberOfDerivationsComboBox.SelectedIndexChanged += new System.EventHandler(this.numberderivationInput_SelectedIndexChanged);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      this.errorProvider.RightToLeft = true;
+      // 
+      // ShapeConstraintView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.groupBox);
+      this.Name = "ShapeConstraintView";
+      this.Size = new System.Drawing.Size(587, 380);
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label lowerboundLabel;
+    private System.Windows.Forms.Label upperboundLabel;
+    private System.Windows.Forms.Label variableLabel;
+    private System.Windows.Forms.Label numberOfDerivationLabel;
+    private System.Windows.Forms.TextBox upperboundInput;
+    private System.Windows.Forms.TextBox lowerboundInput;
+    private System.Windows.Forms.TextBox variableInput;
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ComboBox numberOfDerivationsComboBox;
+    private IntervalCollectionView regionView;
+    private System.Windows.Forms.Label regionLabel;
+    private System.Windows.Forms.TextBox weightTextBox;
+    private System.Windows.Forms.Label weightLabel;
+  }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintView.cs	(revision 17902)
@@ -0,0 +1,204 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 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.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Shape Constraint View")]
+  [Content(typeof(ShapeConstraint), true)]
+  public sealed partial class ShapeConstraintView : ItemView {
+    public new ShapeConstraint Content {
+      get => (ShapeConstraint)base.Content;
+      set => base.Content = value;
+    }
+
+    public ShapeConstraintView() {
+      InitializeComponent();
+      int[] items = { 1, 2, 3 };
+      numberOfDerivationsComboBox.DataSource = items;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      this.regionView.Content = Content.Regions;
+      UpdateControls();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += Content_Changed;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Changed -= Content_Changed;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      variableInput.Enabled = Content != null && !Locked && !ReadOnly;
+      numberOfDerivationsComboBox.Enabled = Content != null && !Locked && !ReadOnly;
+      lowerboundInput.Enabled = Content != null && !Locked && !ReadOnly;
+      upperboundInput.Enabled = Content != null && !Locked && !ReadOnly;
+      weightTextBox.Enabled = Content != null && !Locked && !ReadOnly;
+    }
+
+
+    #region helpers
+
+    private static double ParseDoubleValue(string input, Control control, ErrorProvider errorProvider) {
+      input = input.ToLower();
+      switch (input) {
+        case "inf.":
+        case "+inf.":
+        case "Infinity":
+          return double.PositiveInfinity;
+        case "-inf.":
+        case "-Infinity":
+          return double.NegativeInfinity;
+        default: {
+            if (double.TryParse(input, out var value)) {
+              return value;
+            }
+
+            errorProvider.SetError(control, "Invalid input: value must be a double.");
+            return double.NaN;
+          }
+      }
+    }
+
+    private void UpdateControls() {
+      if (Content == null) {
+        lowerboundInput.Text = string.Empty;
+        upperboundInput.Text = string.Empty;
+        weightTextBox.Text = string.Empty;
+        return;
+      }
+
+      lowerboundInput.Text = Content.Interval.LowerBound.ToString();
+      upperboundInput.Text = Content.Interval.UpperBound.ToString();
+      weightTextBox.Text = Content.Weight.ToString();
+
+      variableInput.Text = Content.Variable;
+      if (!Content.IsDerivative) {
+        numberOfDerivationsComboBox.Enabled = false;
+        numberOfDerivationsComboBox.SelectedItem = null;
+        numberOfDerivationsComboBox.Text = "0";
+      } else {
+        numberOfDerivationLabel.Visible = true;
+        numberOfDerivationsComboBox.Visible = true;
+        numberOfDerivationsComboBox.Enabled = true;
+        numberOfDerivationsComboBox.SelectedItem = Content.NumberOfDerivations;
+      }
+
+      regionView.Content = Content.Regions;
+    }
+
+    #endregion
+
+    #region control event handlers
+
+    private void lowerboundInput_Validating(object sender, CancelEventArgs e) {
+      var value = ParseDoubleValue(lowerboundInput.Text, lowerboundInput, errorProvider);
+      if (double.IsNaN(value)) {
+        errorProvider.SetError(lowerboundInput, "Invalid input: lower bound must be a double value.");
+        e.Cancel = true;
+        return;
+      }
+
+      if (value > Content.Interval.UpperBound) {
+        errorProvider.SetError(lowerboundInput, "Invalid input: lower bound must be smaller than upper bound.");
+        e.Cancel = true;
+        return;
+      }
+
+      errorProvider.SetError(lowerboundInput, string.Empty);
+      e.Cancel = false;
+    }
+
+    private void lowerboundInput_Validated(object sender, EventArgs e) {
+      var value =
+        ParseDoubleValue(lowerboundInput.Text, lowerboundInput, errorProvider);
+      if (!double.IsNaN(value)) Content.Interval = new Interval(value, Content.Interval.UpperBound);
+    }
+
+    private void upperboundInput_Validating(object sender, CancelEventArgs e) {
+      var value = ParseDoubleValue(upperboundInput.Text, upperboundInput, errorProvider);
+      if (double.IsNaN(value)) {
+        errorProvider.SetError(upperboundInput, "Invalid Input: upper bound must be a double value.");
+        e.Cancel = true;
+        return;
+      }
+
+      if (value < Content.Interval.LowerBound) {
+        errorProvider.SetError(upperboundInput, "Invalid input: upper bound must be bigger than lower bound.");
+        e.Cancel = true;
+        return;
+      }
+
+      errorProvider.SetError(upperboundInput, string.Empty);
+      e.Cancel = false;
+    }
+
+    private void upperboundInput_Validated(object sender, EventArgs e) {
+      var value =
+        ParseDoubleValue(upperboundInput.Text, upperboundInput, errorProvider);
+      if (!double.IsNaN(value)) Content.Interval = new Interval(Content.Interval.LowerBound, value);
+    }
+
+    private void numberderivationInput_SelectedIndexChanged(object sender, EventArgs e) {
+      if (numberOfDerivationsComboBox.SelectedItem == null) {
+        Content.NumberOfDerivations = 0;
+        numberOfDerivationsComboBox.Enabled = false;
+        return;
+      }
+
+      if ((int)numberOfDerivationsComboBox.SelectedItem == 1)
+        Content.NumberOfDerivations = 1;
+      else if ((int)numberOfDerivationsComboBox.SelectedItem == 2)
+        Content.NumberOfDerivations = 2;
+      else if ((int)numberOfDerivationsComboBox.SelectedItem == 3)
+        Content.NumberOfDerivations = 3;
+    }
+
+    private void weightInput_TextChanged(object sender, EventArgs e) {
+      var value = ParseDoubleValue(weightTextBox.Text, weightTextBox, errorProvider);
+      if (!double.IsNaN(value)) Content.Weight = value;
+    }
+
+
+    #endregion
+
+    #region content event handlers
+
+    private void Content_Changed(object sender, EventArgs e) {
+      UpdateControls();
+    }
+
+   #endregion
+  }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.Designer.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.Designer.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.Designer.cs	(revision 17902)
@@ -0,0 +1,184 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class ShapeConstraintsView {
+    /// <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.components = new System.ComponentModel.Container();
+            this.splitContainer = new System.Windows.Forms.SplitContainer();
+            this.groupBox = new System.Windows.Forms.GroupBox();
+            this.constraintsInput = new System.Windows.Forms.TextBox();
+            this.parseBtn = new System.Windows.Forms.Button();
+            this.infoLabel = new System.Windows.Forms.Label();
+            this.errorOutput = new System.Windows.Forms.Label();
+            this.shapeConstraintsView = new HeuristicLab.Core.Views.CheckedItemListView<ShapeConstraint>();
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+            this.splitContainer.Panel1.SuspendLayout();
+            this.splitContainer.Panel2.SuspendLayout();
+            this.splitContainer.SuspendLayout();
+            this.groupBox.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // splitContainer1
+            // 
+            this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer.Location = new System.Drawing.Point(0, 0);
+            this.splitContainer.Name = "splitContainer1";
+            // 
+            // splitContainer1.Panel1
+            // 
+            this.splitContainer.Panel1.Controls.Add(this.groupBox);
+            // 
+            // splitContainer1.Panel2
+            // 
+            this.splitContainer.Panel2.Controls.Add(this.shapeConstraintsView);
+            this.splitContainer.Size = new System.Drawing.Size(888, 629);
+            this.splitContainer.SplitterDistance = 296;
+            this.splitContainer.TabIndex = 0;
+            // 
+            // groupBox1
+            // 
+            this.groupBox.Controls.Add(this.constraintsInput);
+            this.groupBox.Controls.Add(this.parseBtn);
+            this.groupBox.Controls.Add(this.infoLabel);
+            this.groupBox.Controls.Add(this.errorOutput);
+            this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.groupBox.Location = new System.Drawing.Point(0, 0);
+            this.groupBox.Name = "groupBox1";
+            this.groupBox.Size = new System.Drawing.Size(296, 629);
+            this.groupBox.TabIndex = 3;
+            this.groupBox.TabStop = false;
+            this.groupBox.Text = "Constraints Input";
+            // 
+            // constraintsInput
+            // 
+            this.constraintsInput.AcceptsTab = true;
+            this.constraintsInput.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.constraintsInput.Location = new System.Drawing.Point(3, 29);
+            this.constraintsInput.Multiline = true;
+            this.constraintsInput.Name = "constraintsInput";
+            this.constraintsInput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+            this.constraintsInput.Size = new System.Drawing.Size(290, 561);
+            this.constraintsInput.TabIndex = 2;
+            this.constraintsInput.TextChanged += new System.EventHandler(this.constraintsInput_TextChanged);
+            // 
+            // parseBtn
+            // 
+            this.parseBtn.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.parseBtn.Location = new System.Drawing.Point(3, 590);
+            this.parseBtn.Name = "parseBtn";
+            this.parseBtn.Size = new System.Drawing.Size(290, 23);
+            this.parseBtn.TabIndex = 1;
+            this.parseBtn.Text = "Parse Constraints";
+            this.parseBtn.UseVisualStyleBackColor = true;
+            this.parseBtn.Click += new System.EventHandler(this.parseBtn_Click);
+            // 
+            // label1
+            // 
+            this.infoLabel.AutoSize = true;
+            this.infoLabel.Dock = System.Windows.Forms.DockStyle.Top;
+            this.infoLabel.Image = global::HeuristicLab.Problems.DataAnalysis.Views.Properties.Resources.VS2008ImageLibrary_Annotations_Information;
+            this.infoLabel.Location = new System.Drawing.Point(3, 16);
+            this.infoLabel.Name = "label1";
+            this.infoLabel.Size = new System.Drawing.Size(19, 13);
+            this.infoLabel.TabIndex = 4;
+            this.infoLabel.Text = "    ";
+            this.toolTip.SetToolTip(this.infoLabel, "Double-click to open description.");
+            this.infoLabel.DoubleClick += new System.EventHandler(this.helpButton_DoubleClick);
+            // 
+            // errorOutput
+            // 
+            this.errorOutput.AutoSize = true;
+            this.errorOutput.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.errorOutput.ForeColor = System.Drawing.Color.DarkRed;
+            this.errorOutput.Location = new System.Drawing.Point(3, 613);
+            this.errorOutput.MaximumSize = new System.Drawing.Size(350, 0);
+            this.errorOutput.Name = "errorOutput";
+            this.errorOutput.Size = new System.Drawing.Size(35, 13);
+            this.errorOutput.TabIndex = 3;
+            this.errorOutput.Text = "label2";
+            // 
+            // intervalConstraintsView
+            // 
+            this.shapeConstraintsView.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.shapeConstraintsView.Location = new System.Drawing.Point(0, 0);
+            this.shapeConstraintsView.Name = "intervalConstraintsView";
+            this.shapeConstraintsView.Size = new System.Drawing.Size(588, 629);
+            this.shapeConstraintsView.TabIndex = 2;
+            this.shapeConstraintsView.TabStop = false;
+            // 
+            // ShapeConstraintsView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.splitContainer);
+            this.Name = "ShapeConstraintsView";
+            this.Size = new System.Drawing.Size(888, 629);
+            this.splitContainer.Panel1.ResumeLayout(false);
+            this.splitContainer.Panel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+            this.splitContainer.ResumeLayout(false);
+            this.groupBox.ResumeLayout(false);
+            this.groupBox.PerformLayout();
+            this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Button parseBtn;
+    private HeuristicLab.Core.Views.CheckedItemListView<ShapeConstraint> shapeConstraintsView;
+    private System.Windows.Forms.TextBox constraintsInput;
+    private Label errorOutput;
+    private Label infoLabel;
+    protected ToolTip toolTip;
+    }
+}
Index: trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs
===================================================================
--- trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs	(revision 17902)
+++ trunk/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/ShapeConstraintsView.cs	(revision 17902)
@@ -0,0 +1,177 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 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.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("ShapeConstraints View")]
+  [Content(typeof(ShapeConstraints), true)]
+  public partial class ShapeConstraintsView : AsynchronousContentView {
+    public new ShapeConstraints Content {
+      get => (ShapeConstraints)base.Content;
+      set => base.Content = value;
+    }
+
+    public bool suspendUpdates = false;
+
+    public ShapeConstraintsView() {
+      InitializeComponent();
+      errorOutput.Text = "";
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      this.shapeConstraintsView.Content = Content;
+      UpdateControl();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += constraints_Added;
+      Content.ItemsRemoved += constraint_Removed;
+      Content.Changed += Content_Changed;
+      Content.CollectionReset += constraints_Reset;
+      Content.ItemsMoved += constraints_Moved;
+      Content.ItemsReplaced += Content_ItemsReplaced;
+      Content.CheckedItemsChanged += Content_CheckedItemsChanged;
+    }
+
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= constraints_Added;
+      Content.ItemsRemoved -= constraint_Removed;
+      Content.Changed -= Content_Changed;
+      Content.CollectionReset -= constraints_Reset;
+      Content.ItemsMoved -= constraints_Moved;
+      Content.ItemsReplaced -= Content_ItemsReplaced;
+      Content.CheckedItemsChanged -= Content_CheckedItemsChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      constraintsInput.Enabled = Content != null && !Locked && !ReadOnly;
+    }
+
+
+    private void parseBtn_Click(object sender, EventArgs e) {
+      if (constraintsInput.Text != null) {
+        suspendUpdates = true;
+        Content.Clear();
+        try {
+          var parsedConstraints = ShapeConstraintsParser.ParseConstraints(constraintsInput.Text);
+          Content.AddRange(parsedConstraints);
+          errorOutput.Text = "Constraints successfully parsed.";
+          errorOutput.ForeColor = Color.DarkGreen;
+        } catch (ArgumentException ex) {
+          errorOutput.Text = ex.Message.Replace("Parameter name", "@Line");
+          errorOutput.ForeColor = Color.DarkRed;
+        } finally {
+          suspendUpdates = false;
+        }
+      } else {
+        errorOutput.Text = "No constraints were found!";
+      }
+    }
+
+    private void UpdateControl() {
+      if (suspendUpdates) return;
+      if (Content == null) {
+        constraintsInput.Text = string.Empty;
+      } else {
+        var newText = ToString(Content);
+        if (newText != constraintsInput.Text)
+          constraintsInput.Text = newText;
+      }
+    }
+
+    private string ToString(ShapeConstraints constraints) {
+      var sb = new StringBuilder();
+      foreach (var constraint in constraints) {
+        if (!constraints.ItemChecked(constraint)) {
+          sb.Append("# ").AppendLine(constraint.ToString());
+        } else {
+          sb.AppendLine(constraint.ToString());
+        }
+      }
+      return sb.ToString();
+    }
+
+    private void constraint_Changed(object sender, EventArgs e) {
+      UpdateControl();
+    }
+
+    private void constraints_Added(object sender,
+                                     CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      foreach (var addedItem in e.Items) addedItem.Value.Changed += constraint_Changed;
+      UpdateControl();
+    }
+
+    private void constraint_Removed(object sender, CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      foreach (var removedItem in e.Items) removedItem.Value.Changed -= constraint_Changed;
+      UpdateControl();
+    }
+
+    private void constraints_Moved(object sender, CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      UpdateControl();
+    }
+
+    private void constraints_Reset(object sender, CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      foreach (var addedItem in e.Items) addedItem.Value.Changed += constraint_Changed;
+      foreach (var removedItem in e.OldItems) removedItem.Value.Changed -= constraint_Changed;
+      UpdateControl();
+    }
+
+    private void Content_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      UpdateControl();
+    }
+
+    private void Content_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<ShapeConstraint>> e) {
+      foreach (var addedItem in e.Items) addedItem.Value.Changed += constraint_Changed;
+      foreach (var removedItem in e.OldItems) removedItem.Value.Changed -= constraint_Changed;
+      UpdateControl();
+    }
+
+    private void constraintsInput_TextChanged(object sender, EventArgs e) {
+      errorOutput.Text = "Unparsed changes! Press parse button to save changes.";
+      errorOutput.ForeColor = Color.DarkOrange;
+    }
+
+    private void Content_Changed(object sender, EventArgs e) {
+      UpdateControl();
+    }
+
+    private void helpButton_DoubleClick(object sender, EventArgs e) {
+      using (InfoBox dialog = new InfoBox("Help for shape constraints",
+        "HeuristicLab.Problems.DataAnalysis.Views.Resources.shapeConstraintsHelp.rtf",
+        this)) {
+        dialog.ShowDialog(this);
+      }
+    }
+  }
+}
