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);
}