blob: b6b13856eb1e8928cb8edadd88716d1106d2d3b0 [file] [log] [blame]
package org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.hideshow
import java.io.Serializable
import java.util.Map
import java.util.SortedMap
import java.util.TreeMap
import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
class HideShowSegmentAxis implements Axis {
val Axis underlyingAxis
val SortedMap<Integer, Serializable> hiddenSegmentPositionToIdMap = new TreeMap
val Map<Integer, Integer> segmentPositionToStartPixelMap = newHashMap
new(Axis underlyingAxis) {
this.underlyingAxis = underlyingAxis
}
// Axis interface
override getSegmentCount() {
underlyingAxis.segmentCount - hiddenSegmentPositionToIdMap.size
}
override getStartPixelOfSegmentPosition(int segmentPosition) {
val startPixel = segmentPositionToStartPixelMap.get(segmentPosition)
if (startPixel != null)
return startPixel
else {
var aggregateSize = 0
for (position : 0 ..< segmentPosition) {
val segmentId = getIdOfSegmentPosition(position)
val underlyingSegmentPosition = underlyingAxis.getSegmentPositionOfId(segmentId)
aggregateSize = aggregateSize + underlyingAxis.getPixelSizeOfSegmentPosition(underlyingSegmentPosition)
}
segmentPositionToStartPixelMap.put(segmentPosition, aggregateSize)
return aggregateSize
}
}
override getSegmentPositionOfPixelLocation(int pixelLocation) {
for (segmentPosition : 0 .. segmentCount) {
val startPixel = getStartPixelOfSegmentPosition(segmentPosition)
if (startPixel > pixelLocation)
return segmentPosition - 1
}
return -1
}
// TODO Optimize. Cache?
override getIdOfSegmentPosition(int segmentPosition) {
var numHiddenSegments = 0
var fromPosition = 0
var toPosition = segmentPosition
while (toPosition < underlyingAxis.segmentCount) {
var numHiddenSegmentsAtOrBeforeToPosition = hiddenSegmentPositionToIdMap.subMap(fromPosition, toPosition + 1).size
if (numHiddenSegmentsAtOrBeforeToPosition == 0)
return underlyingAxis.getIdOfSegmentPosition(segmentPosition + numHiddenSegments)
else {
numHiddenSegments = numHiddenSegments + numHiddenSegmentsAtOrBeforeToPosition
fromPosition = toPosition + 1
toPosition = toPosition + numHiddenSegmentsAtOrBeforeToPosition
}
}
null
}
override getSegmentPositionOfId(Serializable segmentId) {
val underlyingSegmentPosition = underlyingAxis.getSegmentPositionOfId(segmentId)
underlyingSegmentPosition - hiddenSegmentPositionToIdMap.subMap(0, underlyingSegmentPosition).size
}
//
def hideSegmentId(Serializable segmentId) {
val underlyingSegmentPosition = underlyingAxis.getSegmentPositionOfId(segmentId)
if (underlyingAxis.containsSegmentPosition(underlyingSegmentPosition)) {
hiddenSegmentPositionToIdMap.put(underlyingSegmentPosition, segmentId)
segmentPositionToStartPixelMap.clear
}
}
def showSegmentId(Serializable segmentId) {
val underlyingSegmentPosition = underlyingAxis.getSegmentPositionOfId(segmentId)
if (underlyingAxis.containsSegmentPosition(underlyingSegmentPosition)) {
val mapping = hiddenSegmentPositionToIdMap.remove(underlyingSegmentPosition)
if (mapping != null)
segmentPositionToStartPixelMap.clear
}
}
}