Index: /trunk/sources/HeuristicLab.Visualization/3.2/CompositeShape.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/CompositeShape.cs	(revision 1882)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/CompositeShape.cs	(revision 1883)
@@ -58,4 +58,9 @@
     }
 
+
+    /// <summary>
+    /// Adds a shape to the container
+    /// </summary>
+    /// <param name="shape"> the Shape to add</param>
     public void AddShape(IShape shape) {
       shape.Parent = this;
@@ -71,4 +76,27 @@
       shapes.Add(shape);
     }
+
+    /// <summary>
+    /// Recalculate the bounding box
+    /// </summary>
+    private void InitBoundingBox() {
+      if (shapes.Count > 0) 
+        boundingBox = shapes[0].BoundingBox;
+      foreach (var shape in shapes) {
+        boundingBox = new RectangleD(Math.Min(boundingBox.X1, shape.BoundingBox.X1),
+                                    Math.Min(boundingBox.Y1, shape.BoundingBox.Y1),
+                                    Math.Max(boundingBox.X2, shape.BoundingBox.X2),
+                                    Math.Max(boundingBox.Y2, shape.BoundingBox.Y2));
+      }
+    }
+
+    /// <summary>
+    /// Removes a Shape from the container and reinitializes the bounding box
+    /// </summary>
+    /// <param name="shape">the Shape to remove</param>
+    public void RemoveShape(IShape shape) {
+      shapes.Remove(shape);
+      InitBoundingBox();
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj	(revision 1882)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj	(revision 1883)
@@ -161,4 +161,5 @@
     <Compile Include="RectangleShape.cs" />
     <Compile Include="SizeD.cs" />
+    <Compile Include="TooltipListener.cs" />
     <Compile Include="Transform.cs" />
     <Compile Include="Translate.cs" />
Index: /trunk/sources/HeuristicLab.Visualization/3.2/IDataRow.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/IDataRow.cs	(revision 1882)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/IDataRow.cs	(revision 1883)
@@ -3,5 +3,6 @@
 namespace HeuristicLab.Visualization {
   public enum DataRowType {
-    Normal, SingleValue
+    Normal, SingleValue,
+    Points
   }
 
Index: /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs	(revision 1882)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs	(revision 1883)
@@ -31,4 +31,7 @@
     private const int YAxisWidth = 100;
     private const int XAxisHeight = 40;
+    private readonly TooltipListener toolTipListener;
+    private readonly ToolTip valueToolTip;
+    private Point currentMousePos;
 
     /// <summary>
@@ -55,4 +58,10 @@
 
       Item = model;
+
+      valueToolTip = new ToolTip();
+      toolTipListener = new TooltipListener();
+      toolTipListener.ShowToolTip += ShowToolTip;
+      mouseEventListener = toolTipListener;
+      currentMousePos = new Point(0, 0);
 
       this.ResizeRedraw = true;
@@ -137,5 +146,4 @@
       canvas.AddShape(titleShape);
       canvas.AddShape(legendShape);
-
       canvas.AddShape(userInteractionShape);
 
@@ -160,5 +168,5 @@
 
       int yAxisLeft = 0;
-      int yAxisRight = (int)linesAreaBoundingBox.X2;
+      int yAxisRight = (int) linesAreaBoundingBox.X2;
 
       foreach (YAxisDescriptor yAxisDescriptor in model.YAxes) {
@@ -187,5 +195,6 @@
 
       userInteractionShape.BoundingBox = linesAreaBoundingBox;
-      userInteractionShape.ClippingArea = new RectangleD(0, 0, userInteractionShape.BoundingBox.Width, userInteractionShape.BoundingBox.Height);
+      userInteractionShape.ClippingArea = new RectangleD(0, 0, userInteractionShape.BoundingBox.Width,
+                                                         userInteractionShape.BoundingBox.Height);
 
       xAxis.BoundingBox = new RectangleD(linesAreaBoundingBox.X1,
@@ -199,4 +208,9 @@
     private readonly Dictionary<YAxisDescriptor, YAxisInfo> yAxisInfos = new Dictionary<YAxisDescriptor, YAxisInfo>();
 
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="yAxisDescriptor"></param>
+    /// <returns></returns>
     private YAxisInfo GetYAxisInfo(YAxisDescriptor yAxisDescriptor) {
       YAxisInfo info;
@@ -209,4 +223,7 @@
       return info;
     }
+
+
+    #region Legend-specific
 
     /// <summary>
@@ -235,5 +252,6 @@
     public void setLegendRight() {
       // legend right
-      legendShape.BoundingBox = new RectangleD(canvasUI.Width - legendShape.GetMaxLabelLength(), 10, canvasUI.Width, canvasUI.Height - 50);
+      legendShape.BoundingBox = new RectangleD(canvasUI.Width - legendShape.GetMaxLabelLength(), 10, canvasUI.Width,
+                                               canvasUI.Height - 50);
       legendShape.ClippingArea = new RectangleD(0, 0, legendShape.BoundingBox.Width, legendShape.BoundingBox.Height);
       legendShape.Row = false;
@@ -253,5 +271,6 @@
     public void setLegendTop() {
       // legend top
-      legendShape.BoundingBox = new RectangleD(100, canvasUI.Height - canvasUI.Height, canvasUI.Width, canvasUI.Height - 10);
+      legendShape.BoundingBox = new RectangleD(100, canvasUI.Height - canvasUI.Height, canvasUI.Width,
+                                               canvasUI.Height - 10);
       legendShape.ClippingArea = new RectangleD(0, 0, legendShape.BoundingBox.Width, legendShape.BoundingBox.Height);
       legendShape.Row = true;
@@ -269,7 +288,34 @@
     }
 
+    #endregion
+
+    /// <summary>
+    /// Shows the Tooltip with the real values of a datapoint, if the mousepoint is near to one
+    /// </summary>
+    /// <param name="location"></param>
+    private void ShowToolTip(Point location) {
+      valueToolTip.Hide(this);
+      if (rowEntries.Count > 0) {
+        double dx = Transform.ToWorldX(location.X, this.rowEntries[0].LinesShape.Viewport,
+                                       this.rowEntries[0].LinesShape.ClippingArea);
+        int ix = (int) Math.Round(dx);
+        foreach (var rowEntry in rowEntries) {
+          if ((rowEntry.DataRow.Count > ix) && (ix > 0) && ((rowEntry.DataRow.LineType == DataRowType.Normal)||(rowEntry.DataRow.LineType==DataRowType.Points))) {
+            Point screenDataP = Transform.ToScreen(new PointD(ix, rowEntry.DataRow[ix]), rowEntry.LinesShape.Viewport,
+                                                   rowEntry.LinesShape.ClippingArea);
+            if ((Math.Abs(screenDataP.X - location.X) <= 6) && (Math.Abs(screenDataP.Y - location.Y) <= 6)) {
+              valueToolTip.Show(("\t x:" + ix + " y:" + rowEntry.DataRow[ix]), this, screenDataP.X, screenDataP.Y);
+            }
+          }
+        }
+      }
+    }
+
+
+
     private void optionsToolStripMenuItem_Click(object sender, EventArgs e) {
       OptionsDialog optionsdlg = new OptionsDialog(model);
       optionsdlg.Show();
+      mouseEventListener = toolTipListener;
     }
 
@@ -408,4 +454,8 @@
     }
 
+    /// <summary>
+    /// Creates the shapes for the data of the given row and stores them.
+    /// </summary>
+    /// <param name="row">Datarow, whose data items should be converted to shapes</param>
     private void InitLineShapes(IDataRow row) {
       RowEntry rowEntry = new RowEntry(row);
@@ -419,5 +469,9 @@
           rowEntry.LinesShape.AddShape(lineShape);
         }
-      } else {
+      } else if (row.LineType == DataRowType.Points) {
+        rowEntry.showMarkers(true);      //no lines, only markers are shown!!
+        for (int i = 0; i < row.Count; i++)
+          rowEntry.LinesShape.AddMarkerShape(new MarkerShape(i , row[i], 8, row.Color));
+      } else if (row.LineType == DataRowType.Normal) {
         rowEntry.showMarkers(row.ShowMarkers);
         for (int i = 1; i < row.Count; i++) {
@@ -434,4 +488,11 @@
     }
 
+    /// <summary>
+    /// Handles the event, when a value of a datarow was changed
+    /// </summary>
+    /// <param name="row">row in which the data was changed</param>
+    /// <param name="value">new value of the data point</param>
+    /// <param name="index">index in the datarow of the changed datapoint</param>
+    /// <param name="action">the performed action (added, modified, deleted)</param>
     private void OnRowValueChanged(IDataRow row, double value, int index, Action action) {
       RowEntry rowEntry = rowToRowEntry[row];
@@ -442,17 +503,15 @@
                                                         row.Style);
           rowEntry.LinesShape.AddShape(lineShape);
-        } else {
+        } else if(action==Action.Deleted) {
+          throw new ArgumentException("It is unwise to delete the only value of the SinglevalueRow!!");
+        }else if(action ==Action.Modified){
           LineShape lineShape = rowEntry.LinesShape.GetShape(0);
           lineShape.Y1 = value;
           lineShape.Y2 = value;
         }
-      } else {
-        if (index > rowEntry.LinesShape.Count + 1) {
-          //MarkersShape is on position zero
-          throw new NotImplementedException();
-        }
-
+      } else if (row.LineType == DataRowType.Points) {
         if (action == Action.Added) {
-          // new value was added
+          if(rowEntry.LinesShape.Count==0)
+            rowEntry.LinesShape.AddMarkerShape(new MarkerShape(0, row[0], 8, row.Color));
           if (index > 0 && index == rowEntry.LinesShape.Count + 1) {
             LineShape lineShape = new LineShape(index - 1, row[index - 1], index, row[index], row.Color, row.Thickness,
@@ -460,4 +519,6 @@
             rowEntry.LinesShape.AddShape(lineShape);
             rowEntry.LinesShape.AddMarkerShape(new MarkerShape(index, row[index], 8, row.Color));
+          } else {
+            throw new ArgumentException("Adding a value is only possible at the end of a row!");
           }
         } else if (action == Action.Modified) {
@@ -465,12 +526,51 @@
           if (index > 0) {
             rowEntry.LinesShape.GetShape(index - 1).Y2 = value;
-            ((MarkerShape)rowEntry.LinesShape.markersShape.GetShape(index - 1)).Y = value;
+            ((MarkerShape) rowEntry.LinesShape.markersShape.GetShape(index - 1)).Y = value;
           }
 
           // not the last value
-          if (index > 0 && index < row.Count - 1) {
+          if (index < row.Count - 1) {
             rowEntry.LinesShape.GetShape(index).Y1 = value;
-            ((MarkerShape)rowEntry.LinesShape.markersShape.GetShape(index)).Y = value;
-          }
+            ((MarkerShape) rowEntry.LinesShape.markersShape.GetShape(index)).Y = value;
+          }
+        } else if(action == Action.Deleted) {
+          if (index == row.Count - 1)
+            rowEntry.LinesShape.RemoveMarkerShape(rowEntry.LinesShape.markersShape.GetShape(index));
+          else
+            throw new NotSupportedException("Deleting of values other than the last one is not supported!");
+        }
+        
+      } else if (row.LineType == DataRowType.Normal) {
+        if (index > rowEntry.LinesShape.Count + 1) {
+          throw new NotImplementedException();
+        }
+
+        if (action == Action.Added) {
+          if (rowEntry.LinesShape.Count == 0)
+            rowEntry.LinesShape.AddMarkerShape(new MarkerShape(0, row[0], 8, row.Color));
+          if (index > 0 && index == rowEntry.LinesShape.Count + 1) {
+            LineShape lineShape = new LineShape(index-1, row[index-1], index, row[index], row.Color, row.Thickness,
+                                                row.Style);
+            rowEntry.LinesShape.AddShape(lineShape);
+            rowEntry.LinesShape.AddMarkerShape(new MarkerShape(index, row[index], 8, row.Color));
+          }
+        } else if (action == Action.Modified) {
+          // not the first value
+          if (index > 0) {
+            rowEntry.LinesShape.GetShape(index - 1).Y2 = value;
+            ((MarkerShape) rowEntry.LinesShape.markersShape.GetShape(index - 1)).Y = value;
+          }
+
+          // not the last value
+          if (index < row.Count - 1) {
+            rowEntry.LinesShape.GetShape(index).Y1 = value;
+            ((MarkerShape) rowEntry.LinesShape.markersShape.GetShape(index)).Y = value;
+          }
+        } else if (action == Action.Deleted) {
+          if (index == row.Count - 1) {
+            rowEntry.LinesShape.RemoveMarkerShape(rowEntry.LinesShape.markersShape.GetShape(index));
+            rowEntry.LinesShape.RemoveShape(rowEntry.LinesShape.GetShape(index));
+          } else
+            throw new NotSupportedException("Deleting of values other than the last one is not supported!");
         }
       }
@@ -520,5 +620,6 @@
       foreach (RowEntry rowEntry in rowEntries) {
         if (rowEntry.DataRow.YAxis.ClipChangeable) {
-          clippingArea = Translate.ClippingArea(startPoint, endPoint, rowEntry.LinesShape.ClippingArea, rowEntry.LinesShape.Viewport);
+          clippingArea = Translate.ClippingArea(startPoint, endPoint, rowEntry.LinesShape.ClippingArea,
+                                                rowEntry.LinesShape.Viewport);
           SetClipY(rowEntry, clippingArea.Y1, clippingArea.Y2);
         }
@@ -550,5 +651,6 @@
 
     private void DrawRectangle(Rectangle rectangle) {
-      rectangleShape.Rectangle = Transform.ToWorld(rectangle, userInteractionShape.Viewport, userInteractionShape.ClippingArea);
+      rectangleShape.Rectangle = Transform.ToWorld(rectangle, userInteractionShape.Viewport,
+                                                   userInteractionShape.ClippingArea);
       canvasUI.Invalidate();
     }
@@ -560,5 +662,7 @@
 
       if (e.Button == MouseButtons.Right) {
-        contextMenu.Show(PointToScreen(e.Location));
+        valueToolTip.Hide(this);
+        mouseEventListener = null;
+        this.contextMenu.Show(PointToScreen(e.Location));
       } else if (e.Button == MouseButtons.Left) {
         if (ModifierKeys == Keys.None) {
@@ -582,7 +686,11 @@
 
     private void canvasUI_MouseMove(object sender, MouseEventArgs e) {
+      if (currentMousePos == e.Location)
+        return;
       if (mouseEventListener != null) {
         mouseEventListener.MouseMove(sender, e);
       }
+
+      currentMousePos = e.Location;
     }
 
@@ -592,5 +700,5 @@
       }
 
-      mouseEventListener = null;
+      mouseEventListener = toolTipListener;
     }
 
@@ -640,7 +748,11 @@
           }
         }
-        this.markersShape.ShowChildShapes = row.ShowMarkers;
-      }
-
+        markersShape.ShowChildShapes = row.ShowMarkers;
+      }
+
+      /// <summary>
+      /// Draws all Shapes in the chart
+      /// </summary>
+      /// <param name="graphics"></param>
       public override void Draw(Graphics graphics) {
         GraphicsState gstate = graphics.Save();
@@ -660,4 +772,9 @@
       }
 
+      public void RemoveMarkerShape(IShape shape) {
+        shape.Parent = this;
+        markersShape.RemoveShape(shape);
+      }
+
       public int Count {
         get { return shapes.Count; }
@@ -665,5 +782,5 @@
 
       public LineShape GetShape(int index) {
-        return (LineShape)shapes[index]; //shapes[0] is markersShape!!
+        return (LineShape) shapes[index]; //shapes[0] is markersShape!!
       }
     }
Index: /trunk/sources/HeuristicLab.Visualization/3.2/TooltipListener.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/TooltipListener.cs	(revision 1883)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/TooltipListener.cs	(revision 1883)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Visualization {
+  class TooltipListener:IMouseEventListener {
+    public delegate void ShowToolTipHandler(Point location);
+
+    public event ShowToolTipHandler ShowToolTip;
+    
+    private readonly Timer timer;
+    private Point lastMouseLocation;
+
+
+    public TooltipListener() {
+      timer= new Timer {Interval = 300};
+      timer.Tick += Tick;
+      timer.Start();
+    }
+
+    private void Tick(object sender, EventArgs e) {
+      if(ShowToolTip != null) {
+        ShowToolTip(lastMouseLocation);
+      }
+    }
+
+    #region Implementation of IMouseEventListener
+
+    public void MouseMove(object sender, MouseEventArgs e) {
+      if(e.Location==lastMouseLocation)
+        return;
+      timer.Stop();
+      timer.Start();
+      lastMouseLocation = e.Location;
+    }
+
+    public void MouseUp(object sender, MouseEventArgs e) {
+      //Not needed, so do Nothing
+    }
+
+    #endregion
+  }
+}
