blob: ad6ac92de1ee9a045c172111cc6829a87ac42d26 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.text.link;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
/**
* A <code>Position</code> on a document that knows which document it is
* registered with and has a sequence number for tab stops.
* <p>
* Clients may extend this class.
* </p>
* @since 3.0
*/
public class LinkedPosition extends Position {
/** The document this position belongs to. */
private IDocument fDocument;
private int fSequenceNumber;
/**
* Creates a new instance.
*
* @param document the document
* @param offset the offset of the position
* @param length the length of the position
* @param sequence the iteration sequence rank
*/
public LinkedPosition(IDocument document, int offset, int length, int sequence) {
super(offset, length);
Assert.isNotNull(document);
fDocument= document;
fSequenceNumber= sequence;
}
/**
* Creates a new instance. Equivalent to calling
* <code>LinkedPosition(document, offset, length, LinkedPositionGroup.NO_STOP)</code>
*
* @param document the document
* @param offset the offset of the position
* @param length the length of the position
*/
public LinkedPosition(IDocument document, int offset, int length) {
this(document, offset, length, LinkedPositionGroup.NO_STOP);
}
/**
* @return Returns the document.
*/
public IDocument getDocument() {
return fDocument;
}
/*
* @see org.eclipse.jface.text.Position#equals(java.lang.Object)
*/
public boolean equals(Object other) {
if (other instanceof LinkedPosition) {
LinkedPosition p= (LinkedPosition) other;
return p.offset == offset && p.length == length && p.fDocument == fDocument;
}
return false;
}
/**
* Returns whether this position overlaps with <code>position</code>.
*
* @param position the position to check.
* @return <code>true</code> if this position overlaps with
* <code>position</code>,<code>false</code> otherwise
*/
public boolean overlapsWith(LinkedPosition position) {
return position.getDocument() == fDocument && overlapsWith(position.getOffset(), position.getLength());
}
/**
* Returns whether this position includes <code>event</code>.
*
* @param event the event to check.
* @return <code>true</code> if this position includes <code>event</code>,
* <code>false</code> otherwise
*/
public boolean includes(DocumentEvent event) {
return includes(event.getDocument(), event.getOffset(), event.getLength());
}
/**
* Returns whether this position includes <code>position</code>.
*
* @param position the position to check.
* @return <code>true</code> if this position includes
* <code>position</code>,<code>false</code> otherwise
*/
public boolean includes(LinkedPosition position) {
return includes(position.getDocument(), position.getOffset(), position.getLength());
}
/**
* Overrides {@link Position#includes(int)}so every offset is considered
* included that lies in between the first and last offset of this position,
* and offsets that are right at the end of the position.
*
* @param pOffset the offset to check
* @return <code>true</code> if <code>pOffset</code> is in
* <code>[offset, offset + length]</code>
*/
public boolean includes(int pOffset) {
return this.offset <= pOffset && pOffset <= this.offset + this.length;
}
/**
* Returns whether this position includes the range given by
* <code>offset</code> and <code>length</code>. A range is included by
* a <code>LinkedPosition</code> if {@link #includes(int) includes(offset)}
* returns true for every offset in the range, including the borders of the
* range.
*
* @param doc the document that the given range refers to, may be <code>null</code>
* @param off the offset of the range, referring to <code>document</code>
* @param len the length of the range
* @return <code>true</code> if <code>doc</code> is the same document as
* this position refers to, and if the entire range is included in
* this position
*/
protected boolean includes(IDocument doc, int off, int len) {
return doc == fDocument && off >= offset && len + off <= offset + length;
}
/**
* Returns the content of this position on the referenced document.
*
* @return the content of the document at this position
* @throws BadLocationException if the position is not valid
*/
public String getContent() throws BadLocationException {
return fDocument.get(offset, length);
}
/**
* Returns the sequence number of this position.
*
* @return the sequence number of this position
*/
public int getSequenceNumber() {
return fSequenceNumber;
}
/**
* Sets the sequence number of this position.
*
* @param sequence the new sequence number
*/
public void setSequenceNumber(int sequence) {
fSequenceNumber= sequence;
}
/*
* @see org.eclipse.jface.text.Position#hashCode()
*/
public int hashCode() {
return fDocument.hashCode() | super.hashCode() | fSequenceNumber;
}
}