blob: d34bc792c22412255f04cabcc590cde90b18910a [file] [log] [blame]
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 org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
class ScrollBarHandler implements Listener {
val static MAX_SCROLL_SIZE = new BigDecimal(Integer::MAX_VALUE)
//
val ScrollBar scrollBar
val ViewportAxis viewportAxis
val BigDecimal minThumb
val int minIncrement
val int minPageIncrement
val BigDecimal maxScrollSelection
new(ScrollBar scrollBar, ViewportAxis viewportAxis) {
this.scrollBar = scrollBar
this.viewportAxis = viewportAxis
scrollBar.thumb = 0
scrollBar.increment = 0
scrollBar.pageIncrement = 0
minThumb = new BigDecimal(scrollBar.thumb)
minIncrement = scrollBar.increment
minPageIncrement = scrollBar.pageIncrement
maxScrollSelection = MAX_SCROLL_SIZE - minThumb
}
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
}
def void recalculateScrollBarSize() {
val visiblePixelSize = viewportAxis.visiblePixelSize
val maxPixelOrigin = viewportAxis.underlyingAxis.pixelSize - visiblePixelSize
val maxPixelSize = maxPixelOrigin * (MAX_SCROLL_SIZE / maxScrollSelection)
val pixelToInt = BigDecimal::ONE.min(MAX_SCROLL_SIZE.divide(maxPixelSize, new MathContext(maxPixelSize.precision, RoundingMode::CEILING)))
scrollBar.maximum = (maxPixelSize * pixelToInt).intValue
scrollBar.selection = (viewportAxis.pixelOrigin * pixelToInt).intValue
if (visiblePixelSize < maxPixelSize && visiblePixelSize != 0) {
scrollBar.thumb = minThumb.max(visiblePixelSize * pixelToInt).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)
scrollBar.enabled = true
scrollBar.visible = true
} else {
scrollBar.thumb = scrollBar.maximum
scrollBar.enabled = false
scrollBar.visible = false
}
}
}