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