| 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 HideShowAxis implements Axis { |
| |
| val SortedMap<Integer, Serializable> hiddenSegmentPositionToIdMap = new TreeMap |
| val Map<Integer, Integer> segmentPositionToStartPixelMap = newHashMap |
| |
| Axis underlyingAxis |
| |
| new() {} |
| |
| new(Axis underlyingAxis) { |
| setUnderlyingAxis(underlyingAxis) |
| } |
| |
| def void setUnderlyingAxis(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) { |
| if (pixelLocation < 0) return 0 |
| |
| for (segmentPosition : 0 .. segmentCount) { |
| val startPixel = getStartPixelOfSegmentPosition(segmentPosition) |
| if (startPixel > pixelLocation) |
| return segmentPosition - 1 |
| } |
| |
| return segmentCount - 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 |
| } |
| } |
| |
| } |