/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.netbeans.editor;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import org.openide.text.NbDocument;
import org.openide.util.Parameters;
/**
* Represents a line of text in a {@link StyledDocument}.
*
* @author Sam Harwell
*/
public final class DocumentLine {
private final StyledDocument document;
private final int lineNumber;
private final DocumentSpan extent;
private final DocumentSpan extentIncludingLineBreak;
private final int lineBreakLength;
public DocumentLine(StyledDocument document, int lineNumber) throws BadLocationException {
Parameters.notNull("document", document);
if (lineNumber < 0) {
throw new IllegalArgumentException("lineNumber must be greater than 0.");
}
this.document = document;
this.lineNumber = lineNumber;
DocumentPoint start = new DocumentPoint(document, NbDocument.findLineOffset(document, lineNumber));
if (lineNumber < NbDocument.findLineRootElement(document).getElementCount() - 1) {
DocumentPoint endIncludingLineBreak = new DocumentPoint(document, NbDocument.findLineOffset(document, lineNumber + 1));
extentIncludingLineBreak = new DocumentSpan(start, endIncludingLineBreak);
String text = extentIncludingLineBreak.getText();
if (text.endsWith("\r\n")) {
this.lineBreakLength = 2;
} else {
this.lineBreakLength = 1;
}
this.extent = new DocumentSpan(start, extentIncludingLineBreak.getEnd().subtract(lineBreakLength));
} else {
this.lineBreakLength = 0;
DocumentPoint endIncludingLineBreak = new DocumentPoint(document, document.getLength());
this.extentIncludingLineBreak = new DocumentSpan(start, endIncludingLineBreak);
this.extent = this.extentIncludingLineBreak;
}
}
public int getLineNumber() {
return lineNumber;
}
public DocumentPoint getStart() {
return extent.getStart();
}
public DocumentPoint getEnd() {
return extent.getEnd();
}
public DocumentPoint getEndIncludingLineBreak() {
return extentIncludingLineBreak.getEnd();
}
public DocumentSpan getExtent() {
return extent;
}
public DocumentSpan getExtentIncludingLineBreak() {
return extentIncludingLineBreak;
}
public int getLength() {
return extent.getLength();
}
public int getLengthIncludingLineBreak() {
return extentIncludingLineBreak.getLength();
}
public String getText() throws BadLocationException {
return extent.getText();
}
public String getTextIncludingLineBreak() throws BadLocationException {
return extentIncludingLineBreak.getText();
}
}