Document should not have its own reference to Content.

Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
index 6458a15..650a70f 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/Document.java
@@ -29,7 +29,6 @@
  */
 public class Document extends Parent {
 
-	private final Content content;
 	private final Element rootElement;
 	private final ListenerList<DocumentListener, DocumentEvent> listeners = new ListenerList<DocumentListener, DocumentEvent>(DocumentListener.class);
 	private boolean undoEnabled = true;
@@ -49,9 +48,10 @@
 	 * 
 	 */
 	public Document(final Element rootElement) {
-		content = new GapContent(100);
+		final GapContent content = new GapContent(100);
 		content.insertElementMarker(0);
 		content.insertElementMarker(0);
+		associate(content, 0, 1);
 
 		this.rootElement = rootElement;
 		addChild(rootElement);
@@ -69,7 +69,7 @@
 	 * 
 	 */
 	public Document(final Content content, final Element rootElement) {
-		this.content = content;
+		associate(content, 0, content.getLength() - 1);
 		this.rootElement = rootElement;
 		addChild(rootElement);
 	}
@@ -122,7 +122,7 @@
 	}
 
 	public Position createPosition(final int offset) {
-		return content.createPosition(offset);
+		return getContent().createPosition(offset);
 	}
 
 	public void delete(final int startOffset, final int endOffset) throws DocumentValidationException {
@@ -156,7 +156,7 @@
 			}
 		}
 
-		content.remove(startOffset, endOffset - startOffset);
+		getContent().remove(startOffset, endOffset - startOffset);
 
 		final IUndoableEdit edit = undoEnabled ? new DeleteEdit(startOffset, endOffset, frag) : null;
 
@@ -184,7 +184,7 @@
 	}
 
 	public char getCharacterAt(final int offset) {
-		final String text = content.getText(offset, 1);
+		final String text = getContent().getText(offset, 1);
 		if (text.length() == 0) {
 			/*
 			 * XXX This is used in VexWidgetImpl.deleteNextChar/deletePreviousChar to find out if there is an element
@@ -222,7 +222,7 @@
 	}
 
 	public boolean isElementAt(final int offset) {
-		return content.isElementMarker(offset);
+		return getContent().isElementMarker(offset);
 	}
 
 	public String getEncoding() {
@@ -235,8 +235,8 @@
 
 	public DocumentFragment getFragment(final int startOffset, final int endOffset) {
 
-		assertOffset(startOffset, 0, content.getLength());
-		assertOffset(endOffset, 0, content.getLength());
+		assertOffset(startOffset, 0, getContent().getLength());
+		assertOffset(endOffset, 0, getContent().getLength());
 
 		if (endOffset <= startOffset) {
 			throw new IllegalArgumentException("Invalid range (" + startOffset + ", " + endOffset + ")");
@@ -250,7 +250,7 @@
 
 		final List<Element> children = e1.getChildElements();
 
-		final Content newContent = content.getContent(startOffset, endOffset - startOffset);
+		final Content newContent = getContent().getContent(startOffset, endOffset - startOffset);
 		final List<Element> newChildren = new ArrayList<Element>();
 		for (int i = 0; i < children.size(); i++) {
 			final Element child = children.get(i);
@@ -267,7 +267,7 @@
 	}
 
 	public int getLength() {
-		return content.getLength();
+		return getContent().getLength();
 	}
 
 	public List<QualifiedName> getNodeNames(final int startOffset, final int endOffset) {
@@ -378,11 +378,11 @@
 	}
 
 	public String getText(final int startOffset, final int endOffset) {
-		return content.getText(startOffset, endOffset - startOffset);
+		return getContent().getText(startOffset, endOffset - startOffset);
 	}
 
 	public String getRawText(final int startOffset, final int endOffset) {
-		return content.getRawText(startOffset, endOffset - startOffset);
+		return getContent().getRawText(startOffset, endOffset - startOffset);
 	}
 
 	public Validator getValidator() {
@@ -433,10 +433,10 @@
 
 		fireBeforeContentInserted(new DocumentEvent(this, parent, offset, 2, null));
 
-		content.insertElementMarker(offset);
-		content.insertElementMarker(offset + 1);
+		getContent().insertElementMarker(offset);
+		getContent().insertElementMarker(offset + 1);
 
-		element.associate(content, offset, offset + 1);
+		element.associate(getContent(), offset, offset + 1);
 		element.setParent(parent);
 		parent.insertChild(childIndex, element);
 
@@ -465,7 +465,7 @@
 
 		fireBeforeContentInserted(new DocumentEvent(this, parent, offset, 2, null));
 
-		content.insertContent(offset, fragment.getContent());
+		getContent().insertContent(offset, fragment.getContent());
 
 		final List<Element> children = parent.getChildElements();
 		int index = 0;
@@ -475,7 +475,7 @@
 
 		final List<Element> elements = fragment.getElements();
 		for (int i = 0; i < elements.size(); i++) {
-			final Element newElement = cloneElement(elements.get(i), content, offset, parent);
+			final Element newElement = cloneElement(elements.get(i), getContent(), offset, parent);
 			parent.insertChild(index, newElement);
 			index++;
 		}
@@ -494,9 +494,9 @@
 		final Element parent = getElementAt(offset);
 
 		boolean isValid = false;
-		if (!content.isElementMarker(offset - 1)) {
+		if (!getContent().isElementMarker(offset - 1)) {
 			isValid = true;
-		} else if (!content.isElementMarker(offset)) {
+		} else if (!getContent().isElementMarker(offset)) {
 			isValid = true;
 		} else {
 			final Validator validator = getValidator();
@@ -527,7 +527,7 @@
 
 		fireBeforeContentInserted(new DocumentEvent(this, parent, offset, 2, null));
 
-		content.insertText(offset, s);
+		getContent().insertText(offset, s);
 
 		final IUndoableEdit edit = undoEnabled ? new InsertTextEdit(offset, s) : null;