hide/show
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxis.xtend
new file mode 100644
index 0000000..b6b1385
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxis.xtend
@@ -0,0 +1,99 @@
+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
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/NatTable/test/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxisTest.xtend b/NatTable/test/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxisTest.xtend
new file mode 100644
index 0000000..09e3a8d
--- /dev/null
+++ b/NatTable/test/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowSegmentAxisTest.xtend
@@ -0,0 +1,158 @@
+package org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.hideshow
+
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.SimpleAxis
+import org.junit.Before
+import org.junit.Test
+
+import static org.eclipse.nebula.widgets.nattable.core.layer.AxisTest.*
+
+class HideShowSegmentPositionAxisTest {
+
+ Axis underlyingAxis
+ HideShowSegmentAxis hideShowSegmentAxis
+
+ @Before
+ def void before() {
+ underlyingAxis = new SimpleAxis(4, 100)
+ hideShowSegmentAxis = new HideShowSegmentAxis(underlyingAxis)
+ }
+
+ @Test
+ def void baseline() {
+ testAxis(
+ "underlyingAxis",
+ underlyingAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+
+ testAxis(
+ "hideShowSegmentAxis",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+ }
+
+ @Test
+ def void hideShowBeginning() {
+ hideShowSegmentAxis.hideSegmentId(0)
+
+ testAxis(
+ "hide",
+ hideShowSegmentAxis,
+ #[ 1, 2, 3 ],
+ #[ 0, 100, 200, 300 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(0)
+
+ testAxis(
+ "show",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+ }
+
+ @Test
+ def void hideShowMiddle() {
+ hideShowSegmentAxis.hideSegmentId(1)
+
+ testAxis(
+ "hide",
+ hideShowSegmentAxis,
+ #[ 0, 2, 3 ],
+ #[ 0, 100, 200, 300 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(1)
+
+ testAxis(
+ "show",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+ }
+
+ @Test
+ def void hideShowEnd() {
+ hideShowSegmentAxis.hideSegmentId(3)
+
+ testAxis(
+ "hide",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2 ],
+ #[ 0, 100, 200, 300 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(3)
+
+ testAxis(
+ "show",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+ }
+
+ @Test
+ def void hideShowMultiple() {
+ hideShowSegmentAxis.hideSegmentId(3)
+
+ testAxis(
+ "hide 3",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2 ],
+ #[ 0, 100, 200, 300 ]
+ )
+
+ hideShowSegmentAxis.hideSegmentId(0)
+
+ testAxis(
+ "hide 0",
+ hideShowSegmentAxis,
+ #[ 1, 2 ],
+ #[ 0, 100, 200 ]
+ )
+
+ hideShowSegmentAxis.hideSegmentId(1)
+
+ testAxis(
+ "hide 1",
+ hideShowSegmentAxis,
+ #[ 2 ],
+ #[ 0, 100 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(1)
+
+ testAxis(
+ "show 1",
+ hideShowSegmentAxis,
+ #[ 1, 2 ],
+ #[ 0, 100, 200 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(3)
+
+ testAxis(
+ "show 3",
+ hideShowSegmentAxis,
+ #[ 1, 2, 3 ],
+ #[ 0, 100, 200, 300 ]
+ )
+
+ hideShowSegmentAxis.showSegmentId(0)
+
+ testAxis(
+ "show 0",
+ hideShowSegmentAxis,
+ #[ 0, 1, 2, 3 ],
+ #[ 0, 100, 200, 300, 400 ]
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend b/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
index d54737c..beb6af5 100644
--- a/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
+++ b/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
@@ -12,6 +12,7 @@
import org.eclipse.swt.layout.FillLayout
import org.eclipse.swt.widgets.Display
import org.eclipse.swt.widgets.Shell
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.hideshow.HideShowSegmentAxis
class SWTExample {
@@ -50,8 +51,8 @@
val bodyHorizontalAxis = new ReorderSegmentAxis(new SimpleAxis(4, 200))
bodyHorizontalAxis.reorderSegmentPosition(1, 2)
- val bodyVerticalAxis = new ReorderSegmentAxis(new SimpleAxis(4, 100))
- bodyVerticalAxis.reorderSegmentPosition(3, 1)
+ val bodyVerticalAxis = new HideShowSegmentAxis(new SimpleAxis(4, 100))
+ bodyVerticalAxis.hideSegmentId(0)
val bodyLayer = new DummyLayer(
bodyHorizontalAxis,
bodyVerticalAxis