test/fixes for ScrollBarHandler
diff --git a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/SmallLayerExample.xtend b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/SmallLayerExample.xtend
new file mode 100644
index 0000000..ce76964
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/SmallLayerExample.xtend
@@ -0,0 +1,37 @@
+package org.eclipse.nebula.widgets.nattable.core.example.impl
+
+import org.eclipse.nebula.widgets.nattable.core.example.impl.AbstractNatExample
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DimensionallyDependentLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DummyLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.LayerDataAccessorImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.composite.CompositeLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.ColumnHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.RowHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer
+
+class SmallLayerExample extends AbstractNatExample {
+
+ override getDescription() {
+ '''
+ A little grid with 4 columns and 4 rows
+ '''
+ }
+
+ override createLayer() {
+ val bodyLayer = new ViewportLayer(new DummyLayer(
+ new AxisImpl(4, 200), // Horizontal axis
+ new AxisImpl(4, 100) // Vertical axis
+ ))
+
+ val columnHeaderLayer = new ColumnHeaderLayer(bodyLayer.horizontalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | columnId ]))
+ val rowHeaderLayer = new RowHeaderLayer(bodyLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | rowId ]))
+ val cornerLayer = new DimensionallyDependentLayer(rowHeaderLayer.horizontalAxis, columnHeaderLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | "" ]))
+
+ new CompositeLayer => [
+ addRow(cornerLayer, columnHeaderLayer)
+ addRow(rowHeaderLayer, bodyLayer)
+ ]
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
index b844217..8b0c496 100644
--- a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
+++ b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
@@ -1,2 +1,3 @@
GridLayer=org.eclipse.nebula.widgets.nattable.core.example.impl.GridLayer
big=|Huge examples
+SmallLayerExample=org.eclipse.nebula.widgets.nattable.core.example.impl.SmallLayerExample
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
index 2ab40b5..681ed54 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
@@ -2,8 +2,6 @@
import java.math.BigDecimal
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
-
/**
* A set of useful utility functions that calculate invariants that must hold for any Axis.
*/
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
index b2754e5..a3c9932 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
@@ -5,7 +5,6 @@
import java.util.TreeMap
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
/**
* A simple Axis implementation.
@@ -89,7 +88,7 @@
override getSegmentPositionOfId(Serializable segmentId) {
if (segmentId != null)
- return segmentId as Long
+ return (segmentId as Number).longValue
else
return -1
}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
index 1b32633..0e09607 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
@@ -8,7 +8,6 @@
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
/**
* An axis that allows segments to be hidden and later shown again.
@@ -43,7 +42,7 @@
if (startPixel != null)
return startPixel
else {
- var aggregateSize = new BigDecimal(0.0)
+ var aggregateSize = BigDecimal::ZERO
for (position : 0 ..< segmentPosition) {
val segmentId = getIdOfSegmentPosition(position)
@@ -57,7 +56,7 @@
}
override getSegmentPositionOfPixelLocation(BigDecimal pixelLocation) {
- if (pixelLocation < new BigDecimal(0)) return -1
+ if (pixelLocation < BigDecimal::ZERO) return -1
for (segmentPosition : 0 .. segmentCount) {
val startPixel = getStartPixelOfSegmentPosition(segmentPosition)
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
index 03530d7..af95d0b 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
@@ -8,7 +8,6 @@
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
/**
* An axis that allows reordering of its segments.
@@ -52,7 +51,7 @@
if (startPixel != null)
return startPixel
else {
- var aggregateSize = new BigDecimal(0.0)
+ var aggregateSize = BigDecimal::ZERO
var position = 0L
while (position < segmentPosition) {
@@ -69,7 +68,7 @@
}
override getSegmentPositionOfPixelLocation(BigDecimal pixelLocation) {
- if (pixelLocation < new BigDecimal(0)) return -1
+ if (pixelLocation < BigDecimal::ZERO) return -1
var segmentPosition = 0L
while (segmentPosition <= segmentCount) {
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/cell/impl/TextCellPainter.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/cell/impl/TextCellPainter.xtend
index baac7cd..e52428f 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/cell/impl/TextCellPainter.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/cell/impl/TextCellPainter.xtend
@@ -8,7 +8,11 @@
class TextCellPainter implements CellPainter {
override paintCell(Cell cell, PixelArea cellPaintArea, GraphicsContext gc) {
- val text = cell.dataValue.toString
+ val text =
+ if (cell.dataValue != null)
+ cell.dataValue.toString
+ else
+ ""
val centerX = cellPaintArea.width.doubleValue / 2
val centerY = cellPaintArea.height.doubleValue / 2
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
index 1381f0c..f922df8 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
@@ -5,7 +5,6 @@
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
/**
* Represents the axis of a CompositeLayer, which is composed of an amalgamation of the axes of the CompsiteLayer's sublayers.
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
index 96fe6ea..5badd5c 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
@@ -6,7 +6,6 @@
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
-import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
class ViewportAxis extends AbstractAxis {
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/math/BigDecimalExtensions.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/math/BigDecimalExtensions.xtend
deleted file mode 100644
index 999c55c..0000000
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/math/BigDecimalExtensions.xtend
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.core.math
-
-import java.math.BigDecimal
-
-class BigDecimalExtensions {
-
- def static operator_lessThan(BigDecimal a, BigDecimal b) {
- a.compareTo(b) < 0
- }
-
- def static operator_lessEqualsThan(BigDecimal a, BigDecimal b) {
- a.compareTo(b) <= 0
- }
-
- def static operator_equals(BigDecimal a, BigDecimal b) {
- a.compareTo(b) == 0
- }
-
- def static operator_greaterThan(BigDecimal a, BigDecimal b) {
- a.compareTo(b) > 0
- }
-
- def static operator_greaterEqualsThan(BigDecimal a, BigDecimal b) {
- a.compareTo(b) >= 0
- }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.classpath b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.classpath
new file mode 100644
index 0000000..9938e7c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="xtend-gen"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.project b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.project
new file mode 100644
index 0000000..5d2c470
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.nebula.widgets.nattable.renderer.swt.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.core.resources.prefs b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b17a3f
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: NatTable SWT Renderer Test
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.renderer.swt.test
+Bundle-Version: 2.0.0.qualifier
+Fragment-Host: org.eclipse.nebula.widgets.nattable.renderer.swt;bundle-version="2.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.junit;bundle-version="4.10.0",
+ org.mockito.mockito-core;bundle-version="1.9.5",
+ com.springsource.org.objenesis;bundle-version="1.0.0"
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/build.properties b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/build.properties
new file mode 100644
index 0000000..d8e2f0e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/,\
+ xtend-gen/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/AbstractScrollBarHandlerTest.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/AbstractScrollBarHandlerTest.xtend
new file mode 100644
index 0000000..4b79de3
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/AbstractScrollBarHandlerTest.xtend
@@ -0,0 +1,48 @@
+package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
+
+import java.math.BigDecimal
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
+import org.eclipse.swt.widgets.ScrollBar
+import org.junit.Before
+
+import static org.junit.Assert.*
+import static org.mockito.Mockito.*
+
+abstract class AbstractScrollBarHandlerTest {
+
+ Axis underlyingAxis
+ protected ScrollBar scrollBar
+ protected ViewportAxis viewportAxis
+ protected ScrollBarHandler scrollBarHandler
+
+ new(long segmentCount, double defaultSegmentSize) {
+ this(segmentCount, new BigDecimal(defaultSegmentSize))
+ }
+
+ new(long segmentCount, BigDecimal defaultSegmentSize) {
+ underlyingAxis = new AxisImpl(segmentCount, defaultSegmentSize)
+ }
+
+ @Before
+ def void before() {
+ scrollBar = mock(typeof(ScrollBar))
+ when(scrollBar.thumb).thenReturn(10)
+ when(scrollBar.increment).thenReturn(1)
+ when(scrollBar.pageIncrement).thenReturn(10)
+
+ viewportAxis = new ViewportAxis(underlyingAxis, null)
+ viewportAxis.visiblePixelSize = 500
+
+ scrollBarHandler = new ScrollBarHandler(scrollBar, viewportAxis)
+
+ assertEquals(BigDecimal::TEN, scrollBarHandler.minThumbSize)
+ assertEquals(1, scrollBarHandler.minIncrement)
+ assertEquals(10, scrollBarHandler.minPageIncrement)
+
+ // ScrollBarHandler constructor makes calls on scrollBar. Reset scrollBar here so they do not interfere with test expectations.
+ reset(scrollBar)
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeLargerThanIntTest.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeLargerThanIntTest.xtend
new file mode 100644
index 0000000..90a438e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeLargerThanIntTest.xtend
@@ -0,0 +1,72 @@
+package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
+
+import java.math.BigDecimal
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.runners.MockitoJUnitRunner
+
+import static org.junit.Assert.*
+import static org.mockito.Mockito.*
+
+import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
+
+@RunWith(typeof(MockitoJUnitRunner))
+class ScrollBarHandlerRangeLargerThanIntTest extends AbstractScrollBarHandlerTest {
+
+ val static MILLION = 1000L * 1000
+ val static BILLION = 1000L * MILLION
+ val static TRILLION = 1000L * BILLION
+ val static QUADRILLION = 1000L * TRILLION
+
+ //
+
+ new() {
+ super(1 * QUADRILLION, 200)
+ }
+
+ @Test
+ def void viewportAtBeginning() {
+ scrollBarHandler.recalculateScrollBarSize
+
+ verify(scrollBar).maximum = Integer::MAX_VALUE
+ verify(scrollBar).thumb = 10
+ verify(scrollBar).increment = 1
+ verify(scrollBar).pageIncrement = 10
+ verify(scrollBar).selection = 0
+ }
+
+ @Test
+ def void viewportAtEnd() {
+ viewportAxis.pixelOrigin = new BigDecimal(200 * QUADRILLION - 1)
+ scrollBarHandler.recalculateScrollBarSize
+
+ verify(scrollBar).maximum = Integer::MAX_VALUE
+ verify(scrollBar).thumb = 10
+ verify(scrollBar).increment = 1
+ verify(scrollBar).pageIncrement = 10
+ verify(scrollBar).selection = Integer::MAX_VALUE - 10
+ }
+
+ @Test
+ def void moveViewportABit() {
+ when(scrollBar.selection).thenReturn(1)
+ scrollBarHandler.updateViewportOrigin
+
+ assertEquals(new BigDecimal((1.0 / Integer::MAX_VALUE) * (200 * QUADRILLION)), viewportAxis.pixelOrigin)
+ }
+
+ @Test
+ def void moveViewportToEnd() {
+ when(scrollBar.selection).thenReturn(Integer::MAX_VALUE - 10)
+ scrollBarHandler.updateViewportOrigin
+
+ assertTrue('''viewport origin «viewportAxis.pixelOrigin» + visible pixel size «viewportAxis.visiblePixelSize» should be >= underlying axis pixel size «viewportAxis.underlyingAxis.pixelSize»''', viewportAxis.pixelOrigin + viewportAxis.visiblePixelSize >= new BigDecimal(200 * QUADRILLION))
+
+ verify(scrollBar).maximum = Integer::MAX_VALUE
+ verify(scrollBar).thumb = 10
+ verify(scrollBar).increment = 1
+ verify(scrollBar).pageIncrement = 10
+ verify(scrollBar).selection = Integer::MAX_VALUE - 10
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeSmallerThanIntTest.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeSmallerThanIntTest.xtend
new file mode 100644
index 0000000..9231b7e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt.test/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandlerRangeSmallerThanIntTest.xtend
@@ -0,0 +1,65 @@
+package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
+
+import java.math.BigDecimal
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.runners.MockitoJUnitRunner
+
+import static org.junit.Assert.*
+import static org.mockito.Mockito.*
+
+import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
+
+@RunWith(typeof(MockitoJUnitRunner))
+class ScrollBarHandlerRangeSmallerThanIntTest extends AbstractScrollBarHandlerTest {
+
+ new() {
+ super(10, 200)
+ }
+
+ @Test
+ def void viewportAtBeginning() {
+ scrollBarHandler.recalculateScrollBarSize
+
+ verify(scrollBar).maximum = 2000 // axis pixel size
+ verify(scrollBar).thumb = 500 // visible pixel size
+ verify(scrollBar).increment = 125 // 1/4 of visible pixel size
+ verify(scrollBar).pageIncrement = 500
+ verify(scrollBar).selection = 0
+ }
+
+ @Test
+ def void viewportAtEnd() {
+ viewportAxis.pixelOrigin = 1999
+ scrollBarHandler.recalculateScrollBarSize
+
+ verify(scrollBar).maximum = 2000 // axis pixel size
+ verify(scrollBar).thumb = 500 // visible pixel size
+ verify(scrollBar).increment = 125 // 1/4 of visible pixel size
+ verify(scrollBar).pageIncrement = 500
+ verify(scrollBar).selection = 1999
+ }
+
+ @Test
+ def void moveViewportABit() {
+ when(scrollBar.selection).thenReturn(1)
+ scrollBarHandler.updateViewportOrigin
+
+ assertEquals(BigDecimal::ONE, viewportAxis.pixelOrigin)
+ }
+
+ @Test
+ def void moveViewportToEnd() {
+ when(scrollBar.selection).thenReturn(1990)
+ scrollBarHandler.updateViewportOrigin
+
+ assertTrue('''viewport origin «viewportAxis.pixelOrigin» + visible pixel size «viewportAxis.visiblePixelSize» should be >= underlying axis pixel size «viewportAxis.underlyingAxis.pixelSize»''', viewportAxis.pixelOrigin + viewportAxis.visiblePixelSize >= new BigDecimal(2000))
+
+ verify(scrollBar).maximum = 2000
+ verify(scrollBar).thumb = 500
+ verify(scrollBar).increment = 125
+ verify(scrollBar).pageIncrement = 500
+ verify(scrollBar).selection = 1990
+ }
+
+}
\ No newline at end of file
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 89e5164..a54c39c 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
@@ -48,16 +48,17 @@
// Resize listener
viewportCanvas.addListener(SWT::Resize, [ event |
+ println("resize!")
// Horizontal
viewportLayer.horizontalAxis.handleResize
+ horizontalScrollBarHandler.recalculateScrollBarSize
// Vertical
viewportLayer.verticalAxis.handleResize
+ verticalScrollBarHandler.recalculateScrollBarSize
])
resizeViewportCanvas(swtGC)
- horizontalScrollBarHandler.recalculateScrollBarSize
- verticalScrollBarHandler.recalculateScrollBarSize
} else
resizeViewportCanvas(swtGC)
}
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
index d34bc79..f2ab635 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
@@ -1,28 +1,26 @@
package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
import java.math.BigDecimal
-import java.math.MathContext
-import java.math.RoundingMode
import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
import org.eclipse.swt.widgets.Event
import org.eclipse.swt.widgets.Listener
import org.eclipse.swt.widgets.ScrollBar
+import static extension java.lang.Math.*
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
class ScrollBarHandler implements Listener {
- val static MAX_SCROLL_SIZE = new BigDecimal(Integer::MAX_VALUE)
+ val static MAXINT = new BigDecimal(Integer::MAX_VALUE)
//
val ScrollBar scrollBar
val ViewportAxis viewportAxis
- val BigDecimal minThumb
+ val BigDecimal minThumbSize
val int minIncrement
val int minPageIncrement
- val BigDecimal maxScrollSelection
new(ScrollBar scrollBar, ViewportAxis viewportAxis) {
this.scrollBar = scrollBar
@@ -32,45 +30,75 @@
scrollBar.increment = 0
scrollBar.pageIncrement = 0
- minThumb = new BigDecimal(scrollBar.thumb)
- minIncrement = scrollBar.increment
- minPageIncrement = scrollBar.pageIncrement
- maxScrollSelection = MAX_SCROLL_SIZE - minThumb
+ minThumbSize = new BigDecimal(1.max(scrollBar.thumb))
+ minIncrement = 1.max(scrollBar.increment)
+ minPageIncrement = 1.max(scrollBar.pageIncrement)
}
+
+ def getMinThumbSize() { minThumbSize }
+ def getMinIncrement() { minIncrement }
+ def getMinPageIncrement() { minPageIncrement }
override handleEvent(Event event) {
- val maxPixelOrigin = viewportAxis.underlyingAxis.pixelSize - viewportAxis.visiblePixelSize
- val maxPixelSize = maxPixelOrigin * (MAX_SCROLL_SIZE / maxScrollSelection)
- val intToPixel = BigDecimal::ONE.max(maxPixelSize.divide(MAX_SCROLL_SIZE, new MathContext(maxPixelSize.precision, RoundingMode::CEILING)))
- viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) * intToPixel
- recalculateScrollBarSize
+ updateViewportOrigin
}
-
+
+ def void updateViewportOrigin() {
+ recalculateScrollBarSize(true)
+ }
+
def void recalculateScrollBarSize() {
+ recalculateScrollBarSize(false)
+ }
+
+ /**
+ * Recalculate scrollbar values from viewport axis values. Optionally update the viewport origin from the scrollbar selection first.
+ * @param updateViewportOrigin Indicates whether or not to update the viewport origin.
+ */
+ def private void recalculateScrollBarSize(boolean updateViewportOrigin) {
val visiblePixelSize = viewportAxis.visiblePixelSize
- val maxPixelOrigin = viewportAxis.underlyingAxis.pixelSize - visiblePixelSize
+ val maxPixelSize = viewportAxis.underlyingAxis.pixelSize
+ val maxScrollSize = maxPixelSize.min(MAXINT)
+ val thumbSize = minThumbSize.max((visiblePixelSize / maxPixelSize) * maxScrollSize)
- val maxPixelSize = maxPixelOrigin * (MAX_SCROLL_SIZE / maxScrollSelection)
- val pixelToInt = BigDecimal::ONE.min(MAX_SCROLL_SIZE.divide(maxPixelSize, new MathContext(maxPixelSize.precision, RoundingMode::CEILING)))
+ val intPerPixelRatio =
+ if (thumbSize / maxScrollSize < visiblePixelSize / maxPixelSize)
+ thumbSize / visiblePixelSize
+ else
+ if (maxScrollSize + thumbSize < MAXINT)
+ maxScrollSize / maxPixelSize
+ else
+ (maxScrollSize - thumbSize) / (maxPixelSize - visiblePixelSize)
- scrollBar.maximum = (maxPixelSize * pixelToInt).intValue
- scrollBar.selection = (viewportAxis.pixelOrigin * pixelToInt).intValue
+ if (updateViewportOrigin) {
+ println(scrollBar.selection)
+ viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) / intPerPixelRatio
+ }
- if (visiblePixelSize < maxPixelSize && visiblePixelSize != 0) {
- scrollBar.thumb = minThumb.max(visiblePixelSize * pixelToInt).intValue
+ val viewportOrigin = viewportAxis.pixelOrigin
+
+ if (visiblePixelSize > BigDecimal::ZERO && viewportOrigin < maxPixelSize) {
+ scrollBar.maximum = maxScrollSize.intValue
+ scrollBar.thumb = thumbSize.intValue
+ scrollBar.pageIncrement = Math::max(minPageIncrement, thumbSize.intValue)
+
// Increment by size of segment 0 or 1/4 of visible pixel size, whichever is smaller
- val increment = viewportAxis.getPixelSizeOfSegmentPosition(0).min(viewportAxis.visiblePixelSize / new BigDecimal(4))
- scrollBar.increment = Math::max(minIncrement, increment.intValue)
- scrollBar.pageIncrement = Math::max(minPageIncrement, scrollBar.thumb)
+ val pixelIncrement = viewportAxis.getPixelSizeOfSegmentPosition(0).min(visiblePixelSize / new BigDecimal(4))
+ scrollBar.increment = minIncrement.max((pixelIncrement * intPerPixelRatio).intValue)
+
+ scrollBar.selection = (viewportOrigin * intPerPixelRatio).intValue
+ println('''«scrollBar.selection» = («viewportOrigin» * «intPerPixelRatio»).intValue''')
scrollBar.enabled = true
scrollBar.visible = true
} else {
- scrollBar.thumb = scrollBar.maximum
-
scrollBar.enabled = false
scrollBar.visible = false
}
}
+// def operator_divide(BigDecimal a, BigDecimal b) {
+// a.divide(b, new MathContext(a.precision.max(b.precision), RoundingMode::CEILING))
+// }
+
}
\ No newline at end of file