modeSwitcher listenTo viewportCanvas
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
index 381fe01..5ff55e0 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
@@ -1,25 +1,27 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt
-
-import com.google.inject.Injector
-import javax.inject.Inject
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
-import org.eclipse.nebula.widgets.nattable.core.graphics.LayerPainterFactory
-import org.eclipse.nebula.widgets.nattable.core.layer.Layer
-import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.Mode
-import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.ModeSwitcher
-import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.NormalMode
-import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext
-import org.eclipse.swt.SWT
-import org.eclipse.swt.graphics.GC
-import org.eclipse.swt.widgets.Canvas
-import org.eclipse.swt.widgets.Composite
-
+package org.eclipse.nebula.widgets.nattable.renderer.swt

+

+import com.google.inject.Injector

+import javax.inject.Inject

+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea

+import org.eclipse.nebula.widgets.nattable.core.graphics.LayerPainterFactory

+import org.eclipse.nebula.widgets.nattable.core.layer.Layer

+import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.Mode

+import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.ModeSwitcher

+import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.NormalMode

+import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext

+import org.eclipse.swt.SWT

+import org.eclipse.swt.graphics.GC

+import org.eclipse.swt.widgets.Canvas

+import org.eclipse.swt.widgets.Composite

+

 class SWTNatTable extends Canvas {
 
 	static val int DEFAULT_STYLE_OPTIONS = SWT::NO_BACKGROUND.bitwiseOr(SWT::DOUBLE_BUFFERED).bitwiseOr(SWT::NO_REDRAW_RESIZE)
 	
 	@Inject extension Injector
 	@Inject extension LayerPainterFactory
+	
+	@Inject ModeSwitcher modeSwitcher
 
 	Layer layer
 
@@ -28,7 +30,7 @@
 	}
 
 	new(Composite parent, int style) {
-		super(parent, style)
+		super(parent, style)

 	}
 	
 	def Layer getLayer() { layer }
@@ -42,15 +44,15 @@
 		// Paint listener
 		addPaintListener([ event | paintLayer(event.gc) ])
 		
-		// Init mode switcher
-		val modeSwitcher = new ModeSwitcher(this)
+		// Init mode switcher

 		modeSwitcher.registerMode(Mode::NORMAL, getInstance(typeof(NormalMode)))
 		modeSwitcher.switchToMode(Mode::NORMAL)
+		modeSwitcher.listenTo(this)

 	}
 	
 	def private paintLayer(GC swtGC) {
 		val paintArea = new PixelArea(bounds.width, bounds.height)
-		val gc = new SWTGraphicsContext(this, swtGC)
+		val gc = new SWTGraphicsContext(swtGC, this, modeSwitcher)
 		layer?.layerPainter?.paintLayer(layer, paintArea, gc)
 	}
 	
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/event/mode/ModeSwitcher.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/event/mode/ModeSwitcher.xtend
index fadda8b..94bf812 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/event/mode/ModeSwitcher.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/event/mode/ModeSwitcher.xtend
@@ -1,28 +1,28 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode
-
-import java.util.Map
-import org.eclipse.swt.events.FocusEvent
-import org.eclipse.swt.events.FocusListener
-import org.eclipse.swt.events.KeyEvent
-import org.eclipse.swt.events.KeyListener
-import org.eclipse.swt.events.MouseEvent
-import org.eclipse.swt.events.MouseListener
-import org.eclipse.swt.events.MouseMoveListener
-import org.eclipse.swt.widgets.Control
-
+package org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode

+

+import java.util.Map

+import org.eclipse.swt.events.FocusEvent

+import org.eclipse.swt.events.FocusListener

+import org.eclipse.swt.events.KeyEvent

+import org.eclipse.swt.events.KeyListener

+import org.eclipse.swt.events.MouseEvent

+import org.eclipse.swt.events.MouseListener

+import org.eclipse.swt.events.MouseMoveListener

+import org.eclipse.swt.widgets.Control

+

 /**
  * Modal event handler for NatTable. This class acts as a proxy event listener.
  * It manages a set of IModeEventHandler instances which control the actual
  * event handling for a given mode. This allows the event handling behavior for
  * different modes to be grouped together and isolated from each other.
- */
+ */

 class ModeSwitcher implements KeyListener, MouseListener, MouseMoveListener, FocusListener {
 
 	val Map<String, Mode> modalEventHandlerMap = newHashMap
 
 	Mode currentMode
 
-	new(Control control) {
+	def listenTo(Control control) {

 		control.addKeyListener(this)
 		control.addMouseListener(this)
 		control.addMouseMoveListener(this)
@@ -62,22 +62,22 @@
 
 	// KeyListener interface
 
-	override keyPressed(KeyEvent event) { currentMode.keyPressed(event) }
-	override keyReleased(KeyEvent event) { currentMode.keyReleased(event) }
+	override keyPressed(KeyEvent event) { currentMode?.keyPressed(event) }
+	override keyReleased(KeyEvent event) { currentMode?.keyReleased(event) }
 
 	// MouseListener interface
 
-	override mouseDoubleClick(MouseEvent event) { currentMode.mouseDoubleClick(event) }
-	override mouseDown(MouseEvent event) { currentMode.mouseDown(event) }
-	override mouseUp(MouseEvent event) { currentMode.mouseUp(event) }
+	override mouseDoubleClick(MouseEvent event) { currentMode?.mouseDoubleClick(event) }
+	override mouseDown(MouseEvent event) { currentMode?.mouseDown(event) }
+	override mouseUp(MouseEvent event) { currentMode?.mouseUp(event) }
 	
 	// MouseMotionListener interface
 	
-	override mouseMove(MouseEvent event) { currentMode.mouseMove(event) }
+	override mouseMove(MouseEvent event) { currentMode?.mouseMove(event) }
 
 	// FocusListener interface
 
-	override focusGained(FocusEvent event) { currentMode.focusGained(event) }
-	override focusLost(FocusEvent event) { currentMode.focusLost(event) }
+	override focusGained(FocusEvent event) { currentMode?.focusGained(event) }
+	override focusLost(FocusEvent event) { currentMode?.focusLost(event) }
 
 }
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
index 8681029..63150d5 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
@@ -1,17 +1,18 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.graphics
-
-import java.util.Map
-import java.util.Stack
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
-import org.eclipse.nebula.widgets.nattable.core.graphics.Color
-import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
-import org.eclipse.swt.SWT
-import org.eclipse.swt.graphics.GC
-import org.eclipse.swt.graphics.Rectangle
-import org.eclipse.swt.widgets.Composite
-
-import static org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.GraphicsPropertiesEnum.*
-
+package org.eclipse.nebula.widgets.nattable.renderer.swt.graphics

+

+import java.util.Map

+import java.util.Stack

+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle

+import org.eclipse.nebula.widgets.nattable.core.graphics.Color

+import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext

+import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.ModeSwitcher

+import org.eclipse.swt.SWT

+import org.eclipse.swt.graphics.GC

+import org.eclipse.swt.graphics.Rectangle

+import org.eclipse.swt.widgets.Composite

+

+import static org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.GraphicsPropertiesEnum.*

+

 /**
  * Proxy implementation of {@link IGraphicsContext} to provide the drawing
  * capabilities by {@link GC} so the NatTable can be painted using this.
@@ -21,11 +22,12 @@
  */
 class SWTGraphicsContext implements GraphicsContext {
 	
-	val Composite composite
 	/**
 	 * The SWT {@link GC} which is proxied by this implementation.
 	 */
 	val GC gc
+	val Composite composite
+	val ModeSwitcher modeSwitcher
 	val stateStack = new Stack<Map<GraphicsPropertiesEnum, Object>>
 	
 	Map<GraphicsPropertiesEnum, Object> originalState = newHashMap
@@ -38,16 +40,16 @@
 	 * Create a new proxy instance for the specified {@link GC}.
 	 * @param gc The SWT {@link GC} which is proxied by this implementation.
 	 */
-	new(Composite composite, GC gc) {
-		if (composite == null) throw new IllegalArgumentException("composite can not be null"); //$NON-NLS-1$
+	new(GC gc, Composite composite, ModeSwitcher modeSwitcher) {
 		if (gc == null) throw new IllegalArgumentException("gc can not be null"); //$NON-NLS-1$
-		this.composite = composite
+		if (composite == null) throw new IllegalArgumentException("composite can not be null"); //$NON-NLS-1$
 		this.gc = gc
+		this.composite = composite
+		this.modeSwitcher = modeSwitcher
 	}
 	
-	def getSWTComposite() {
-		composite
-	}
+	def getSWTComposite() { composite }

+	def getModeSwitcher() { modeSwitcher }
 	
 	def getXOffset() { xOffset }
 	def getYOffset() { yOffset }
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
index 4597bc8..774f3cc 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
@@ -1,18 +1,18 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
-
-import java.util.HashMap
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
-import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
-import org.eclipse.nebula.widgets.nattable.core.layer.LayerPainter
-import org.eclipse.nebula.widgets.nattable.core.layer.impl.GridLineCellLayerPainter
-import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
-import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer
-import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext
-import org.eclipse.swt.SWT
-import org.eclipse.swt.graphics.Rectangle
-import org.eclipse.swt.widgets.Canvas
-
+package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport

+

+import java.util.HashMap

+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea

+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle

+import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext

+import org.eclipse.nebula.widgets.nattable.core.layer.LayerPainter

+import org.eclipse.nebula.widgets.nattable.core.layer.impl.GridLineCellLayerPainter

+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis

+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer

+import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext

+import org.eclipse.swt.SWT

+import org.eclipse.swt.graphics.Rectangle

+import org.eclipse.swt.widgets.Canvas

+

 class SWTViewportLayerPainter implements LayerPainter<ViewportLayer> {
 	
 	val defaultPainter = new GridLineCellLayerPainter
@@ -36,6 +36,7 @@
 	def private createViewportCanvas(ViewportLayer viewportLayer, SWTGraphicsContext swtGC) {
 		val viewportCanvas = new Canvas(swtGC.SWTComposite, SWT::H_SCROLL.bitwiseOr(SWT::V_SCROLL))
 		viewportLayerToCanvasMap.put(viewportLayer, viewportCanvas)
+		swtGC.modeSwitcher.listenTo(viewportCanvas)

 		
 		// Dispose listener
 		viewportCanvas.addDisposeListener([ viewportLayerToCanvasMap.remove(viewportLayer) ])
@@ -43,7 +44,7 @@
 		// Paint listener
 		viewportCanvas.addPaintListener([ event |
 			val swtBounds = viewportCanvas.bounds
-			defaultPainter.paintLayer(viewportLayer, new PixelArea(swtBounds.width, swtBounds.height), new SWTGraphicsContext(viewportCanvas, event.gc))
+			defaultPainter.paintLayer(viewportLayer, new PixelArea(swtBounds.width, swtBounds.height), new SWTGraphicsContext(event.gc, viewportCanvas, swtGC.modeSwitcher))
 		])
 		
 		viewportLayer.addEventListener([ event | viewportCanvas.redraw ])