Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.Designer.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.Designer.cs	(revision 12883)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.Designer.cs	(revision 12884)
@@ -46,6 +46,6 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
-      System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
       this.yLabel = new System.Windows.Forms.Label();
       this.xLabel = new System.Windows.Forms.Label();
@@ -56,4 +56,5 @@
       this.childrenGroupBox = new System.Windows.Forms.GroupBox();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.noDataLabel = new System.Windows.Forms.Label();
       this.sizeComboBox = new System.Windows.Forms.ComboBox();
       this.sizeLabel = new System.Windows.Forms.Label();
@@ -66,5 +67,5 @@
       this.yJitterTrackBar = new System.Windows.Forms.TrackBar();
       this.xJitterTrackBar = new System.Windows.Forms.TrackBar();
-      this.noDataLabel = new System.Windows.Forms.Label();
+      this.tooltip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
       this.childrenGroupBox.SuspendLayout();
@@ -103,18 +104,20 @@
             | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
-      chartArea2.Name = "ChartArea1";
-      this.chart.ChartAreas.Add(chartArea2);
+      chartArea1.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea1);
       this.chart.Location = new System.Drawing.Point(3, 3);
       this.chart.Name = "chart";
-      series2.ChartArea = "ChartArea1";
-      series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
-      series2.IsVisibleInLegend = false;
-      series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
-      series2.Name = "Bubbles";
-      series2.YValuesPerPoint = 2;
-      this.chart.Series.Add(series2);
+      series1.ChartArea = "ChartArea1";
+      series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
+      series1.IsVisibleInLegend = false;
+      series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
+      series1.Name = "Bubbles";
+      series1.YValuesPerPoint = 2;
+      this.chart.Series.Add(series1);
       this.chart.Size = new System.Drawing.Size(966, 668);
       this.chart.TabIndex = 7;
       this.chart.AxisViewChanged += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(this.chart_AxisViewChanged);
+      this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDoubleClick);
+      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
       // 
       // yAxisComboBox
@@ -184,4 +187,15 @@
       this.splitContainer.SplitterDistance = 107;
       this.splitContainer.TabIndex = 12;
+      // 
+      // noDataLabel
+      // 
+      this.noDataLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noDataLabel.AutoSize = true;
+      this.noDataLabel.Location = new System.Drawing.Point(469, 323);
+      this.noDataLabel.Name = "noDataLabel";
+      this.noDataLabel.Size = new System.Drawing.Size(139, 13);
+      this.noDataLabel.TabIndex = 8;
+      this.noDataLabel.Text = "No data could be displayed.";
+      this.noDataLabel.Visible = false;
       // 
       // sizeComboBox
@@ -291,15 +305,4 @@
       this.xJitterTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
       this.xJitterTrackBar.ValueChanged += new System.EventHandler(this.jitterTrackBar_ValueChanged);
-      // 
-      // noDataLabel
-      // 
-      this.noDataLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
-      this.noDataLabel.AutoSize = true;
-      this.noDataLabel.Location = new System.Drawing.Point(469, 323);
-      this.noDataLabel.Name = "noDataLabel";
-      this.noDataLabel.Size = new System.Drawing.Size(139, 13);
-      this.noDataLabel.TabIndex = 8;
-      this.noDataLabel.Text = "No data could be displayed.";
-      this.noDataLabel.Visible = false;
       // 
       // BubbleChartView
@@ -363,4 +366,5 @@
     private System.Windows.Forms.TrackBar xJitterTrackBar;
     private System.Windows.Forms.Label noDataLabel;
+    private System.Windows.Forms.ToolTip tooltip;
   }
 }
Index: /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.cs
===================================================================
--- /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.cs	(revision 12883)
+++ /branches/BubbleChart/HeuristicLab.Optimization.BubbleChart/3.3/BubbleChartView.cs	(revision 12884)
@@ -567,4 +567,79 @@
     }
 
+    private void chart_MouseMove(object sender, MouseEventArgs e) {
+      if (Control.MouseButtons != MouseButtons.None) return;
+      HitTestResult h = this.chart.HitTest(e.X, e.Y);
+      string newTooltipText = string.Empty;
+      string oldTooltipText;
+      if (h.ChartElementType == ChartElementType.DataPoint) {
+        var tag = (Tuple<double, double, RecursiveDataItem, RecursiveDataItem>)((DataPoint)h.Object).Tag;
+        newTooltipText = BuildTooltip(tag);
+      } else if (h.ChartElementType == ChartElementType.AxisLabels) {
+        newTooltipText = ((CustomLabel)h.Object).ToolTip;
+      }
+
+      oldTooltipText = this.tooltip.GetToolTip(chart);
+      if (newTooltipText != oldTooltipText)
+        this.tooltip.SetToolTip(chart, newTooltipText);
+    }
+
+    private string BuildTooltip(Tuple<double, double, RecursiveDataItem, RecursiveDataItem> tag) {
+      string tooltip;
+      if (tag.Item3 != tag.Item4)
+        tooltip = "X: " + tag.Item3.Name + Environment.NewLine + "Y: " + tag.Item4.Name + Environment.NewLine;
+      else
+        tooltip = tag.Item3.Name + Environment.NewLine;
+
+      double? xValue = tag.Item1;
+      double? yValue = tag.Item2;
+      //double? sizeValue = this.GetValue(run, (string)sizeComboBox.SelectedItem);
+
+      string xString = xValue == null ? string.Empty : xValue.Value.ToString();
+      string yString = yValue == null ? string.Empty : yValue.Value.ToString();
+      //string sizeString = sizeValue == null ? string.Empty : sizeValue.Value.ToString();
+
+      // TODO
+      ////code to handle TimeSpanValues correct
+      //int axisDimensionCount = Enum.GetNames(typeof(AxisDimension)).Count();
+      //int columnIndex = xAxisComboBox.SelectedIndex - axisDimensionCount;
+      //if (xValue.HasValue && columnIndex > 0 && Content.GetValue(0, columnIndex) is TimeSpanValue) {
+      //  TimeSpan time = TimeSpan.FromSeconds(xValue.Value);
+      //  xString = string.Format("{0:00}:{1:00}:{2:00.00}", (int)time.TotalHours, time.Minutes, time.Seconds);
+      //}
+      //columnIndex = yAxisComboBox.SelectedIndex - axisDimensionCount;
+      //if (yValue.HasValue && columnIndex > 0 && Content.GetValue(0, columnIndex) is TimeSpanValue) {
+      //  TimeSpan time = TimeSpan.FromSeconds(yValue.Value);
+      //  yString = string.Format("{0:00}:{1:00}:{2:00.00}", (int)time.TotalHours, time.Minutes, time.Seconds);
+      //}
+
+      tooltip += xAxisComboBox.SelectedItem + " : " + xString + Environment.NewLine;
+      tooltip += yAxisComboBox.SelectedItem + " : " + yString + Environment.NewLine;
+      //tooltip += sizeComboBox.SelectedItem + " : " + sizeString + Environment.NewLine;
+
+      return tooltip;
+    }
+
+    private void chart_MouseDoubleClick(object sender, MouseEventArgs e) {
+      HitTestResult h = this.chart.HitTest(e.X, e.Y, ChartElementType.DataPoint);
+      if (h.ChartElementType == ChartElementType.DataPoint) {
+        var tuple = (Tuple<double, double, RecursiveDataItem, RecursiveDataItem>)((DataPoint)h.Object).Tag;
+        IContentView view = MainFormManager.MainForm.ShowContent(tuple.Item3, typeof(RecursiveDataItemView));
+        if (view != null) {
+          view.ReadOnly = this.ReadOnly;
+          view.Locked = this.Locked;
+        }
+        if (tuple.Item3 != tuple.Item4) {
+          view = MainFormManager.MainForm.ShowContent(tuple.Item4, typeof(RecursiveDataItemView));
+          if (view != null) {
+            view.ReadOnly = this.ReadOnly;
+            view.Locked = this.Locked;
+          }
+        }
+
+        this.chart.ChartAreas[0].CursorX.SelectionStart = this.chart.ChartAreas[0].CursorX.SelectionEnd;
+        this.chart.ChartAreas[0].CursorY.SelectionStart = this.chart.ChartAreas[0].CursorY.SelectionEnd;
+      }
+      UpdateAxisLabels();
+    }
     #endregion
 
