blob: 5574e16aaa1e8478a9789b04eb10b1a1c7c5e968 [file] [log] [blame]
package org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.reorder
import java.io.Serializable
import java.util.List
import java.util.Map
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.*
class ReorderAxis extends AbstractAxis {
val List<Serializable> reorderedSegmentIds = newArrayList
val Map<Integer, Integer> segmentPositionToStartPixelMap = newHashMap
Axis underlyingAxis
new() {}
new(Axis underlyingAxis) {
setUnderlyingAxis(underlyingAxis)
}
def void setUnderlyingAxis(Axis underlyingAxis) {
this.underlyingAxis = underlyingAxis
for (segmentPosition : 0 ..< underlyingAxis.segmentCount)
reorderedSegmentIds += underlyingAxis.getIdOfSegmentPosition(segmentPosition)
}
// Axis interface
override getSegmentCount() {
underlyingAxis.segmentCount
}
override getStartPixelOfSegmentPosition(int segmentPosition) {
val startPixel = segmentPositionToStartPixelMap.get(segmentPosition)
if (startPixel != null)
return startPixel
else {
var aggregateSize = 0
for (position : 0 ..< segmentPosition) {
val segmentId = reorderedSegmentIds.get(position)
val underlyingSegmentPosition = underlyingAxis.getSegmentPositionOfId(segmentId)
aggregateSize = aggregateSize + underlyingAxis.getPixelSizeOfSegmentPosition(underlyingSegmentPosition)
}
segmentPositionToStartPixelMap.put(segmentPosition, aggregateSize)
return aggregateSize
}
}
override getSegmentPositionOfPixelLocation(int pixelLocation) {
if (pixelLocation < 0) return 0
for (segmentPosition : 0 .. segmentCount) {
val startPixel = getStartPixelOfSegmentPosition(segmentPosition)
if (startPixel > pixelLocation)
return segmentPosition - 1
}
return segmentCount - 1
}
override getIdOfSegmentPosition(int segmentPosition) {
reorderedSegmentIds.get(segmentPosition)
}
override getSegmentPositionOfId(Serializable segmentId) {
reorderedSegmentIds.indexOf(segmentId)
}
//
/**
* Moves a segment from a given position to a new position.
* @param fromSegmentPosition The segment position to move.
* @param toSegmentPosition The new position to move the segment to.
*/
def void reorderSegmentPosition(int fromSegmentPosition, int toSegmentPosition) {
val segmentId = reorderedSegmentIds.get(fromSegmentPosition)
reorderedSegmentIds.remove(segmentId)
reorderedSegmentIds.add(toSegmentPosition, segmentId)
segmentPositionToStartPixelMap.clear
}
}