/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.mockdocument;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPositionCategoryException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.IDocumentPartitioningListener;
import org.eclipse.jface.text.IPositionUpdater;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
/**
* @author Michal Anglart
*
*/
public class Document implements IDocument {
private StringBuilder documentText;
public Document() {
this.documentText = new StringBuilder();
}
public Document(final IDocument document) {
this(document.get());
}
public Document(final String content) {
this.documentText = new StringBuilder(content);
}
public Document(final List<String> content) {
this.documentText = new StringBuilder();
for (final String line : content) {
this.documentText.append(line);
this.documentText.append("\n");
}
}
public Document(final String firstLine, final String... lines) {
this.documentText = new StringBuilder(firstLine);
this.documentText.append("\n");
for (final String line : lines) {
this.documentText.append(line);
this.documentText.append("\n");
}
}
private void assertOffsetWithinLimits(final int offset) throws BadLocationException {
if (offset < 0 || offset >= documentText.length()) {
throw new BadLocationException();
}
}
@Override
public char getChar(final int offset) throws BadLocationException {
assertOffsetWithinLimits(offset);
return documentText.charAt(offset);
}
@Override
public int getLength() {
return documentText.length();
}
@Override
public String get() {
return documentText.toString();
}
@Override
public String get(final int offset, final int length) throws BadLocationException {
assertOffsetWithinLimits(offset);
assertOffsetWithinLimits(Math.max(0, offset + length - 1));
return documentText.substring(offset, offset + length);
}
@Override
public void set(final String text) {
documentText = new StringBuilder(text);
}
@Override
public void replace(final int offset, final int length, final String text) throws BadLocationException {
assertOffsetWithinLimits(offset);
assertOffsetWithinLimits(Math.max(0, offset + length - 1));
documentText.replace(offset, offset + length, text);
}
@Override
public void addDocumentListener(final IDocumentListener listener) {
// nothing to do currrently
}
@Override
public void removeDocumentListener(final IDocumentListener listener) {
// nothing to do currrently
}
@Override
public void addPrenotifiedDocumentListener(final IDocumentListener documentAdapter) {
// nothing to do currrently
}
@Override
public void removePrenotifiedDocumentListener(final IDocumentListener documentAdapter) {
// nothing to do currrently
}
@Override
public void addPositionCategory(final String category) {
// nothing to do currrently
}
@Override
public void removePositionCategory(final String category) throws BadPositionCategoryException {
// nothing to do currrently
}
@Override
public String[] getPositionCategories() {
return null;
}
@Override
public boolean containsPositionCategory(final String category) {
return false;
}
@Override
public void addPosition(final Position position) throws BadLocationException {
// nothing to do currrently
}
@Override
public void removePosition(final Position position) {
// nothing to do currrently
}
@Override
public void addPosition(final String category, final Position position)
throws BadLocationException, BadPositionCategoryException {
// nothing to do currrently
}
@Override
public void removePosition(final String category, final Position position) throws BadPositionCategoryException {
// nothing to do currrently
}
@Override
public Position[] getPositions(final String category) throws BadPositionCategoryException {
return null;
}
@Override
public boolean containsPosition(final String category, final int offset, final int length) {
return false;
}
@Override
public int computeIndexInCategory(final String category, final int offset)
throws BadLocationException, BadPositionCategoryException {
return 0;
}
@Override
public void addPositionUpdater(final IPositionUpdater updater) {
// nothing to do currrently
}
@Override
public void removePositionUpdater(final IPositionUpdater updater) {
// nothing to do currrently
}
@Override
public void insertPositionUpdater(final IPositionUpdater updater, final int index) {
// nothing to do currrently
}
@Override
public IPositionUpdater[] getPositionUpdaters() {
return null;
}
@Override
public String[] getLegalContentTypes() {
return null;
}
@Override
public String getContentType(final int offset) throws BadLocationException {
return null;
}
@Override
public ITypedRegion getPartition(final int offset) throws BadLocationException {
return null;
}
@Override
public ITypedRegion[] computePartitioning(final int offset, final int length) throws BadLocationException {
return null;
}
@Override
public void addDocumentPartitioningListener(final IDocumentPartitioningListener listener) {
// nothing to do currrently
}
@Override
public void removeDocumentPartitioningListener(final IDocumentPartitioningListener listener) {
// nothing to do currrently
}
@Override
public void setDocumentPartitioner(final IDocumentPartitioner partitioner) {
// nothing to do currrently
}
@Override
public IDocumentPartitioner getDocumentPartitioner() {
return null;
}
@Override
public int getLineLength(final int line) throws BadLocationException {
return getLineInformation(line).getLength();
}
@Override
public int getLineOfOffset(final int offset) throws BadLocationException {
assertOffsetWithinLimits(offset);
int noOfLines = 0;
for (int i = 0; i < offset; i++) {
if (documentText.charAt(i) == '\n') {
noOfLines++;
}
}
return noOfLines;
}
@Override
public int getLineOffset(final int line) throws BadLocationException {
return getLineInformation(line).getOffset();
}
@Override
public IRegion getLineInformation(final int line) throws BadLocationException {
if (line < 0 || line > getNumberOfLines()) {
throw new BadLocationException();
}
int currentLineStart = 0;
int noOfLines = 0;
for (int i = 0; i < documentText.length(); i++) {
if (documentText.charAt(i) == '\n' || i == documentText.length() - 1) {
if (noOfLines == line) {
return new Region(currentLineStart, i - currentLineStart);
}
noOfLines++;
currentLineStart = i + 1;
}
}
throw new BadLocationException();
}
@Override
public IRegion getLineInformationOfOffset(final int offset) throws BadLocationException {
return getLineInformation(getLineOfOffset(offset));
}
@Override
public int getNumberOfLines() {
return computeNumberOfLines(documentText.toString());
}
@Override
public int getNumberOfLines(final int offset, final int length) throws BadLocationException {
assertOffsetWithinLimits(offset);
assertOffsetWithinLimits(Math.max(0, offset + length - 1));
int noOfLines = 0;
for (int i = offset; i < offset + length; i++) {
if (documentText.charAt(i) == '\n') {
noOfLines++;
}
}
return noOfLines;
}
@Override
public int computeNumberOfLines(final String text) {
int noOfLines = 0;
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == '\n') {
noOfLines++;
}
}
return noOfLines;
}
@Override
public String[] getLegalLineDelimiters() {
return new String[] { "\n" };
}
@Override
public String getLineDelimiter(final int line) throws BadLocationException {
return "\n";
}
@Override
public int search(final int startOffset, final String findString, final boolean forwardSearch, final boolean caseSensitive,
final boolean wholeWord) throws BadLocationException {
return 0;
}
@Override
public String toString() {
return documentText.toString();
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof Document) {
final Document that = (Document) obj;
return this.get().equals(that.get());
}
return false;
}
@Override
public int hashCode() {
return documentText.hashCode();
}
}