Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChart.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChart.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChart.cs	(revision 1303)
@@ -0,0 +1,273 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Charting;
+using System.Windows.Forms;
+using HeuristicLab.CEDMA.Core;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Core;
+using HeuristicLab.CEDMA.DB.Interfaces;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public class BubbleChart : Chart {
+    private const string X_JITTER = "__X_JITTER";
+    private const string Y_JITTER = "__Y_JITTER";
+    private const double maxXJitterPercent = 0.05;
+    private const double maxYJitterPercent = 0.05;
+    private const int minBubbleSize = 5;
+    private const int maxBubbleSize = 30;
+    private const int maxAlpha = 255;
+    private const int minAlpha = 50;
+    private static readonly Color defaultColor = Color.Blue;
+    private static readonly Color selectionColor = Color.Red;
+
+    private double xJitterFactor = 0.0;
+    private double yJitterFactor = 0.0;
+    private string xDimension;
+    private string yDimension;
+    private string sizeDimension;
+    private bool invertSize;
+    private double minX = double.PositiveInfinity;
+    private double minY = double.PositiveInfinity;
+    private double maxX = double.NegativeInfinity;
+    private double maxY = double.NegativeInfinity;
+    private List<ResultsEntry> records;
+    private Results results;
+    private Dictionary<IPrimitive, ResultsEntry> primitiveToEntryDictionary;
+    private Dictionary<ResultsEntry, IPrimitive> entryToPrimitiveDictionary;
+    private Random random = new Random();
+    private Group points;
+
+    public BubbleChart(Results results, PointD lowerLeft, PointD upperRight)
+      : base(lowerLeft, upperRight) {
+      records = new List<ResultsEntry>();
+      primitiveToEntryDictionary = new Dictionary<IPrimitive, ResultsEntry>();
+      entryToPrimitiveDictionary = new Dictionary<ResultsEntry, IPrimitive>();
+      this.results = results;
+
+      foreach (var resultsEntry in results.GetEntries()) {
+        if (resultsEntry.Get(X_JITTER) == null)
+          resultsEntry.Set(X_JITTER, random.NextDouble() * 2.0 - 1.0);
+        if (resultsEntry.Get(Y_JITTER) == null)
+          resultsEntry.Set(Y_JITTER, random.NextDouble() * 2.0 - 1.0);
+        records.Add(resultsEntry);
+      }
+
+      results.Changed += new EventHandler(results_Changed);
+    }
+
+    void results_Changed(object sender, EventArgs e) {
+      Repaint();
+      EnforceUpdate();
+    }
+
+    public BubbleChart(Results results, double x1, double y1, double x2, double y2)
+      : this(results, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+
+    public void SetBubbleSizeDimension(string dimension, bool inverted) {
+      this.sizeDimension = dimension;
+      this.invertSize = inverted;
+      Repaint();
+      EnforceUpdate();
+    }
+
+    public void ShowXvsY(string xDimension, string yDimension) {
+      if (this.xDimension != xDimension || this.yDimension != yDimension) {
+        this.xDimension = xDimension;
+        this.yDimension = yDimension;
+
+        ResetViewSize();
+        Repaint();
+        ZoomToViewSize();
+      }
+    }
+
+    internal void SetJitter(double xJitterFactor, double yJitterFactor) {
+      this.xJitterFactor = xJitterFactor * maxXJitterPercent * Size.Width;
+      this.yJitterFactor = yJitterFactor * maxYJitterPercent * Size.Height;
+      Repaint();
+      EnforceUpdate();
+    }
+
+    private void Repaint() {
+      if (xDimension == null || yDimension == null) return;
+      double maxSize = 1;
+      double minSize = 1;
+      try {
+        if (sizeDimension != null && results.OrdinalVariables.Contains(sizeDimension)) {
+          var sizes = records
+            .Select(x => Convert.ToDouble(x.Get(sizeDimension)))
+            .Where(size => !double.IsInfinity(size) && size != double.MaxValue && size != double.MinValue)
+            .OrderBy(r => r);
+          minSize = sizes.ElementAt((int)(sizes.Count() * 0.1));
+          maxSize = sizes.ElementAt((int)(sizes.Count() * 0.9));
+        }
+      }
+      catch (InvalidCastException) {
+        minSize = 1;
+        maxSize = 1;
+      }
+      UpdateEnabled = false;
+      Group.Clear();
+      primitiveToEntryDictionary.Clear();
+      entryToPrimitiveDictionary.Clear();
+      points = new Group(this);
+      Group.Add(new Axis(this, 0, 0, AxisType.Both));
+      UpdateViewSize(0, 0, 5);
+      foreach (ResultsEntry r in records) {
+        double x, y;
+        int size;
+        try {
+          x = Convert.ToDouble(r.Get(xDimension)) + (double)r.Get(X_JITTER) * xJitterFactor;
+          y = Convert.ToDouble(r.Get(yDimension)) + (double)r.Get(Y_JITTER) * yJitterFactor;
+          size = CalculateSize(Convert.ToDouble(r.Get(sizeDimension)), minSize, maxSize);
+        }
+        catch (InvalidCastException) {
+          x = double.NaN;
+          y = double.NaN;
+          size = minBubbleSize;
+        }
+        if (double.IsInfinity(x) || x == double.MaxValue || x == double.MinValue) x = double.NaN;
+        if (double.IsInfinity(y) || y == double.MaxValue || y == double.MinValue) y = double.NaN;
+        if (!double.IsNaN(x) && !double.IsNaN(y)) {
+          UpdateViewSize(x, y, size);
+          int alpha = CalculateAlpha(size);
+          Pen pen = new Pen(Color.FromArgb(alpha, r.Selected ? selectionColor : defaultColor));
+          Brush brush = pen.Brush;
+          FixedSizeCircle c = new FixedSizeCircle(this, x, y, size, pen, brush);
+          c.ToolTipText = r.GetToolTipText();
+          points.Add(c);
+          if (!r.Selected) c.IntoBackground();
+          primitiveToEntryDictionary[c] = r;
+          entryToPrimitiveDictionary[r] = c;
+        }
+      }
+      Group.Add(points);
+      UpdateEnabled = true;
+    }
+
+    private int CalculateSize(double size, double minSize, double maxSize) {
+      if (double.IsNaN(size) || double.IsInfinity(size) || size == double.MaxValue || size == double.MinValue) return minBubbleSize;
+      if (size > maxSize) size = maxSize;
+      if (size < minSize) size = minSize;
+      if (Math.Abs(maxSize - minSize) < 1.0E-10) return minBubbleSize;
+      double sizeDifference = ((size - minSize) / (maxSize - minSize) * (maxBubbleSize - minBubbleSize));
+      if (invertSize) return maxBubbleSize - (int)sizeDifference;
+      else return minBubbleSize + (int)sizeDifference;
+    }
+
+    private int CalculateAlpha(int size) {
+      return maxAlpha - (int)((double)(size - minBubbleSize) / (double)(maxBubbleSize - minBubbleSize) * (double)(maxAlpha - minAlpha));
+    }
+
+    private void ZoomToViewSize() {
+      if (minX < maxX && minY < maxY) {
+        // enlarge view by 5% on each side
+        double width = maxX - minX;
+        double height = maxY - minY;
+        minX = minX - width * 0.05;
+        maxX = maxX + width * 0.05;
+        minY = minY - height * 0.05;
+        maxY = maxY + height * 0.05;
+        ZoomIn(minX, minY, maxX, maxY);
+      }
+    }
+
+    private void UpdateViewSize(double x, double y, double size) {
+      if (x - size < minX) minX = x - size;
+      if (x + size > maxX) maxX = x + size;
+      if (y - size < minY) minY = y + size;
+      if (y + size > maxY) maxY = y + size;
+    }
+
+    private void ResetViewSize() {
+      minX = double.PositiveInfinity;
+      maxX = double.NegativeInfinity;
+      minY = double.PositiveInfinity;
+      maxY = double.NegativeInfinity;
+    }
+
+    internal ResultsEntry GetResultsEntry(Point point) {
+      ResultsEntry r = null;
+      IPrimitive p = points.GetPrimitive(TransformPixelToWorld(point));
+      if (p != null) {
+        primitiveToEntryDictionary.TryGetValue(p, out r);
+      }
+      return r;
+    }
+
+
+    public override void MouseDrag(Point start, Point end, MouseButtons button) {
+      if (button == MouseButtons.Left && Mode == ChartMode.Select) {
+        PointD a = TransformPixelToWorld(start);
+        PointD b = TransformPixelToWorld(end);
+        double minX = Math.Min(a.X, b.X);
+        double minY = Math.Min(a.Y, b.Y);
+        double maxX = Math.Max(a.X, b.X);
+        double maxY = Math.Max(a.Y, b.Y);
+        HeuristicLab.Charting.Rectangle rect = new HeuristicLab.Charting.Rectangle(this, minX, minY, maxX, maxY);
+
+        List<IPrimitive> primitives = new List<IPrimitive>();
+        primitives.AddRange(points.Primitives);
+
+        foreach (FixedSizeCircle p in primitives) {
+          if (rect.ContainsPoint(p.Point)) {
+            ResultsEntry r;
+            primitiveToEntryDictionary.TryGetValue(p, out r);
+            if (r != null) r.ToggleSelected();
+          }
+        }
+        if (primitives.Count() > 0) results.FireChanged();
+      } else {
+        base.MouseDrag(start, end, button);
+      }
+    }
+
+    public override void MouseClick(Point point, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        ResultsEntry r = GetResultsEntry(point);
+        if (r != null) r.ToggleSelected();
+        results.FireChanged();
+      } else {
+        base.MouseClick(point, button);
+      }
+    }
+
+    public override void MouseDoubleClick(Point point, MouseButtons button) {
+      if (button == MouseButtons.Left) {
+        ResultsEntry entry = GetResultsEntry(point);
+        if (entry != null) {
+          string serializedData = (string)entry.Get(Ontology.PredicateSerializedData.Uri.Replace(Ontology.CedmaNameSpace, ""));
+          var model = (IItem)PersistenceManager.RestoreFromGZip(Convert.FromBase64String(serializedData));
+          PluginManager.ControlManager.ShowControl(model.CreateView());
+        }
+      } else {
+        base.MouseDoubleClick(point, button);
+      }
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.Designer.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.Designer.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.Designer.cs	(revision 1303)
@@ -0,0 +1,133 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.CEDMA.Charting {
+  partial class BubbleChartControl {
+    /// <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.pictureBox = new System.Windows.Forms.PictureBox();
+      this.pictureBoxContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.moveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.zoomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.selectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.pictureBoxContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.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.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.ContextMenuStrip = this.pictureBoxContextMenuStrip;
+      this.pictureBox.Location = new System.Drawing.Point(0, 0);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(266, 236);
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.VisibleChanged += new System.EventHandler(this.pictureBox_VisibleChanged);
+      this.pictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
+      this.pictureBox.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDoubleClick);
+      this.pictureBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseClick);
+      this.pictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
+      this.pictureBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      // 
+      // pictureBoxContextMenuStrip
+      // 
+      this.pictureBoxContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.moveToolStripMenuItem,
+            this.zoomToolStripMenuItem,
+            this.selectToolStripMenuItem});
+      this.pictureBoxContextMenuStrip.Name = "pictureBoxContextMenuStrip";
+      this.pictureBoxContextMenuStrip.Size = new System.Drawing.Size(153, 92);
+      // 
+      // moveToolStripMenuItem
+      // 
+      this.moveToolStripMenuItem.Name = "moveToolStripMenuItem";
+      this.moveToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.moveToolStripMenuItem.Text = "Move";
+      this.moveToolStripMenuItem.Click += new System.EventHandler(this.moveToolStripMenuItem_Click);
+      // 
+      // zoomToolStripMenuItem
+      // 
+      this.zoomToolStripMenuItem.Name = "zoomToolStripMenuItem";
+      this.zoomToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.zoomToolStripMenuItem.Text = "&Zoom";
+      this.zoomToolStripMenuItem.Click += new System.EventHandler(this.zoomToolStripMenuItem_Click);
+      // 
+      // selectToolStripMenuItem
+      // 
+      this.selectToolStripMenuItem.Name = "selectToolStripMenuItem";
+      this.selectToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+      this.selectToolStripMenuItem.Text = "&Select";
+      this.selectToolStripMenuItem.Click += new System.EventHandler(this.selectToolStripMenuItem_Click);
+      // 
+      // BubbleChartControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.BackColor = System.Drawing.SystemColors.Control;
+      this.Controls.Add(this.pictureBox);
+      this.Name = "BubbleChartControl";
+      this.Size = new System.Drawing.Size(266, 236);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.pictureBoxContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.PictureBox pictureBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.ContextMenuStrip pictureBoxContextMenuStrip;
+    protected System.Windows.Forms.ToolStripMenuItem zoomToolStripMenuItem;
+    protected System.Windows.Forms.ToolStripMenuItem selectToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem moveToolStripMenuItem;
+
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.cs	(revision 1303)
@@ -0,0 +1,176 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public partial class BubbleChartControl : UserControl {
+    private Bitmap bitmap;
+    private bool renderingRequired;
+    private Point mousePosition;
+    private Point buttonDownPoint;
+
+    private BubbleChart myChart;
+    public BubbleChart Chart {
+      get { return myChart; }
+      set {
+        if(myChart != null) myChart.Update -= new EventHandler(myChart_Update);
+        myChart = value;
+        if(myChart != null) {
+          myChart.Update += new EventHandler(myChart_Update);
+          SetMode(Chart.Mode);
+        }
+        GenerateImage();
+      }
+    }
+    private bool myScaleOnResize;
+    public bool ScaleOnResize {
+      get { return myScaleOnResize; }
+      set { myScaleOnResize = value; }
+    }
+
+    public BubbleChartControl() {
+      InitializeComponent();
+      myScaleOnResize = true;
+      GenerateImage();
+    }
+
+    private void myChart_Update(object sender, EventArgs e) {
+      GenerateImage();
+    }
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      if(ScaleOnResize) {
+        if((pictureBox.Width > 0) && (pictureBox.Height > 0) && (Chart != null)) {
+          PointD point = Chart.TransformPixelToWorld(new Point(pictureBox.Width, Chart.SizeInPixels.Height - pictureBox.Height));
+          Chart.SetPosition(Chart.LowerLeft, point);
+        }
+      }
+      GenerateImage();
+    }
+    private void pictureBox_VisibleChanged(object sender, EventArgs e) {
+      if(pictureBox.Visible && renderingRequired) {
+        GenerateImage();
+      }
+    }
+
+    private void pictureBox_MouseDown(object sender, MouseEventArgs e) {
+      buttonDownPoint = e.Location;
+    }
+    private void pictureBox_MouseUp(object sender, MouseEventArgs e) {
+      if(e.Button == MouseButtons.Left) {
+        Point lowerLeft = new Point(Math.Min(e.X, buttonDownPoint.X),
+                                    Math.Max(e.Y, buttonDownPoint.Y));
+        Point upperRight = new Point(Math.Max(e.X, buttonDownPoint.X),
+                                     Math.Min(e.Y, buttonDownPoint.Y));
+        if(Chart.Mode == ChartMode.Zoom) {
+          pictureBox.Refresh();
+          if((lowerLeft.X != upperRight.X) && (lowerLeft.Y != upperRight.Y)) {
+            Chart.ZoomIn(lowerLeft, upperRight);
+          }
+        } else if(Chart.Mode == ChartMode.Select) {
+          if((lowerLeft.X != upperRight.X) && (lowerLeft.Y != upperRight.Y)) {
+            Chart.MouseDrag(lowerLeft, upperRight, e.Button);
+          }
+        } else if(Chart.Mode == ChartMode.Move) {
+        }
+      } else if(e.Button == MouseButtons.Middle) {
+        if(Chart.Mode == ChartMode.Zoom) {
+          Chart.ZoomOut();
+        }
+      }
+    }
+    private void pictureBox_MouseMove(object sender, MouseEventArgs e) {
+      toolTip.SetToolTip(pictureBox, Chart.GetToolTipText(e.Location));
+      if(e.Button != MouseButtons.None) {
+        if((Chart.Mode == ChartMode.Zoom || Chart.Mode == ChartMode.Select) && (e.Button == MouseButtons.Left)) {
+          pictureBox.Refresh();
+          Graphics graphics = pictureBox.CreateGraphics();
+          Pen pen = new Pen(Color.Gray);
+          pen.DashStyle = DashStyle.Dash;
+          graphics.DrawRectangle(pen,
+                                 Math.Min(e.X, buttonDownPoint.X),
+                                 Math.Min(e.Y, buttonDownPoint.Y),
+                                 Math.Abs(e.X - buttonDownPoint.X),
+                                 Math.Abs(e.Y - buttonDownPoint.Y));
+          pen.Dispose();
+          graphics.Dispose();
+        }
+      }
+      mousePosition = e.Location;
+    }
+
+    private void zoomToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Zoom);
+    }
+    private void selectToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Select);
+    }
+    private void moveToolStripMenuItem_Click(object sender, EventArgs e) {
+      SetMode(ChartMode.Move);
+    }
+
+    private void GenerateImage() {
+      if(!Visible) {
+        renderingRequired = true;
+      } else {
+        if((pictureBox.Width == 0) || (pictureBox.Height == 0)) {
+          bitmap = null;
+        } else {
+          bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+          if(Chart != null) {
+            Graphics graphics = Graphics.FromImage(bitmap);
+            graphics.SetClip(new System.Drawing.Rectangle(0, 0, pictureBox.Width, pictureBox.Height));
+            Chart.Render(graphics, pictureBox.Width, pictureBox.Height);
+            graphics.Dispose();
+          }
+        }
+        pictureBox.Image = bitmap;
+        renderingRequired = false;
+      }
+    }
+
+    private void SetMode(ChartMode mode) {
+      zoomToolStripMenuItem.Checked = false;
+      selectToolStripMenuItem.Checked = false;
+      moveToolStripMenuItem.Checked = false;
+      if(mode == ChartMode.Zoom) zoomToolStripMenuItem.Checked = true;
+      else if(mode == ChartMode.Select) selectToolStripMenuItem.Checked = true;
+      else if(mode == ChartMode.Move) moveToolStripMenuItem.Checked = true;
+      Chart.Mode = mode;
+    }
+
+    private void pictureBox_MouseClick(object sender, MouseEventArgs e) {
+      Chart.MouseClick(e.Location, e.Button);
+    }
+
+    private void pictureBox_MouseDoubleClick(object sender, MouseEventArgs e) {
+      Chart.MouseDoubleClick(e.Location, e.Button);
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.resx
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.resx	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartControl.resx	(revision 1303)
@@ -0,0 +1,126 @@
+<?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>
+  <metadata name="pictureBoxContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>210, 17</value>
+  </metadata>
+</root>
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.Designer.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.Designer.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.Designer.cs	(revision 1303)
@@ -0,0 +1,206 @@
+﻿namespace HeuristicLab.CEDMA.Charting {
+  partial class BubbleChartView {
+    /// <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.yJitterLabel = new System.Windows.Forms.Label();
+      this.xJitterlabel = new System.Windows.Forms.Label();
+      this.xTrackBar = new System.Windows.Forms.TrackBar();
+      this.xAxisLabel = new System.Windows.Forms.Label();
+      this.xAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.yAxisLabel = new System.Windows.Forms.Label();
+      this.yAxisComboBox = new System.Windows.Forms.ComboBox();
+      this.yTrackBar = new System.Windows.Forms.TrackBar();
+      this.sizeComboBox = new System.Windows.Forms.ComboBox();
+      this.sizeLabel = new System.Windows.Forms.Label();
+      this.invertCheckbox = new System.Windows.Forms.CheckBox();
+      this.bubbleChartControl = new HeuristicLab.CEDMA.Charting.BubbleChartControl();
+      ((System.ComponentModel.ISupportInitialize)(this.xTrackBar)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.yTrackBar)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // yJitterLabel
+      // 
+      this.yJitterLabel.AutoSize = true;
+      this.yJitterLabel.Location = new System.Drawing.Point(3, 30);
+      this.yJitterLabel.Name = "yJitterLabel";
+      this.yJitterLabel.Size = new System.Drawing.Size(29, 13);
+      this.yJitterLabel.TabIndex = 13;
+      this.yJitterLabel.Text = "jitter:";
+      // 
+      // xJitterlabel
+      // 
+      this.xJitterlabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xJitterlabel.AutoSize = true;
+      this.xJitterlabel.Location = new System.Drawing.Point(291, 418);
+      this.xJitterlabel.Name = "xJitterlabel";
+      this.xJitterlabel.Size = new System.Drawing.Size(29, 13);
+      this.xJitterlabel.TabIndex = 12;
+      this.xJitterlabel.Text = "jitter:";
+      // 
+      // xTrackBar
+      // 
+      this.xTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xTrackBar.Location = new System.Drawing.Point(326, 418);
+      this.xTrackBar.Maximum = 100;
+      this.xTrackBar.Name = "xTrackBar";
+      this.xTrackBar.Size = new System.Drawing.Size(121, 45);
+      this.xTrackBar.TabIndex = 11;
+      this.xTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+      this.xTrackBar.ValueChanged += new System.EventHandler(this.jitterTrackBar_ValueChanged);
+      // 
+      // xAxisLabel
+      // 
+      this.xAxisLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xAxisLabel.AutoSize = true;
+      this.xAxisLabel.Location = new System.Drawing.Point(305, 394);
+      this.xAxisLabel.Name = "xAxisLabel";
+      this.xAxisLabel.Size = new System.Drawing.Size(15, 13);
+      this.xAxisLabel.TabIndex = 8;
+      this.xAxisLabel.Text = "x:";
+      // 
+      // xAxisComboBox
+      // 
+      this.xAxisComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.xAxisComboBox.FormattingEnabled = true;
+      this.xAxisComboBox.Location = new System.Drawing.Point(326, 391);
+      this.xAxisComboBox.Name = "xAxisComboBox";
+      this.xAxisComboBox.Size = new System.Drawing.Size(121, 21);
+      this.xAxisComboBox.TabIndex = 7;
+      this.xAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // yAxisLabel
+      // 
+      this.yAxisLabel.AutoSize = true;
+      this.yAxisLabel.Location = new System.Drawing.Point(3, 6);
+      this.yAxisLabel.Name = "yAxisLabel";
+      this.yAxisLabel.Size = new System.Drawing.Size(15, 13);
+      this.yAxisLabel.TabIndex = 6;
+      this.yAxisLabel.Text = "y:";
+      // 
+      // yAxisComboBox
+      // 
+      this.yAxisComboBox.FormattingEnabled = true;
+      this.yAxisComboBox.Location = new System.Drawing.Point(24, 3);
+      this.yAxisComboBox.Name = "yAxisComboBox";
+      this.yAxisComboBox.Size = new System.Drawing.Size(121, 21);
+      this.yAxisComboBox.TabIndex = 5;
+      this.yAxisComboBox.SelectedIndexChanged += new System.EventHandler(this.axisComboBox_SelectedIndexChanged);
+      // 
+      // yTrackBar
+      // 
+      this.yTrackBar.Location = new System.Drawing.Point(38, 30);
+      this.yTrackBar.Maximum = 100;
+      this.yTrackBar.Name = "yTrackBar";
+      this.yTrackBar.Size = new System.Drawing.Size(107, 45);
+      this.yTrackBar.TabIndex = 10;
+      this.yTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
+      this.yTrackBar.ValueChanged += new System.EventHandler(this.jitterTrackBar_ValueChanged);
+      // 
+      // sizeComboBox
+      // 
+      this.sizeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.sizeComboBox.FormattingEnabled = true;
+      this.sizeComboBox.Location = new System.Drawing.Point(329, 3);
+      this.sizeComboBox.Name = "sizeComboBox";
+      this.sizeComboBox.Size = new System.Drawing.Size(121, 21);
+      this.sizeComboBox.TabIndex = 14;
+      this.sizeComboBox.SelectedIndexChanged += new System.EventHandler(this.sizeComboBox_SelectedIndexChanged);
+      // 
+      // sizeLabel
+      // 
+      this.sizeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.sizeLabel.AutoSize = true;
+      this.sizeLabel.Location = new System.Drawing.Point(259, 6);
+      this.sizeLabel.Name = "sizeLabel";
+      this.sizeLabel.Size = new System.Drawing.Size(64, 13);
+      this.sizeLabel.TabIndex = 15;
+      this.sizeLabel.Text = "Bubble size:";
+      // 
+      // invertCheckbox
+      // 
+      this.invertCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.invertCheckbox.AutoSize = true;
+      this.invertCheckbox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.invertCheckbox.Location = new System.Drawing.Point(326, 30);
+      this.invertCheckbox.Name = "invertCheckbox";
+      this.invertCheckbox.Size = new System.Drawing.Size(64, 17);
+      this.invertCheckbox.TabIndex = 16;
+      this.invertCheckbox.Text = "Inverse:";
+      this.invertCheckbox.UseVisualStyleBackColor = true;
+      this.invertCheckbox.CheckedChanged += new System.EventHandler(this.sizeComboBox_SelectedIndexChanged);
+      // 
+      // bubbleChartControl
+      // 
+      this.bubbleChartControl.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.bubbleChartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.bubbleChartControl.Chart = null;
+      this.bubbleChartControl.Location = new System.Drawing.Point(3, 81);
+      this.bubbleChartControl.Name = "bubbleChartControl";
+      this.bubbleChartControl.ScaleOnResize = true;
+      this.bubbleChartControl.Size = new System.Drawing.Size(444, 304);
+      this.bubbleChartControl.TabIndex = 17;
+      // 
+      // BubbleChartView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.bubbleChartControl);
+      this.Controls.Add(this.invertCheckbox);
+      this.Controls.Add(this.sizeLabel);
+      this.Controls.Add(this.sizeComboBox);
+      this.Controls.Add(this.yJitterLabel);
+      this.Controls.Add(this.xJitterlabel);
+      this.Controls.Add(this.xTrackBar);
+      this.Controls.Add(this.xAxisLabel);
+      this.Controls.Add(this.xAxisComboBox);
+      this.Controls.Add(this.yAxisLabel);
+      this.Controls.Add(this.yAxisComboBox);
+      this.Controls.Add(this.yTrackBar);
+      this.Name = "BubbleChartView";
+      this.Size = new System.Drawing.Size(450, 459);
+      ((System.ComponentModel.ISupportInitialize)(this.xTrackBar)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.yTrackBar)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label xAxisLabel;
+    private System.Windows.Forms.ComboBox xAxisComboBox;
+    private System.Windows.Forms.Label yAxisLabel;
+    private System.Windows.Forms.ComboBox yAxisComboBox;
+    private System.Windows.Forms.TrackBar yTrackBar;
+    private System.Windows.Forms.TrackBar xTrackBar;
+    private System.Windows.Forms.Label xJitterlabel;
+    private System.Windows.Forms.Label yJitterLabel;
+    private System.Windows.Forms.ComboBox sizeComboBox;
+    private System.Windows.Forms.Label sizeLabel;
+    private System.Windows.Forms.CheckBox invertCheckbox;
+    private BubbleChartControl bubbleChartControl;
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.cs	(revision 1303)
@@ -0,0 +1,72 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.CEDMA.Charting;
+using HeuristicLab.CEDMA.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public class BubbleChartViewFactory : IResultsViewFactory {
+    #region IResultsViewFactory Members
+
+    public string Name {
+      get { return "Bubble chart"; }
+    }
+
+    public IControl CreateView(Results results) {
+      return new BubbleChartView(results);
+    }
+
+    #endregion
+  }
+
+  public partial class BubbleChartView : ViewBase {
+    private Results Results {
+      get { return (Results)Item; }
+      set { Item = value; }
+    }
+    private const string CONSTANT_SIZE = "<constant>";
+    private Label pleaseSelectAxisLabel = new Label();
+    public BubbleChartView(Results results) {
+      InitializeComponent();
+      Results = results;
+      bubbleChartControl.Chart = new BubbleChart(Results, 0, 0, 100, 100);
+      xAxisComboBox.Items.AddRange(Results.OrdinalVariables);
+      xAxisComboBox.Items.AddRange(Results.CategoricalVariables);
+      yAxisComboBox.Items.AddRange(Results.OrdinalVariables);
+      yAxisComboBox.Items.AddRange(Results.CategoricalVariables);
+      sizeComboBox.Items.Add(CONSTANT_SIZE);
+      sizeComboBox.Items.AddRange(Results.OrdinalVariables);
+      sizeComboBox.SelectedItem = sizeComboBox.Items[0];
+      yAxisComboBox.SelectedItem = yAxisComboBox.Items[0];
+      xAxisComboBox.SelectedItem = xAxisComboBox.Items[0];
+    }
+
+    private void axisComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdateChart();
+    }
+
+    private void UpdateChart() {
+      if (xAxisComboBox.SelectedItem == null || yAxisComboBox.SelectedItem == null) return;
+      bubbleChartControl.Chart.ShowXvsY((string)xAxisComboBox.SelectedItem, (string)yAxisComboBox.SelectedItem);
+    }
+
+    private void jitterTrackBar_ValueChanged(object sender, EventArgs e) {
+      double xJitterFactor = xTrackBar.Value / 100.0;
+      double yJitterFactor = yTrackBar.Value / 100.0;
+      bubbleChartControl.Chart.SetJitter(xJitterFactor, yJitterFactor);
+      UpdateChart();
+    }
+
+    private void sizeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      bubbleChartControl.Chart.SetBubbleSizeDimension((string)sizeComboBox.SelectedItem, invertCheckbox.Checked);
+      UpdateChart();
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.resx
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.resx	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/BubbleChartView.resx	(revision 1303)
@@ -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>
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLab.CEDMA.Charting.csproj
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLab.CEDMA.Charting.csproj	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLab.CEDMA.Charting.csproj	(revision 1303)
@@ -0,0 +1,150 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1BF17271-5350-476A-8F6D-FC74FA3E82CA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.CEDMA.Charting</RootNamespace>
+    <AssemblyName>HeuristicLab.CEDMA.Charting-3.2</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BubbleChart.cs" />
+    <Compile Include="BubbleChartControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BubbleChartControl.Designer.cs">
+      <DependentUpon>BubbleChartControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BubbleChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="BubbleChartView.Designer.cs">
+      <DependentUpon>BubbleChartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabCedmaChartingPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.CEDMA.Core\HeuristicLab.CEDMA.Core.csproj">
+      <Project>{C27DDF6C-84DF-45EF-B82F-57A28DD51166}</Project>
+      <Name>HeuristicLab.CEDMA.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.CEDMA.DB.Interfaces\HeuristicLab.CEDMA.DB.Interfaces.csproj">
+      <Project>{4F9BB789-D561-436B-B226-2BF44B7D0804}</Project>
+      <Name>HeuristicLab.CEDMA.DB.Interfaces</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Charting.Data\HeuristicLab.Charting.Data.csproj">
+      <Project>{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}</Project>
+      <Name>HeuristicLab.Charting.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Charting\HeuristicLab.Charting.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Core\HeuristicLab.Core.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.DataAnalysis\HeuristicLab.DataAnalysis.csproj">
+      <Project>{7DD3A97A-56E9-462F-90E2-A351FE7AF5C2}</Project>
+      <Name>HeuristicLab.DataAnalysis</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Data\HeuristicLab.Data.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Logging\HeuristicLab.Logging.csproj">
+      <Project>{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}</Project>
+      <Name>HeuristicLab.Logging</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="BubbleChartControl.resx">
+      <DependentUpon>BubbleChartControl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="BubbleChartView.resx">
+      <DependentUpon>BubbleChartView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLabCedmaChartingPlugin.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLabCedmaChartingPlugin.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HeuristicLabCedmaChartingPlugin.cs	(revision 1303)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.CEDMA.Charting {
+  [ClassInfo(Name = "HeuristicLab.CEDMA.Charting-3.2")]
+  [PluginFile(Filename = "HeuristicLab.CEDMA.Charting-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Charting-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.CEDMA.DB.Interfaces-3.2")]
+  public class HeuristicLabCedmaCorePlugin : PluginBase {
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Histogram.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Histogram.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Histogram.cs	(revision 1303)
@@ -0,0 +1,192 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Charting;
+using System.Windows.Forms;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public class Histogram : Chart {
+    private static readonly Color defaultColor = Color.Blue;
+    private static readonly Color selectionColor = Color.Red;
+    private static readonly Pen defaultPen = new Pen(defaultColor);
+    private static readonly Brush defaultBrush = defaultPen.Brush;
+    private static readonly Pen selectionPen = new Pen(selectionColor);
+    private static readonly Brush selectionBrush = selectionPen.Brush;
+
+    private double minX;
+    private double maxX;
+    private double maxFrequency;
+    private const int N_BUCKETS = 50;
+    private const int MAX_BUCKETS = 100;
+    private List<Record> records;
+    private ResultList results;
+    private Dictionary<IPrimitive, List<Record>> primitiveToRecordsDictionary;
+    private Dictionary<Record, IPrimitive> recordToPrimitiveDictionary;
+    private Group bars;
+    private string dimension;
+
+    public Histogram(ResultList results, double x1, double y1, double x2, double y2)
+      : this(results, new PointD(x1, y1), new PointD(x2, y2)) {
+    }
+
+    public Histogram(ResultList results, PointD lowerLeft, PointD upperRight)
+      : base(lowerLeft, upperRight) {
+      records = new List<Record>();
+      primitiveToRecordsDictionary = new Dictionary<IPrimitive, List<Record>>();
+      recordToPrimitiveDictionary = new Dictionary<Record, IPrimitive>();
+      this.results = results;
+      foreach(Record r in results.Records) {
+        records.Add(r);
+      }
+      results.OnRecordAdded += new EventHandler<RecordAddedEventArgs>(results_OnRecordAdded);
+      results.Changed += new EventHandler(results_Changed);
+    }
+
+    void results_Changed(object sender, EventArgs e) {
+      ResetViewSize();
+      Repaint();
+      EnforceUpdate();
+    }
+
+    void results_OnRecordAdded(object sender, RecordAddedEventArgs e) {
+      lock(records) {
+        records.Add(e.Record);
+      }
+    }
+
+    public void ShowFrequency(string dimension) {
+      if(this.dimension != dimension) {
+        this.dimension = dimension;
+        ResetViewSize();
+        Repaint();
+        ZoomToViewSize();
+      }
+    }
+
+    private void Repaint() {
+      lock(records) {
+        if(dimension == null) return;
+        UpdateEnabled = false;
+        Group.Clear();
+        primitiveToRecordsDictionary.Clear();
+        recordToPrimitiveDictionary.Clear();
+        bars = new Group(this);
+        Group.Add(new Axis(this, 0, 0, AxisType.Both));
+        UpdateViewSize(0, 0);
+        PaintHistogram(records);
+        Group.Add(bars);
+        UpdateEnabled = true;
+      }
+    }
+
+    private void PaintHistogram(IEnumerable<Record> records) {
+      var values = records.Select(r => new { Record = r, Value = r.Get(dimension) }).Where(
+        x => !double.IsNaN(x.Value) && !double.IsInfinity(x.Value) && x.Value != double.MinValue && x.Value != double.MaxValue).OrderBy(x => x.Value);
+      if(values.Count() == 0) return;
+      double bucketSize = 1.0;
+      var frequencies = values.GroupBy(x => x.Value);
+      if(frequencies.Count() > MAX_BUCKETS) {
+        double min = values.ElementAt((int)(values.Count() * 0.05)).Value;
+        double max = values.ElementAt((int)(values.Count() * 0.95)).Value;
+        bucketSize = (max - min) / N_BUCKETS;
+        frequencies = values.GroupBy(x => Math.Min(Math.Max(min, Math.Floor((x.Value - min) / bucketSize) * bucketSize + min), max));
+      }
+      foreach(var g in frequencies) {
+        double freq = g.Count();
+        double selectedFreq = g.Where(r=>r.Record.Selected).Count();
+        double lower = g.Key;
+        double upper = g.Key + bucketSize;
+        HeuristicLab.Charting.Rectangle bar = new HeuristicLab.Charting.Rectangle(this, lower, 0, upper, freq, defaultPen, defaultBrush);
+        primitiveToRecordsDictionary[bar] = g.Select(r => r.Record).ToList();
+        primitiveToRecordsDictionary[bar].ForEach(x => recordToPrimitiveDictionary[x] = bar);
+        HeuristicLab.Charting.Rectangle selectedBar = new HeuristicLab.Charting.Rectangle(this, lower, 0, upper, selectedFreq, selectionPen, selectionBrush);
+        primitiveToRecordsDictionary[selectedBar] = g.Select(r => r.Record).Where(r=>r.Selected).ToList();
+        primitiveToRecordsDictionary[selectedBar].ForEach(x => recordToPrimitiveDictionary[x] = bar);
+        if(lower == frequencies.First().Key) {
+          selectedBar.ToolTipText = " x < " + upper + " : " + selectedFreq;
+           bar.ToolTipText = " x < " + upper + " : " + freq;
+        } else if(lower == frequencies.Last().Key) {
+          selectedBar.ToolTipText = "x >= " + lower + " : " + selectedFreq;
+          bar.ToolTipText = "x >= " + lower + " : " + freq;
+        } else {
+          selectedBar.ToolTipText = "x in [" + lower + " .. " + upper + "[ : " + selectedFreq;
+           bar.ToolTipText = "x in [" + lower + " .. " + upper + "[ : " + freq;
+        }
+        bars.Add(bar);
+        bars.Add(selectedBar);
+        UpdateViewSize(lower, freq);
+        UpdateViewSize(upper, freq);
+      }
+    }
+
+    private void ZoomToViewSize() {
+      if(minX < maxX) {
+        // enlarge view by 5% on each side
+        double width = maxX - minX;
+        minX = minX - width * 0.05;
+        maxX = maxX + width * 0.05;
+        double minY = 0 - maxFrequency * 0.05;
+        double maxY = maxFrequency + maxFrequency * 0.05;
+        ZoomIn(minX, minY, maxX, maxY);
+      }
+    }
+
+    private void UpdateViewSize(double x, double freq) {
+      if(x < minX) minX = x;
+      if(x > maxX) maxX = x;
+      if(freq > maxFrequency) maxFrequency = freq;
+    }
+
+    private void ResetViewSize() {
+      minX = double.PositiveInfinity;
+      maxX = double.NegativeInfinity;
+      maxFrequency = double.NegativeInfinity;
+    }
+
+    internal List<Record> GetRecords(Point point) {
+      List<Record> records = null;
+      IPrimitive p = bars.GetPrimitive(TransformPixelToWorld(point));
+      if(p != null) {
+        primitiveToRecordsDictionary.TryGetValue(p, out records);
+      }
+      return records;
+    }
+
+    public override void MouseClick(Point point, MouseButtons button) {
+      if(button == MouseButtons.Left) {
+        lock(records) {
+          List<Record> rs = GetRecords(point);
+          UpdateEnabled = false;
+          if(rs != null) rs.ForEach(r => r.ToggleSelected());
+          UpdateEnabled = true;
+        }
+        results.FireChanged();
+      } else {
+        base.MouseClick(point, button);
+      }
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.Designer.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.Designer.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.Designer.cs	(revision 1303)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.CEDMA.Charting {
+  partial class HistogramControl {
+    /// <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.pictureBox = new System.Windows.Forms.PictureBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.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.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.Location = new System.Drawing.Point(0, 0);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(266, 236);
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.VisibleChanged += new System.EventHandler(this.pictureBox_VisibleChanged);
+      this.pictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
+      this.pictureBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseClick);
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      // 
+      // HistogramControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.BackColor = System.Drawing.SystemColors.Control;
+      this.Controls.Add(this.pictureBox);
+      this.Name = "HistogramControl";
+      this.Size = new System.Drawing.Size(266, 236);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.PictureBox pictureBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.cs	(revision 1303)
@@ -0,0 +1,96 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Charting;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public partial class HistogramControl : UserControl {
+    private Bitmap bitmap;
+    private bool renderingRequired;
+
+    private Histogram myChart;
+    public Histogram Chart {
+      get { return myChart; }
+      set {
+        if(myChart != null) myChart.Update -= new EventHandler(myChart_Update);
+        myChart = value;
+        if(myChart != null) {
+          myChart.Update += new EventHandler(myChart_Update);
+        }
+        GenerateImage();
+      }
+    }
+
+    public HistogramControl() {
+      InitializeComponent();
+      GenerateImage();
+    }
+
+    private void myChart_Update(object sender, EventArgs e) {
+      GenerateImage();
+    }
+
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      GenerateImage();
+    }
+    private void pictureBox_VisibleChanged(object sender, EventArgs e) {
+      if(pictureBox.Visible && renderingRequired) {
+        GenerateImage();
+      }
+    }
+
+    private void pictureBox_MouseMove(object sender, MouseEventArgs e) {
+      toolTip.SetToolTip(pictureBox, Chart.GetToolTipText(e.Location));
+    }
+
+    private void GenerateImage() {
+      if(!Visible) {
+        renderingRequired = true;
+      } else {
+        if((pictureBox.Width == 0) || (pictureBox.Height == 0)) {
+          bitmap = null;
+        } else {
+          bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+          if(Chart != null) {
+            Graphics graphics = Graphics.FromImage(bitmap);
+            graphics.SetClip(new System.Drawing.Rectangle(0, 0, pictureBox.Width, pictureBox.Height));
+            Chart.Render(graphics, pictureBox.Width, pictureBox.Height);
+            graphics.Dispose();
+          }
+        }
+        pictureBox.Image = bitmap;
+        renderingRequired = false;
+      }
+    }
+
+    private void pictureBox_MouseClick(object sender, MouseEventArgs e) {
+      Chart.MouseClick(e.Location, e.Button);
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.resx
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.resx	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/HistogramControl.resx	(revision 1303)
@@ -0,0 +1,123 @@
+<?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>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>210, 17</value>
+  </metadata>
+</root>
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.Designer.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.Designer.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.Designer.cs	(revision 1303)
@@ -0,0 +1,94 @@
+﻿namespace HeuristicLab.CEDMA.Charting {
+  partial class ModelView {
+    /// <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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.lowerSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.algoButton = new System.Windows.Forms.Button();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.lowerSplitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.lowerSplitContainer);
+      this.splitContainer.Size = new System.Drawing.Size(450, 427);
+      this.splitContainer.SplitterDistance = 185;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // lowerSplitContainer
+      // 
+      this.lowerSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lowerSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.lowerSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.lowerSplitContainer.Name = "lowerSplitContainer";
+      this.lowerSplitContainer.Size = new System.Drawing.Size(450, 238);
+      this.lowerSplitContainer.SplitterDistance = 232;
+      this.lowerSplitContainer.TabIndex = 0;
+      // 
+      // algoButton
+      // 
+      this.algoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.algoButton.Location = new System.Drawing.Point(352, 433);
+      this.algoButton.Name = "algoButton";
+      this.algoButton.Size = new System.Drawing.Size(95, 23);
+      this.algoButton.TabIndex = 1;
+      this.algoButton.Text = "Open algorithm";
+      this.algoButton.UseVisualStyleBackColor = true;
+      this.algoButton.Click += new System.EventHandler(this.algoButton_Click);
+      // 
+      // ModelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.algoButton);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ModelView";
+      this.Size = new System.Drawing.Size(450, 459);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.lowerSplitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.SplitContainer lowerSplitContainer;
+    private System.Windows.Forms.Button algoButton;
+
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.cs
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.cs	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.cs	(revision 1303)
@@ -0,0 +1,121 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Charting;
+using HeuristicLab.Logging;
+using HeuristicLab.DataAnalysis;
+using HeuristicLab.Charting.Data;
+using HeuristicLab.GP;
+using HeuristicLab.GP.StructureIdentification;
+
+namespace HeuristicLab.CEDMA.Charting {
+  public partial class ModelView : ViewBase {
+    private Dataset dataset;
+    private IFunctionTree model;
+    private int targetVariable;
+    private Record record;
+
+    public ModelView(Record record, Dataset dataset, IFunctionTree model, int targetVariable) {
+      InitializeComponent();
+      this.dataset = dataset;
+      this.model = model;
+      this.targetVariable = targetVariable;
+      this.record = record;
+
+      splitContainer.Panel1.Controls.Add((Control)model.CreateView());
+      splitContainer.Panel1.Controls[0].Dock = DockStyle.Fill;
+      lowerSplitContainer.Panel1.Controls.Add(CreateLineChart());
+      lowerSplitContainer.Panel1.Controls[0].Dock = DockStyle.Fill;
+      lowerSplitContainer.Panel2.Controls.Add(CreateScatterPlot());
+      lowerSplitContainer.Panel2.Controls[0].Dock = DockStyle.Fill;
+    }
+
+    private Control CreateScatterPlot() {
+      double minX = double.PositiveInfinity;
+      double maxX = double.NegativeInfinity;
+
+      Datachart chart = new Datachart(0, 0, 1, 1);
+      chart.Title = "Scatter plot";
+      chart.UpdateEnabled = false;
+      Pen pen = new Pen(Color.FromArgb(80, Color.Blue));
+      chart.AddDataRow(DataRowType.Points, pen, pen.Brush);
+      BakedTreeEvaluator eval = new BakedTreeEvaluator();
+      eval.ResetEvaluator((BakedFunctionTree)model, dataset, targetVariable, 0, dataset.Rows, 1.0);
+      for(int i = 0; i < dataset.Rows; i += 10) {
+        double predicted = eval.Evaluate(i);
+        double original = dataset.GetValue(i, targetVariable);
+        if(double.IsInfinity(predicted) || predicted == double.MaxValue || predicted == double.MinValue) predicted = double.NaN;
+        if(double.IsInfinity(original) || original == double.MaxValue || original == double.MinValue) original = double.NaN;
+        if(!double.IsNaN(predicted) && !double.IsNaN(original)) {
+          chart.AddDataPoint(0, original, predicted);
+          if(original < minX) minX = original;
+          if(original > maxX) maxX = original;
+          if(predicted < minX) minX = predicted;
+          if(predicted > maxX) maxX = predicted;
+        }
+      }
+      chart.UpdateEnabled = true;
+      chart.Group.Add(new Axis(chart, (maxX - minX) / 2 + minX, (maxX - minX) / 2+minX, AxisType.Both));
+      DataChartControl control = new DataChartControl();
+      control.Chart = chart;
+      if(minX < maxX) {
+        double xExcess = (maxX - minX) * 0.1;
+        chart.ZoomIn(minX - xExcess, minX-xExcess, maxX + xExcess, maxX + xExcess);
+        control.ScaleOnResize = false;
+      }
+      return control;
+    }
+
+    private Control CreateLineChart() {
+      double minY = double.PositiveInfinity;
+      double maxY = double.NegativeInfinity;
+
+      Datachart chart = new Datachart(0, 0, 1, 1);
+      chart.Title = "Linechart";
+      chart.UpdateEnabled = false;
+      Pen redPen = new Pen(Color.FromArgb(180, Color.Red));
+      Pen bluePen = new Pen(Color.FromArgb(180, Color.Blue));
+      chart.AddDataRow(DataRowType.Lines, bluePen, bluePen.Brush);
+      chart.AddDataRow(DataRowType.Lines, redPen, redPen.Brush);
+      BakedTreeEvaluator eval = new BakedTreeEvaluator();
+      eval.ResetEvaluator((BakedFunctionTree)model, dataset, targetVariable, 0, dataset.Rows, 1.0);
+      int n = 0;
+      for(int i = 0; i < dataset.Rows; i ++) {
+        double predicted = eval.Evaluate(i);
+        double original = dataset.GetValue(i, targetVariable);
+        if(double.IsInfinity(predicted) || predicted == double.MaxValue || predicted == double.MinValue) predicted = double.NaN;
+        if(double.IsInfinity(original) || original == double.MaxValue || original == double.MinValue) original = double.NaN;
+        if(!double.IsNaN(predicted) && !double.IsNaN(original)) {
+          chart.AddDataPoint(0, i, predicted);
+          chart.AddDataPoint(1, i, original);
+          n++;
+          if(original < minY) minY = original;
+          if(original > maxY) maxY = original;
+          if(predicted < minY) minY = predicted;
+          if(predicted > maxY) maxY = predicted;
+        }
+      }
+      chart.UpdateEnabled = true;
+      chart.Group.Add(new Axis(chart, 0, minY, AxisType.Both));
+      DataChartControl control = new DataChartControl();
+      control.Chart = chart;
+      if(minY < maxY) {
+        double xExcess = dataset.Rows * 0.05;
+        double yExcess = (maxY - minY) * 0.1;
+        chart.ZoomIn(0.0 - xExcess, minY - yExcess, (double)dataset.Rows + xExcess, maxY + yExcess);
+        control.ScaleOnResize = false;
+      }
+      return control;
+    }
+
+    private void algoButton_Click(object sender, EventArgs e) {
+      record.OpenGeneratingAlgorithm();
+    }
+  }
+}
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.resx
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.resx	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/ModelView.resx	(revision 1303)
@@ -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>
Index: /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Properties/AssemblyInfo.frame
===================================================================
--- /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Properties/AssemblyInfo.frame	(revision 1303)
+++ /branches/plugins/HeuristicLab.CEDMA.Charting/3.2/Properties/AssemblyInfo.frame	(revision 1303)
@@ -0,0 +1,38 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.CEDMA.Charting")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("58cd6e79-3f9b-4307-944e-b858e8957bbf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyBuildDate("$WCNOW$")]
