/*
* 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.CustomTrackToBehavior;
import org.antlr.netbeans.editor.text.DocumentVersion;
import org.antlr.netbeans.editor.text.NormalizedDocumentChangeCollection;
import org.antlr.netbeans.editor.text.OffsetRegion;
import org.antlr.netbeans.editor.text.TrackingFidelity;
import org.antlr.netbeans.editor.text.TrackingPosition;
import org.antlr.netbeans.editor.text.TrackingPositionRegion;
import org.antlr.netbeans.editor.text.VersionedDocument;
import org.netbeans.api.annotations.common.NonNull;
import org.openide.util.Parameters;
/**
*
* @author Sam Harwell
*/
public class NbDocumentVersion implements DocumentVersion {
@NonNull
private final NbVersionedDocument textBuffer;
private final int versionNumber;
@NonNull
private final LineTextCache lineData;
private NbDocumentSnapshot snapshot;
private final Object lock = new Object();
private NormalizedDocumentChangeCollection changes;
private NbDocumentVersion next;
public NbDocumentVersion(@NonNull NbVersionedDocument textBuffer, int versionNumber, @NonNull LineTextCache lineData) {
Parameters.notNull("textBuffer", textBuffer);
Parameters.notNull("lineData", lineData);
this.textBuffer = textBuffer;
this.versionNumber = versionNumber;
this.lineData = lineData;
}
@Override
public VersionedDocument getVersionedDocument() {
return textBuffer;
}
@Override
public int getLength() {
return lineData.getLength();
}
@Override
public int getVersionNumber() {
return versionNumber;
}
@Override
public NormalizedDocumentChangeCollection getChanges() {
synchronized (lock) {
return changes;
}
}
@Override
public DocumentVersion getNext() {
synchronized (lock) {
return next;
}
}
@NonNull LineTextCache getLineData() {
return lineData;
}
@Override
public @NonNull NbDocumentSnapshot getSnapshot() {
synchronized (this) {
if (snapshot == null) {
snapshot = new NbDocumentSnapshot(this);
}
return snapshot;
}
}
@Override
public TrackingPositionRegion createCustomTrackingRegion(OffsetRegion region, TrackingFidelity fidelity, CustomTrackToBehavior behavior) {
Parameters.notNull("region", region);
Parameters.notNull("fidelity", fidelity);
Parameters.notNull("behavior", behavior);
return new NbCustomTrackingPositionRegion(this, region, fidelity, behavior);
}
@Override
public NbTrackingPosition createTrackingPosition(int position, TrackingPosition.Bias bias) {
Parameters.notNull("bias", bias);
return createTrackingPosition(position, bias, TrackingFidelity.Forward);
}
@Override
public NbTrackingPosition createTrackingPosition(int position, TrackingPosition.Bias bias, TrackingFidelity fidelity) {
Parameters.notNull("bias", bias);
Parameters.notNull("fidelity", fidelity);
if (fidelity == TrackingFidelity.Forward) {
return new NbForwardTrackingPosition(this, position, bias);
}
return new NbFullTrackingPosition(this, position, bias, fidelity);
}
@Override
public NbTrackingPositionRegion createTrackingRegion(OffsetRegion region, TrackingPositionRegion.Bias bias) {
Parameters.notNull("region", region);
Parameters.notNull("bias", bias);
return createTrackingRegion(region, bias, TrackingFidelity.Forward);
}
@Override
public NbTrackingPositionRegion createTrackingRegion(int start, int length, TrackingPositionRegion.Bias bias) {
Parameters.notNull("bias", bias);
return createTrackingRegion(start, length, bias, TrackingFidelity.Forward);
}
@Override
public NbTrackingPositionRegion createTrackingRegion(OffsetRegion region, TrackingPositionRegion.Bias bias, TrackingFidelity fidelity) {
Parameters.notNull("region", region);
Parameters.notNull("bias", bias);
Parameters.notNull("fidelity", fidelity);
return createTrackingRegion(region.getStart(), region.getLength(), bias, fidelity);
}
@Override
public NbTrackingPositionRegion createTrackingRegion(int start, int length, TrackingPositionRegion.Bias bias, TrackingFidelity fidelity) {
Parameters.notNull("bias", bias);
Parameters.notNull("fidelity", fidelity);
if (length < 0) {
throw new IndexOutOfBoundsException();
}
NbTrackingPosition trackingStart = createTrackingPosition(start, bias.getStartBias(), fidelity);
NbTrackingPosition trackingEnd = createTrackingPosition(start + length, bias.getEndBias(), fidelity);
return new NbTrackingPositionRegion(trackingStart, trackingEnd);
}
@NonNull NbDocumentVersion translate(@NonNull NormalizedDocumentChangeCollection changes) {
Parameters.notNull("changes", changes);
synchronized (lock) {
if (this.changes != null) {
throw new IllegalStateException();
}
LineTextCache nextLineData = lineData.applyChanges(changes);
NbDocumentVersion nextVersion = new NbDocumentVersion(textBuffer, versionNumber + 1, nextLineData);
this.changes = changes;
this.next = nextVersion;
return next;
}
}
}