/* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */ package net.sourceforge.phpdt.internal.corext.textmanipulation; //import net.sourceforge.phpdt.core.ISourceRange; // //import net.sourceforge.phpdt.internal.corext.Assert; public final class TextRange { /* package */ int fOffset; /* package */ int fLength; public static final TextRange UNDEFINED= new TextRange((TextRange)null); /** * Creates a insert position with the given offset. * * @param offset the position offset, must be >= 0 */ public TextRange(int offset) { this(offset, 0); } /** * Creates a new range with the given offset and length. * * @param offset the position offset, must be >= 0 * @param length the position length, must be >= 0 */ public TextRange(int offset, int length) { fOffset= offset; // Assert.isTrue(fOffset >= 0); fLength= length; // Assert.isTrue(fLength >= 0); } /** * Constructor for the undefined text range. */ private TextRange(TextRange dummy) { fOffset= -1; fLength= -1; } public static TextRange createFromStartAndLength(int start, int length) { return new TextRange(start, length); } public static TextRange createFromStartAndInclusiveEnd(int start, int end) { return new TextRange(start, end - start + 1); } public static TextRange createFromStartAndExclusiveEnd(int start, int end) { return new TextRange(start, end - start); } /** * Creates a new range from the given source range. * * @range the source range denoting offset and length */ // public TextRange(ISourceRange range) { // this(range.getOffset(), range.getLength()); // } /** * Returns the offset of this range. * * @return the length of this range */ public int getOffset() { return fOffset; } /** * Returns the length of this range. * * @return the length of this range */ public int getLength() { return fLength; } /** * Returns the inclusive end position of this range. That means that the end position * denotes the last character of this range. * * @return the inclusive end position */ public int getInclusiveEnd() { return fOffset + fLength - 1; } /** * Returns the exclusive end position of this range. That means that the end position * denotes the first character after this range. * * @return the exclusive end position */ public int getExclusiveEnd() { return fOffset + fLength; } /** * Creates a copy of this TextRange. * * @return a copy of this TextRange */ public TextRange copy() { if (isUndefined()) return this; return new TextRange(fOffset, fLength); } /** * Returns true if this text range is the UNDEFINED * text range. Otherwise false is returned. */ public boolean isUndefined() { return UNDEFINED == this; } /** * Checks if this TextRange is valid. For valid text range the following * expression evaluates to true: *
	 * 	getOffset() >= 0 && getLength() >= 0
	 * 
* * @return true if this text range is a valid range. Otherwise * false */ public boolean isValid() { return fOffset >= 0 && fLength >= 0; } /* package */ boolean isInsertionPoint() { return fLength == 0; } /* package */ boolean equals(TextRange range) { return fOffset == range.fOffset && fLength == range.fLength; } /* package */ boolean isEqualInsertionPoint(TextRange range) { return fLength == 0 && range.fLength == 0 && fOffset == range.fOffset; } /* package */ boolean liesBehind(TextRange range) { return fOffset >= range.fOffset + range.fLength; } /* package */ boolean isInsertionPointAt(int o) { return fOffset == o && fLength == 0; } /* package */ boolean covers(TextRange other) { if (fLength == 0) { // an insertion point can't cover anything return false; } else if (other.fLength == 0) { int otherOffset= other.fOffset; return fOffset < otherOffset && otherOffset < fOffset + fLength; } else { int otherOffset= other.fOffset; return fOffset <= otherOffset && otherOffset + other.fLength <= fOffset + fLength; } } /* non Java-doc * @see Object#toString() */ public String toString() { StringBuffer buffer= new StringBuffer(); buffer.append(TextManipulationMessages.getString("TextRange.offset")); //$NON-NLS-1$ buffer.append(fOffset); buffer.append(TextManipulationMessages.getString("TextRange.length")); //$NON-NLS-1$ buffer.append(fLength); return buffer.toString(); } public boolean equals(Object obj) { if (! (obj instanceof TextRange)) return false; TextRange other= (TextRange)obj; return fOffset == other.getOffset() && fLength == other.getLength(); } public int hashCode() { return fOffset ^ fLength; } }