blob: 102da856ae618d77e6d3f9df1c5c3de2064ef964 [file] [log] [blame]
package org.eclipse.nebula.widgets.nattable.core.layer.impl.composite
import java.io.Serializable
import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
/**
* Represents the axis of a CompositeLayer, which is composed of an amalgamation of the axes of the CompsiteLayer's sublayers.
*/
class CompositeAxis extends AbstractAxis {
val SubLayerAccessor subLayerAccessor
val extension AxisAccessor axisAccessor
new(SubLayerAccessor subLayerAccessor, AxisAccessor axisAccessor) {
this.subLayerAccessor = subLayerAccessor
this.axisAccessor = axisAccessor
}
def getAxisAccessor() { axisAccessor }
def getSubLayers() {
subLayerAccessor.subLayers
}
// Axis interface
override getSegmentCount() {
subLayers.fold(0, [ acc, layer | acc + layer.axis.segmentCount ])
}
override getStartPixelOfSegmentPosition(int segmentPosition) {
var segmentOffset = 0
var pixelOffset = 0.0
for (subLayer : subLayers) {
val subAxis = subLayer.axis
val subSegmentPosition = segmentPosition - segmentOffset
if (subSegmentPosition < subAxis.segmentCount)
return pixelOffset + Math::max(subAxis.minPixelLocation, subAxis.getStartPixelOfSegmentPosition(subSegmentPosition))
segmentOffset = segmentOffset + subAxis.segmentCount
pixelOffset = pixelOffset + subAxis.pixelSize
}
pixelOffset
}
override getSegmentPositionOfPixelLocation(double pixelLocation) {
if (pixelLocation < 0) return -1
if (pixelLocation >= pixelSize) return segmentCount
var segmentOffset = 0
var pixelOffset = 0.0
for (subLayer : subLayers) {
val subAxis = subLayer.axis
val subPixelLocation = pixelLocation - pixelOffset
if (subPixelLocation < subAxis.pixelSize)
return segmentOffset + subAxis.getSegmentPositionOfPixelLocation(subPixelLocation)
segmentOffset = segmentOffset + subAxis.segmentCount
pixelOffset = pixelOffset + subAxis.pixelSize
}
segmentOffset
}
override getIdOfSegmentPosition(int segmentPosition) {
var segmentOffset = 0
for (subLayer : subLayers) {
val subAxis = subLayer.axis
val subSegmentPosition = segmentPosition - segmentOffset
if (subSegmentPosition < subAxis.segmentCount)
return subAxis.getIdOfSegmentPosition(subSegmentPosition)
segmentOffset = segmentOffset + subAxis.segmentCount
}
null
}
override getSegmentPositionOfId(Serializable segmentId) {
var segmentOffset = 0
for (subLayer : subLayers) {
val subAxis = subLayer.axis
val subSegmentPosition = subAxis.getSegmentPositionOfId(segmentId)
if (subAxis.containsSegmentPosition(subSegmentPosition) && subSegmentPosition >= 0)
return segmentOffset + subSegmentPosition
segmentOffset = segmentOffset + subAxis.segmentCount
}
return -1
}
}