blob: 1cd5ae9f65bebbfed6141fae128e68c1309dbacf [file] [log] [blame]
package org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport
import java.io.Serializable
import java.math.BigDecimal
import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
import static extension org.eclipse.nebula.widgets.nattable.core.math.BigDecimalExtensions.*
class ViewportAxis extends AbstractAxis {
val Axis underlyingAxis
val ViewportAxisListener viewportAxisListener
/**
* Indicates the visible size of the axis. Note that the pixel locations returned by this ClientDimensionProvider
* must be in terms of underlying axis pixel coordinates.
*/
BigDecimal visiblePixelRange = new BigDecimal(-1.0)
BigDecimal pixelOrigin = new BigDecimal(0)
new(Axis underlyingAxis, ViewportAxisListener viewportAxisListener) {
this.underlyingAxis = underlyingAxis
this.viewportAxisListener = viewportAxisListener
}
def getUnderlyingAxis() { underlyingAxis }
def getVisiblePixelRange() {
if (visiblePixelRange >= new BigDecimal(0)) visiblePixelRange
else underlyingAxis.pixelSize
}
def setVisiblePixelRange(double visiblePixelRange) {
setVisiblePixelRange(new BigDecimal(visiblePixelRange))
}
def setVisiblePixelRange(BigDecimal visiblePixelRange) {
this.visiblePixelRange = visiblePixelRange
}
def getPixelOrigin() { pixelOrigin }
def void setPixelOrigin(double pixelOrigin) {
setPixelOrigin(new BigDecimal(pixelOrigin))
}
def void setPixelOrigin(BigDecimal pixelOrigin) {
this.pixelOrigin = pixelOrigin
viewportAxisListener?.viewportAxisChanged
}
def long getOriginSegmentPosition() {
underlyingAxis.getSegmentPositionOfPixelLocation(pixelOrigin)
}
def void handleResize() {
// If the visible pixel size is greater than the content size, move origin to fill as much content as possible.
val additionalSize = pixelOrigin + getVisiblePixelRange - underlyingAxis.pixelSize
if (additionalSize > new BigDecimal(0))
pixelOrigin = new BigDecimal(0).max(pixelOrigin - additionalSize)
}
// Layer interface
override getSegmentCount() {
val endPixel = pixelOrigin + getVisiblePixelRange
val endSegmentPosition = underlyingAxis.getSegmentPositionOfPixelLocation(endPixel)
val isEndPixelInsideEndSegment = endPixel > underlyingAxis.getStartPixelOfSegmentPosition(endSegmentPosition) && endPixel < underlyingAxis.getStartPixelOfSegmentPosition(underlyingAxis.segmentCount)
(endSegmentPosition + if (isEndPixelInsideEndSegment) 1 else 0) - originSegmentPosition
}
override getStartPixelOfSegmentPosition(long segmentPosition) {
underlyingAxis.getStartPixelOfSegmentPosition(originSegmentPosition + segmentPosition) - pixelOrigin
}
override getSegmentPositionOfPixelLocation(BigDecimal pixelLocation) {
val underlyingPixelLocation = pixelOrigin + pixelLocation
if (underlyingPixelLocation < new BigDecimal(0)) return -1
if (underlyingPixelLocation >= underlyingAxis.pixelSize) return segmentCount
underlyingAxis.getSegmentPositionOfPixelLocation(underlyingPixelLocation) - originSegmentPosition
}
override getIdOfSegmentPosition(long segmentPosition) {
underlyingAxis.getIdOfSegmentPosition(originSegmentPosition + segmentPosition)
}
override getSegmentPositionOfId(Serializable segmentId) {
underlyingAxis.getSegmentPositionOfId(segmentId) - originSegmentPosition
}
}