Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 14445)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/HeuristicLab.DataPreprocessing.Views-3.4.csproj	(revision 14446)
@@ -256,10 +256,4 @@
     <Compile Include="ScatterPlotMultiView.Designer.cs">
       <DependentUpon>ScatterPlotMultiView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="PreprocessingScatterPlotView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="PreprocessingScatterPlotView.Designer.cs">
-      <DependentUpon>PreprocessingScatterPlotView.cs</DependentUpon>
     </Compile>
     <Compile Include="SearchAndReplaceDialog.cs">
Index: anches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.Designer.cs	(revision 14445)
+++ 	(revision )
@@ -1,109 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2016 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.DataPreprocessing.Views {
-  partial class PreprocessingScatterPlotView {
-    /// <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) {
-        if (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();
-      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
-      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
-      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
-      System.Windows.Forms.DataVisualization.Charting.Title title1 = new System.Windows.Forms.DataVisualization.Charting.Title();
-      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // chart
-      // 
-      this.chart.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.chart.BorderlineColor = System.Drawing.Color.Black;
-      this.chart.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
-      chartArea1.AxisX.Minimum = 0D;
-      chartArea1.CursorX.IsUserEnabled = true;
-      chartArea1.CursorX.IsUserSelectionEnabled = true;
-      chartArea1.CursorY.IsUserEnabled = true;
-      chartArea1.CursorY.IsUserSelectionEnabled = true;
-      chartArea1.Name = "Default";
-      this.chart.ChartAreas.Add(chartArea1);
-      legend1.Alignment = System.Drawing.StringAlignment.Center;
-      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
-      legend1.Name = "Default";
-      this.chart.Legends.Add(legend1);
-      this.chart.Location = new System.Drawing.Point(0, 0);
-      this.chart.Name = "chart";
-      series1.ChartArea = "Default";
-      series1.Legend = "Default";
-      series1.Name = "Default";
-      this.chart.Series.Add(series1);
-      this.chart.Size = new System.Drawing.Size(359, 274);
-      this.chart.TabIndex = 3;
-      this.chart.Text = "chart";
-      title1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      title1.Name = "Default";
-      title1.Text = "Title";
-      title1.Visible = false;
-      this.chart.Titles.Add(title1);
-      this.chart.CustomizeLegend += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CustomizeLegendEventArgs>(this.chart_CustomizeLegend);
-      this.chart.DoubleClick += new System.EventHandler(this.chart_DoubleClick);
-      this.chart.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chart_MouseDown);
-      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
-      // 
-      // PreprocessingScatterPlotView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.chart);
-      this.Name = "PreprocessingScatterPlotView";
-      this.Size = new System.Drawing.Size(359, 274);
-      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    protected HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
-
-  }
-}
Index: anches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/PreprocessingScatterPlotView.cs	(revision 14445)
+++ 	(revision )
@@ -1,480 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2016 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.Drawing;
-using System.Linq;
-using System.Windows.Forms;
-using System.Windows.Forms.DataVisualization.Charting;
-using HeuristicLab.Analysis;
-using HeuristicLab.Analysis.Views;
-using HeuristicLab.Collections;
-using HeuristicLab.Common;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.DataPreprocessing.Views {
-  [View("Preprocessing ScatterPlot View")]
-  [Content(typeof(ScatterPlot), false)]
-  public partial class PreprocessingScatterPlotView : ItemView, IConfigureableView {
-    protected List<Series> invisibleSeries;
-    protected Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow> pointsRowsTable;
-    private event EventHandler chartDoubleClick;
-
-    public new ScatterPlot Content {
-      get { return (ScatterPlot)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public bool ShowLegend {
-      get { return chart.Legends[0].Enabled; }
-      set { chart.Legends[0].Enabled = value; }
-    }
-
-    public string XAxisFormat {
-      get { return chart.ChartAreas[0].AxisX.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisX.LabelStyle.Format = value; }
-    }
-    public string YAxisFormat {
-      get { return chart.ChartAreas[0].AxisY.LabelStyle.Format; }
-      set { chart.ChartAreas[0].AxisY.LabelStyle.Format = value; }
-    }
-
-    public PreprocessingScatterPlotView() {
-      InitializeComponent();
-      pointsRowsTable = new Dictionary<IObservableList<Point2D<double>>, ScatterPlotDataRow>();
-      invisibleSeries = new List<Series>();
-      chart.CustomizeAllChartAreas();
-      chart.ChartAreas[0].CursorX.Interval = 1;
-    }
-
-    #region Event Handler Registration
-    protected override void DeregisterContentEvents() {
-      foreach (ScatterPlotDataRow row in Content.Rows)
-        DeregisterScatterPlotDataRowEvents(row);
-      Content.VisualPropertiesChanged -= new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset -= new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset);
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.VisualPropertiesChanged += new EventHandler(Content_VisualPropertiesChanged);
-      Content.Rows.ItemsAdded += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded);
-      Content.Rows.ItemsRemoved += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved);
-      Content.Rows.ItemsReplaced += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced);
-      Content.Rows.CollectionReset += new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset);
-    }
-
-    protected virtual void RegisterScatterPlotDataRowEvents(ScatterPlotDataRow row) {
-      row.NameChanged += new EventHandler(Row_NameChanged);
-      row.VisualPropertiesChanged += new EventHandler(Row_VisualPropertiesChanged);
-      pointsRowsTable.Add(row.Points, row);
-      row.Points.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded);
-      row.Points.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved);
-      row.Points.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced);
-      row.Points.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset);
-    }
-    protected virtual void DeregisterScatterPlotDataRowEvents(ScatterPlotDataRow row) {
-      row.Points.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded);
-      row.Points.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved);
-      row.Points.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced);
-      row.Points.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset);
-      pointsRowsTable.Remove(row.Points);
-      row.VisualPropertiesChanged -= new EventHandler(Row_VisualPropertiesChanged);
-      row.NameChanged -= new EventHandler(Row_NameChanged);
-    }
-    #endregion
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      invisibleSeries.Clear();
-      chart.ChartAreas[0].AxisX.Title = string.Empty;
-      chart.ChartAreas[0].AxisY.Title = string.Empty;
-      chart.Series.Clear();
-      if (Content != null) {
-        AddScatterPlotDataRows(Content.Rows);
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      chart.Enabled = Content != null;
-    }
-
-    public void ShowConfiguration() {
-      if (Content != null) {
-        using (ScatterPlotVisualPropertiesDialog dialog = new ScatterPlotVisualPropertiesDialog(Content)) {
-          dialog.ShowDialog(this);
-        }
-      } else MessageBox.Show("Nothing to configure.");
-    }
-
-    protected virtual void AddScatterPlotDataRows(IEnumerable<ScatterPlotDataRow> rows) {
-      foreach (var row in rows) {
-        RegisterScatterPlotDataRowEvents(row);
-        Series series = new Series(row.Name);
-        if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
-        else series.LegendText = row.Name;
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        chart.Series.Add(series);
-      }
-      ConfigureChartArea(chart.ChartAreas[0]);
-      RecalculateAxesScale(chart.ChartAreas[0]);
-      UpdateYCursorInterval();
-    }
-
-    protected virtual void RemoveScatterPlotDataRows(IEnumerable<ScatterPlotDataRow> rows) {
-      foreach (var row in rows) {
-        DeregisterScatterPlotDataRowEvents(row);
-        Series series = chart.Series[row.Name];
-        chart.Series.Remove(series);
-        if (invisibleSeries.Contains(series))
-          invisibleSeries.Remove(series);
-      }
-      RecalculateAxesScale(chart.ChartAreas[0]);
-    }
-
-    private void ConfigureSeries(Series series, ScatterPlotDataRow row) {
-      series.BorderWidth = 1;
-      series.BorderDashStyle = ChartDashStyle.Solid;
-      series.BorderColor = Color.Empty;
-
-      if (row.VisualProperties.Color != Color.Empty)
-        series.Color = row.VisualProperties.Color;
-      else series.Color = Color.Empty;
-      series.IsVisibleInLegend = row.VisualProperties.IsVisibleInLegend;
-      series.ChartType = SeriesChartType.FastPoint;
-      series.MarkerSize = row.VisualProperties.PointSize;
-      series.MarkerStyle = ConvertPointStyle(row.VisualProperties.PointStyle);
-      series.XAxisType = AxisType.Primary;
-      series.YAxisType = AxisType.Primary;
-
-      if (row.VisualProperties.DisplayName.Trim() != String.Empty) series.LegendText = row.VisualProperties.DisplayName;
-      else series.LegendText = row.Name;
-
-      string xAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.XAxisTitle)
-                      ? "X"
-                      : Content.VisualProperties.XAxisTitle;
-      string yAxisTitle = string.IsNullOrEmpty(Content.VisualProperties.YAxisTitle)
-                            ? "Y"
-                            : Content.VisualProperties.YAxisTitle;
-      series.ToolTip =
-        series.LegendText + Environment.NewLine +
-        xAxisTitle + " = " + "#VALX," + Environment.NewLine +
-        yAxisTitle + " = " + "#VAL";
-    }
-
-    private void ConfigureChartArea(ChartArea area) {
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisX.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisX.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisX.Title = Content.VisualProperties.XAxisTitle;
-      area.AxisX.MajorGrid.Enabled = Content.VisualProperties.XAxisGrid;
-
-      if (Content.VisualProperties.AxisTitleFont != null) area.AxisY.TitleFont = Content.VisualProperties.AxisTitleFont;
-      if (!Content.VisualProperties.AxisTitleColor.IsEmpty) area.AxisY.TitleForeColor = Content.VisualProperties.AxisTitleColor;
-      area.AxisY.Title = Content.VisualProperties.YAxisTitle;
-      area.AxisY.MajorGrid.Enabled = Content.VisualProperties.YAxisGrid;
-    }
-
-    private void RecalculateAxesScale(ChartArea area) {
-      // Reset the axes bounds so that RecalculateAxesScale() will assign new bounds
-      foreach (Axis a in area.Axes) {
-        a.Minimum = double.NaN;
-        a.Maximum = double.NaN;
-      }
-      area.RecalculateAxesScale();
-      area.AxisX.IsMarginVisible = false;
-
-      if (!Content.VisualProperties.XAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue)) area.AxisX.Minimum = Content.VisualProperties.XAxisMinimumFixedValue;
-      if (!Content.VisualProperties.XAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue)) area.AxisX.Maximum = Content.VisualProperties.XAxisMaximumFixedValue;
-      if (!Content.VisualProperties.YAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.YAxisMinimumFixedValue)) area.AxisY.Minimum = Content.VisualProperties.YAxisMinimumFixedValue;
-      if (!Content.VisualProperties.YAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.YAxisMaximumFixedValue)) area.AxisY.Maximum = Content.VisualProperties.YAxisMaximumFixedValue;
-      if (area.AxisX.Minimum >= area.AxisX.Maximum) area.AxisX.Maximum = area.AxisX.Minimum + 1;
-      if (area.AxisY.Minimum >= area.AxisY.Maximum) area.AxisY.Maximum = area.AxisY.Minimum + 1;
-    }
-
-    protected virtual void UpdateYCursorInterval() {
-      double interestingValuesRange = (
-        from series in chart.Series
-        where series.Enabled
-        let values = (from point in series.Points
-                      where !point.IsEmpty
-                      select point.YValues[0]).DefaultIfEmpty(1.0)
-        let range = values.Max() - values.Min()
-        where range > 0.0
-        select range
-        ).DefaultIfEmpty(1.0).Min();
-
-      double digits = (int)Math.Log10(interestingValuesRange) - 3;
-      double yZoomInterval = Math.Pow(10, digits);
-      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
-    }
-
-
-    public event EventHandler ChartDoubleClick {
-      add { chartDoubleClick += value; }
-      remove { chartDoubleClick -= value; }
-    }
-
-    #region Event Handlers
-    #region Content Event Handlers
-
-    private void Content_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_VisualPropertiesChanged), sender, e);
-      else {
-        ConfigureChartArea(chart.ChartAreas[0]);
-        RecalculateAxesScale(chart.ChartAreas[0]); // axes min/max could have changed
-      }
-    }
-    #endregion
-    #region Rows Event Handlers
-    private void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsAdded), sender, e);
-      else {
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsRemoved), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_ItemsReplaced), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.OldItems);
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    private void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<ScatterPlotDataRow> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<ScatterPlotDataRow>(Rows_CollectionReset), sender, e);
-      else {
-        RemoveScatterPlotDataRows(e.OldItems);
-        AddScatterPlotDataRows(e.Items);
-      }
-    }
-    #endregion
-    #region Row Event Handlers
-    private void Row_VisualPropertiesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_VisualPropertiesChanged), sender, e);
-      else {
-        ScatterPlotDataRow row = (ScatterPlotDataRow)sender;
-        Series series = chart.Series[row.Name];
-        series.Points.Clear();
-        ConfigureSeries(series, row);
-        FillSeriesWithRowValues(series, row);
-        RecalculateAxesScale(chart.ChartAreas[0]);
-      }
-    }
-    private void Row_NameChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Row_NameChanged), sender, e);
-      else {
-        ScatterPlotDataRow row = (ScatterPlotDataRow)sender;
-        chart.Series[row.Name].Name = row.Name;
-      }
-    }
-    #endregion
-    #region Points Event Handlers
-    private void Points_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsAdded), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsRemoved), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_ItemsReplaced), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    private void Points_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Point2D<double>>> e) {
-      if (InvokeRequired)
-        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<Point2D<double>>>(Points_CollectionReset), sender, e);
-      else {
-        ScatterPlotDataRow row = null;
-        pointsRowsTable.TryGetValue((IObservableList<Point2D<double>>)sender, out row);
-        if (row != null) {
-          Series rowSeries = chart.Series[row.Name];
-          if (!invisibleSeries.Contains(rowSeries)) {
-            rowSeries.Points.Clear();
-            FillSeriesWithRowValues(rowSeries, row);
-            RecalculateAxesScale(chart.ChartAreas[0]);
-            UpdateYCursorInterval();
-          }
-        }
-      }
-    }
-    #endregion
-    #endregion
-
-    #region Chart Event Handlers
-    private void chart_MouseDown(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem) {
-        ToggleSeriesVisible(result.Series);
-      }
-    }
-    private void chart_MouseMove(object sender, MouseEventArgs e) {
-      HitTestResult result = chart.HitTest(e.X, e.Y);
-      if (result.ChartElementType == ChartElementType.LegendItem)
-        this.Cursor = Cursors.Hand;
-      else
-        this.Cursor = Cursors.Default;
-    }
-    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
-      foreach (LegendItem legendItem in e.LegendItems) {
-        var series = chart.Series[legendItem.SeriesName];
-        if (series != null) {
-          bool seriesIsInvisible = invisibleSeries.Contains(series);
-          foreach (LegendCell cell in legendItem.Cells) {
-            cell.ForeColor = seriesIsInvisible ? Color.Gray : Color.Black;
-          }
-        }
-      }
-    }
-    #endregion
-
-    private void ToggleSeriesVisible(Series series) {
-      if (!invisibleSeries.Contains(series)) {
-        series.Points.Clear();
-        invisibleSeries.Add(series);
-      } else {
-        invisibleSeries.Remove(series);
-        if (Content != null) {
-
-          var row = (from r in Content.Rows
-                     where r.Name == series.Name
-                     select r).Single();
-          FillSeriesWithRowValues(series, row);
-          this.chart.Legends[series.Legend].ForeColor = Color.Black;
-          RecalculateAxesScale(chart.ChartAreas[0]);
-          UpdateYCursorInterval();
-        }
-      }
-    }
-
-    private void FillSeriesWithRowValues(Series series, ScatterPlotDataRow row) {
-      for (int i = 0; i < row.Points.Count; i++) {
-        var value = row.Points[i];
-        DataPoint point = new DataPoint();
-        if (IsInvalidValue(value.X) || IsInvalidValue(value.Y))
-          point.IsEmpty = true;
-        else {
-          point.XValue = value.X;
-          point.YValues = new double[] { value.Y };
-        }
-        series.Points.Add(point);
-      }
-    }
-
-    #region Helpers
-    private MarkerStyle ConvertPointStyle(ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle pointStyle) {
-      switch (pointStyle) {
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Circle:
-          return MarkerStyle.Circle;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Cross:
-          return MarkerStyle.Cross;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Diamond:
-          return MarkerStyle.Diamond;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Square:
-          return MarkerStyle.Square;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star4:
-          return MarkerStyle.Star4;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star5:
-          return MarkerStyle.Star5;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star6:
-          return MarkerStyle.Star6;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Star10:
-          return MarkerStyle.Star10;
-        case ScatterPlotDataRowVisualProperties.ScatterPlotDataRowPointStyle.Triangle:
-          return MarkerStyle.Triangle;
-        default:
-          return MarkerStyle.None;
-      }
-    }
-
-    protected static bool IsInvalidValue(double x) {
-      return double.IsNaN(x) || x < (double)decimal.MinValue || x > (double)decimal.MaxValue;
-    }
-    #endregion
-
-    //bubble double click event with scatter plot view as sender
-    private void chart_DoubleClick(object sender, EventArgs e) {
-      if (chartDoubleClick != null)
-        chartDoubleClick(this, e);
-    }
-  }
-}
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14445)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotMultiView.cs	(revision 14446)
@@ -5,7 +5,7 @@
 using System.Windows.Forms;
 using HeuristicLab.Analysis;
+using HeuristicLab.Analysis.Views;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
-using HeuristicLab.Core.Views;
 using HeuristicLab.Data;
 using HeuristicLab.MainForm;
@@ -18,5 +18,5 @@
     private readonly IDictionary<string, Label> columnHeaderCache;
     private readonly IDictionary<string, Label> rowHeaderCache;
-    private readonly IDictionary<Tuple<string/*col*/, string/*row*/>, ItemView> bodyCache;
+    private readonly IDictionary<Tuple<string/*col*/, string/*row*/>, Control> bodyCache;
 
     public ScatterPlotMultiView() {
@@ -43,5 +43,5 @@
       columnHeaderCache = new Dictionary<string, Label>();
       rowHeaderCache = new Dictionary<string, Label>();
-      bodyCache = new Dictionary<Tuple<string, string>, ItemView>();
+      bodyCache = new Dictionary<Tuple<string, string>, Control>();
 
       bodyScrollPanel.MouseWheel += bodyScrollPanel_MouseWheel;
@@ -249,5 +249,5 @@
       return rowHeaderCache[variable];
     }
-    private ItemView GetBody(string colVariable, string rowVariable) {
+    private Control GetBody(string colVariable, string rowVariable) {
       var key = Tuple.Create(colVariable, rowVariable);
       if (!bodyCache.ContainsKey(key)) {
@@ -266,14 +266,15 @@
           bodyCache.Add(key, pcv);
         } else { //scatter plot
-          ScatterPlot scatterPlot = Content.CreateScatterPlot(colVariable, rowVariable);
-          PreprocessingScatterPlotView pspv = new PreprocessingScatterPlotView {
+          var scatterPlot = Content.CreateScatterPlot(colVariable, rowVariable);
+          scatterPlot.VisualProperties.Title = string.Empty;
+          var scatterPlotControl = new /*Preprocessing*/ScatterPlotControl {
             Name = key.ToString(),
             Content = scatterPlot,
             Dock = DockStyle.Fill,
-            ShowLegend = false,
-            XAxisFormat = "G3"
+            //ShowLegend = false,
+            //XAxisFormat = "G3"
           };
-          pspv.ChartDoubleClick += ScatterPlotDoubleClick;
-          bodyCache.Add(key, pspv);
+          scatterPlotControl.DoubleClick += ScatterPlotDoubleClick; // ToDo: not working; double click is already handled by the chart
+          bodyCache.Add(key, scatterPlotControl);
         }
       }
@@ -344,7 +345,7 @@
     //Open scatter plot in new tab with new content when double clicked
     private void ScatterPlotDoubleClick(object sender, EventArgs e) {
-      PreprocessingScatterPlotView pspv = (PreprocessingScatterPlotView)sender;
+      var scatterPlotControl = (ScatterPlotControl)sender;
       ScatterPlotContent scatterContent = new ScatterPlotContent(Content, new Cloner());  // create new content
-      ScatterPlot scatterPlot = pspv.Content;
+      ScatterPlot scatterPlot = scatterPlotControl.Content;
 
       //Extract variable names from scatter plot and set them in content
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 14445)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.Designer.cs	(revision 14446)
@@ -45,27 +45,25 @@
     /// </summary>
     private void InitializeComponent() {
-      this.scatterPlotView = new HeuristicLab.DataPreprocessing.Views.PreprocessingScatterPlotView();
+      this.scatterPlotControl = new HeuristicLab.Analysis.Views.ScatterPlotControl();
       this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.label3 = new System.Windows.Forms.Label();
       this.label2 = new System.Windows.Forms.Label();
       this.label1 = new System.Windows.Forms.Label();
+      this.comboBoxColor = new System.Windows.Forms.ComboBox();
       this.comboBoxYVariable = new System.Windows.Forms.ComboBox();
       this.comboBoxXVariable = new System.Windows.Forms.ComboBox();
-      this.label3 = new System.Windows.Forms.Label();
-      this.comboBoxColor = new System.Windows.Forms.ComboBox();
       this.groupBox1.SuspendLayout();
       this.SuspendLayout();
       // 
-      // scatterPlotView
+      // scatterPlotControl
       // 
-      this.scatterPlotView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
+      this.scatterPlotControl.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.scatterPlotView.Caption = "ScatterPlot View";
-      this.scatterPlotView.Content = null;
-      this.scatterPlotView.Location = new System.Drawing.Point(169, 3);
-      this.scatterPlotView.Name = "scatterPlotView";
-      this.scatterPlotView.ReadOnly = false;
-      this.scatterPlotView.Size = new System.Drawing.Size(689, 509);
-      this.scatterPlotView.TabIndex = 0;
+      this.scatterPlotControl.Content = null;
+      this.scatterPlotControl.Location = new System.Drawing.Point(169, 3);
+      this.scatterPlotControl.Name = "scatterPlotControl";
+      this.scatterPlotControl.Size = new System.Drawing.Size(689, 509);
+      this.scatterPlotControl.TabIndex = 0;
       // 
       // groupBox1
@@ -83,4 +81,13 @@
       this.groupBox1.TabStop = false;
       this.groupBox1.Text = "Options";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(17, 141);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(31, 13);
+      this.label3.TabIndex = 3;
+      this.label3.Text = "Color";
       // 
       // label2
@@ -101,4 +108,15 @@
       this.label1.TabIndex = 2;
       this.label1.Text = "X Variable";
+      // 
+      // comboBoxColor
+      // 
+      this.comboBoxColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBoxColor.FormattingEnabled = true;
+      this.comboBoxColor.Location = new System.Drawing.Point(20, 164);
+      this.comboBoxColor.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
+      this.comboBoxColor.Name = "comboBoxColor";
+      this.comboBoxColor.Size = new System.Drawing.Size(121, 21);
+      this.comboBoxColor.TabIndex = 1;
+      this.comboBoxColor.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
       // 
       // comboBoxYVariable
@@ -124,24 +142,4 @@
       this.comboBoxXVariable.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
       // 
-      // label3
-      // 
-      this.label3.AutoSize = true;
-      this.label3.Location = new System.Drawing.Point(17, 141);
-      this.label3.Name = "label3";
-      this.label3.Size = new System.Drawing.Size(31, 13);
-      this.label3.TabIndex = 3;
-      this.label3.Text = "Color";
-      // 
-      // comboBoxColor
-      // 
-      this.comboBoxColor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.comboBoxColor.FormattingEnabled = true;
-      this.comboBoxColor.Location = new System.Drawing.Point(20, 164);
-      this.comboBoxColor.Margin = new System.Windows.Forms.Padding(3, 10, 3, 3);
-      this.comboBoxColor.Name = "comboBoxColor";
-      this.comboBoxColor.Size = new System.Drawing.Size(121, 21);
-      this.comboBoxColor.TabIndex = 1;
-      this.comboBoxColor.SelectedIndexChanged += new System.EventHandler(this.comboBox_SelectedIndexChanged);
-      // 
       // ScatterPlotSingleView
       // 
@@ -149,5 +147,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.Controls.Add(this.groupBox1);
-      this.Controls.Add(this.scatterPlotView);
+      this.Controls.Add(this.scatterPlotControl);
       this.Name = "ScatterPlotSingleView";
       this.Size = new System.Drawing.Size(863, 517);
@@ -160,5 +158,5 @@
     #endregion
 
-    private HeuristicLab.DataPreprocessing.Views.PreprocessingScatterPlotView scatterPlotView;
+    private HeuristicLab.Analysis.Views.ScatterPlotControl scatterPlotControl;
     private System.Windows.Forms.GroupBox groupBox1;
     private System.Windows.Forms.Label label2;
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 14445)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs	(revision 14446)
@@ -88,11 +88,15 @@
     private void UpdateScatterPlot() {
       if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxColor.SelectedItem != null) {
-        //get scatter plot with selected x and y variable
-        ScatterPlot scatterPlot = Content.CreateScatterPlot(
-          (string)comboBoxXVariable.SelectedItem,
-          (string)comboBoxYVariable.SelectedItem,
-          (string)comboBoxColor.SelectedItem);
-        scatterPlotView.Content = scatterPlot;
+        var xVariable = (string)comboBoxXVariable.SelectedItem;
+        var yVariable = (string)comboBoxYVariable.SelectedItem;
+        var colorVariable = (string)comboBoxColor.SelectedItem;
+        ScatterPlot scatterPlot = Content.CreateScatterPlot(xVariable, yVariable, colorVariable);
+        var vp = scatterPlot.VisualProperties;
+        vp.Title = string.Empty;
+        vp.XAxisTitle = xVariable;
+        vp.YAxisTitle = yVariable;
 
+        scatterPlotControl.Content = scatterPlot;
+        
         //save selected x and y variable in content
         this.Content.SelectedXVariable = (string)comboBoxXVariable.SelectedItem;
Index: /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs
===================================================================
--- /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 14445)
+++ /branches/DataPreprocessing Enhancements/HeuristicLab.DataPreprocessing/3.4/Content/ScatterPlotContent.cs	(revision 14446)
@@ -69,4 +69,5 @@
 
         ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY, "", points);
+        scdr.VisualProperties.IsVisibleInLegend = false;
         scatterPlot.Rows.Add(scdr);
 
