added paintBounds to LayerPainter; fixing viewport scrolling
diff --git a/NatTable/core.bnd b/NatTable/core.bnd
index 717ffbf..f45a7d1 100644
--- a/NatTable/core.bnd
+++ b/NatTable/core.bnd
@@ -1,4 +1,6 @@
-Export-Package: org.eclipse.nebula.widgets.nattable.core.data,\
+Export-Package: org.eclipse.nebula.widgets.nattable.core.command,\
+ org.eclipse.nebula.widgets.nattable.core.data,\
+ org.eclipse.nebula.widgets.nattable.core.event,\
org.eclipse.nebula.widgets.nattable.core.geometry,\
org.eclipse.nebula.widgets.nattable.core.graphics,\
org.eclipse.nebula.widgets.nattable.core.layer,\
diff --git a/NatTable/renderer.swt.bnd b/NatTable/renderer.swt.bnd
index 1c12c03..d7bc340 100644
--- a/NatTable/renderer.swt.bnd
+++ b/NatTable/renderer.swt.bnd
@@ -4,5 +4,5 @@
org.eclipse.nebula.widgets.nattable.renderer.swt.event.binding,\
org.eclipse.nebula.widgets.nattable.renderer.swt.event.matcher,\
org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode,\
- org.eclipse.nebula.widgets.nattable.renderer.swt.geometry,\
- org.eclipse.nebula.widgets.nattable.renderer.swt.graphics
\ No newline at end of file
+ org.eclipse.nebula.widgets.nattable.renderer.swt.graphics,\
+ org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/command/packageinfo
similarity index 100%
copy from NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo
copy to NatTable/src/org/eclipse/nebula/widgets/nattable/core/command/packageinfo
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/packageinfo
similarity index 100%
copy from NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo
copy to NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/packageinfo
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelArea.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelArea.xtend
deleted file mode 100644
index fe547bf..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelArea.xtend
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.core.geometry
-
-/**
- * Represents a two-dimensional pixel area.
- */
-interface PixelArea {
-
- def PixelRange getHorizontalPixelRange()
- def PixelRange getVerticalPixelRange()
-
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRangeImpl.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRangeImpl.xtend
new file mode 100644
index 0000000..de97a45
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRangeImpl.xtend
@@ -0,0 +1,9 @@
+package org.eclipse.nebula.widgets.nattable.core.geometry
+
+@Data
+class PixelRangeImpl implements PixelRange {
+
+ int start
+ int size
+
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerPainter.xtend
index 7648462..64ec2b7 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerPainter.xtend
@@ -1,13 +1,15 @@
package org.eclipse.nebula.widgets.nattable.core.layer
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
interface LayerPainter<T extends Layer> {
/**
* @param layer The layer to render.
+ * @param paintBounds The rectangular pixel area to paint into.
* @param gc The graphics context to render into.
*/
- def void paintLayer(T layer, GraphicsContext gc)
+ def void paintLayer(T layer, PixelRectangle paintBounds, GraphicsContext gc)
}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainter.xtend
index dd0d5aa..7e0d5d5 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainter.xtend
@@ -1,5 +1,6 @@
package org.eclipse.nebula.widgets.nattable.core.layer.impl
+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.Layer
import org.eclipse.nebula.widgets.nattable.core.layer.LayerPainter
@@ -15,7 +16,7 @@
// LayerPainter interface
- override paintLayer(Layer layer, GraphicsContext gc) {
+ override paintLayer(Layer layer, PixelRectangle paintBounds, GraphicsContext gc) {
// gc.clearRect(0, 0, canvas.boundsInLocal.width, canvas.boundsInLocal.height)
for (columnPosition : 0 ..< layer.getColumnCount)
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainter.xtend
index de3f8f8..07382fb 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainter.xtend
@@ -12,9 +12,9 @@
// LayerPainter interface
- override paintLayer(Layer layer, GraphicsContext gc) {
+ override paintLayer(Layer layer, PixelRectangle paintBounds, GraphicsContext gc) {
// Draw cells
- super.paintLayer(layer, gc)
+ super.paintLayer(layer, paintBounds, gc)
// Draw grid lines
drawGridLines(layer, gc)
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainter.xtend
index 830c496..6216376 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainter.xtend
@@ -12,24 +12,32 @@
@Inject extension PainterFactory
- override paintLayer(CompositeLayer compositeLayer, GraphicsContext gc) {
+ override paintLayer(CompositeLayer compositeLayer, PixelRectangle paintBounds, GraphicsContext gc) {
var yOffset = 0
- for (row : compositeLayer.rows) {
- var xOffset = 0
+ for (compositeRowPosition : 0 ..< compositeLayer.rows.size) {
+ val compositeRow = compositeLayer.rows.get(compositeRowPosition)
+ val isLastCompositeRow = compositeRowPosition == compositeLayer.rows.size - 1
- for (childLayer : row.childLayers) {
+ var xOffset = 0
+ for (compositeColumnPosition : 0 ..< compositeRow.childLayers.size) {
+ val childLayer = compositeRow.childLayers.get(compositeColumnPosition)
+ val isLastCompositeColumn = compositeColumnPosition == compositeRow.childLayers.size - 1
+
gc.pushState
gc.translate(xOffset, yOffset)
- if (childLayer.pixelWidth <= 0 || childLayer.pixelHeight <= 0)
- println("oh no!")
- gc.clipBounds = new PixelRectangle(0, 0, childLayer.pixelWidth, childLayer.pixelHeight)
- childLayer.layerPainter.paintLayer(childLayer, gc)
+
+ val pixelWidth = if (isLastCompositeColumn) paintBounds.x + paintBounds.width - xOffset else childLayer.pixelWidth
+ val pixelHeight = if (isLastCompositeRow) paintBounds.y + paintBounds.height - yOffset else childLayer.pixelHeight
+ val childPaintBounds = new PixelRectangle(0, 0, pixelWidth, pixelHeight)
+
+ gc.clipBounds = childPaintBounds
+ childLayer.layerPainter.paintLayer(childLayer, childPaintBounds, gc)
gc.popState
xOffset = xOffset + childLayer.pixelWidth
}
- yOffset = yOffset + row.childLayers.get(0).pixelHeight
+ yOffset = yOffset + compositeRow.childLayers.get(0).pixelHeight
}
}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
index 43453bc..6587455 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
@@ -51,10 +51,8 @@
}
def void handleResize() {
- println(visiblePixelRange)
-
// If the visible pixel size is greater than the content size, move origin to fill as much content as possible.
- val additionalSize = visiblePixelRange.end - underlyingAxis.pixelSize
+ val additionalSize = getVisiblePixelRange.end - underlyingAxis.pixelSize
if (additionalSize > 0)
pixelOrigin = Math::max(0, pixelOrigin - additionalSize)
}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
index d521ff3..94c9670 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
@@ -1,6 +1,7 @@
package org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRangeImpl
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.layer.Layer
import org.eclipse.nebula.widgets.nattable.core.layer.impl.AbstractLayer
@@ -24,9 +25,9 @@
verticalAxis = new ViewportAxis(underlyingLayer.verticalAxis, [| fireEvent(new ScrollEvent) ])
}
- def void setPixelArea(PixelArea pixelArea) {
- horizontalAxis.visiblePixelRange = pixelArea.horizontalPixelRange
- verticalAxis.visiblePixelRange = pixelArea.verticalPixelRange
+ def void setVisiblePixelRectangle(PixelRectangle visiblePixelRectangle) {
+ horizontalAxis.visiblePixelRange = new PixelRangeImpl(visiblePixelRectangle.x, visiblePixelRectangle.width)
+ verticalAxis.visiblePixelRange = new PixelRangeImpl(visiblePixelRectangle.y, visiblePixelRectangle.height)
}
def Layer getUnderlyingLayer() { underlyingLayer }
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
index d35ea7d..be221bd 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
@@ -2,6 +2,7 @@
import javafx.beans.value.ObservableValue
import javafx.scene.canvas.Canvas
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.layer.Layer
import org.eclipse.nebula.widgets.nattable.core.layer.impl.GridLineCellLayerPainter
import org.eclipse.nebula.widgets.nattable.renderer.javafx.graphics.JavaFXGraphicsContext
@@ -27,7 +28,8 @@
}
private def paintLayer() {
- layer.layerPainter.paintLayer(layer, new JavaFXGraphicsContext(this.graphicsContext2D))
+ val paintBounds = new PixelRectangle(boundsInLocal.minX as int, boundsInLocal.minY as int, boundsInLocal.width as int, boundsInLocal.height as int)
+ layer.layerPainter.paintLayer(layer, paintBounds, new JavaFXGraphicsContext(this.graphicsContext2D))
}
private def getLayerPainter(Layer layer) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
index 63afe90..ba6341c 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTNatTable.xtend
@@ -1,6 +1,7 @@
package org.eclipse.nebula.widgets.nattable.renderer.swt
import com.google.inject.Injector
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.graphics.PainterFactory
import org.eclipse.nebula.widgets.nattable.core.layer.Layer
import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.Mode
@@ -15,7 +16,7 @@
class SWTNatTable extends Canvas {
- static val int DEFAULT_STYLE_OPTIONS = SWT::NO_BACKGROUND.bitwiseOr(SWT::NO_REDRAW_RESIZE).bitwiseOr(SWT::DOUBLE_BUFFERED)
+ static val int DEFAULT_STYLE_OPTIONS = SWT::NO_BACKGROUND.bitwiseOr(SWT::DOUBLE_BUFFERED).bitwiseOr(SWT::NO_REDRAW_RESIZE)
extension Injector
extension PainterFactory
@@ -58,7 +59,8 @@
}
private def paintLayer(GC gc) {
- layer?.layerPainter?.paintLayer(layer, new SWTGraphicsContext(this, gc))
+ val paintBounds = new PixelRectangle(bounds.x, bounds.y, bounds.width, bounds.height)
+ layer?.layerPainter?.paintLayer(layer, paintBounds, new SWTGraphicsContext(this, gc))
}
}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlHorizontalPixelRange.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlHorizontalPixelRange.xtend
deleted file mode 100644
index ed573e9..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlHorizontalPixelRange.xtend
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.geometry
-
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRange
-import org.eclipse.swt.widgets.Control
-
-class SWTControlHorizontalPixelRange implements PixelRange {
-
- val Control control
-
- new(Control control) {
- this.control = control
- }
-
- override getStart() { control.bounds.x }
- override getSize() { control.bounds.width }
-
- override toString() {
- '''«class.name» start: «start», size: «size»'''
- }
-
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlPixelArea.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlPixelArea.xtend
deleted file mode 100644
index 060e742..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlPixelArea.xtend
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.geometry
-
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRange
-import org.eclipse.swt.widgets.Control
-
-class SWTControlPixelArea implements PixelArea {
-
- val Control control
- val PixelRange horizontalPixelRange
- val PixelRange verticalPixelRange
-
- new(Control control) {
- this.control = control
- horizontalPixelRange = new SWTControlHorizontalPixelRange(control)
- verticalPixelRange = new SWTControlVerticalPixelRange(control)
- }
-
- override getHorizontalPixelRange() { horizontalPixelRange }
- override getVerticalPixelRange() { verticalPixelRange }
-
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlVerticalPixelRange.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlVerticalPixelRange.xtend
deleted file mode 100644
index 9edf53d..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/SWTControlVerticalPixelRange.xtend
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.renderer.swt.geometry
-
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRange
-import org.eclipse.swt.widgets.Control
-
-class SWTControlVerticalPixelRange implements PixelRange {
-
- val Control control
-
- new(Control control) {
- this.control = control
- }
-
- override getStart() { control.bounds.y }
- override getSize() { control.bounds.height }
-
- override toString() {
- '''«class.name» start: «start», size: «size»'''
- }
-
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
index a40626f..351c042 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/graphics/SWTGraphicsContext.xtend
@@ -49,9 +49,8 @@
composite
}
- def getSWTGC() {
- gc
- }
+ def getXOffset() { xOffset }
+ def getYOffset() { yOffset }
// GraphicsContext interface
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
index fd6e8e1..f85ecb8 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
@@ -1,15 +1,16 @@
package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
+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.geometry.SWTControlPixelArea
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
+import org.eclipse.swt.widgets.Display
class SWTViewportLayerPainter implements LayerPainter<ViewportLayer> {
@@ -17,21 +18,18 @@
Canvas viewportCanvas
- override paintLayer(ViewportLayer viewportLayer, GraphicsContext gc) {
+ override paintLayer(ViewportLayer viewportLayer, PixelRectangle paintBounds, GraphicsContext gc) {
val swtGC = gc as SWTGraphicsContext
+ viewportLayer.visiblePixelRectangle = paintBounds
+
if (viewportCanvas == null) {
viewportCanvas = new Canvas(swtGC.SWTComposite, SWT::H_SCROLL.bitwiseOr(SWT::V_SCROLL))
-
- viewportLayer.pixelArea = new SWTControlPixelArea(viewportCanvas)
-
- // Event listener
-
- viewportLayer.addEventListener([ event | viewportCanvas.redraw ])
+ viewportCanvas.background = Display::getDefault.getSystemColor(SWT::COLOR_RED)
// Paint listener
- viewportCanvas.addPaintListener([ event | defaultPainter.paintLayer(viewportLayer, new SWTGraphicsContext(viewportCanvas, event.gc)) ])
+ viewportCanvas.addPaintListener([ event | defaultPainter.paintLayer(viewportLayer, paintBounds, new SWTGraphicsContext(viewportCanvas, event.gc)) ])
// ScrollBar handlers
@@ -56,8 +54,10 @@
])
}
- val clipBounds = swtGC.SWTGC.clipping
- viewportCanvas.bounds = new Rectangle(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height)
+ // Resize viewport canvas
+
+ val clipBounds = gc.clipBounds
+ viewportCanvas.bounds = new Rectangle(swtGC.getXOffset + clipBounds.x, swtGC.getYOffset + clipBounds.y, clipBounds.width, clipBounds.height)
}
}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/packageinfo
similarity index 100%
rename from NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/geometry/packageinfo
rename to NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/packageinfo