blob: 54cdcd97e2f78786cb9de9fcbdf85e642df8b457 [file] [log] [blame]
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.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
val viewportLayerToCanvasMap = new HashMap<ViewportLayer, Canvas>
/**
* Constructs an SWT Canvas object onto which the ViewportLayer is painted. The same Canvas instance will always be returned
* when called with the same ViewportLayer instance. Different ViewportLayer instances will return different Canvas instances.
*/
override paintLayer(ViewportLayer viewportLayer, PixelArea layerPaintArea, GraphicsContext gc) {
viewportLayer.visiblePixelRectangle = new PixelRectangle(0, 0, layerPaintArea.width, layerPaintArea.height)
val swtGC = gc as SWTGraphicsContext
val viewportCanvas = viewportLayerToCanvasMap.get(viewportLayer) ?: viewportLayer.createViewportCanvas(swtGC)
val clipBounds = swtGC.clipBounds
viewportCanvas.bounds = new Rectangle((swtGC.getXOffset + clipBounds.x) as int, (swtGC.getYOffset + clipBounds.y) as int, clipBounds.width.intValue, clipBounds.height.intValue)
}
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) ])
// Paint listener
viewportCanvas.addPaintListener([ event |
val swtBounds = viewportCanvas.bounds
defaultPainter.paintLayer(viewportLayer, new PixelArea(swtBounds.width, swtBounds.height), new SWTGraphicsContext(event.gc, viewportCanvas, swtGC.modeSwitcher))
])
viewportLayer.addEventListener([ event | viewportCanvas.redraw ])
// ScrollBar handlers
val horizontalScrollBarHandler = new ScrollBarHandler(viewportCanvas.horizontalBar, viewportLayer.horizontalAxis)
val verticalScrollBarHandler = new ScrollBarHandler(viewportCanvas.verticalBar, viewportLayer.verticalAxis)
viewportCanvas.horizontalBar.addListener(SWT::Selection, horizontalScrollBarHandler)
viewportCanvas.verticalBar.addListener(SWT::Selection, verticalScrollBarHandler)
viewportCanvas.horizontalBar.addDisposeListener([ viewportCanvas.horizontalBar.removeListener(SWT::Selection, horizontalScrollBarHandler) ])
viewportCanvas.verticalBar.addDisposeListener([ viewportCanvas.verticalBar.removeListener(SWT::Selection, verticalScrollBarHandler) ])
// Resize listener
viewportCanvas.addListener(SWT::Resize, [ event |
// Horizontal
viewportLayer.horizontalAxis.handleResize
horizontalScrollBarHandler.recalculateScrollBarSize
// Vertical
viewportLayer.verticalAxis.handleResize
verticalScrollBarHandler.recalculateScrollBarSize
])
viewportCanvas
}
}