/*
* 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.text.impl;
import org.antlr.netbeans.editor.text.DocumentSnapshot;
import org.antlr.netbeans.editor.text.DocumentSnapshotLine;
import org.antlr.netbeans.editor.text.SnapshotPosition;
import org.antlr.netbeans.editor.text.SnapshotPositionRegion;
import org.netbeans.api.annotations.common.NonNull;
import org.openide.util.Parameters;
/**
*
* @author Sam Harwell
*/
class NbDocumentSnapshotLine implements DocumentSnapshotLine {
@NonNull
private final NbDocumentSnapshot snapshot;
private final int lineNumber;
@NonNull
private final SnapshotPosition start;
@NonNull
private final String textIncludingLineBreak;
private final int lineBreakLength;
public NbDocumentSnapshotLine(@NonNull NbDocumentSnapshot snapshot, int lineNumber) {
Parameters.notNull("snapshot", snapshot);
if (lineNumber < 0 || lineNumber >= snapshot.getLineCount()) {
throw new IndexOutOfBoundsException();
}
this.snapshot = snapshot;
this.lineNumber = lineNumber;
LineTextCache lineData = snapshot.getVersion().getLineData();
int block = lineData.getBlockFromLineNumber(lineNumber);
int lineStart = lineData.getLineStart(block, lineNumber);
this.start = new SnapshotPosition(snapshot, lineStart);
this.textIncludingLineBreak = lineData.getLineText(block, lineNumber);
if (textIncludingLineBreak.length() > 0) {
char lastChar = textIncludingLineBreak.charAt(textIncludingLineBreak.length() - 1);
if (lastChar == '\n') {
if (textIncludingLineBreak.length() > 1 && textIncludingLineBreak.charAt(textIncludingLineBreak.length() - 2) == '\r') {
lineBreakLength = 2;
} else {
lineBreakLength = 1;
}
} else if (lastChar == '\r') {
lineBreakLength = 1;
} else {
lineBreakLength = 0;
}
} else {
lineBreakLength = 0;
}
}
@Override
public DocumentSnapshot getSnapshot() {
return snapshot;
}
@Override
public int getLineNumber() {
return lineNumber;
}
@Override
public SnapshotPosition getStart() {
return start;
}
@Override
public int getLength() {
return textIncludingLineBreak.length() - lineBreakLength;
}
@Override
public int getLengthIncludingLineBreak() {
return textIncludingLineBreak.length();
}
@Override
public SnapshotPosition getEnd() {
return start.add(getLength());
}
@Override
public SnapshotPosition getEndIncludingLineBreak() {
return start.add(getLengthIncludingLineBreak());
}
@Override
public SnapshotPositionRegion getRegion() {
return new SnapshotPositionRegion(start, getLength());
}
@Override
public SnapshotPositionRegion getRegionIncludingLineBreak() {
return new SnapshotPositionRegion(start, getLengthIncludingLineBreak());
}
@Override
public int getLineBreakLength() {
return lineBreakLength;
}
@Override
public String getText() {
return textIncludingLineBreak.substring(0, getLength());
}
@Override
public String getTextIncludingLineBreak() {
return textIncludingLineBreak;
}
@Override
public String getLineBreakText() {
return textIncludingLineBreak.substring(getLength(), getLengthIncludingLineBreak());
}
}