Mercurial > projects > dwt-addons
diff dwtx/jface/text/Position.d @ 129:eb30df5ca28b
Added JFace Text sources
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 23 Aug 2008 19:10:48 +0200 |
parents | |
children | c4fb132a086c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/jface/text/Position.d Sat Aug 23 19:10:48 2008 +0200 @@ -0,0 +1,202 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.jface.text.Position; + +import dwt.dwthelper.utils; + +import dwtx.core.runtime.Assert; + + +/** + * Positions describe text ranges of a document. Positions are adapted to + * changes applied to that document. The text range is specified by an offset + * and a length. Positions can be marked as deleted. Deleted positions are + * considered to no longer represent a valid text range in the managing + * document. + * <p> + * Positions attached to documents are usually updated by position updaters. + * Because position updaters are freely definable and because of the frequency + * in which they are used, the fields of a position are made publicly + * accessible. Clients other than position updaters are not allowed to access + * these public fields. + * </p> + * <p> + * Positions cannot be used as keys in hash tables as they override + * <code>equals</code> and <code>hashCode</code> as they would be value + * objects. + * </p> + * + * @see dwtx.jface.text.IDocument + */ +public class Position { + + /** The offset of the position */ + public int offset; + /** The length of the position */ + public int length; + /** Indicates whether the position has been deleted */ + public bool isDeleted; + + /** + * Creates a new position with the given offset and length 0. + * + * @param offset the position offset, must be >= 0 + */ + public Position(int offset) { + this(offset, 0); + } + + /** + * Creates a new position with the given offset and length. + * + * @param offset the position offset, must be >= 0 + * @param length the position length, must be >= 0 + */ + public Position(int offset, int length) { + Assert.isTrue(offset >= 0); + Assert.isTrue(length >= 0); + this.offset= offset; + this.length= length; + } + + /** + * Creates a new, not initialized position. + */ + protected Position() { + } + + /* + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + int deleted= isDeleted ? 0 : 1; + return (offset << 24) | (length << 16) | deleted; + } + + /** + * Marks this position as deleted. + */ + public void delete() { + isDeleted= true; + } + + /** + * Marks this position as not deleted. + * + * @since 2.0 + */ + public void undelete() { + isDeleted= false; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public bool equals(Object other) { + if (other instanceof Position) { + Position rp= (Position) other; + return (rp.offset is offset) && (rp.length is length); + } + return super.equals(other); + } + + /** + * Returns the length of this position. + * + * @return the length of this position + */ + public int getLength() { + return length; + } + + /** + * Returns the offset of this position. + * + * @return the offset of this position + */ + public int getOffset() { + return offset; + } + + /** + * Checks whether the given index is inside + * of this position's text range. + * + * @param index the index to check + * @return <code>true</code> if <code>index</code> is inside of this position + */ + public bool includes(int index) { + + if (isDeleted) + return false; + + return (this.offset <= index) && (index < this.offset + length); + } + + /** + * Checks whether the intersection of the given text range + * and the text range represented by this position is empty + * or not. + * + * @param rangeOffset the offset of the range to check + * @param rangeLength the length of the range to check + * @return <code>true</code> if intersection is not empty + */ + public bool overlapsWith(int rangeOffset, int rangeLength) { + + if (isDeleted) + return false; + + int end= rangeOffset + rangeLength; + int thisEnd= this.offset + this.length; + + if (rangeLength > 0) { + if (this.length > 0) + return this.offset < end && rangeOffset < thisEnd; + return rangeOffset <= this.offset && this.offset < end; + } + + if (this.length > 0) + return this.offset <= rangeOffset && rangeOffset < thisEnd; + return this.offset is rangeOffset; + } + + /** + * Returns whether this position has been deleted or not. + * + * @return <code>true</code> if position has been deleted + */ + public bool isDeleted() { + return isDeleted; + } + + /** + * Changes the length of this position to the given length. + * + * @param length the new length of this position + */ + public void setLength(int length) { + Assert.isTrue(length >= 0); + this.length= length; + } + + /** + * Changes the offset of this position to the given offset. + * + * @param offset the new offset of this position + */ + public void setOffset(int offset) { + Assert.isTrue(offset >= 0); + this.offset= offset; + } +}