UndoableEdit removeUpdate(int removeOffset, int removeLength) { // The algorithm here is similar to the one in PlainDocument.removeUpdate(). // Unfortunately in case exactly a line element (or multiple line elements) // the algorithm removes extra line that follows the end of removed area. // That could be improved but compatibility with PlainDocument would be lost. Edit edit = null; int removeEndOffset = removeOffset + removeLength; int line0 = getElementIndex(removeOffset); int line1 = getElementIndex(removeEndOffset); if (line0 != line1) { // at least one line was removed line1++; // will remove the line where remove ends as well Element[] removeElements = new Element[line1 - line0]; copyElements(line0, line1, removeElements, 0); Element[] addElements = new Element[] { new LineElement(this, ((LineElement)removeElements[0]).getStartPosition(), ((LineElement)removeElements[removeElements.length - 1]).getEndPosition() ) }; replace(line0, removeElements.length, addElements); edit = new Edit(line0, removeElements, addElements); } checkConsistency(); return edit; }
public Document getDocument() { return root.getDocument(); }
private void checkConsistency() { int lineCount = getElementCount(); assert (lineCount > 0); // Should be 1 or greater int prevLineEndOffset = 0; for (int i = 0; i < lineCount; i++) { LineElement elem = (LineElement)getElement(i); assert (prevLineEndOffset == elem.getStartOffset()); assert (prevLineEndOffset < elem.getEndOffset()) : "Line " + i + " of " + lineCount + ": " + lineToString(elem); // NOI18N prevLineEndOffset = elem.getEndOffset(); } assert (prevLineEndOffset == (doc.getLength() + 1)); }
private static void checkConsistency(Document doc) { // Check whether all syntax state infos (except for the first line) are non-null LineRootElement lineRoot = getLineRoot(doc); int lineCount = lineRoot.getElementCount(); for (int i = 1; i < lineCount; i++) { // skip the very first line LineElement elem = (LineElement)lineRoot.getElement(i); assert (elem.getSyntaxStateInfo() != null) : "Syntax state null at line " + i + " of " + lineCount; // NOI18N } }
public Element getParagraphElement(int pos) { return getLineRootElement().getElement( getLineRootElement().getElementIndex(pos)); }
if (futureAddedLineEndPos == null) { index = getElementIndex(insertOffset); LineElement removeLine = (LineElement)getElement(index); addLine = false; // do not add new line in this case } else { LineElement nextRemoveLine = (LineElement)getElement(index + 1); removeElements = new Element[] { removeLine, firstAddedLineIndex = doubleAddedLinesCapacity(); ); replace(index, removeElements.length, addElements); edit = new Edit(index, removeElements, addElements); checkConsistency(); return edit;
int lineIndex = lineRoot.getElementIndex(offset); Element lineElem = lineRoot.getElement(lineIndex); int lineStartOffset = lineElem.getStartOffset(); Syntax.StateInfo stateInfo = getValidSyntaxStateInfo(doc, lineIndex); int lineCount = lineRoot.getElementCount(); while (++lineIndex < lineCount) { lineElem = lineRoot.getElement(lineIndex); stateInfo = getValidSyntaxStateInfo(doc, lineIndex); lineStartOffset = lineElem.getStartOffset();
LineRootElement(BaseDocument doc) { this.doc = doc; assert (doc.getLength() == 0) : "Cannot start with non-empty document"; // NOI18N Position startPos = doc.getStartPosition(); assert (startPos.getOffset() == 0) : "Document.getStartPosition() != 0"; // NOI18N Position endPos = doc.getEndPosition(); assert (endPos.getOffset() == 1) : "Document.getEndPosition() != 1"; // NOI18N Element line = new LineElement(this, startPos, endPos); replace(0, 0, new Element[]{ line }); assert (getElement(0) != null); }
public Element getElement(int index) { if (index < 0) { throw new IndexOutOfBoundsException("Invalid line index=" + index + " < 0"); // NOI18N } int elementCount = getElementCount(); if (index >= elementCount) { throw new IndexOutOfBoundsException("Invalid line index=" + index // NOI18N + " >= lineCount=" + elementCount); // NOI18N } LineElement elem = (LineElement)super.getElement(index); assert (elem != null); return elem; }
protected void insertUpdate(DefaultDocumentEvent chng, AttributeSet attr) { super.insertUpdate(chng, attr); MarksStorageUndo marksStorageUndo = new MarksStorageUndo(chng); marksStorageUndo.updateMarksStorage(); chng.addEdit(marksStorageUndo); // fix compatible marks UndoableEdit lineUndo = lineRootElement.insertUpdate(chng.getOffset(), chng.getLength()); if (lineUndo != null) { chng.addEdit(lineUndo); } fixLineSyntaxState.update(false); chng.addEdit(fixLineSyntaxState.createAfterLineUndo()); fixLineSyntaxState = null; }
LineElement lineElem = (LineElement)lineRoot.getElement(lineIndex); Syntax.StateInfo stateInfo = lineElem.getSyntaxStateInfo(); LineElement validLineElem = null; while (validLineIndex > 0) { validLineElem = (LineElement)lineRoot.getElement(validLineIndex); stateInfo = validLineElem.getSyntaxStateInfo() ; if (stateInfo != null) { do { validLineIndex++; validLineElem = (LineElement)lineRoot.getElement(validLineIndex); int scanLength = validLineOffset; // get orig value validLineOffset = validLineElem.getStartOffset();
lineRootElement = new LineRootElement(this);
int lineCount = lineRoot.getElementCount(); DocumentEvent.ElementChange lineChange = evt.getChange(lineRoot); int lineIndex; lineIndex = lineChange.getIndex(); } else { // no change in line elements lineIndex = lineRoot.getElementIndex(offset); LineElement lineElem = (LineElement)lineRoot.getElement(lineIndex); try { LineElement nextLineElem = (LineElement)lineRoot.getElement(lineIndex); // should be valid int nextLineStartOffset = nextLineElem.getStartOffset(); lineStartOffset = nextLineStartOffset; nextLineElem = (LineElement)lineRoot.getElement(lineIndex); nextLineStartOffset = nextLineElem.getStartOffset();
static void invalidateAllSyntaxStateInfos(BaseDocument doc) { LineRootElement lineRoot = getLineRoot(doc); int elemCount = lineRoot.getElementCount(); for (int i = elemCount - 1; i >= 0; i--) { LineElement line = (LineElement)lineRoot.getElement(i); line.clearSyntaxStateInfo(); } }
int reqPosLineIndex = lineRoot.getElementIndex(reqPos); Element reqPosLineElem = lineRoot.getElement(reqPosLineIndex); Syntax.StateInfo stateInfo = getValidSyntaxStateInfo(doc, reqPosLineIndex); int lineStartOffset = reqPosLineElem.getStartOffset();
public static String lineInfosToString(Document doc) { StringBuffer sb = new StringBuffer(); LineRootElement lineRoot = getLineRoot(doc); int lineCount = lineRoot.getElementCount(); for (int i = 0; i < lineCount; i++) { LineElement elem = (LineElement)lineRoot.getElement(i); sb.append("[" + i + "]: lineStartOffset=" + elem.getStartOffset() // NOI18N + ", info: " + elem.getSyntaxStateInfo() + "\n"); // NOI18N } return sb.toString(); }