move cursor positioning by absolute coordinates to CursorPosition
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/boxes/TestCursorPosition.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/boxes/TestCursorPosition.java
index 4cea87f..50e47ff 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/boxes/TestCursorPosition.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/boxes/TestCursorPosition.java
@@ -14,6 +14,7 @@
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.vex.core.internal.dom.Document;
+import org.eclipse.vex.core.internal.layout.FakeGraphics;
import org.eclipse.vex.core.internal.visualization.DocumentRootVisualization;
import org.eclipse.vex.core.internal.visualization.ParagraphVisualization;
import org.eclipse.vex.core.internal.visualization.StructureElementVisualization;
@@ -30,9 +31,12 @@
*/
public class TestCursorPosition {
+ private static final String LOREM_IPSUM_LONG = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.";
+
private RootBox rootBox;
private ContentMap contentMap;
private CursorPosition cursorPosition;
+ private FakeGraphics graphics;
@Before
public void setUp() throws Exception {
@@ -40,6 +44,10 @@
contentMap = new ContentMap();
contentMap.setRootBox(rootBox);
cursorPosition = new CursorPosition(contentMap);
+
+ graphics = new FakeGraphics();
+ rootBox.setWidth(100);
+ rootBox.layout(graphics);
}
@Test
@@ -65,9 +73,16 @@
@Test
public void whenAtLastPosition_cannotMoveCursorOneCharacterRight() throws Exception {
- cursorPosition.setOffset(37);
+ final int lastPosition = contentMap.getLastPosition();
+ cursorPosition.setOffset(lastPosition);
cursorPosition.right();
- assertEquals(37, cursorPosition.getOffset());
+ assertEquals(lastPosition, cursorPosition.getOffset());
+ }
+
+ @Test
+ public void canSetPositionByAbsoluteCoordinates() throws Exception {
+ cursorPosition.moveToAbsoluteCoordinates(graphics, 18, 11);
+ assertEquals(5, cursorPosition.getOffset());
}
private static RootBox createTestModel() {
@@ -94,7 +109,7 @@
private static void insertSection(final IParent parent) {
final IElement section = insertElement(parent, "section");
- insertText(insertElement(section, "para"), "LOREM IPSUM");
+ insertText(insertElement(section, "para"), LOREM_IPSUM_LONG);
insertElement(section, "para");
}
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/layout/FakeGraphics.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/layout/FakeGraphics.java
index da98074..3cc6a95 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/layout/FakeGraphics.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/layout/FakeGraphics.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2010 John Krasnay and others.
+ * Copyright (c) 2004, 2015 John Krasnay 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
@@ -74,22 +74,22 @@
@Override
public int asAbsoluteX(final int relativeX) {
- return 0;
+ return relativeX;
}
@Override
public int asAbsoluteY(final int relativeY) {
- return 0;
+ return relativeY;
}
@Override
public int asRelativeX(final int absoluteX) {
- return 0;
+ return absoluteX;
}
@Override
public int asRelativeY(final int absoluteY) {
- return 0;
+ return absoluteY;
}
@Override
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/CursorPosition.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/CursorPosition.java
index 03839fb..f6ff5e3 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/CursorPosition.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/CursorPosition.java
@@ -10,6 +10,8 @@
*******************************************************************************/
package org.eclipse.vex.core.internal.boxes;
+import org.eclipse.vex.core.internal.core.Graphics;
+
/**
* @author Florian Thienel
*/
@@ -37,4 +39,9 @@
public void right() {
offset = Math.min(offset + 1, contentMap.getLastPosition());
}
+
+ public void moveToAbsoluteCoordinates(final Graphics graphics, final int x, final int y) {
+ final IContentBox box = contentMap.findBoxByCoordinates(x, y);
+ offset = box.getOffsetForCoordinates(graphics, x - box.getAbsoluteLeft(), y - box.getAbsoluteTop());
+ }
}
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 548b577..1ed1173 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
@@ -31,7 +31,6 @@
import org.eclipse.vex.core.internal.boxes.ContentMap;
import org.eclipse.vex.core.internal.boxes.Cursor;
import org.eclipse.vex.core.internal.boxes.CursorPosition;
-import org.eclipse.vex.core.internal.boxes.IContentBox;
import org.eclipse.vex.core.internal.boxes.RootBox;
import org.eclipse.vex.core.internal.core.Graphics;
@@ -184,20 +183,17 @@
private void mouseDown(final MouseEvent event) {
final int absoluteY = event.y + getVerticalBar().getSelection();
- final IContentBox clickedBox = contentMap.findBoxByCoordinates(event.x, absoluteY);
- setCursorPositionInBoxByAbsoluteCoordinates(clickedBox, event.x, absoluteY);
+ setCursorPositionInByAbsoluteCoordinates(event.x, absoluteY);
invalidate();
}
- private void setCursorPositionInBoxByAbsoluteCoordinates(final IContentBox box, final int x, final int y) {
+ private void setCursorPositionInByAbsoluteCoordinates(final int x, final int y) {
runWithGraphics(new IRunnableWithGraphics<Object>() {
@Override
public Integer run(final Graphics graphics) {
- final int offset = box.getOffsetForCoordinates(graphics, x - box.getAbsoluteLeft(), y - box.getAbsoluteTop());
- cursorPosition.setOffset(offset);
- cursor.setPosition(graphics, offset);
+ cursorPosition.moveToAbsoluteCoordinates(graphics, x, y);
return null;
}
});
@@ -205,32 +201,19 @@
private void cursorLeft() {
cursorPosition.left();
- transferCursorPositionToCursor();
invalidate();
}
private void cursorRight() {
cursorPosition.right();
- transferCursorPositionToCursor();
invalidate();
}
private void cursorHome() {
cursorPosition.setOffset(0);
- transferCursorPositionToCursor();
invalidate();
}
- private void transferCursorPositionToCursor() {
- runWithGraphics(new IRunnableWithGraphics<Object>() {
- @Override
- public Integer run(final Graphics graphics) {
- cursor.setPosition(graphics, cursorPosition.getOffset());
- return null;
- }
- });
- }
-
private <T> T runWithGraphics(final IRunnableWithGraphics<T> runnable) {
final Image image = new Image(getDisplay(), 1, 1);
final GC gc = new GC(image);
@@ -305,6 +288,7 @@
private void paintContent(final Graphics graphics) {
rootBox.paint(graphics);
+ cursor.setPosition(graphics, cursorPosition.getOffset());
cursor.paint(graphics);
}