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