public String[] getValidMorphElements() { VEXDocument doc = this.getDocument(); if (doc == null) return new String[0]; Validator validator = doc.getValidator(); if (validator == null) return new String[0]; VEXElement element = doc.getElementAt(this.getCaretOffset()); VEXElement parent = element.getParent(); if (parent == null) { // can't morph the root return new String[0]; } Set<String> validItems = validator.getValidItems(parent.getName()); List<String> result = new ArrayList<String>(validItems); result.remove(Validator.PCDATA); result.remove(element.getName()); // exclude converting to the same // root out those that can't contain the current content EList<String> content = doc.getNodeNames(element.getStartOffset() + 1, element.getEndOffset()); for (Iterator<String> iter = result.iterator(); iter.hasNext(); ) { String candidate = iter.next(); if (!validator.isValidSequence(candidate, content, true)) { iter.remove(); } } Collections.sort(result); return result.toArray(new String[result.size()]); }
public boolean canUnwrap() { VEXDocument doc = this.getDocument(); if (doc == null) { return false; } Validator validator = doc.getValidator(); if (validator == null) { return false; } VEXElement element = doc.getElementAt(this.getCaretOffset()); VEXElement parent = element.getParent(); if (parent == null) { // can't unwrap the root return false; } EList<String> seq1 = doc.getNodeNames(parent.getStartOffset() + 1, element.getStartOffset()); EList<String> seq2 = doc.getNodeNames(element.getStartOffset() + 1, element.getEndOffset()); EList<String> seq3 = doc.getNodeNames(element.getEndOffset() + 1, parent.getEndOffset()); return validator.isValidSequence(parent.getName(), seq1, seq2, seq3, true); }
/** * Returns true if the given fragment can be inserted at the current caret position. * * @param frag DocumentFragment to be inserted. */ public boolean canInsertFragment(VEXDocumentFragment frag) { VEXDocument doc = this.getDocument(); if (doc == null) { return false; } Validator validator = doc.getValidator(); if (validator == null) { return true; } int startOffset = this.getCaretOffset(); int endOffset = this.getCaretOffset(); if (this.hasSelection()) { startOffset = this.getSelectionStart(); endOffset = this.getSelectionEnd(); } VEXElement parent = this.getDocument().getElementAt(startOffset); EList<String> seq1 = doc.getNodeNames(parent.getStartOffset() + 1, startOffset); EList<String> seq2 = frag.getNodeNames(); EList<String> seq3 = doc.getNodeNames(endOffset, parent.getEndOffset()); return validator.isValidSequence(parent.getName(), seq1, seq2, seq3, true); }
public String[] getValidInsertElements() { VEXDocument doc = this.getDocument(); if (doc == null) return new String[0]; Validator validator = doc.getValidator(); if (validator == null) return new String[0]; int startOffset = this.getCaretOffset(); int endOffset = this.getCaretOffset(); if (this.hasSelection()) { startOffset = this.getSelectionStart(); endOffset = this.getSelectionEnd(); } VEXElement parent = doc.getElementAt(startOffset); Set<String> validItems = validator.getValidItems(parent.getName()); List<String> candidates = new ArrayList<String>(validItems); candidates.remove(Validator.PCDATA); // filter invalid sequences EList<String> nodesBefore = doc.getNodeNames(parent.getStartOffset() + 1, startOffset); EList<String> nodesAfter = doc.getNodeNames(endOffset, parent.getEndOffset()); int sequenceLength = nodesBefore.size() + 1 + nodesAfter.size(); for (Iterator<String> iter = candidates.iterator(); iter.hasNext(); ) { String candidate = iter.next(); EList<String> sequence = new BasicEList<String>(sequenceLength); sequence.addAll(nodesBefore); sequence.add(candidate); sequence.addAll(nodesAfter); if (!validator.isValidSequence(parent.getName(), sequence, true)) { iter.remove(); } } // If there's a selection, root out those candidates that can't // contain it. if (hasSelection()) { EList<String> selectedNodes = doc.getNodeNames(startOffset, endOffset); for (Iterator<String> iter = candidates.iterator(); iter.hasNext(); ) { String candidate = iter.next(); if (!validator.isValidSequence(candidate, selectedNodes, true)) { iter.remove(); } } } Collections.sort(candidates); return (String[]) candidates.toArray(new String[candidates.size()]); }