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 ])