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