provide child nodes before or after a given offset
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
index 58e58e1..57798f4 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
@@ -419,7 +419,46 @@
public void shouldNotProvideChildNodeAfterEndOffset() throws Exception {
content.insertText(parent.getEndOffset() + 1, "suffix");
parent.getChildNodeAt(parent.getEndOffset() + 1);
+ }
+ @Test
+ public void shouldProvideChildNodesBeforeOffset() throws Exception {
+ final TestChild child1 = addTestChild();
+ final TestChild child2 = addTestChild();
+ final TestChild child3 = addTestChild();
+
+ final List<Node> childNodes12 = parent.getChildNodesBefore(child3.getStartOffset());
+ assertEquals(2, childNodes12.size());
+ assertSame(child1, childNodes12.get(0));
+ assertSame(child2, childNodes12.get(1));
+
+ final List<Node> childNodes123 = parent.getChildNodesBefore(parent.getEndOffset());
+ assertEquals(3, childNodes123.size());
+ assertSame(child1, childNodes123.get(0));
+ assertSame(child2, childNodes123.get(1));
+ assertSame(child3, childNodes123.get(2));
+
+ assertTrue(parent.getChildNodesBefore(parent.getStartOffset()).isEmpty());
+ }
+
+ @Test
+ public void shouldProvideChildNodesAfterOffset() throws Exception {
+ final TestChild child1 = addTestChild();
+ final TestChild child2 = addTestChild();
+ final TestChild child3 = addTestChild();
+
+ final List<Node> childNodes23 = parent.getChildNodesAfter(child1.getEndOffset());
+ assertEquals(2, childNodes23.size());
+ assertSame(child2, childNodes23.get(0));
+ assertSame(child3, childNodes23.get(1));
+
+ final List<Node> childNodes123 = parent.getChildNodesAfter(parent.getStartOffset());
+ assertEquals(3, childNodes123.size());
+ assertSame(child1, childNodes123.get(0));
+ assertSame(child2, childNodes123.get(1));
+ assertSame(child3, childNodes123.get(2));
+
+ assertTrue(parent.getChildNodesAfter(parent.getEndOffset()).isEmpty());
}
private static void assertTextNodeEquals(final String text, final int startOffset, final int endOffset, final Node actualNode) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
index 6e44949..3de6f97 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
@@ -129,6 +129,14 @@
return currentOffset;
}
+ public List<Node> getChildNodesBefore(final int offset) {
+ return getChildNodes(getStartOffset() + 1, offset);
+ }
+
+ public List<Node> getChildNodesAfter(final int offset) {
+ return getChildNodes(offset, getEndOffset() - 1);
+ }
+
/**
* An Iterator of all child nodes. The underlying collection is not modifyable.
*