show squares to indicate line breaks

In order to demonstrate that it is possible to distribute the content of
one IText node over several inline boxes, we insert a Square at every
line break. All boxes that relate to the IText node are aggregated in an
InlineContainer.

Signed-off-by: Florian Thienel <florian@thienel.org>
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 9dc0786..5eb5db1 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
@@ -14,6 +14,7 @@
 import static org.eclipse.vex.core.internal.boxes.BoxFactory.nodeReference;
 import static org.eclipse.vex.core.internal.boxes.BoxFactory.nodeReferenceWithText;
 import static org.eclipse.vex.core.internal.boxes.BoxFactory.rootBox;
+import static org.eclipse.vex.core.internal.boxes.BoxFactory.square;
 import static org.eclipse.vex.core.internal.boxes.BoxFactory.verticalBlock;
 import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.frame;
 import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.paragraph;
@@ -29,6 +30,7 @@
 import org.eclipse.vex.core.internal.boxes.IInlineBox;
 import org.eclipse.vex.core.internal.boxes.IParentBox;
 import org.eclipse.vex.core.internal.boxes.IStructuralBox;
+import org.eclipse.vex.core.internal.boxes.InlineContainer;
 import org.eclipse.vex.core.internal.boxes.RootBox;
 import org.eclipse.vex.core.internal.css.CSS;
 import org.eclipse.vex.core.internal.css.StyleSheet;
@@ -41,6 +43,7 @@
 import org.eclipse.vex.core.provisional.dom.INode;
 import org.eclipse.vex.core.provisional.dom.IText;
 import org.eclipse.vex.core.provisional.dom.IValidator;
+import org.eclipse.vex.core.provisional.dom.MultilineText;
 
 /**
  * @author Florian Thienel
@@ -198,7 +201,19 @@
 
 			@Override
 			public IInlineBox visit(final IText text) {
-				return textContent(text.getContent(), text.getRange(), styles);
+				if (!CSS.PRE.equals(styles.getWhiteSpace())) { // TODO use IWhitespacePolicy
+					return textContent(text.getContent(), text.getRange(), styles);
+				}
+
+				final InlineContainer lineContainer = inlineContainer();
+				final MultilineText lines = text.getContent().getMultilineText(text.getRange());
+				for (int i = 0; i < lines.size(); i += 1) {
+					lineContainer.appendChild(textContent(text.getContent(), lines.getRange(i), styles));
+					if (text.getContent().isLineBreak(lines.getRange(i).getEndOffset())) {
+						lineContainer.appendChild(square(10));
+					}
+				}
+				return lineContainer;
 			}
 		});
 	}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
index 4ecda19..07d3a51 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
@@ -122,6 +122,14 @@
 	boolean isTagMarker(int offset);
 
 	/**
+	 * Indicate if there is a line break at the given offset.
+	 *
+	 * @param offset
+	 *            offset at which to check if a line break is present.
+	 */
+	boolean isLineBreak(int offset);
+
+	/**
 	 * Delete the given range of characters.
 	 *
 	 * @param range