more fixes to ScrollBarHandler; SWT ScrollBar doesn't function properly
above 10 billion!
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
index 90a438e..f908fd2 100644
--- 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
@@ -9,6 +9,7 @@
import static org.mockito.Mockito.*
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
+import java.math.MathContext
@RunWith(typeof(MockitoJUnitRunner))
class ScrollBarHandlerRangeLargerThanIntTest extends AbstractScrollBarHandlerTest {
@@ -28,7 +29,7 @@
def void viewportAtBeginning() {
scrollBarHandler.recalculateScrollBarSize
- verify(scrollBar).maximum = Integer::MAX_VALUE
+ verify(scrollBar).maximum = ScrollBarHandler::MAX_SCROLL_SIZE
verify(scrollBar).thumb = 10
verify(scrollBar).increment = 1
verify(scrollBar).pageIncrement = 10
@@ -40,11 +41,11 @@
viewportAxis.pixelOrigin = new BigDecimal(200 * QUADRILLION - 1)
scrollBarHandler.recalculateScrollBarSize
- verify(scrollBar).maximum = Integer::MAX_VALUE
+ verify(scrollBar).maximum = ScrollBarHandler::MAX_SCROLL_SIZE
verify(scrollBar).thumb = 10
verify(scrollBar).increment = 1
verify(scrollBar).pageIncrement = 10
- verify(scrollBar).selection = Integer::MAX_VALUE - 10
+ verify(scrollBar).selection = ScrollBarHandler::MAX_SCROLL_SIZE - 10
}
@Test
@@ -52,7 +53,8 @@
when(scrollBar.selection).thenReturn(1)
scrollBarHandler.updateViewportOrigin
- assertEquals(new BigDecimal((1.0 / Integer::MAX_VALUE) * (200 * QUADRILLION)), viewportAxis.pixelOrigin)
+ val mathContext = new MathContext(15)
+ assertEquals(new BigDecimal((1.0 / (ScrollBarHandler::MAX_SCROLL_SIZE - 10)) * (200 * QUADRILLION - 500)).round(mathContext), viewportAxis.pixelOrigin.round(mathContext))
}
@Test
@@ -61,12 +63,6 @@
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
index 9231b7e..ece8eb0 100644
--- 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
@@ -54,12 +54,6 @@
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/ScrollBarHandler.xtend b/org.eclipse.nebula.widgets.nattable.renderer.swt/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
index f2ab635..34c9e3c 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
@@ -11,7 +11,8 @@
class ScrollBarHandler implements Listener {
- val static MAXINT = new BigDecimal(Integer::MAX_VALUE)
+ val public static MAX_SCROLL_SIZE = 10000000 // SWT ScrollBar doesn't function properly when the range is > 10 billion
+ val static BD_MAX_SCROLL_SIZE = new BigDecimal(MAX_SCROLL_SIZE)
//
@@ -43,37 +44,44 @@
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.
+ * Update the viewport origin from the scrollbar selection.
*/
- def private void recalculateScrollBarSize(boolean updateViewportOrigin) {
+ def void updateViewportOrigin() {
val visiblePixelSize = viewportAxis.visiblePixelSize
val maxPixelSize = viewportAxis.underlyingAxis.pixelSize
- val maxScrollSize = maxPixelSize.min(MAXINT)
+ val maxScrollSize = maxPixelSize.min(BD_MAX_SCROLL_SIZE)
val thumbSize = minThumbSize.max((visiblePixelSize / maxPixelSize) * maxScrollSize)
val intPerPixelRatio =
if (thumbSize / maxScrollSize < visiblePixelSize / maxPixelSize)
thumbSize / visiblePixelSize
else
- if (maxScrollSize + thumbSize < MAXINT)
+ if (maxScrollSize + thumbSize < BD_MAX_SCROLL_SIZE)
maxScrollSize / maxPixelSize
else
(maxScrollSize - thumbSize) / (maxPixelSize - visiblePixelSize)
- if (updateViewportOrigin) {
- println(scrollBar.selection)
- viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) / intPerPixelRatio
- }
+ viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) / intPerPixelRatio
+ }
+
+ /**
+ * Recalculate scrollbar values from viewport axis values.
+ */
+ def void recalculateScrollBarSize() {
+ val visiblePixelSize = viewportAxis.visiblePixelSize
+ val maxPixelSize = viewportAxis.underlyingAxis.pixelSize
+ val maxScrollSize = maxPixelSize.min(BD_MAX_SCROLL_SIZE)
+ val thumbSize = minThumbSize.max((visiblePixelSize / maxPixelSize) * maxScrollSize)
+
+ val intPerPixelRatio =
+ if (thumbSize / maxScrollSize < visiblePixelSize / maxPixelSize)
+ thumbSize / visiblePixelSize
+ else
+ if (maxScrollSize + thumbSize < BD_MAX_SCROLL_SIZE)
+ maxScrollSize / maxPixelSize
+ else
+ (maxScrollSize - thumbSize) / (maxPixelSize - visiblePixelSize)
val viewportOrigin = viewportAxis.pixelOrigin
@@ -87,7 +95,6 @@
scrollBar.increment = minIncrement.max((pixelIncrement * intPerPixelRatio).intValue)
scrollBar.selection = (viewportOrigin * intPerPixelRatio).intValue
- println('''«scrollBar.selection» = («viewportOrigin» * «intPerPixelRatio»).intValue''')
scrollBar.enabled = true
scrollBar.visible = true
@@ -97,8 +104,4 @@
}
}
-// 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