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.

 	 *