fix layout reconciliation after content deletion
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
index d231581..12411ab 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
@@ -27,6 +27,7 @@
import org.eclipse.vex.core.internal.boxes.ListItem;
import org.eclipse.vex.core.internal.boxes.NodeEndOffsetPlaceholder;
import org.eclipse.vex.core.internal.boxes.Paragraph;
+import org.eclipse.vex.core.internal.boxes.ParentTraversal;
import org.eclipse.vex.core.internal.boxes.RootBox;
import org.eclipse.vex.core.internal.boxes.StructuralFrame;
import org.eclipse.vex.core.internal.boxes.StructuralNodeReference;
@@ -193,7 +194,7 @@
}
public void rebuildContentRange(final INode node, final ContentRange modifiedRange) {
- final IContentBox modifiedBox = contentTopology.findBoxForRange(modifiedRange);
+ final IContentBox modifiedBox = findModifiedBox(modifiedRange);
Assert.isNotNull(modifiedBox, "No box found for range " + modifiedRange);
modifiedBox.accept(new BaseBoxVisitor() {
@@ -222,4 +223,48 @@
}
});
}
+
+ private IContentBox findModifiedBox(final ContentRange modifiedRange) {
+ final IContentBox modifiedBox = contentTopology.findBoxForRange(new ContentRange(modifiedRange.getStartOffset(), modifiedRange.getStartOffset()));
+ if (modifiedBox.getEndOffset() >= modifiedRange.getEndOffset()) {
+ return modifiedBox;
+ }
+ return surroundingContentBox(modifiedBox);
+ }
+
+ private static IContentBox surroundingContentBox(final IContentBox contentBox) {
+ return contentBox.accept(new ParentTraversal<IContentBox>() {
+ @Override
+ public IContentBox visit(final StructuralNodeReference box) {
+ if (box == contentBox) {
+ return super.visit(box);
+ }
+ return box;
+ }
+
+ @Override
+ public IContentBox visit(final InlineNodeReference box) {
+ if (box == contentBox) {
+ return super.visit(box);
+ }
+ return box;
+ }
+
+ @Override
+ public IContentBox visit(final TextContent box) {
+ if (box == contentBox) {
+ return super.visit(box);
+ }
+ return box;
+ }
+
+ @Override
+ public IContentBox visit(final NodeEndOffsetPlaceholder box) {
+ if (box == contentBox) {
+ return super.visit(box);
+ }
+ return box;
+ }
+ });
+ }
}