Index: trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj
===================================================================
--- trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj	(revision 1186)
+++ trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj	(revision 1187)
@@ -83,6 +83,13 @@
     <Compile Include="DefaultLabelProvider.cs" />
     <Compile Include="Grid.cs" />
+    <Compile Include="HorizontalLineShape.cs" />
     <Compile Include="ILabelProvider.cs" />
     <Compile Include="IMouseEventListener.cs" />
+    <Compile Include="OptionsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="OptionsDialog.Designer.cs">
+      <DependentUpon>OptionsDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="PanListener.cs" />
     <Compile Include="TextShape.cs" />
@@ -138,4 +145,7 @@
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="OptionsDialog.resx">
+      <DependentUpon>OptionsDialog.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: trunk/sources/HeuristicLab.Visualization/HorizontalLineShape.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/HorizontalLineShape.cs	(revision 1187)
+++ trunk/sources/HeuristicLab.Visualization/HorizontalLineShape.cs	(revision 1187)
@@ -0,0 +1,55 @@
+﻿using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace HeuristicLab.Visualization {
+  public class MinMaxLineShape : WorldShape {
+    private LineShape minLineShape;
+    private LineShape maxLineShape;
+
+    /// <summary>
+    /// Initializes the HorizontalLineShape.
+    /// </summary>
+    /// <param name="z">Z-order</param>
+    /// <param name="color">color for the LineShape</param>
+    /// <param name="yMin">y value for lower line</param>
+    /// <param name="yMax">y value for upper line</param>
+    /// <param name="thickness">line thickness</param>
+    /// <param name="style">line style</param>
+    public MinMaxLineShape(double yMin, double yMax, double z, Color color, int thickness, DrawingStyle style) {
+      minLineShape = new LineShape(0, yMin, 1, yMin, z, color, thickness, style);
+      maxLineShape = new LineShape(0, yMax, 1, yMax, z, color, thickness, style);
+      shapes.Add(minLineShape);
+      shapes.Add(maxLineShape);
+    }
+
+
+    /// <summary>
+    /// Draws the HorizontalLineShape.
+    /// </summary>
+    /// <param name="graphics">graphics handle to draw to</param>
+    /// <param name="viewport">rectangle in value-coordinates to display</param>
+    /// <param name="clippingArea">rectangle in screen-coordinates to draw</param>
+    public override void Draw(Graphics graphics, Rectangle viewport, RectangleD clippingArea) {
+      minLineShape.X1 = ClippingArea.X1;
+      minLineShape.X2 = ClippingArea.X2;
+      maxLineShape.X1 = ClippingArea.X1;
+      maxLineShape.X2 = ClippingArea.X2;
+      base.Draw(graphics, viewport, clippingArea);
+    }
+
+
+    public double YMin {
+      set {
+        minLineShape.Y1 = value;
+        minLineShape.Y2 = value;
+      }
+    }
+
+    public double YMax {
+      set {
+        maxLineShape.Y1 = value;
+        maxLineShape.Y2 = value;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Visualization/LineChart.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/LineChart.Designer.cs	(revision 1186)
+++ trunk/sources/HeuristicLab.Visualization/LineChart.Designer.cs	(revision 1187)
@@ -31,5 +31,9 @@
         private void InitializeComponent()
         {
+          this.components = new System.ComponentModel.Container();
           this.canvas = new HeuristicLab.Visualization.CanvasUI();
+          this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+          this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+          this.contextMenuStrip1.SuspendLayout();
           this.SuspendLayout();
           // 
@@ -43,7 +47,23 @@
           this.canvas.TabIndex = 0;
           this.canvas.Text = "canvas";
+          this.canvas.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.canvasUI1_MouseWheel);
+          this.canvas.ContextMenuStripChanged += new System.EventHandler(this.optionsToolStripMenuItem_Click);
           this.canvas.MouseDown += new System.Windows.Forms.MouseEventHandler(this.canvasUI1_MouseDown);
-          this.canvas.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.canvasUI1_MouseWheel);
           this.canvas.KeyDown += new System.Windows.Forms.KeyEventHandler(this.canvasUI1_KeyDown);
+          // 
+          // contextMenuStrip1
+          // 
+          this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.optionsToolStripMenuItem});
+          this.contextMenuStrip1.Name = "contextMenuStrip1";
+          this.contextMenuStrip1.Size = new System.Drawing.Size(112, 26);
+
+          // 
+          // optionsToolStripMenuItem
+          // 
+          this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
+          this.optionsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+          this.optionsToolStripMenuItem.Text = "Options";
+          this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click);
           // 
           // LineChart
@@ -54,4 +74,5 @@
           this.Name = "LineChart";
           this.Size = new System.Drawing.Size(552, 390);
+          this.contextMenuStrip1.ResumeLayout(false);
           this.ResumeLayout(false);
 
@@ -61,4 +82,6 @@
 
         private CanvasUI canvas;
+        private ContextMenuStrip contextMenuStrip1;
+        private ToolStripMenuItem optionsToolStripMenuItem;
     }
 }
Index: trunk/sources/HeuristicLab.Visualization/LineChart.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 1186)
+++ trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 1187)
@@ -2,11 +2,12 @@
 using System.Collections.Generic;
 using System.Drawing;
+using System.Drawing.Drawing2D;
 using System.Windows.Forms;
 using HeuristicLab.Core;
 
 namespace HeuristicLab.Visualization {
-  public class LinesShape : WorldShape { }
-
   public partial class LineChart : ViewBase {
+    internal class LinesShape : WorldShape {}
+
     private readonly IChartDataRowsModel model;
     private int maxDataRowCount;
@@ -14,4 +15,7 @@
     private double minDataValue;
     private double maxDataValue;
+    private bool minMaxLineEnabled;
+    private MinMaxLineShape minMaxLineShape;
+    private IShape minLineShape;
 
     private readonly WorldShape root;
@@ -45,4 +49,5 @@
 
       grid = new Grid();
+      minMaxLineEnabled = true;
       root.AddShape(grid);
 
@@ -65,18 +70,17 @@
       root.AddShape(titleShape);
 
-
+      minMaxLineShape = new MinMaxLineShape(this.minDataValue, this.maxDataValue, 0, Color.Yellow, 4, DrawingStyle.Solid);
+      root.AddShape(minMaxLineShape);
       canvas.MainCanvas.WorldShape = root;
       canvas.Resize += delegate { UpdateLayout(); };
 
       UpdateLayout();
-
+      maxDataRowCount = 0;
       this.model = model;
       Item = model;
 
-      maxDataRowCount = 0;
+
       //The whole data rows are shown per default
-      zoomFullView = true;
-      minDataValue = Double.PositiveInfinity;
-      maxDataValue = Double.NegativeInfinity;
+      ResetView();
     }
 
@@ -97,6 +101,8 @@
                                               canvas.Width,
                                               canvas.Height);
-      
+
       grid.BoundingBox = linesShape.BoundingBox;
+
+      minMaxLineShape.BoundingBox = linesShape.BoundingBox;
 
       yAxis.BoundingBox = new RectangleD(0,
@@ -173,6 +179,8 @@
     private void SetLineClippingArea(RectangleD clippingArea) {
       linesShape.ClippingArea = clippingArea;
-      
+
       grid.ClippingArea = linesShape.ClippingArea;
+
+      minMaxLineShape.ClippingArea = linesShape.ClippingArea;
 
       xAxis.ClippingArea = new RectangleD(linesShape.ClippingArea.X1,
@@ -180,5 +188,5 @@
                                           linesShape.ClippingArea.X2,
                                           xAxis.BoundingBox.Y2);
-      
+
       yAxis.ClippingArea = new RectangleD(yAxis.BoundingBox.X1,
                                           linesShape.ClippingArea.Y1,
@@ -189,4 +197,8 @@
     private void InitLineShapes(IDataRow row) {
       List<LineShape> lineShapes = new List<LineShape>();
+      if (rowToLineShapes.Count == 0) {
+        minDataValue = Double.PositiveInfinity;
+        maxDataValue = Double.NegativeInfinity;
+      }
       if (row.Count > 0) {
         maxDataValue = Math.Max(row[0], maxDataValue);
@@ -201,5 +213,6 @@
         minDataValue = Math.Min(row[i], minDataValue);
       }
-
+      minMaxLineShape.YMax = maxDataValue;
+      minMaxLineShape.YMin = minDataValue;
       rowToLineShapes[row] = lineShapes;
       ZoomToFullView();
@@ -213,5 +226,6 @@
     }
 
-    private readonly IDictionary<IDataRow, List<LineShape>> rowToLineShapes = new Dictionary<IDataRow, List<LineShape>>();
+    private readonly IDictionary<IDataRow, List<LineShape>> rowToLineShapes =
+      new Dictionary<IDataRow, List<LineShape>>();
 
     // TODO use action parameter
@@ -220,5 +234,6 @@
       maxDataValue = Math.Max(value, maxDataValue);
       minDataValue = Math.Min(value, minDataValue);
-
+      minMaxLineShape.YMax = maxDataValue;
+      minMaxLineShape.YMin = minDataValue;
       if (index > lineShapes.Count + 1) {
         throw new NotImplementedException();
@@ -230,5 +245,6 @@
           maxDataRowCount = row.Count;
         }
-        LineShape lineShape = new LineShape(index - 1, row[index - 1], index, row[index], 0, row.Color, row.Thickness, row.Style);
+        LineShape lineShape = new LineShape(index - 1, row[index - 1], index, row[index], 0, row.Color, row.Thickness,
+                                            row.Style);
         lineShapes.Add(lineShape);
         // TODO each DataRow needs its own WorldShape so Y Axes can be zoomed independently.
@@ -249,4 +265,10 @@
       canvas.Invalidate();
     }
+
+
+    public IList<IDataRow> GetRows() {
+      return model.Rows;
+    }
+
 
     // TODO use action parameter
@@ -293,9 +315,9 @@
 
     private void canvasUI1_KeyDown(object sender, KeyEventArgs e) {
-      if(e.KeyCode == Keys.Back && historyStack.Count > 1) {
+      if (e.KeyCode == Keys.Back && historyStack.Count > 1) {
         historyStack.Pop();
 
         RectangleD clippingArea = historyStack.Peek();
-  
+
         SetNewClippingArea(clippingArea);
         canvas.Invalidate();
@@ -305,9 +327,19 @@
     private void canvasUI1_MouseDown(object sender, MouseEventArgs e) {
       Focus();
-
-      if (ModifierKeys == Keys.Control) {
-        CreateZoomListener(e);
-      } else {
-        CreatePanListener(e);
+      if (e.Button == System.Windows.Forms.MouseButtons.Right) {
+        if (this.ParentForm != null)
+          this.contextMenuStrip1.Show(e.Location.X + this.ParentForm.Location.X,
+                                      e.Location.Y + this.ParentForm.Location.Y + 50);
+        else {
+          this.contextMenuStrip1.Show(e.Location.X, e.Location.Y);
+        }
+      }
+      else {
+        if (ModifierKeys == Keys.Control) {
+          CreateZoomListener(e);
+        }
+        else {
+          CreatePanListener(e);
+        }
       }
     }
@@ -362,7 +394,7 @@
       panListener.SetNewClippingArea += SetNewClippingArea;
       panListener.OnMouseUp += delegate {
-        historyStack.Push(linesShape.ClippingArea);
-        canvas.MouseEventListener = null;
-      };
+                                 historyStack.Push(linesShape.ClippingArea);
+                                 canvas.MouseEventListener = null;
+                               };
 
       canvas.MouseEventListener = panListener;
@@ -377,4 +409,23 @@
 
     #endregion
+
+    private void optionsToolStripMenuItem_Click(object sender, EventArgs e) {
+      var optionsdlg = new OptionsDialog(this);
+      optionsdlg.Show();
+    }
+
+    public void ApplyChangesToRow(IDataRow row) {
+      foreach (var ls in rowToLineShapes[row]) {
+        ls.LSColor = row.Color;
+        ls.LSThickness = row.Thickness;
+        if (row.Style == DrawingStyle.Dashed) {
+          ls.LSDashStyle = DashStyle.Dash;
+        }
+        else {
+          ls.LSDashStyle = DashStyle.Solid; //default
+        }
+      }
+      canvas.Invalidate();
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Visualization/LineChart.resx
===================================================================
--- trunk/sources/HeuristicLab.Visualization/LineChart.resx	(revision 1186)
+++ trunk/sources/HeuristicLab.Visualization/LineChart.resx	(revision 1187)
@@ -118,3 +118,6 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
 </root>
Index: trunk/sources/HeuristicLab.Visualization/LineShape.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/LineShape.cs	(revision 1186)
+++ trunk/sources/HeuristicLab.Visualization/LineShape.cs	(revision 1187)
@@ -21,11 +21,11 @@
       this.boundingBox = new RectangleD(x1, y1, x2, y2);
       this.z = z;
-      this.color = color;
-      this.thickness = thickness;
+      this.LSColor = color;
+      this.LSThickness = thickness;
       if (style==DrawingStyle.Dashed) {
-        this.dashStyle = DashStyle.Dash;
+        this.LSDashStyle = DashStyle.Dash;
       }
       else {
-        this.dashStyle = DashStyle.Solid;        //default
+        this.LSDashStyle = DashStyle.Solid;        //default
       }
     }
@@ -62,6 +62,6 @@
     /// <param name="clippingArea">rectangle in screen-coordinates to draw</param>
     public void Draw(Graphics graphics, Rectangle viewport, RectangleD clippingArea) {
-      using (Pen pen = new Pen(color, thickness)){
-        pen.DashStyle = this.dashStyle;
+      using (Pen pen = new Pen(LSColor, LSThickness)){
+        pen.DashStyle = this.LSDashStyle;
         Rectangle screenRect = Transform.ToScreen(boundingBox, viewport, clippingArea);
         graphics.DrawLine(pen,screenRect.Left, screenRect.Bottom, screenRect.Right, screenRect.Top);
@@ -73,4 +73,19 @@
       set { z = value; }
     }
+
+    public Color LSColor {
+      get { return color; }
+      set { color = value; }
+    }
+
+    public int LSThickness {
+      get { return thickness; }
+      set { thickness = value; }
+    }
+
+    public DashStyle LSDashStyle {
+      get { return dashStyle; }
+      set { dashStyle = value; }
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Visualization/OptionsDialog.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/OptionsDialog.Designer.cs	(revision 1187)
+++ trunk/sources/HeuristicLab.Visualization/OptionsDialog.Designer.cs	(revision 1187)
@@ -0,0 +1,234 @@
+﻿namespace HeuristicLab.Visualization {
+  partial class OptionsDialog {
+    /// <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.Optionstabs = new System.Windows.Forms.TabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.label4 = new System.Windows.Forms.Label();
+      this.OptionsDialogSelectColorBt = new System.Windows.Forms.Button();
+      this.ColorPreviewTB = new System.Windows.Forms.TextBox();
+      this.label3 = new System.Windows.Forms.Label();
+      this.LineThicknessCB = new System.Windows.Forms.ComboBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.LinestyleCB = new System.Windows.Forms.ComboBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.LineSelectCB = new System.Windows.Forms.ComboBox();
+      this.tabPage2 = new System.Windows.Forms.TabPage();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.OptionsDialogCancelButton = new System.Windows.Forms.Button();
+      this.OptionsDialogOkButton = new System.Windows.Forms.Button();
+      this.Optionstabs.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // Optionstabs
+      // 
+      this.Optionstabs.Controls.Add(this.tabPage1);
+      this.Optionstabs.Controls.Add(this.tabPage2);
+      this.Optionstabs.Location = new System.Drawing.Point(0, 1);
+      this.Optionstabs.Name = "Optionstabs";
+      this.Optionstabs.SelectedIndex = 0;
+      this.Optionstabs.Size = new System.Drawing.Size(292, 225);
+      this.Optionstabs.TabIndex = 0;
+      // 
+      // tabPage1
+      // 
+      this.tabPage1.Controls.Add(this.OptionsDialogSelectColorBt);
+      this.tabPage1.Controls.Add(this.ColorPreviewTB);
+      this.tabPage1.Controls.Add(this.label2);
+      this.tabPage1.Controls.Add(this.LinestyleCB);
+      this.tabPage1.Controls.Add(this.label1);
+      this.tabPage1.Controls.Add(this.LineSelectCB);
+      this.tabPage1.Controls.Add(this.groupBox1);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(284, 199);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "Linestyle";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(33, 77);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(31, 13);
+      this.label4.TabIndex = 8;
+      this.label4.Text = "Color";
+      // 
+      // OptionsDialogSelectColorBt
+      // 
+      this.OptionsDialogSelectColorBt.Location = new System.Drawing.Point(217, 126);
+      this.OptionsDialogSelectColorBt.Name = "OptionsDialogSelectColorBt";
+      this.OptionsDialogSelectColorBt.Size = new System.Drawing.Size(50, 23);
+      this.OptionsDialogSelectColorBt.TabIndex = 7;
+      this.OptionsDialogSelectColorBt.Text = "Select";
+      this.OptionsDialogSelectColorBt.UseVisualStyleBackColor = true;
+      this.OptionsDialogSelectColorBt.Click += new System.EventHandler(this.button1_Click);
+      // 
+      // ColorPreviewTB
+      // 
+      this.ColorPreviewTB.Location = new System.Drawing.Point(146, 127);
+      this.ColorPreviewTB.Name = "ColorPreviewTB";
+      this.ColorPreviewTB.ReadOnly = true;
+      this.ColorPreviewTB.Size = new System.Drawing.Size(64, 20);
+      this.ColorPreviewTB.TabIndex = 6;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(32, 52);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(56, 13);
+      this.label3.TabIndex = 5;
+      this.label3.Text = "Thickness";
+      // 
+      // LineThicknessCB
+      // 
+      this.LineThicknessCB.FormattingEnabled = true;
+      this.LineThicknessCB.Location = new System.Drawing.Point(142, 46);
+      this.LineThicknessCB.Name = "LineThicknessCB";
+      this.LineThicknessCB.Size = new System.Drawing.Size(121, 21);
+      this.LineThicknessCB.TabIndex = 4;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(36, 80);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(30, 13);
+      this.label2.TabIndex = 3;
+      this.label2.Text = "Style";
+      // 
+      // LinestyleCB
+      // 
+      this.LinestyleCB.FormattingEnabled = true;
+      this.LinestyleCB.Location = new System.Drawing.Point(146, 73);
+      this.LinestyleCB.Name = "LinestyleCB";
+      this.LinestyleCB.Size = new System.Drawing.Size(121, 21);
+      this.LinestyleCB.TabIndex = 2;
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(7, 37);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(72, 13);
+      this.label1.TabIndex = 1;
+      this.label1.Text = "Selected Line";
+      // 
+      // LineSelectCB
+      // 
+      this.LineSelectCB.FormattingEnabled = true;
+      this.LineSelectCB.Location = new System.Drawing.Point(146, 30);
+      this.LineSelectCB.Name = "LineSelectCB";
+      this.LineSelectCB.Size = new System.Drawing.Size(121, 21);
+      this.LineSelectCB.TabIndex = 0;
+      this.LineSelectCB.SelectedIndexChanged += new System.EventHandler(this.LineSelectCB_SelectedIndexChanged);
+      // 
+      // tabPage2
+      // 
+      this.tabPage2.Location = new System.Drawing.Point(4, 22);
+      this.tabPage2.Name = "tabPage2";
+      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage2.Size = new System.Drawing.Size(284, 241);
+      this.tabPage2.TabIndex = 1;
+      this.tabPage2.Text = "tbd";
+      this.tabPage2.UseVisualStyleBackColor = true;
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.label4);
+      this.groupBox1.Controls.Add(this.LineThicknessCB);
+      this.groupBox1.Controls.Add(this.label3);
+      this.groupBox1.Location = new System.Drawing.Point(4, 54);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(274, 129);
+      this.groupBox1.TabIndex = 9;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "Details";
+      // 
+      // OptionsDialogCancelButton
+      // 
+      this.OptionsDialogCancelButton.Location = new System.Drawing.Point(133, 232);
+      this.OptionsDialogCancelButton.Name = "OptionsDialogCancelButton";
+      this.OptionsDialogCancelButton.Size = new System.Drawing.Size(75, 23);
+      this.OptionsDialogCancelButton.TabIndex = 1;
+      this.OptionsDialogCancelButton.Text = "Cancel";
+      this.OptionsDialogCancelButton.UseVisualStyleBackColor = true;
+      this.OptionsDialogCancelButton.Click += new System.EventHandler(this.OptionsDialogCancelButton_Click);
+      // 
+      // OptionsDialogOkButton
+      // 
+      this.OptionsDialogOkButton.Location = new System.Drawing.Point(213, 232);
+      this.OptionsDialogOkButton.Name = "OptionsDialogOkButton";
+      this.OptionsDialogOkButton.Size = new System.Drawing.Size(75, 23);
+      this.OptionsDialogOkButton.TabIndex = 2;
+      this.OptionsDialogOkButton.Text = "OK";
+      this.OptionsDialogOkButton.UseVisualStyleBackColor = true;
+      this.OptionsDialogOkButton.Click += new System.EventHandler(this.OptionsDialogOkButton_Click);
+      // 
+      // OptionsDialog
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(292, 266);
+      this.Controls.Add(this.OptionsDialogOkButton);
+      this.Controls.Add(this.OptionsDialogCancelButton);
+      this.Controls.Add(this.Optionstabs);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.MaximizeBox = false;
+      this.Name = "OptionsDialog";
+      this.Text = "OptionsDialog";
+      this.Load += new System.EventHandler(this.OptionsDialog_Load);
+      this.Optionstabs.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage1.PerformLayout();
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl Optionstabs;
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.TabPage tabPage2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox LineSelectCB;
+    private System.Windows.Forms.Button OptionsDialogSelectColorBt;
+    private System.Windows.Forms.TextBox ColorPreviewTB;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.ComboBox LineThicknessCB;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.ComboBox LinestyleCB;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.Button OptionsDialogCancelButton;
+    private System.Windows.Forms.Button OptionsDialogOkButton;
+  }
+}
Index: trunk/sources/HeuristicLab.Visualization/OptionsDialog.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/OptionsDialog.cs	(revision 1187)
+++ trunk/sources/HeuristicLab.Visualization/OptionsDialog.cs	(revision 1187)
@@ -0,0 +1,64 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Visualization {
+  public partial class OptionsDialog : Form {
+    private LineChart lc;
+
+    public OptionsDialog(LineChart lc) {
+      InitializeComponent();
+      this.lc = lc;
+    }
+
+
+    private void button1_Click(object sender, EventArgs e) {
+      var dlg = new ColorDialog();
+      dlg.ShowDialog();
+      this.ColorPreviewTB.BackColor = dlg.Color;
+    }
+
+    public IList<int> GetThicknesses() {
+      return new List<int>() {0, 1, 2, 3, 4, 5, 6, 7, 8};
+    }
+
+    public IList<DrawingStyle> GetStyles() {
+      return new List<DrawingStyle>() {DrawingStyle.Solid, DrawingStyle.Dashed};
+    }
+
+    private void OptionsDialog_Load(object sender, EventArgs e) {
+      this.LineSelectCB.DataSource = lc.GetRows();
+      this.LineSelectCB.DisplayMember = "Label";
+
+      LineThicknessCB.DataSource = GetThicknesses();
+      LinestyleCB.DataSource = GetStyles();
+      LineSelectCB.SelectedIndex = 0;
+      LineSelectCB_SelectedIndexChanged(this, null);
+    }
+
+    private void LineSelectCB_SelectedIndexChanged(object sender, EventArgs e) {
+      int index = this.LineThicknessCB.FindStringExact(((IDataRow) this.LineSelectCB.SelectedValue).Thickness.ToString());
+      this.LineThicknessCB.SelectedIndex = index;
+      index = this.LinestyleCB.FindStringExact(((IDataRow) this.LineSelectCB.SelectedValue).Style.ToString());
+      LinestyleCB.SelectedIndex = index;
+      this.ColorPreviewTB.BackColor = ((IDataRow) this.LineSelectCB.SelectedValue).Color;
+    }
+
+    private void OptionsDialogCancelButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+
+    private void OptionsDialogOkButton_Click(object sender, EventArgs e) {
+      ((IDataRow) this.LineSelectCB.SelectedValue).Thickness = (int) this.LineThicknessCB.SelectedItem;
+      ((IDataRow) this.LineSelectCB.SelectedValue).Color = this.ColorPreviewTB.BackColor;
+      ((IDataRow) this.LineSelectCB.SelectedValue).Style = (DrawingStyle) this.LineThicknessCB.SelectedItem;
+      this.lc.ApplyChangesToRow((IDataRow) this.LineSelectCB.SelectedValue);
+      this.Close();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Visualization/OptionsDialog.resx
===================================================================
--- trunk/sources/HeuristicLab.Visualization/OptionsDialog.resx	(revision 1187)
+++ trunk/sources/HeuristicLab.Visualization/OptionsDialog.resx	(revision 1187)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
