| 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 |
| } |
| } |
| |
| } |