blob: f2ab635ee425b4097060b7c06d79fd19c4895b5e [file] [log] [blame]
package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
import java.math.BigDecimal
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 MAXINT = new BigDecimal(Integer::MAX_VALUE)
//
val ScrollBar scrollBar
val ViewportAxis viewportAxis
val BigDecimal minThumbSize
val int minIncrement
val int minPageIncrement
new(ScrollBar scrollBar, ViewportAxis viewportAxis) {
this.scrollBar = scrollBar
this.viewportAxis = viewportAxis
scrollBar.thumb = 0
scrollBar.increment = 0
scrollBar.pageIncrement = 0
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) {
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 maxPixelSize = viewportAxis.underlyingAxis.pixelSize
val maxScrollSize = maxPixelSize.min(MAXINT)
val thumbSize = minThumbSize.max((visiblePixelSize / maxPixelSize) * maxScrollSize)
val intPerPixelRatio =
if (thumbSize / maxScrollSize < visiblePixelSize / maxPixelSize)
thumbSize / visiblePixelSize
else
if (maxScrollSize + thumbSize < MAXINT)
maxScrollSize / maxPixelSize
else
(maxScrollSize - thumbSize) / (maxPixelSize - visiblePixelSize)
if (updateViewportOrigin) {
println(scrollBar.selection)
viewportAxis.pixelOrigin = new BigDecimal(scrollBar.selection) / intPerPixelRatio
}
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 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.enabled = false
scrollBar.visible = false
}
}
// def operator_divide(BigDecimal a, BigDecimal b) {
// a.divide(b, new MathContext(a.precision.max(b.precision), RoundingMode::CEILING))
// }
}