001: /*
002: * This is free software, licensed under the Gnu Public License (GPL)
003: * get a copy from <http://www.gnu.org/licenses/gpl.html>
004: * $Id: SortedMatchIterator.java,v 1.4 2004/03/07 15:28:28 hzeller Exp $
005: * author: Henner Zeller <H.Zeller@acm.org>
006: */
007: package henplus.view.util;
008:
009: import java.util.Iterator;
010: import java.util.SortedSet;
011: import java.util.SortedMap;
012:
013: /**
014: * An Iterator returning end-truncated matching values from
015: * a sorted List.
016: * <p>
017: * This Iterator is initialized with a sorted Set, sorted Map or another
018: * Iterator that must be placed at the beginning of the matching
019: * area of a sorted set.
020: * </p>
021: * This Iterator is commonly used for TAB-completion..
022: */
023: public class SortedMatchIterator implements Iterator {
024: private final Iterator _it;
025: private final String _partialMatch;
026:
027: private String _prefix;
028: private String _suffix;
029:
030: /** the current match */
031: private String _current;
032:
033: /**
034: * Return all Key-Elements from the given Iterator that have the common
035: * prefix given in 'partialMatch'. The Iterator must provide a sorted
036: * sequence of the potential matches that is placed on the first match.
037: *
038: * @param partialMatch the prefix that should match
039: * @param it the Iterator positioned at the first partial match.
040: */
041: public SortedMatchIterator(String partialMatch,
042: Iterator/*<String>*/it) {
043: _partialMatch = partialMatch;
044: _it = it;
045: }
046:
047: /**
048: * Return all Key-Elements from the given SortedSet that have the common
049: * prefix given in 'partialMatch'.
050: *
051: * @param partialMatch the prefix that should match
052: * @param set the SortedSet from which the matches should be iterated.
053: */
054: public SortedMatchIterator(String partialMatch,
055: SortedSet/*<String>*/set) {
056: this (partialMatch, set.tailSet(partialMatch).iterator());
057: }
058:
059: /**
060: * Return all Key-Elements from the given SortedMap that have the common
061: * prefix given in 'partialMatch'.
062: *
063: * @param partialMatch the prefix that should match
064: * @param map the SortedMap from its matching keys the matches should be
065: * iterated.
066: */
067: public SortedMatchIterator(String partialMatch,
068: SortedMap/*<String>*/map) {
069: this (partialMatch, map.tailMap(partialMatch).keySet()
070: .iterator());
071: }
072:
073: /**
074: * If a prefix is set, then return the matching element with
075: * with this prefix prepended.
076: */
077: public void setPrefix(String prefix) {
078: _prefix = prefix;
079: }
080:
081: /**
082: * If a suffix is set, then return the matching element with
083: * with this suffix appended.
084: */
085: public void setSuffix(String suffix) {
086: _suffix = suffix;
087: }
088:
089: /**
090: * Override this method if you want to exclude
091: * certain values from the iterated values returned.
092: * By default, no value is excluded.
093: */
094: protected boolean exclude(String current) {
095: return false;
096: }
097:
098: //-- java.util.Iterator interface implementation
099: public boolean hasNext() {
100: while (_it.hasNext()) {
101: _current = (String) _it.next();
102: if (_current.length() == 0) {
103: continue;
104: }
105: if (!_current.startsWith(_partialMatch)) {
106: return false;
107: }
108: if (exclude(_current)) {
109: continue;
110: }
111: return true;
112: }
113: return false;
114: }
115:
116: public Object next() {
117: String result = _current;
118: if (_prefix != null)
119: result = _prefix + result;
120: if (_suffix != null)
121: result = result + _suffix;
122: return result;
123: }
124:
125: public void remove() {
126: throw new UnsupportedOperationException("no!");
127: }
128: }
|