split always splits elements, independent of the whitespace policy
The split operation always splits the current element, independent of
the whitespace policy. The differenciation between preformatted elements
(newline characters are keept) and other elements (newline characters
will split the element) is only done in insertText.
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
index 4da09c2..409adf0 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
@@ -12,6 +12,7 @@
package org.eclipse.vex.core.internal.widget;
import static org.eclipse.vex.core.internal.widget.VexWidgetTest.PARA;
+import static org.eclipse.vex.core.internal.widget.VexWidgetTest.PRE;
import static org.eclipse.vex.core.internal.widget.VexWidgetTest.TITLE;
import static org.eclipse.vex.core.internal.widget.VexWidgetTest.createDocumentWithDTD;
import static org.eclipse.vex.core.tests.TestResources.TEST_DTD;
@@ -24,7 +25,6 @@
import java.io.IOException;
import java.util.List;
-import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.vex.core.internal.css.CssWhitespacePolicy;
import org.eclipse.vex.core.internal.css.StyleSheet;
import org.eclipse.vex.core.internal.css.StyleSheetReader;
@@ -297,7 +297,7 @@
widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
rootElement = widget.getDocument().getRootElement();
- final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+ final IElement preElement = widget.insertElement(PRE);
assertEquals(preElement.getEndOffset(), widget.getCaretOffset());
widget.insertText("line1");
widget.insertText("\n");
@@ -351,7 +351,7 @@
public void givenPreElement_whenInsertingTextWithNewline_shouldInsertNewline() throws Exception {
widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
- final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+ final IElement preElement = widget.insertElement(PRE);
assertEquals(preElement.getEndOffset(), widget.getCaretOffset());
widget.insertText("line1\nline2");
assertEquals("line1\nline2", preElement.getText());
@@ -361,7 +361,7 @@
public void givenPreElement_whenInsertingText_shouldKeepWhitespace() throws Exception {
widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
- final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+ final IElement preElement = widget.insertElement(PRE);
widget.moveTo(preElement.getEndOffset());
widget.insertText("line1\nline2 end");
@@ -380,7 +380,7 @@
widget.insertText("line1\nline2 \t end");
final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
- assertEquals("single para element", 2, children.size());
+ assertEquals("two para elements", 2, children.size());
assertTrue("original para element", children.get(0) instanceof IParent);
assertTrue("splitted para element", children.get(1) instanceof IParent);
assertEquals("first line", "line1", children.get(0).getText());
@@ -396,13 +396,56 @@
widget.insertText("line1\n\nline2");
final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
- assertEquals("single para element", 2, children.size());
+ assertEquals("two para elements", 2, children.size());
assertTrue("original para element", children.get(0) instanceof IParent);
assertTrue("splitted para element", children.get(1) instanceof IParent);
assertEquals("first line", "line1", children.get(0).getText());
assertEquals("second line", "line2", children.get(1).getText());
}
+ @Test
+ public void givenNonPreElement_whenSplitting_shouldSplitIntoTwoElements() throws Exception {
+ widget.setDocument(createDocumentWithDTD(TEST_DTD, "section"), readTestStyleSheet());
+ widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
+ final IElement para = widget.insertElement(PARA);
+ widget.moveTo(para.getEndOffset());
+ widget.insertText("line1line2");
+ widget.moveBy(-5);
+
+ widget.split();
+
+ final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
+ assertEquals("two para elements", 2, children.size());
+ assertTrue("original para element", children.get(0) instanceof IParent);
+ assertTrue("splitted para element", children.get(1) instanceof IParent);
+ assertEquals("first line element", PARA, ((IElement) children.get(0)).getQualifiedName());
+ assertEquals("second line element", PARA, ((IElement) children.get(0)).getQualifiedName());
+ assertEquals("first line", "line1", children.get(0).getText());
+ assertEquals("second line", "line2", children.get(1).getText());
+ }
+
+ @Test
+ public void givenPreElement_whenSplitting_shouldSplitIntoTwoElements() throws Exception {
+ widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
+ widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
+ final IElement preElement = widget.insertElement(PRE);
+ widget.moveTo(preElement.getEndOffset());
+ widget.insertText("line1line2");
+ widget.moveBy(-5);
+
+ widget.split();
+
+ final List<? extends INode> children = widget.getDocument().getRootElement().children().after(preElement.getStartOffset()).asList();
+ assertEquals("two para elements", 2, children.size());
+ assertTrue("original pre element", children.get(0) instanceof IParent);
+ assertTrue("splitted pre element", children.get(1) instanceof IParent);
+ assertEquals("first line element", PRE, ((IElement) children.get(0)).getQualifiedName());
+ assertEquals("second line element", PRE, ((IElement) children.get(0)).getQualifiedName());
+ assertEquals("first line", "line1", children.get(0).getText());
+ assertEquals("second line", "line2", children.get(1).getText());
+
+ }
+
private static StyleSheet readTestStyleSheet() throws IOException {
return new StyleSheetReader().read(TestResources.get("test.css"));
}
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
index 0ebc2c5..f5b51e7 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
@@ -34,6 +34,7 @@
public static final QualifiedName TITLE = new QualifiedName(null, "title");
public static final QualifiedName PARA = new QualifiedName(null, "para");
+ public static final QualifiedName PRE = new QualifiedName(null, "pre");
private IVexWidget widget;
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
index 090e203..606b337 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
@@ -848,7 +848,7 @@
final IElement element = document.getElementForInsertionAt(getCaretOffset());
final boolean isPreformatted = whitespacePolicy.isPre(element);
- String toInsert;
+ final String toInsert;
if (!isPreformatted) {
toInsert = XML.compressWhitespace(XML.normalizeNewlines(text), true, true, true);
} else {
@@ -868,7 +868,12 @@
applyEdit(new InsertTextEdit(document, getCaretOffset(), toInsert.substring(i, nextLineBreak)), getCaretOffset());
}
this.moveTo(getCaretOffset() + nextLineBreak - i);
- split();
+ if (isPreformatted) {
+ applyEdit(new InsertTextEdit(document, getCaretOffset(), "\n"), getCaretOffset());
+ moveBy(1);
+ } else {
+ split();
+ }
i = nextLineBreak + 1;
}
@@ -1486,35 +1491,29 @@
final long start = System.currentTimeMillis();
final IElement element = getBlockForInsertionAt(getCaretOffset());
- final boolean isPreformatted = whitespacePolicy.isPre(element);
boolean success = false;
try {
beginWork();
- if (isPreformatted) {
- applyEdit(new InsertTextEdit(document, getCaretOffset(), "\n"), getCaretOffset());
- this.moveBy(1);
- } else {
- IDocumentFragment frag = null;
- int offset = getCaretOffset();
- final boolean atEnd = offset == element.getEndOffset();
- if (!atEnd) {
- this.moveTo(element.getEndOffset(), true);
- frag = getSelectedFragment();
- deleteSelection();
- }
+ IDocumentFragment frag = null;
+ int offset = getCaretOffset();
+ final boolean atEnd = offset == element.getEndOffset();
+ if (!atEnd) {
+ this.moveTo(element.getEndOffset(), true);
+ frag = getSelectedFragment();
+ deleteSelection();
+ }
- // either way, we are now at the end offset for the element, let's move just outside
- this.moveBy(1);
+ // either way, we are now at the end offset for the element, let's move just outside
+ this.moveBy(1);
- insertElement(element.getQualifiedName());
- // TODO: clone attributes
+ insertElement(element.getQualifiedName());
+ // TODO: clone attributes
- if (!atEnd) {
- offset = getCaretOffset();
- insertFragment(frag);
- this.moveTo(offset, false);
- }
+ if (!atEnd) {
+ offset = getCaretOffset();
+ insertFragment(frag);
+ this.moveTo(offset, false);
}
success = true;
} finally {