X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/JavaWordIterator.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/JavaWordIterator.java new file mode 100644 index 0000000..1c55ba9 --- /dev/null +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/JavaWordIterator.java @@ -0,0 +1,227 @@ +/******************************************************************************* + * 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 net.sourceforge.phpdt.internal.ui.text; + +import java.text.BreakIterator; +import java.text.CharacterIterator; + +import org.eclipse.jface.text.Assert; + +/** + * Breaks java text into word starts, also stops at line start and end. No + * direction dependency. + * + * @since 3.0 + */ +public class JavaWordIterator extends BreakIterator { + + /** + * The underlying java break iterator. It returns all breaks, including + * before and after every whitespace. + */ + private JavaBreakIterator fIterator; + + /** The current index for the stateful operations. */ + private int fIndex; + + /** + * Creates a new word iterator. + */ + public JavaWordIterator() { + fIterator = new JavaBreakIterator(); + first(); + } + + /* + * @see java.text.BreakIterator#first() + */ + public int first() { + fIndex = fIterator.first(); + return fIndex; + } + + /* + * @see java.text.BreakIterator#last() + */ + public int last() { + fIndex = fIterator.last(); + return fIndex; + } + + /* + * @see java.text.BreakIterator#next(int) + */ + public int next(int n) { + int next = 0; + while (--n > 0 && next != DONE) { + next = next(); + } + return next; + } + + /* + * @see java.text.BreakIterator#next() + */ + public int next() { + fIndex = following(fIndex); + return fIndex; + } + + /* + * @see java.text.BreakIterator#previous() + */ + public int previous() { + fIndex = preceding(fIndex); + return fIndex; + } + + /* + * @see java.text.BreakIterator#preceding(int) + */ + public int preceding(int offset) { + int first = fIterator.preceding(offset); + if (isWhitespace(first, offset)) { + int second = fIterator.preceding(first); + if (second != DONE && !isDelimiter(second, first)) + return second; + } + return first; + } + + /* + * @see java.text.BreakIterator#following(int) + */ + public int following(int offset) { + int first = fIterator.following(offset); + if (eatFollowingWhitespace(offset, first)) { + int second = fIterator.following(first); + if (isWhitespace(first, second)) + return second; + } + return first; + } + + private boolean eatFollowingWhitespace(int offset, int exclusiveEnd) { + if (exclusiveEnd == DONE || offset == DONE) + return false; + + if (isWhitespace(offset, exclusiveEnd)) + return false; + if (isDelimiter(offset, exclusiveEnd)) + return false; + + return true; + } + + /** + * Returns true if the given sequence into the underlying + * text represents a delimiter, false otherwise. + * + * @param offset + * the offset + * @param exclusiveEnd + * the end offset + * @return true if the given range is a delimiter + */ + private boolean isDelimiter(int offset, int exclusiveEnd) { + if (exclusiveEnd == DONE || offset == DONE) + return false; + + Assert.isTrue(offset >= 0); + Assert.isTrue(exclusiveEnd <= getText().getEndIndex()); + Assert.isTrue(exclusiveEnd > offset); + + CharSequence seq = fIterator.fText; + + while (offset < exclusiveEnd) { + char ch = seq.charAt(offset); + if (ch != '\n' && ch != '\r') + return false; + offset++; + } + + return true; + } + + /** + * Returns true if the given sequence into the underlying + * text represents whitespace, but not a delimiter, false + * otherwise. + * + * @param offset + * the offset + * @param exclusiveEnd + * the end offset + * @return true if the given range is whitespace + */ + private boolean isWhitespace(int offset, int exclusiveEnd) { + if (exclusiveEnd == DONE || offset == DONE) + return false; + + Assert.isTrue(offset >= 0); + Assert.isTrue(exclusiveEnd <= getText().getEndIndex()); + Assert.isTrue(exclusiveEnd > offset); + + CharSequence seq = fIterator.fText; + + while (offset < exclusiveEnd) { + char ch = seq.charAt(offset); + if (!Character.isWhitespace(ch)) + return false; + if (ch == '\n' || ch == '\r') + return false; + offset++; + } + + return true; + } + + /* + * @see java.text.BreakIterator#current() + */ + public int current() { + return fIndex; + } + + /* + * @see java.text.BreakIterator#getText() + */ + public CharacterIterator getText() { + return fIterator.getText(); + } + + /** + * Sets the text as CharSequence. + * + * @param newText + * the new text + */ + public void setText(CharSequence newText) { + fIterator.setText(newText); + first(); + } + + /* + * @see java.text.BreakIterator#setText(java.text.CharacterIterator) + */ + public void setText(CharacterIterator newText) { + fIterator.setText(newText); + first(); + } + + /* + * @see java.text.BreakIterator#setText(java.lang.String) + */ + public void setText(String newText) { + setText((CharSequence) newText); + } + +}