handle splitting of InlineNodeReference before the first content child
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/InlineNodeReference.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/InlineNodeReference.java
index 1352486..688508c 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/InlineNodeReference.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/InlineNodeReference.java
@@ -312,7 +312,7 @@
if (node != otherNodeReference.node) {
return false;
}
- if (endPosition.getOffset() != otherNodeReference.getStartOffset() - 1) {
+ if (endPosition.getOffset() != otherNodeReference.getStartOffset() - 1 && endPosition.getOffset() != otherNodeReference.getStartOffset()) {
return false;
}
if (!component.canJoin(otherNodeReference.component)) {
@@ -361,32 +361,36 @@
tail.setParent(parent);
tail.layout(graphics);
- adaptContentRanges(firstChildOffset, tail);
-
layout(graphics);
+ adaptContentRanges(firstChildOffset, tail);
+
return tail;
}
private void adaptContentRanges(final int oldOffsetOfFirstChild, final InlineNodeReference tail) {
- if (tail.getComponent().getWidth() == 0) {
+ if (tail.getWidth() == 0) {
return;
}
final int offsetOfFirstChildInTail = findStartOffset(tail.getComponent());
final int splitPosition;
- if (oldOffsetOfFirstChild == offsetOfFirstChildInTail) {
- splitPosition = startPosition.getOffset();
- } else if (offsetOfFirstChildInTail == -1) {
+ if (offsetOfFirstChildInTail == -1) {
splitPosition = endPosition.getOffset();
+ } else if (offsetOfFirstChildInTail == oldOffsetOfFirstChild && width == 0) {
+ splitPosition = startPosition.getOffset();
} else {
splitPosition = offsetOfFirstChildInTail;
}
Assert.isTrue(splitPosition >= getStartOffset(), MessageFormat.format("Split position {0} is invalid.", splitPosition));
+
tail.setSubrange(node, splitPosition, getEndOffset());
node.getContent().removePosition(endPosition);
- endPosition = node.getContent().createPosition(splitPosition - 1);
+ endPosition = node.getContent().createPosition(Math.max(startPosition.getOffset(), splitPosition - 1));
+
+ Assert.isTrue(startPosition.getOffset() <= endPosition.getOffset(), "InlineNodeReference head range is invalid: [" + startPosition + ", " + endPosition + "]");
+ Assert.isTrue(tail.startPosition.getOffset() <= tail.endPosition.getOffset(), "InlineNodeReference tail range is invalid: [" + tail.startPosition + ", " + tail.endPosition + "]");
}
private int findStartOffset(final IBox startBox) {