prevent to enter #PCDATA into empty elements
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src/org/eclipse/wst/xml/vex/core/internal/validator/WTPVEXValidator.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src/org/eclipse/wst/xml/vex/core/internal/validator/WTPVEXValidator.java
index e661e34..436dfa2 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src/org/eclipse/wst/xml/vex/core/internal/validator/WTPVEXValidator.java
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src/org/eclipse/wst/xml/vex/core/internal/validator/WTPVEXValidator.java
@@ -180,7 +180,20 @@
public boolean isValidSequence(String element, EList<String> seq1,
EList<String> seq2, EList<String> seq3, boolean partial) {
+
// TODO
+
+ CMNode parent = getSchema().getElements().getNamedItem(element);
+ if (!(parent instanceof CMElementDeclaration)) return true;
+
+ // must be empty?
+ CMElementDeclaration declaration = (CMElementDeclaration) parent;
+ if ( declaration.getContentType() == CMElementDeclaration.EMPTY
+ && seq2.size() > 0) {
+ return false;
+ }
+
return true;
}
+
}
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src/org/eclipse/wst/xml/vex/core/internal/dom/DTDValidatorTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src/org/eclipse/wst/xml/vex/core/internal/dom/DTDValidatorTest.java
index 3a9659a..2e1ce22 100644
--- a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src/org/eclipse/wst/xml/vex/core/internal/dom/DTDValidatorTest.java
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src/org/eclipse/wst/xml/vex/core/internal/dom/DTDValidatorTest.java
@@ -20,6 +20,8 @@
import junit.framework.TestCase;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
import org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition;
@@ -110,6 +112,13 @@
assertValidItemsAt(doc, 1, "section");
}
+ public void testSequences() {
+ assertValidSequence("title", "#PCDATA");
+ assertInvalidSequence("empty", "#PCDATA");
+ // TODO test more sequences like:
+ // assertInvalidSequence("title", "section");
+ }
+
private void assertValidItemsAt(VEXDocument doc, int offset,
String... expectedItems) {
Set<String> expected = new HashSet<String>(expectedItems.length);
@@ -120,6 +129,44 @@
String elementName = doc.getElementAt(offset).getName();
Set<String> validItems = doc.getValidator().getValidItems(elementName);
assertEquals(expected, validItems);
- }
+ }
+
+ private void assertValidSequence(String element, String...sequence) {
+ assertValidSequence(true, element, sequence);
+ }
+
+ private void assertInvalidSequence(String element, String...sequence) {
+ assertValidSequence(false, element, sequence);
+ }
+
+ private void assertValidSequence(boolean expected, String element, String...sequence) {
+ final EList<String> emptyList = new BasicEList<String>(0);
+ for (int i = 0; i < sequence.length; i++) {
+
+ EList<String> pre = new BasicEList<String>();
+ for (int j = 0; j < i; j++) {
+ pre.add(sequence[j]);
+ }
+
+ EList<String> toInsert = new BasicEList<String>(1);
+ toInsert.add(sequence[i]);
+
+ EList<String> suf = new BasicEList<String>();
+ for (int j = i + 1; j < sequence.length; j++) {
+ pre.add(sequence[j]);
+ }
+
+ assertEquals(expected, validator.isValidSequence(element,
+ pre,
+ toInsert,
+ suf,
+ false));
+ assertEquals(expected, validator.isValidSequence(element,
+ pre,
+ toInsert,
+ emptyList,
+ true));
+ }
+ }
}