Added explicit Parent class to the DOM inheritence hierarchy.

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
new file mode 100644
index 0000000..c3e1699
--- /dev/null
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/ParentTest.java
@@ -0,0 +1,142 @@
+package org.eclipse.vex.core.internal.dom;

+

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

+import static org.junit.Assert.assertNull;

+import static org.junit.Assert.assertSame;

+import static org.junit.Assert.assertTrue;

+

+import java.util.Iterator;

+import java.util.List;

+

+import org.junit.Before;

+import org.junit.Test;

+

+public class ParentTest {

+

+	private TestParent parent;

+

+	@Before

+	public void setUp() throws Exception {

+		parent = new TestParent();

+	}

+

+	@Test

+	public void addChild() throws Exception {

+		assertFalse(parent.hasChildren());

+		assertEquals(0, parent.getChildCount());

+

+		final TestChild child = new TestChild();

+		parent.addChild(child);

+		assertTrue(parent.hasChildren());

+		assertEquals(1, parent.getChildCount());

+		assertSame(child, parent.getChildNode(0));

+		assertSame(child, parent.getChildNodes().get(0));

+	}

+

+	@Test

+	public void insertChild() throws Exception {

+		assertFalse(parent.hasChildren());

+		assertEquals(0, parent.getChildCount());

+

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+		assertEquals(2, parent.getChildCount());

+

+		final TestChild child = new TestChild();

+		parent.insertChild(1, child);

+		assertEquals(3, parent.getChildCount());

+		assertSame(child, parent.getChildNode(1));

+		assertSame(child, parent.getChildNodes().get(1));

+	}

+

+	@Test

+	public void removeChild() throws Exception {

+		final TestChild child = new TestChild();

+		parent.addChild(new TestChild());

+		parent.addChild(child);

+		parent.addChild(new TestChild());

+		assertTrue(parent.hasChildren());

+		assertEquals(3, parent.getChildCount());

+

+		parent.removeChild(child);

+		assertTrue(parent.hasChildren());

+		assertEquals(2, parent.getChildCount());

+		assertFalse(parent.getChildNodes().contains(child));

+	}

+

+	@Test

+	public void shouldSetParentOnAddedChild() throws Exception {

+		final TestChild child = new TestChild();

+		assertNull(child.getParent());

+

+		parent.addChild(child);

+		assertSame(parent, child.getParent());

+	}

+

+	@Test

+	public void shouldSetParentOnInsertedChild() throws Exception {

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+

+		final TestChild child = new TestChild();

+		assertNull(child.getParent());

+

+		parent.insertChild(1, child);

+		assertSame(parent, child.getParent());

+	}

+

+	@Test

+	public void shouldResetParentOnRemovedChild() throws Exception {

+		final TestChild child = new TestChild();

+		parent.addChild(child);

+		assertSame(parent, child.getParent());

+

+		parent.removeChild(child);

+		assertNull(child.getParent());

+	}

+

+	@Test(expected = UnsupportedOperationException.class)

+	public void shouldReturnUnmodifiableChildNodesList() throws Exception {

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+		final List<Node> childNodes = parent.getChildNodes();

+		childNodes.add(new TestChild());

+	}

+

+	@Test(expected = UnsupportedOperationException.class)

+	public void shouldReturnUnmodifiableChildNodesIterator() throws Exception {

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+		parent.addChild(new TestChild());

+		final Iterator<Node> iterator = parent.getChildIterator();

+		iterator.next();

+		iterator.remove();

+	}

+

+	private static class TestParent extends Parent {

+		@Override

+		public String getNodeType() {

+			return "Parent";

+		}

+

+		@Override

+		public String getBaseURI() {

+			return null;

+		}

+	}

+

+	private static class TestChild extends Node {

+		@Override

+		public String getNodeType() {

+			return "Child";

+		}

+

+		@Override

+		public String getBaseURI() {

+			return null;

+		}

+

+	}

+}

diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/tests/VEXCoreTestSuite.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/tests/VEXCoreTestSuite.java
index 300a314..a9675bb 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/tests/VEXCoreTestSuite.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/tests/VEXCoreTestSuite.java
@@ -28,6 +28,7 @@
 import org.eclipse.vex.core.internal.dom.GapContentTest;
 import org.eclipse.vex.core.internal.dom.NamespaceStackTest;
 import org.eclipse.vex.core.internal.dom.NamespaceTest;
+import org.eclipse.vex.core.internal.dom.ParentTest;
 import org.eclipse.vex.core.internal.dom.SchemaValidatorTest;
 import org.eclipse.vex.core.internal.dom.SpaceNormalizerTest;
 import org.eclipse.vex.core.internal.dom.TextWrapperTest;
@@ -53,6 +54,7 @@
 		addTest(new JUnit4TestAdapter(SchemaValidatorTest.class));
 		addTest(new JUnit4TestAdapter(CssTest.class));
 		addTest(new JUnit4TestAdapter(BatikBehaviorTest.class));
+		addTest(new JUnit4TestAdapter(ParentTest.class));
 		addTestSuite(PropertyTest.class);
 		addTestSuite(RuleTest.class);
 		addTestSuite(BlockElementBoxTest.class);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Rule.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Rule.java
index 47962b3..f4ddc8f 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Rule.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Rule.java
@@ -127,10 +127,10 @@
 			if (cs.getCondition().getConditionType() == Condition.SAC_PSEUDO_CLASS_CONDITION) {
 				if (element instanceof PseudoElement) {
 					final AttributeCondition ac = (AttributeCondition) cs.getCondition();
-					return ac.getValue().equals(element.getLocalName()) && matches(cs.getSimpleSelector(), element.getParent());
+					return ac.getValue().equals(element.getLocalName()) && matches(cs.getSimpleSelector(), element.getParentElement());
 				} else if (element instanceof CommentElement) {
 					final AttributeCondition ac = (AttributeCondition) cs.getCondition();
-					return CommentElement.CSS_RULE_NAME.equals(ac.getValue()) && matches(cs.getSimpleSelector(), element.getParent());
+					return CommentElement.CSS_RULE_NAME.equals(ac.getValue()) && matches(cs.getSimpleSelector(), element.getParentElement());
 				} else {
 					return false;
 				}
@@ -183,11 +183,11 @@
 
 		case Selector.SAC_DESCENDANT_SELECTOR:
 			final DescendantSelector ds = (DescendantSelector) selector;
-			return matches(ds.getSimpleSelector(), element) && matchesAncestor(ds.getAncestorSelector(), element.getParent());
+			return matches(ds.getSimpleSelector(), element) && matchesAncestor(ds.getAncestorSelector(), element.getParentElement());
 
 		case Selector.SAC_CHILD_SELECTOR:
 			final DescendantSelector ds2 = (DescendantSelector) selector;
-			final Element parent = element.getParent();
+			final Element parent = element.getParentElement();
 			return matches(ds2.getSimpleSelector(), element) && matches(ds2.getAncestorSelector(), parent);
 
 		case Selector.SAC_DIRECT_ADJACENT_SELECTOR:
@@ -197,7 +197,7 @@
 			if (element != null && element.getParent() != null && matches(ss.getSiblingSelector(), element)) {
 
 				// find next sibling
-				final Iterator<Element> i = element.getParent().getChildElements().iterator();
+				final Iterator<Element> i = element.getParentElement().getChildElements().iterator();
 				Element e = null;
 				Element f = null;
 				while (i.hasNext() && e != element) {
@@ -227,7 +227,7 @@
 			if (matches(selector, e)) {
 				return true;
 			}
-			e = e.getParent();
+			e = e.getParentElement();
 		}
 		return false;
 	}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java
index 525f6a5..f3ee679 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java
@@ -183,7 +183,7 @@
 		final Styles styles = new Styles();
 		Styles parentStyles = null;
 		if (element.getParent() != null) {
-			parentStyles = getStyles(element.getParent());
+			parentStyles = getStyles(element.getParentElement());
 		}
 
 		final Map<String, LexicalUnit> decls = getApplicableDeclarations(element);
@@ -207,7 +207,7 @@
 					break;
 				case LexicalUnit.SAC_ATTR:
 					// content: attr(attributeName)
-					final String attributeValue = element.getParent().getAttributeValue(lexicalUnit.getStringValue());
+					final String attributeValue = element.getParentElement().getAttributeValue(lexicalUnit.getStringValue());
 					if (attributeValue != null) {
 						content.add(attributeValue);
 					}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
index 604e917..5bd60f5 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DocumentFragment.java
@@ -132,7 +132,7 @@
 		out.write(contentLength);
 		for (int i = 0; i < contentLength; i++) {
 			if (content.isElementMarker(i)) {
-				out.writeUTF("\0");
+				out.writeUTF("\0"); // This internal representation of element markers has nothing to do with the internal representation in GapContent.
 			} else {
 				out.writeUTF(content.getText(i, 1));
 			}
@@ -170,7 +170,7 @@
 		final Content result = new GapContent(contentLength);
 		for (int i = 0; i < contentLength; i++) {
 			final String input = in.readUTF();
-			if ("\0".equals(input)) {
+			if ("\0".equals(input)) { // This internal representation of element markers has nothing to do with the internal representation in GapContent.
 				result.insertElementMarker(i);
 			} else {
 				result.insertText(i, input);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
index a52d7b9..b375a2a 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Element.java
@@ -30,7 +30,7 @@
 /**
  * Represents a tag in an XML document. Methods are available for managing the element's attributes and children.
  */
-public class Element extends Node implements Cloneable {
+public class Element extends Parent implements Cloneable {
 
 	/**
 	 * The xml:base attribute re-defines the base URI for a part of an XML document, according to the XML Base
@@ -42,8 +42,6 @@
 
 	private final QualifiedName name;
 
-	private Element parent = null;
-	private final List<Node> childNodes = new ArrayList<Node>();
 	private final Map<QualifiedName, Attribute> attributes = new HashMap<QualifiedName, Attribute>();
 	private final Map<String, String> namespaceDeclarations = new HashMap<String, String>();
 
@@ -55,11 +53,6 @@
 		name = qualifiedName;
 	}
 
-	public void addChild(final Element child) {
-		childNodes.add(child);
-		child.setParent(this);
-	}
-
 	@Override
 	public Element clone() {
 		try {
@@ -177,10 +170,6 @@
 		return result;
 	}
 
-	public Iterator<Node> getChildIterator() {
-		return childNodes.iterator();
-	}
-
 	public List<Element> getChildElements() {
 		final List<Node> nodes = getChildNodes();
 		final Iterator<Node> iter = nodes.iterator();
@@ -194,17 +183,14 @@
 		return elements;
 	}
 
-	public List<Node> getChildNodes() {
-		return Document.createNodeList(getContent(), getStartOffset() + 1, getEndOffset(), childNodes);
-	}
-
+	@Override
 	public Document getDocument() {
-		Element root = this;
+		Node root = this;
 		while (root.getParent() != null) {
 			root = root.getParent();
 		}
 		if (root instanceof RootElement) {
-			return root.getDocument();
+			return ((Element) root).getDocument();
 		} else {
 			return null;
 		}
@@ -230,19 +216,6 @@
 		return prefix + ":" + getLocalName();
 	}
 
-	public Element getParent() {
-		return parent;
-	}
-
-	/**
-	 * Inserts the given element as a child at the given child index. Sets the parent attribute of the given element to
-	 * this element.
-	 */
-	public void insertChild(final int index, final Element child) {
-		childNodes.add(index, child);
-		child.setParent(this);
-	}
-
 	public boolean isEmpty() {
 		return getStartOffset() + 1 == getEndOffset();
 	}
@@ -263,22 +236,34 @@
 		}
 
 		sb.append("> (");
-		sb.append(getStartPosition());
+		sb.append(getStartOffset());
 		sb.append(",");
-		sb.append(getEndPosition());
+		sb.append(getEndOffset());
 		sb.append(")");
 
 		return sb.toString();
 	}
 
-	public void setParent(final Element parent) {
-		this.parent = parent;
+	public Element getParentElement() {
+		return getParentElement(this);
+	}
+
+	private static Element getParentElement(final Node node) {
+		final Node parent = node.getParent();
+		if (parent == null) {
+			return null;
+		}
+		if (parent instanceof Element) {
+			return (Element) parent;
+		}
+		return getParentElement(parent);
 	}
 
 	public String getNamespaceURI(final String namespacePrefix) {
 		if (namespaceDeclarations.containsKey(namespacePrefix)) {
 			return namespaceDeclarations.get(namespacePrefix);
 		}
+		final Element parent = getParentElement();
 		if (parent != null) {
 			return parent.getNamespaceURI(namespacePrefix);
 		}
@@ -308,6 +293,7 @@
 				return entry.getKey();
 			}
 		}
+		final Element parent = getParentElement();
 		if (parent != null) {
 			final String parentPrefix = parent.getNamespacePrefix(namespaceURI);
 			if (!namespaceDeclarations.containsKey(parentPrefix)) {
@@ -331,6 +317,7 @@
 	public Collection<String> getNamespacePrefixes() {
 		final HashSet<String> result = new HashSet<String>();
 		result.addAll(getDeclaredNamespacePrefixes());
+		final Element parent = getParentElement();
 		if (parent != null) {
 			result.addAll(parent.getNamespacePrefixes());
 		}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
index 82f1300..c234c99 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Node.java
@@ -15,34 +15,23 @@
  */
 public abstract class Node {
 
+	private Parent parent;
 	private Content content;
 	private Position startPosition;
 	private Position endPosition;
 
+	public Parent getParent() {
+		return parent;
+	}
+
+	public void setParent(final Parent parent) {
+		this.parent = parent;
+	}
+
 	public Content getContent() {
 		return content;
 	}
 
-	public int getEndOffset() {
-		return endPosition.getOffset();
-	}
-
-	public Position getEndPosition() {
-		return endPosition;
-	}
-
-	public int getStartOffset() {
-		return startPosition.getOffset();
-	}
-
-	public Position getStartPosition() {
-		return startPosition;
-	}
-
-	public String getText() {
-		return content.getText(getStartOffset(), getEndOffset() - getStartOffset());
-	}
-
 	/**
 	 * Sets the content of this node
 	 * 
@@ -59,6 +48,18 @@
 		endPosition = content.createPosition(endOffset);
 	}
 
+	public int getEndOffset() {
+		return endPosition.getOffset();
+	}
+
+	public int getStartOffset() {
+		return startPosition.getOffset();
+	}
+
+	public String getText() {
+		return content.getText(getStartOffset(), getEndOffset() - getStartOffset());
+	}
+
 	public abstract String getNodeType();
 
 	public abstract String getBaseURI();
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
new file mode 100644
index 0000000..ef389c2
--- /dev/null
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Parent.java
@@ -0,0 +1,47 @@
+package org.eclipse.vex.core.internal.dom;

+

+import java.util.ArrayList;

+import java.util.Collections;

+import java.util.Iterator;

+import java.util.List;

+

+public abstract class Parent extends Node {

+

+	private final List<Node> children = new ArrayList<Node>();

+

+	public void addChild(final Node child) {

+		children.add(child);

+		child.setParent(this);

+	}

+

+	public void insertChild(final int index, final Node child) {

+		children.add(index, child);

+		child.setParent(this);

+	}

+

+	public void removeChild(final Node child) {

+		children.remove(child);

+		child.setParent(null);

+	}

+

+	public List<Node> getChildNodes() {

+		//		return Document.createNodeList(getContent(), getStartOffset() + 1, getEndOffset(), childNodes);

+		return Collections.unmodifiableList(children);

+	}

+

+	public Iterator<Node> getChildIterator() {

+		return getChildNodes().iterator();

+	}

+

+	public Node getChildNode(final int index) {

+		return children.get(index);

+	}

+

+	public int getChildCount() {

+		return children.size();

+	}

+

+	public boolean hasChildren() {

+		return !children.isEmpty();

+	}

+}

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
index 374621f..fd1eccc 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/AbstractBlockBox.java
@@ -488,7 +488,7 @@
 	protected void paintSelectionFrame(final LayoutContext context, final int x, final int y, final boolean selected) {
 
 		final Element element = getElement();
-		final Element parent = element == null ? null : element.getParent();
+		final Element parent = element == null ? null : element.getParentElement();
 
 		final boolean paintFrame = context.isElementSelected(element) && !context.isElementSelected(parent);
 
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/BlockElementBox.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/BlockElementBox.java
index 9c58ef9..bcff036 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/BlockElementBox.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/BlockElementBox.java
@@ -303,7 +303,7 @@
 	 */
 	private int getItemNumber() {
 		final Element element = getElement();
-		final Element parent = element.getParent();
+		final Element parent = element.getParentElement();
 
 		if (parent == null) {
 			return 1;
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/TextBox.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/TextBox.java
index f104ca9..6ce554d 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/TextBox.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/TextBox.java
@@ -146,7 +146,7 @@
 				}
 				break;
 			}
-			e = e.getParent();
+			e = e.getParentElement();
 		}
 
 		if (inSelectedBlock) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/validator/WTPVEXValidator.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/validator/WTPVEXValidator.java
index 6083eab..4e7025a 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/validator/WTPVEXValidator.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/validator/WTPVEXValidator.java
@@ -180,7 +180,7 @@
 		if (declarationFromRoot != null) {
 			return declarationFromRoot;
 		}
-		final CMElementDeclaration parentDeclaration = getElementDeclaration(element.getParent());
+		final CMElementDeclaration parentDeclaration = getElementDeclaration(element.getParentElement());
 		if (parentDeclaration == null) {
 			return null;
 		}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
index 1c9b2c9..68a35bb 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VexWidgetImpl.java
@@ -276,7 +276,7 @@
 		}
 
 		final Element element = doc.getElementAt(getCaretOffset());
-		final Element parent = element.getParent();
+		final Element parent = element.getParentElement();
 		if (parent == null) {
 			// can't unwrap the root
 			return false;
@@ -616,7 +616,7 @@
 		}
 
 		final Element element = doc.getElementAt(getCaretOffset());
-		final Element parent = element.getParent();
+		final Element parent = element.getParentElement();
 		if (parent == null) {
 			// can't morph the root
 			return new ElementName[0];
@@ -864,7 +864,7 @@
 						caretColor = new Color(red, green, blue);
 						break;
 					}
-					element = element.getParent();
+					element = element.getParentElement();
 				}
 			}
 
@@ -1160,7 +1160,7 @@
 		Element element = doc.getElementAt(getCaretOffset());
 		Styles styles = getStyleSheet().getStyles(element);
 		while (!styles.isBlock()) {
-			element = element.getParent();
+			element = element.getParentElement();
 			styles = getStyleSheet().getStyles(element);
 		}
 
diff --git a/org.eclipse.vex.docbook/src/org/eclipse/vex/docbook/DocBookOutlineProvider.java b/org.eclipse.vex.docbook/src/org/eclipse/vex/docbook/DocBookOutlineProvider.java
index 1d15624..2dbde2c 100644
--- a/org.eclipse.vex.docbook/src/org/eclipse/vex/docbook/DocBookOutlineProvider.java
+++ b/org.eclipse.vex.docbook/src/org/eclipse/vex/docbook/DocBookOutlineProvider.java
@@ -44,7 +44,7 @@
 	public Element getOutlineElement(final Element child) {
 		Element element = child;
 		while (element.getParent() != null && !isTitledElement(element)) {
-			element = element.getParent();
+			element = element.getParentElement();
 		}
 
 		return element;
@@ -63,7 +63,7 @@
 		}
 
 		public Object getParent(final Object element) {
-			final Element parent = ((Element) element).getParent();
+			final Element parent = ((Element) element).getParentElement();
 			if (parent == null) {
 				return element;
 			} else {
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/editor/VexEditor.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/editor/VexEditor.java
index 72c5e32..2767c7f 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/editor/VexEditor.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/editor/VexEditor.java
@@ -723,7 +723,7 @@
 		Element element = vexWidget.getCurrentElement();
 		while (element != null) {
 			path.add(element.getPrefixedName());
-			element = element.getParent();
+			element = element.getParentElement();
 		}
 		Collections.reverse(path);
 		final StringBuilder sb = new StringBuilder(path.size() * 15);
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
index e83eea0..8130bf1 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
@@ -38,7 +38,7 @@
 		Element element = widget.getCurrentElement();
 		Styles styles = widget.getStyleSheet().getStyles(element);
 		while (!styles.isBlock()) {
-			element = element.getParent();
+			element = element.getParentElement();
 			if (element == null || element instanceof RootElement) {
 				return; // we reached the root element which cannot be split 
 			}
@@ -93,7 +93,7 @@
 						if (child == element) {
 							break;
 						}
-						child = child.getParent();
+						child = child.getParentElement();
 					}
 
 					for (int i = children.size() - 1; i >= 0; i--) {
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
index 751d004..d7aba23 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
@@ -214,7 +214,7 @@
 			if (ss.getStyles(element).getDisplay().equals(CSS.TABLE_ROW)) {
 				return element;
 			}
-			element = element.getParent();
+			element = element.getParentElement();
 		}
 
 		return null;
@@ -458,14 +458,14 @@
 		Element table = doc.getElementAt(offset);
 
 		while (table != null && !LayoutUtils.isTableChild(ss, table)) {
-			table = table.getParent();
+			table = table.getParentElement();
 		}
 
 		while (table != null && LayoutUtils.isTableChild(ss, table)) {
-			table = table.getParent();
+			table = table.getParentElement();
 		}
 
-		if (table == null || table.getParent() == null) {
+		if (table == null || table.getParentElement() == null) {
 			return;
 		}
 
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/outline/DefaultOutlineProvider.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/outline/DefaultOutlineProvider.java
index 66604ee..f3ae7a1 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/outline/DefaultOutlineProvider.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/outline/DefaultOutlineProvider.java
@@ -66,7 +66,7 @@
 			}
 
 			// root?
-			final Element parent = element.getParent();
+			final Element parent = element.getParentElement();
 			if (parent == null) {
 				return element;
 			}
diff --git a/org.eclipse.vex.xhtml/src/org/eclipse/vex/xhtml/XhtmlOutlineProvider.java b/org.eclipse.vex.xhtml/src/org/eclipse/vex/xhtml/XhtmlOutlineProvider.java
index bbba6e1..6525085 100644
--- a/org.eclipse.vex.xhtml/src/org/eclipse/vex/xhtml/XhtmlOutlineProvider.java
+++ b/org.eclipse.vex.xhtml/src/org/eclipse/vex/xhtml/XhtmlOutlineProvider.java
@@ -50,7 +50,7 @@
 				return element;

 			}

 

-			element = element.getParent();

+			element = element.getParentElement();

 		}

 		return element;

 	}

@@ -70,7 +70,7 @@
 		}

 

 		public Object getParent(final Object element) {

-			final Element parent = ((Element) element).getParent();

+			final Element parent = ((Element) element).getParentElement();

 			if (parent == null) {

 				return element;

 			} else {

@@ -123,7 +123,7 @@
 			// between this element and the next element at the same level

 			final int level = Integer.parseInt(element.getLocalName().substring(1));

 			final String childName = "h" + (level + 1);

-			final List<Element> childElements = element.getParent().getChildElements();

+			final List<Element> childElements = element.getParentElement().getChildElements();

 			boolean foundSelf = false;

 			for (final Element child : childElements) {

 				if (child == element) {