define the visualization of empty elements through the content property

Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java
index cee1f51..2840bda 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java
@@ -197,7 +197,7 @@
 	 */
 	public List<String> getTextualContent(final INode node) {
 		final List<String> content = new ArrayList<String>();
-		for (LexicalUnit lexicalUnit : contentLexicalUnits) {
+		for (final LexicalUnit lexicalUnit : contentLexicalUnits) {
 			switch (lexicalUnit.getLexicalUnitType()) {
 			case LexicalUnit.SAC_STRING_VALUE:
 				// content: "A String"
@@ -224,19 +224,17 @@
 				});
 				break;
 			}
-			lexicalUnit = lexicalUnit.getNextLexicalUnit();
 		}
 		return content;
 	}
 
 	public List<IPropertyContent> getAllContent(final INode node) {
 		final List<IPropertyContent> allContent = new ArrayList<IPropertyContent>();
-		for (LexicalUnit lexicalUnit : contentLexicalUnits) {
+		for (final LexicalUnit lexicalUnit : contentLexicalUnits) {
 			final IPropertyContent content = getContent(lexicalUnit, node);
 			if (content != null) {
 				allContent.add(content);
 			}
-			lexicalUnit = lexicalUnit.getNextLexicalUnit();
 		}
 		return allContent;
 	}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
index 0ac6a4b..cfc17ef 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
@@ -248,7 +248,7 @@
 	}
 
 	private IStructuralBox visualizeStructuralElementWithNoContentAllowed(final Styles styles, final IElement element) {
-		return paragraph(styles, nodeTag(element, styles));
+		return paragraph(styles, visualizeInlineElementWithNoContentAllowed(element, styles));
 	}
 
 	private <P extends IParentBox<IStructuralBox>> P visualizeChildrenAsStructure(final INode node, final Styles styles, final Iterable<VisualizeResult> childrenResults, final P parentBox) {
@@ -361,7 +361,7 @@
 			public IInlineBox visit(final IElement element) {
 				if (isElementWithNoContentAllowed(element)) {
 					return nodeReference(element,
-							frame(surroundWithInlinePseudoElements(inlineContainer(visualizeEmptyInlineElementWithNoContentAllowed(element, styles)), element, styles), styles));
+							frame(surroundWithInlinePseudoElements(inlineContainer(visualizeInlineElementWithNoContentAllowed(element, styles)), element, styles), styles));
 				}
 
 				final InlineContainer inlineElementContent = surroundWithInlineMarkers(element, styles,
@@ -423,8 +423,11 @@
 		}
 	}
 
-	private static IInlineBox visualizeEmptyInlineElementWithNoContentAllowed(final INode node, final Styles styles) {
-		return nodeTag(node, styles);
+	private static IInlineBox visualizeInlineElementWithNoContentAllowed(final INode node, final Styles styles) {
+		if (!styles.isContentDefined()) {
+			return nodeTag(node, styles);
+		}
+		return visualizeContentProperty(node, styles, inlineContainer());
 	}
 
 	private static IInlineBox visualizeText(final IContent content, final ContentRange textRange, final INode parentNode, final Styles styles) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VisualizationController.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VisualizationController.java
index 373b199..f1cfa4c 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VisualizationController.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/VisualizationController.java
@@ -31,6 +31,7 @@
 	private final IDocumentListener documentListener = new IDocumentListener() {
 		@Override
 		public void attributeChanged(final AttributeChangeEvent event) {
+			visualization.rebuildContentRange(event.getParent(), event.getParent().getRange());
 		}
 
 		@Override
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/boxview/BoxDemoView.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/boxview/BoxDemoView.java
index 593ca3b..4253f81 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/boxview/BoxDemoView.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/boxview/BoxDemoView.java
@@ -58,6 +58,7 @@
 import org.eclipse.vex.core.provisional.dom.ContentRange;
 import org.eclipse.vex.core.provisional.dom.IContent;
 import org.eclipse.vex.core.provisional.dom.IDocument;
+import org.eclipse.vex.core.provisional.dom.IElement;
 import org.w3c.css.sac.CSSException;
 import org.w3c.css.sac.InputSource;
 
@@ -247,7 +248,8 @@
 	}
 
 	public void insertAnchor() {
-		boxWidget.insertElement(ANCHOR);
+		final IElement anchor = boxWidget.insertElement(ANCHOR);
+		anchor.setAttribute("id", Double.toHexString(Math.random()));
 	}
 
 	public void insertComment() {