adding minPixelLocation, pixelSize to Axis; fixing multiple viewport
example
diff --git a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/MultiViewportExample.xtend b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/MultiViewportExample.xtend
index e680db1..34df83a 100644
--- a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/MultiViewportExample.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/MultiViewportExample.xtend
@@ -14,14 +14,20 @@
 	override createLayer() {
 		val bodyLayer = new CompositeLayer => [
 			addRow(
-				new ViewportLayer(new DummyLayer(
-					new AxisImpl(4, 150),  // Horizontal axis
-					new AxisImpl(10, 100)  // Vertical axis
-				)),
-				new ViewportLayer(new DummyLayer(
-					new AxisImpl(10, 150),  // Horizontal axis
-					new AxisImpl(10, 100)  // Vertical axis
-				))
+				new ViewportLayer => [
+					underlyingLayer = new DummyLayer(
+						new AxisImpl(4, 150),  // Horizontal axis
+						new AxisImpl(10, 100)  // Vertical axis
+					)
+					horizontalAxis.minPixelOrigin = 0
+					horizontalAxis.maxPixelSize = 150
+				],
+				new ViewportLayer => [
+					underlyingLayer = new DummyLayer(
+						new AxisImpl(10, 150),  // Horizontal axis
+						new AxisImpl(10, 100)  // Vertical axis
+					)
+				]
 			)
 		]
 
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
index 604e878..9a6499d 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
@@ -26,6 +26,16 @@
 	def double getStartPixelOfSegmentPosition(int segmentPosition)
 	
 	/**
+	 * Gets the minimum pixel location of this axis. This is normally the same as getStartPixelOfSegmentPosition(0).
+	 */
+	def double getMinPixelLocation()
+	
+	/**
+	 * Gets the maximum pixel size of this axis. This is normally the same as getStartPixelOfSegmentPosition(getSegmentCount()) - getMinPixelLocation().
+	 */
+	def double getPixelSize()
+	
+	/**
 	 * Gets the position of the segment that is nearest to the the given pixel location.
 	 * 
 	 * @param pixelLocation
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
index 1914ed2..7733099 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/AxisInvariants.xtend
@@ -5,10 +5,6 @@
  */
 class AxisInvariants {
 	
-	def static getPixelSize(Axis axis) {
-		axis.getStartPixelOfSegmentPosition(axis.segmentCount) - axis.getStartPixelOfSegmentPosition(0)
-	}
-	
 	def static getPixelSizeOfSegmentPosition(Axis axis, int segmentPosition) {
 		axis.getStartPixelOfSegmentPosition(segmentPosition + 1) - axis.getStartPixelOfSegmentPosition(segmentPosition)
 	}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend
index 3b6b05c..a11394a 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend
@@ -4,5 +4,13 @@
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
 
 abstract class AbstractAxis extends AbstractEventSourceSink implements Axis {
+
+	override getMinPixelLocation() {
+		getStartPixelOfSegmentPosition(0)
+	}
+	
+	override getPixelSize() {
+		getStartPixelOfSegmentPosition(segmentCount) - minPixelLocation
+	}
 	
 }
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
index 8f812bb..102da85 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
@@ -39,7 +39,7 @@
 			val subSegmentPosition = segmentPosition - segmentOffset
 			
 			if (subSegmentPosition < subAxis.segmentCount)
-				return pixelOffset + subAxis.getStartPixelOfSegmentPosition(subSegmentPosition)
+				return pixelOffset + Math::max(subAxis.minPixelLocation, subAxis.getStartPixelOfSegmentPosition(subSegmentPosition))
 			
 			segmentOffset = segmentOffset + subAxis.segmentCount
 			pixelOffset = pixelOffset + subAxis.pixelSize
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
index 4615418..f2c9b61 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
@@ -14,6 +14,9 @@
 	val BigAxis underlyingAxis
 	val ViewportAxisListener viewportAxisListener
 	
+	BigDecimal minPixelOrigin = BigDecimal::ZERO
+	BigDecimal maxPixelSize
+	
 	/**
 	 * Indicates the visible size of the axis. Note that the pixel locations returned by this ClientDimensionProvider
 	 * must be in terms of underlying axis pixel coordinates.
@@ -29,9 +32,33 @@
 	
 	def getUnderlyingAxis() { underlyingAxis }
 	
+	def setMinPixelOrigin(double minPixelOrigin) { setMinPixelOrigin(new BigDecimal(minPixelOrigin)) }
+	def setMinPixelOrigin(BigDecimal minPixelOrigin) { this.minPixelOrigin = minPixelOrigin }
+	def setMaxPixelSize(double maxPixelSize) { setMaxPixelSize(new BigDecimal(maxPixelSize)) }
+	def setMaxPixelSize(BigDecimal maxPixelSize) { this.maxPixelSize = maxPixelSize }
+	
+	override getMinPixelLocation() {
+		if (minPixelOrigin != null)
+			minPixelOrigin.doubleValue
+		else
+			super.minPixelLocation
+	}
+	
+	override getPixelSize() {
+		if (maxPixelSize != null)
+			maxPixelSize.doubleValue
+		else
+			super.pixelSize
+	}
+	
 	def getVisiblePixelSize() {
-		if (visiblePixelSize >= BigDecimal::ZERO) visiblePixelSize
-		else BigDecimal::TEN
+		val pixelSize =
+			if (visiblePixelSize >= BigDecimal::ZERO) visiblePixelSize
+			else underlyingAxis.pixelSize
+		if (maxPixelSize != null)
+			pixelSize.min(maxPixelSize)
+		else
+			pixelSize
 	}
 	
 	def setVisiblePixelSize(double visiblePixelSize) {
@@ -71,7 +98,7 @@
 		val endSegmentPosition = underlyingAxis.getSegmentPositionOfPixelLocation(endPixel)
 		val isEndPixelInsideEndSegment = endPixel > underlyingAxis.getStartPixelOfSegmentPosition(endSegmentPosition) && endPixel < underlyingAxis.getStartPixelOfSegmentPosition(underlyingAxis.segmentCount)
 		val segmentCount = endSegmentPosition - originSegmentPosition
-		segmentCount.intValueExact + if (isEndPixelInsideEndSegment) 1 else 0
+		segmentCount.intValue + if (isEndPixelInsideEndSegment) 1 else 0
 	}
 	
 	override getStartPixelOfSegmentPosition(int segmentPosition) {