Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.Designer.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.Designer.cs	(revision 13075)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.Designer.cs	(revision 13076)
@@ -55,8 +55,4 @@
       this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.selectButton = new System.Windows.Forms.RadioButton();
-      this.moveButton = new System.Windows.Forms.RadioButton();
-      this.zoomInButton = new System.Windows.Forms.RadioButton();
-      this.zoomOutButton = new System.Windows.Forms.RadioButton();
       this.buttonPanel = new System.Windows.Forms.FlowLayoutPanel();
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
@@ -173,69 +169,6 @@
       this.saveFileDialog.Filter = "Bitmap (*.bmp)|*.bmp|JPEG (*.jpg)|*.jpg|EMF (*.emf)|*.emf|PNG (*.png)|*.png|GIF (" +
     "*.gif)|*.gif|TIFF (*.tif)|*.tif";
-      // 
-      // selectButton
-      // 
-      this.selectButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.selectButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Pointer;
-      this.selectButton.Location = new System.Drawing.Point(3, 3);
-      this.selectButton.Name = "selectButton";
-      this.selectButton.Size = new System.Drawing.Size(26, 24);
-      this.selectButton.TabIndex = 1;
-      this.selectButton.TabStop = true;
-      this.selectButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.toolTip.SetToolTip(this.selectButton, "Select");
-      this.selectButton.UseVisualStyleBackColor = true;
-      this.selectButton.CheckedChanged += new System.EventHandler(this.SelectButtonOnCheckedChanged);
-      // 
-      // moveButton
-      // 
-      this.moveButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.moveButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Breakpoint;
-      this.moveButton.Location = new System.Drawing.Point(3, 33);
-      this.moveButton.Name = "moveButton";
-      this.moveButton.Size = new System.Drawing.Size(26, 24);
-      this.moveButton.TabIndex = 1;
-      this.moveButton.TabStop = true;
-      this.moveButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.toolTip.SetToolTip(this.moveButton, "Move");
-      this.moveButton.UseVisualStyleBackColor = true;
-      this.moveButton.CheckedChanged += new System.EventHandler(this.MoveButtonOnCheckedChanged);
-      // 
-      // zoomInButton
-      // 
-      this.zoomInButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.zoomInButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ZoomIn;
-      this.zoomInButton.Location = new System.Drawing.Point(3, 63);
-      this.zoomInButton.Name = "zoomInButton";
-      this.zoomInButton.Size = new System.Drawing.Size(26, 24);
-      this.zoomInButton.TabIndex = 1;
-      this.zoomInButton.TabStop = true;
-      this.zoomInButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.toolTip.SetToolTip(this.zoomInButton, "Zoom In");
-      this.zoomInButton.UseVisualStyleBackColor = true;
-      this.zoomInButton.CheckedChanged += new System.EventHandler(this.ZoomInButtonOnCheckedChanged);
-      // 
-      // zoomOutButton
-      // 
-      this.zoomOutButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.zoomOutButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.ZoomOut;
-      this.zoomOutButton.Location = new System.Drawing.Point(3, 93);
-      this.zoomOutButton.Name = "zoomOutButton";
-      this.zoomOutButton.Size = new System.Drawing.Size(26, 24);
-      this.zoomOutButton.TabIndex = 1;
-      this.zoomOutButton.TabStop = true;
-      this.zoomOutButton.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-      this.toolTip.SetToolTip(this.zoomOutButton, "Zoom Out");
-      this.zoomOutButton.UseVisualStyleBackColor = true;
-      this.zoomOutButton.CheckedChanged += new System.EventHandler(this.ZoomOutButtonOnCheckedChanged);
-      // 
-      // buttonPanel
-      // 
       this.buttonPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
             | System.Windows.Forms.AnchorStyles.Left)));
-      this.buttonPanel.Controls.Add(this.selectButton);
-      this.buttonPanel.Controls.Add(this.moveButton);
-      this.buttonPanel.Controls.Add(this.zoomInButton);
-      this.buttonPanel.Controls.Add(this.zoomOutButton);
       this.buttonPanel.Location = new System.Drawing.Point(0, 0);
       this.buttonPanel.Name = "buttonPanel";
@@ -275,8 +208,4 @@
     protected System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
     protected System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
-    protected System.Windows.Forms.RadioButton selectButton;
-    protected System.Windows.Forms.RadioButton moveButton;
-    protected System.Windows.Forms.RadioButton zoomInButton;
-    protected System.Windows.Forms.RadioButton zoomOutButton;
     protected System.Windows.Forms.FlowLayoutPanel buttonPanel;
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs	(revision 13075)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartControl.cs	(revision 13076)
@@ -21,7 +21,7 @@
 
 using System;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Drawing;
-using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
 using System.Linq;
@@ -30,16 +30,12 @@
 namespace HeuristicLab.Visualization {
   public partial class ChartControl : UserControl {
-    public static readonly Cursor HandCursor = new Cursor(typeof(ChartControl), "Resources.Hand.cur");
-    public static readonly Cursor ZoomOutCursor = new Cursor(typeof(ChartControl), "Resources.ZoomOut.cur");
-    public static readonly Cursor ZoomInCursor = new Cursor(typeof(ChartControl), "Resources.ZoomIn.cur");
-
     protected Bitmap Picture;
     protected bool RenderingRequired;
-    protected Point ButtonDownPoint;
-    protected Point PreviousLocation;
-    protected int MouseClickCount;
+    protected Dictionary<Type, ChartMode> Modes = new Dictionary<Type, ChartMode>();
 
     protected bool SuppressEvents { get; set; }
     private bool SuppressRender { get; set; }
+
+    public PictureBox PictureBox { get { return pictureBox; } }
 
     private IChart chart;
@@ -78,6 +74,25 @@
       InitializeComponent();
       ScaleOnResize = true;
-      Mode = ChartMode.Select;
       Chart = defaultChart ?? new Chart(0, 0, Width, Height);
+    }
+
+    public void AddChartModes(params ChartMode[] chartModes) {
+      foreach (var chartMode in chartModes)
+        Modes.Add(chartMode.GetType(), chartMode);
+
+      RebuildButtonPanel();
+    }
+
+    protected virtual void RebuildButtonPanel() {
+      buttonPanel.Controls.Clear();
+
+      int locationY = 3;
+      foreach (var chartMode in Modes.Values) {
+        var rb = CreateChartModeRadioButton(chartMode);
+        rb.Location = new Point(3, locationY);
+        toolTip.SetToolTip(rb, chartMode.ToolTip);
+        buttonPanel.Controls.Add(rb);
+        locationY += rb.Height + rb.Margin.Vertical;
+      }
     }
 
@@ -92,12 +107,6 @@
 
     protected virtual void SetButtonCheckedSate() {
-      selectButton.Checked = false;
-      moveButton.Checked = false;
-      zoomInButton.Checked = false;
-      zoomOutButton.Checked = false;
-      if (mode == ChartMode.Select) selectButton.Checked = true;
-      else if (mode == ChartMode.Move) moveButton.Checked = true;
-      else if (mode == ChartMode.ZoomIn) zoomInButton.Checked = true;
-      else if (mode == ChartMode.ZoomOut) zoomOutButton.Checked = true;
+      foreach (var rb in buttonPanel.Controls.OfType<RadioButton>())
+        rb.Checked = rb.Tag == Mode;
     }
 
@@ -107,13 +116,7 @@
 
     protected virtual Cursor GetPictureBoxCursor() {
-      if (Mode == ChartMode.Select)
-        return DefaultCursor;
-      if (Mode == ChartMode.Move)
-        return HandCursor;
-      if (Mode == ChartMode.ZoomIn)
-        return ZoomInCursor;
-      if (Mode == ChartMode.ZoomOut)
-        return ZoomOutCursor;
-      return null;
+      if (mode == null) return null;
+
+      return mode.Cursor;
     }
 
@@ -150,61 +153,40 @@
 
     protected virtual void PictureBoxOnMouseClick(object sender, MouseEventArgs e) {
-
+      if (mode == null) return;
+      mode.HandleOnMouseClick(sender, e);
     }
 
     protected virtual void PictureBoxOnMouseDoubleClick(object sender, MouseEventArgs e) {
-
+      if (mode == null) return;
+      mode.HandleOnMouseDoubleClick(sender, e);
     }
 
     protected virtual void OnKeyDown(object sender, KeyEventArgs e) {
-      if (Mode == ChartMode.Select) {
-        if (e.KeyCode == Keys.Delete) {
-          try {
-            SuspendRendering();
-            foreach (var primitive in Chart.Group.SelectedPrimitives)
-              Chart.Group.Remove(primitive);
-          } finally { ResumeRendering(); }
-        }
-      }
+      if (mode == null) return;
+      mode.HandleOnKeyDown(sender, e);
     }
 
     protected virtual void OnKeyUp(object sender, KeyEventArgs e) {
-
+      if (mode == null) return;
+      mode.HandleOnKeyUp(sender, e);
     }
 
     protected virtual void PictureBoxOnMouseWheel(object sender, MouseEventArgs e) {
-
+      if (mode == null) return;
+      mode.HandleOnMouseWheel(sender, e);
     }
 
     protected virtual void PictureBoxOnMouseDown(object sender, MouseEventArgs e) {
-      if (Chart == null) return;
-      MouseClickCount = e.Clicks;
-      ButtonDownPoint = e.Location;
-      if (Mode != ChartMode.Select) return;
-
-      try {
-        SuspendRendering();
-        var worldLocation = Chart.TransformPixelToWorld(e.Location);
-        foreach (var sp in Chart.Group.SelectedPrimitives.Where(x => !x.ContainsPoint(worldLocation)))
-          sp.Selected = false;
-        var p = Chart.GetPrimitive(e.Location);
-        if (p != null) p.Selected = true;
-      } finally { ResumeRendering(); }
+      if (mode == null) return;
+      mode.HandleOnMouseDown(sender, e);
     }
 
     protected virtual void PictureBoxOnMouseUp(object sender, MouseEventArgs e) {
-      if (Chart == null) return;
-      if (e.Button == MouseButtons.Left) {
-        if (Mode == ChartMode.ZoomIn) {
-          //pictureBox.Refresh();
-          var lowerLeft = new Point(Math.Min(e.X, ButtonDownPoint.X), Math.Max(e.Y, ButtonDownPoint.Y));
-          var upperRight = new Point(Math.Max(e.X, ButtonDownPoint.X), Math.Min(e.Y, ButtonDownPoint.Y));
-          if ((lowerLeft.X != upperRight.X) && (lowerLeft.Y != upperRight.Y))
-            Chart.ZoomIn(lowerLeft, upperRight);
-          else Chart.ZoomIn(ButtonDownPoint);
-        } else if (Mode == ChartMode.ZoomOut) {
-          Chart.ZoomOut();
-        }
-      } else if (e.Button == MouseButtons.Right) {
+      if (mode == null) return;
+      mode.HandleOnMouseUp(sender, e);
+
+      if (Chart == null) return;
+
+      if (e.Button == MouseButtons.Right) {
         propertiesToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count() == 1;
         oneLayerUpToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count() == 1;
@@ -212,14 +194,4 @@
         intoForegroundToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count() == 1;
         intoBackgroundToolStripMenuItem.Enabled = Chart.Group.SelectedPrimitives.Count() == 1;
-      } else if (e.Button == MouseButtons.Middle) {
-        if (Mode == ChartMode.Select) {
-          try {
-            SuspendRendering();
-            foreach (var p in Chart.Group.SelectedPrimitives)
-              p.Selected = false;
-          } finally { ResumeRendering(); }
-        } else if (Mode == ChartMode.Move || Mode == ChartMode.ZoomIn || Mode == ChartMode.ZoomOut) {
-          Chart.Unzoom();
-        }
       }
     }
@@ -227,48 +199,14 @@
     protected virtual void PictureBoxOnMouseMove(object sender, MouseEventArgs e) {
       if (InvokeRequired) {
-        Invoke((Action<Object, MouseEventArgs>)PictureBoxOnMouseMove, sender, e);
-        return;
-      }
-      var toolTipText = Chart.GetToolTipText(e.Location);
-      if (toolTip.GetToolTip(pictureBox) != toolTipText) toolTip.SetToolTip(pictureBox, toolTipText);
-
-      Cursor cursor;
-      if (Mode == ChartMode.Select) {
-        cursor = Chart.GetCursor(e.Location) ?? GetPictureBoxCursor();
-      } else cursor = GetPictureBoxCursor();
-      SetPictureBoxCursor(cursor);
-
-      try {
-        if (e.Button == MouseButtons.None) return;
-
-        if (Mode == ChartMode.Select && e.Button == MouseButtons.Left) {
-          var previousWorldLocation = Chart.TransformPixelToWorld(PreviousLocation);
-          var worldLocation = Chart.TransformPixelToWorld(e.Location);
-          var offset = worldLocation - previousWorldLocation;
-          try {
-            SuspendRendering();
-            foreach (var primitive in Chart.Group.SelectedPrimitives.Where(p => p.ContainsPoint(previousWorldLocation)))
-              primitive.Move(previousWorldLocation, offset);
-          } finally { ResumeRendering(); }
-        } else if (Mode == ChartMode.Move) {
-          var previousWorldLocation = Chart.TransformPixelToWorld(PreviousLocation);
-          var worldLocation = Chart.TransformPixelToWorld(e.Location);
-          var offset = worldLocation - previousWorldLocation;
-          Chart.Move(new Offset(-1 * offset.DX, -1 * offset.DY));
-        } else if (Mode == ChartMode.ZoomIn && e.Button == MouseButtons.Left) {
-          pictureBox.Refresh();
-          using (var graphics = pictureBox.CreateGraphics()) {
-            using (var pen = new Pen(Color.Gray) { 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));
-            }
-          }
-        }
-      } finally {
-        PreviousLocation = e.Location;
-        pictureBox.Update();
+        Invoke((Action<object, MouseEventArgs>)PictureBoxOnMouseMove, sender, e);
+      } else {
+        var toolTipText = Chart.GetToolTipText(e.Location);
+        if (toolTip.GetToolTip(pictureBox) != toolTipText) toolTip.SetToolTip(pictureBox, toolTipText);
+
+        if (mode == null) return;
+
+        mode.HandleOnMouseMove(sender, e);
+
+        SetPictureBoxCursor(mode.Cursor);
       }
     }
@@ -276,12 +214,17 @@
     protected virtual void PictureBoxOnMouseEnter(object sender, EventArgs e) {
       if (InvokeRequired) {
-        Invoke((Action<Object, MouseEventArgs>)PictureBoxOnMouseEnter, sender, e);
+        Invoke((Action<object, MouseEventArgs>)PictureBoxOnMouseEnter, sender, e);
         return;
       }
       if (!Focused) this.pictureBox.Focus();
+
+      if (mode == null) return;
+
+      mode.HandleOnMouseEnter(sender, e);
     }
 
     protected virtual void PictureBoxOnMouseLeave(object sender, EventArgs e) {
-
+      if (mode == null) return;
+      mode.HandleOnMouseLeave(sender, e);
     }
 
@@ -292,4 +235,8 @@
       }
       if (!Focused) this.pictureBox.Focus();
+
+      if (mode == null) return;
+
+      mode.HandleOnClick(sender, e);
     }
     #endregion
@@ -392,23 +339,24 @@
     }
 
-    protected virtual void SelectButtonOnCheckedChanged(object sender, EventArgs e) {
-      if (selectButton.Checked) Mode = ChartMode.Select;
-    }
-
-    protected virtual void MoveButtonOnCheckedChanged(object sender, EventArgs e) {
-      if (moveButton.Checked) Mode = ChartMode.Move;
-    }
-
-    protected virtual void ZoomInButtonOnCheckedChanged(object sender, EventArgs e) {
-      if (zoomInButton.Checked) Mode = ChartMode.ZoomIn;
-    }
-
-    protected virtual void ZoomOutButtonOnCheckedChanged(object sender, EventArgs e) {
-      if (zoomOutButton.Checked) Mode = ChartMode.ZoomOut;
-    }
-
     private void ChartControl_Load(object sender, EventArgs e) {
       if (!SuppressRender) GenerateImage();
     }
+
+    #region Helpers
+    private RadioButton CreateChartModeRadioButton(ChartMode chartMode) {
+      var rb = new RadioButton {
+        Appearance = Appearance.Button,
+        Image = chartMode.Image,
+        Size = new Size(24, 24),
+        TabStop = true,
+        Tag = chartMode,
+        UseVisualStyleBackColor = true
+      };
+
+      rb.CheckedChanged += (sender, args) => { if (rb.Checked) Mode = chartMode; };
+
+      return rb;
+    }
+    #endregion
   }
 }
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs	(revision 13075)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartMode.cs	(revision 13076)
@@ -20,12 +20,43 @@
 #endregion
 
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
 namespace HeuristicLab.Visualization {
-  public class ChartMode {
-    protected ChartMode() { }
+  public abstract class ChartMode {
+    protected readonly ChartControl chartControl;
+    protected Cursor cursor;
+    protected Point buttonDownPoint;
+    protected Point previousLocation;
+    protected int mouseClickCount;
 
-    public static readonly ChartMode Select = new ChartMode();
-    public static readonly ChartMode Move = new ChartMode();
-    public static readonly ChartMode ZoomIn = new ChartMode();
-    public static readonly ChartMode ZoomOut = new ChartMode();
+    public abstract Image Image { get; }
+    public abstract string ToolTip { get; }
+
+    public virtual Cursor Cursor {
+      get { return cursor ?? (cursor = Cursors.Default); }
+    }
+
+    protected ChartMode(ChartControl control) {
+      chartControl = control;
+    }
+
+    public virtual void HandleOnKeyDown(object sender, KeyEventArgs e) { }
+    public virtual void HandleOnKeyUp(object sender, KeyEventArgs e) { }
+    public virtual void HandleOnMouseClick(object sender, MouseEventArgs e) { }
+    public virtual void HandleOnMouseDoubleClick(object sender, MouseEventArgs e) { }
+    public virtual void HandleOnMouseWheel(object sender, MouseEventArgs e) { }
+
+    public virtual void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      buttonDownPoint = e.Location;
+      mouseClickCount = e.Clicks;
+    }
+
+    public virtual void HandleOnMouseUp(object sender, MouseEventArgs e) { }
+    public virtual void HandleOnMouseMove(object sender, MouseEventArgs e) { }
+    public virtual void HandleOnMouseEnter(object sender, EventArgs e) { }
+    public virtual void HandleOnMouseLeave(object sender, EventArgs e) { }
+    public virtual void HandleOnClick(object sender, EventArgs e) { }
   }
 }
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/MoveChartMode.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/MoveChartMode.cs	(revision 13076)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/MoveChartMode.cs	(revision 13076)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Visualization {
+  public class MoveChartMode : ChartMode {
+    public override Image Image { get { return VSImageLibrary.Breakpoint; } }
+    public override string ToolTip { get { return "Move"; } }
+
+    public override Cursor Cursor {
+      get { return cursor ?? (cursor = new Cursor(typeof(ChartControl), "Resources.Hand.cur")); }
+    }
+
+    public MoveChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
+      base.HandleOnMouseUp(sender, e);
+
+      switch (e.Button) {
+        case MouseButtons.Middle:
+          chartControl.Chart.Unzoom();
+          break;
+      }
+    }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      base.HandleOnMouseMove(sender, e);
+
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var previousWorldLocation = chartControl.Chart.TransformPixelToWorld(previousLocation);
+            var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var offset = worldLocation - previousWorldLocation;
+            chartControl.Chart.Move(new Offset(-1 * offset.DX, -1 * offset.DY));
+            break;
+        }
+      } finally {
+        previousLocation = e.Location;
+        chartControl.PictureBox.Update();
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs	(revision 13076)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/SelectChartMode.cs	(revision 13076)
@@ -0,0 +1,101 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Visualization {
+  public class SelectChartMode : ChartMode {
+    public override Image Image { get { return VSImageLibrary.Pointer; } }
+    public override string ToolTip { get { return "Select"; } }
+
+    public SelectChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnKeyDown(object sender, KeyEventArgs e) {
+      base.HandleOnKeyDown(sender, e);
+
+      switch (e.KeyCode) {
+        case Keys.Delete:
+          if (e.KeyCode == Keys.Delete) {
+            try {
+              chartControl.SuspendRendering();
+              foreach (var primitive in chartControl.Chart.Group.SelectedPrimitives)
+                chartControl.Chart.Group.Remove(primitive);
+            } finally { chartControl.ResumeRendering(); }
+          }
+          break;
+      }
+    }
+
+    public override void HandleOnMouseDown(object sender, MouseEventArgs e) {
+      base.HandleOnMouseDown(sender, e);
+
+      try {
+        chartControl.SuspendRendering();
+        var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+        foreach (var sp in chartControl.Chart.Group.SelectedPrimitives.Where(x => !x.ContainsPoint(worldLocation)))
+          sp.Selected = false;
+        var p = chartControl.Chart.GetPrimitive(e.Location);
+        if (p != null) p.Selected = true;
+      } finally { chartControl.ResumeRendering(); }
+    }
+
+    public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
+      base.HandleOnMouseUp(sender, e);
+
+      switch (e.Button) {
+        case MouseButtons.Middle:
+          try {
+            chartControl.SuspendRendering();
+            foreach (var p in chartControl.Chart.Group.SelectedPrimitives)
+              p.Selected = false;
+          } finally { chartControl.ResumeRendering(); }
+          break;
+      }
+    }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      base.HandleOnMouseMove(sender, e);
+
+      try {
+        cursor = chartControl.Chart.GetCursor(e.Location);
+
+        switch (e.Button) {
+          case MouseButtons.Left:
+            var previousWorldLocation = chartControl.Chart.TransformPixelToWorld(previousLocation);
+            var worldLocation = chartControl.Chart.TransformPixelToWorld(e.Location);
+            var offset = worldLocation - previousWorldLocation;
+            try {
+              chartControl.SuspendRendering();
+              foreach (var primitive in chartControl.Chart.Group.SelectedPrimitives.Where(p => p.ContainsPoint(previousWorldLocation)))
+                primitive.Move(previousWorldLocation, offset);
+            } finally { chartControl.ResumeRendering(); }
+            break;
+        }
+      } finally {
+        previousLocation = e.Location;
+        chartControl.PictureBox.Update();
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs	(revision 13076)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomInChartMode.cs	(revision 13076)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Visualization {
+  public class ZoomInChartMode : ChartMode {
+    public override Image Image { get { return VSImageLibrary.ZoomIn; } }
+    public override string ToolTip { get { return "Zoom In"; } }
+
+    public override Cursor Cursor {
+      get { return cursor ?? (cursor = new Cursor(typeof(ChartControl), "Resources.ZoomIn.cur")); }
+    }
+
+    public ZoomInChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
+      base.HandleOnMouseUp(sender, e);
+
+      switch (e.Button) {
+        case MouseButtons.Left:
+          var lowerLeft = new Point(Math.Min(e.X, buttonDownPoint.X), Math.Max(e.Y, buttonDownPoint.Y));
+          var upperRight = new Point(Math.Max(e.X, buttonDownPoint.X), Math.Min(e.Y, buttonDownPoint.Y));
+          if ((lowerLeft.X != upperRight.X) && (lowerLeft.Y != upperRight.Y))
+            chartControl.Chart.ZoomIn(lowerLeft, upperRight);
+          else chartControl.Chart.ZoomIn(buttonDownPoint);
+          break;
+        case MouseButtons.Middle:
+          chartControl.Chart.Unzoom();
+          break;
+      }
+    }
+
+    public override void HandleOnMouseMove(object sender, MouseEventArgs e) {
+      base.HandleOnMouseMove(sender, e);
+
+      try {
+        switch (e.Button) {
+          case MouseButtons.Left:
+            chartControl.PictureBox.Refresh();
+            using (var graphics = chartControl.PictureBox.CreateGraphics())
+            using (var pen = new Pen(Color.Gray) { 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));
+            }
+            break;
+        }
+      } finally {
+        previousLocation = e.Location;
+        chartControl.PictureBox.Update();
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs	(revision 13076)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/ChartModes/ZoomOutChartMode.cs	(revision 13076)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+
+namespace HeuristicLab.Visualization {
+  public class ZoomOutChartMode : ChartMode {
+    public override Image Image { get { return VSImageLibrary.ZoomOut; } }
+    public override string ToolTip { get { return "Zoom Out"; } }
+
+    public override Cursor Cursor {
+      get { return cursor ?? (cursor = new Cursor(typeof(ChartControl), "Resources.ZoomOut.cur")); }
+    }
+
+    public ZoomOutChartMode(ChartControl control) : base(control) { }
+
+    public override void HandleOnMouseUp(object sender, MouseEventArgs e) {
+      base.HandleOnMouseUp(sender, e);
+
+      switch (e.Button) {
+        case MouseButtons.Left:
+          chartControl.Chart.ZoomOut();
+          break;
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/HeuristicLab.Visualization-3.3.csproj
===================================================================
--- branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/HeuristicLab.Visualization-3.3.csproj	(revision 13075)
+++ branches/HeuristicLab.Visualization/HeuristicLab.Visualization/3.3/HeuristicLab.Visualization-3.3.csproj	(revision 13076)
@@ -130,4 +130,5 @@
     <Compile Include="ChartMode.cs" />
     <Compile Include="AxisType.cs" />
+    <Compile Include="ChartModes\MoveChartMode.cs" />
     <Compile Include="Primitives\Grid.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
@@ -136,4 +137,5 @@
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <Compile Include="ChartModes\SelectChartMode.cs" />
     <Compile Include="Trees\LayoutEngines\BoxesLayoutEngine.cs" />
     <Compile Include="Trees\LayoutEngines\ILayoutEngine.cs" />
@@ -142,4 +144,6 @@
     <Compile Include="Trees\VisualTreeNode.cs" />
     <Compile Include="Trees\VisualTreeNodeConnection.cs" />
+    <Compile Include="ChartModes\ZoomInChartMode.cs" />
+    <Compile Include="ChartModes\ZoomOutChartMode.cs" />
     <None Include="Plugin.cs.frame" />
     <Compile Include="Plugin.cs" />
