provide view port to the cursor moves

Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/cursor/TestCursorPosition.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/cursor/TestCursorPosition.java
index 7e51116..4304e2b 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/cursor/TestCursorPosition.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/cursor/TestCursorPosition.java
@@ -36,6 +36,7 @@
 import org.eclipse.vex.core.internal.visualization.StructureElementVisualization;
 import org.eclipse.vex.core.internal.visualization.TextVisualization;
 import org.eclipse.vex.core.internal.visualization.VisualizationChain;
+import org.eclipse.vex.core.internal.widget.FakeViewPort;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -53,7 +54,7 @@
 	public void setUp() throws Exception {
 		graphics = new FakeGraphics();
 		document = new UniversalTestDocument(2);
-		cursor = new Cursor(new FakeSelector());
+		cursor = new Cursor(new FakeSelector(), new FakeViewPort());
 
 		visualizeDocument();
 	}
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeCursor.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeCursor.java
index e1f574d..2bd9ffa 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeCursor.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeCursor.java
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Florian Thienel and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * 		Florian Thienel - initial API and implementation
+ *******************************************************************************/
 package org.eclipse.vex.core.internal.widget;
 
 import java.util.LinkedList;
@@ -17,6 +27,7 @@
 	private final Graphics graphics = new FakeGraphics();
 	private final ContentTopology contentTopology;
 	private final BalancingSelector selector;
+	private final IViewPort viewPort = new FakeViewPort();
 
 	private IDocument document;
 
@@ -81,14 +92,14 @@
 	@Override
 	public void move(final ICursorMove move) {
 		firePositionAboutToChange();
-		selector.setMark(move.calculateNewOffset(graphics, contentTopology, selector.getCaretOffset(), null, null, 0));
+		selector.setMark(move.calculateNewOffset(graphics, viewPort, contentTopology, selector.getCaretOffset(), null, null, 0));
 		firePositionChanged(selector.getCaretOffset());
 	}
 
 	@Override
 	public void select(final ICursorMove move) {
 		firePositionAboutToChange();
-		final int newOffset = move.calculateNewOffset(graphics, contentTopology, selector.getCaretOffset(), null, null, 0);
+		final int newOffset = move.calculateNewOffset(graphics, viewPort, contentTopology, selector.getCaretOffset(), null, null, 0);
 		if (move.isAbsolute()) {
 			selector.setEndAbsoluteTo(newOffset);
 		} else {
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeViewPort.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeViewPort.java
new file mode 100644
index 0000000..124e6e6
--- /dev/null
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/FakeViewPort.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Florian Thienel and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * 		Florian Thienel - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.vex.core.internal.widget;
+
+import org.eclipse.vex.core.internal.core.Rectangle;
+
+public class FakeViewPort implements IViewPort {
+
+	@Override
+	public void reconcile(final int maximumHeight) {
+		// ignore
+	}
+
+	@Override
+	public Rectangle getVisibleArea() {
+		return new Rectangle(0, 0, 100, 100);
+	}
+
+	@Override
+	public void moveRelative(final int delta) {
+		// ignore
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/Cursor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/Cursor.java
index cf26708..73d5be1 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/Cursor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/Cursor.java
@@ -30,6 +30,7 @@
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.NodeGraphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 import org.eclipse.vex.core.provisional.dom.ContentRange;
 import org.eclipse.vex.core.provisional.dom.INode;
 
@@ -46,6 +47,8 @@
 
 	private final ContentTopology contentTopology = new ContentTopology();
 	private final IContentSelector selector;
+	private final IViewPort viewPort;
+
 	private final LinkedList<MoveWithSelection> moves = new LinkedList<MoveWithSelection>();
 
 	private int offset;
@@ -56,8 +59,9 @@
 
 	private final LinkedList<ICursorPositionListener> cursorPositionListeners = new LinkedList<ICursorPositionListener>();
 
-	public Cursor(final IContentSelector selector) {
+	public Cursor(final IContentSelector selector, final IViewPort viewPort) {
 		this.selector = selector;
+		this.viewPort = viewPort;
 	}
 
 	public void setRootBox(final RootBox rootBox) {
@@ -159,7 +163,7 @@
 	public void applyMoves(final Graphics graphics) {
 		for (MoveWithSelection move = moves.poll(); move != null; move = moves.poll()) {
 			final int oldOffset = offset;
-			offset = move.move.calculateNewOffset(graphics, contentTopology, offset, box, getHotArea(), preferredX);
+			offset = move.move.calculateNewOffset(graphics, viewPort, contentTopology, offset, box, getHotArea(), preferredX);
 			if (move.select) {
 				if (move.move.isAbsolute()) {
 					selector.setEndAbsoluteTo(offset);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/ICursorMove.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/ICursorMove.java
index ea77783..c9cdcef 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/ICursorMove.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/ICursorMove.java
@@ -13,13 +13,14 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
  */
 public interface ICursorMove {
 
-	int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, int preferredX);
+	int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, int preferredX);
 
 	boolean preferX();
 
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveBy.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveBy.java
index f1223c2..5170354 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveBy.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveBy.java
@@ -13,6 +13,7 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 public class MoveBy implements ICursorMove {
 
@@ -23,7 +24,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		return Math.max(0, Math.min(currentOffset + distance, contentTopology.getLastOffset()));
 	}
 
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveDown.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveDown.java
index 93269a2..0026db5 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveDown.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveDown.java
@@ -26,6 +26,7 @@
 import org.eclipse.vex.core.internal.boxes.TextContent;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -43,7 +44,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		if (isAtStartOfEmptyBox(currentOffset, currentBox)) {
 			return currentBox.getEndOffset();
 		}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveLeft.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveLeft.java
index 1f9044e..9af1a28 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveLeft.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveLeft.java
@@ -13,6 +13,7 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -20,7 +21,7 @@
 public class MoveLeft implements ICursorMove {
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		int nextOffset = Math.max(0, currentOffset - 1);
 
 		final IContentBox searchStartBox = getSearchStartBox(currentBox, nextOffset);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveRight.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveRight.java
index 8c16f51..abc9b98 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveRight.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveRight.java
@@ -13,6 +13,7 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -30,7 +31,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		int nextOffset = Math.min(currentOffset + 1, contentTopology.getLastOffset());
 
 		final IContentBox searchStartBox = getSearchStartBox(currentBox, nextOffset);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToAbsoluteCoordinates.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToAbsoluteCoordinates.java
index e9838a0..856bc7e 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToAbsoluteCoordinates.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToAbsoluteCoordinates.java
@@ -21,6 +21,7 @@
 import org.eclipse.vex.core.internal.boxes.TextContent;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -46,7 +47,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		final IContentBox box = findClosestBoxByCoordinates(contentTopology, x, y);
 		if (box == null) {
 			return currentOffset;
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToNextWord.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToNextWord.java
index 8029bfa..e2f28ba 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToNextWord.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToNextWord.java
@@ -13,12 +13,13 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 import org.eclipse.vex.core.provisional.dom.IContent;
 
 public class MoveToNextWord implements ICursorMove {
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		final IContent content = currentBox.getContent();
 		final int lastOffset = contentTopology.getLastOffset();
 		int offset = currentOffset;
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToOffset.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToOffset.java
index 6b93d0d..d6d76c6 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToOffset.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToOffset.java
@@ -13,6 +13,7 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -26,7 +27,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		return offset;
 	}
 
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToPreviousWord.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToPreviousWord.java
index 12edd62..2520756 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToPreviousWord.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToPreviousWord.java
@@ -3,12 +3,13 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 import org.eclipse.vex.core.provisional.dom.IContent;
 
 public class MoveToPreviousWord implements ICursorMove {
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		final IContent content = currentBox.getContent();
 		int offset = currentOffset;
 		while (offset > 1 && Character.isLetterOrDigit(content.charAt(offset - 1))) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordEnd.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordEnd.java
index c77f428..918ff17 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordEnd.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordEnd.java
@@ -13,12 +13,13 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 import org.eclipse.vex.core.provisional.dom.IContent;
 
 public class MoveToWordEnd implements ICursorMove {
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		final IContent content = currentBox.getContent();
 		final int contentLength = content.length() - 1;
 		int offset = currentOffset;
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordStart.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordStart.java
index 7ec45c0..43752f1 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordStart.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveToWordStart.java
@@ -13,12 +13,13 @@
 import org.eclipse.vex.core.internal.boxes.IContentBox;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 import org.eclipse.vex.core.provisional.dom.IContent;
 
 public class MoveToWordStart implements ICursorMove {
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		final IContent content = currentBox.getContent();
 		int offset = currentOffset;
 		while (offset > 1 && Character.isLetterOrDigit(content.charAt(offset - 1))) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveUp.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveUp.java
index 70d9df4..3debbcc 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveUp.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/cursor/MoveUp.java
@@ -30,6 +30,7 @@
 import org.eclipse.vex.core.internal.boxes.TextContent;
 import org.eclipse.vex.core.internal.core.Graphics;
 import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.widget.IViewPort;
 
 /**
  * @author Florian Thienel
@@ -47,7 +48,7 @@
 	}
 
 	@Override
-	public int calculateNewOffset(final Graphics graphics, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
+	public int calculateNewOffset(final Graphics graphics, IViewPort viewPort, final ContentTopology contentTopology, final int currentOffset, final IContentBox currentBox, final Rectangle hotArea, final int preferredX) {
 		if (isAtEndOfEmptyBox(currentOffset, currentBox)) {
 			return currentBox.getStartOffset();
 		}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/BoxWidget.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/BoxWidget.java
index 7218df7..c2d73cf 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/BoxWidget.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/BoxWidget.java
@@ -104,11 +104,13 @@
 		connectKeyboard();
 		connectMouse();
 
+		final ViewPort viewPort = new ViewPort();
+
 		selector = new BalancingSelector();
-		cursor = new Cursor(selector);
+		cursor = new Cursor(selector, viewPort);
 		connectCursor();
 
-		controller = new VisualizationController(new DoubleBufferedRenderer(this), new ViewPort(), cursor);
+		controller = new VisualizationController(new DoubleBufferedRenderer(this), viewPort, cursor);
 		clipboard = new SwtClipboard(parent.getDisplay());
 		editor = new DocumentEditor(cursor, IWhitespacePolicy.NULL, clipboard);
 	}