001: /*
002: * Copyright (C) 2002 Christian Sell
003: * csell@users.sourceforge.net
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: *
019: * created by cse, 24.09.2002 12:00:04
020: *
021: * @version $Id: SQLCompletion.java,v 1.2 2007/08/07 01:02:15 manningr Exp $
022: */
023: package net.sourceforge.squirrel_sql.client.session.parser.kernel;
024:
025: import java.io.Serializable;
026: import java.util.Comparator;
027:
028: /**
029: * abstract superclass for completion items
030: */
031: public abstract class SQLCompletion implements Completion {
032: public static final int NO_POSITION = -1;
033: public static final int NO_LIMIT = 99999;
034:
035: public static final String[] EMPTY_RESULT = new String[0];
036:
037: protected int startPosition = NO_POSITION, endPosition = NO_LIMIT;
038:
039: protected SQLCompletion(int startPosition) {
040: this .startPosition = startPosition;
041: }
042:
043: protected SQLCompletion() {
044: }
045:
046: public Completion getCompletion(int position) {
047: return isEnclosed(position) ? this : null;
048: }
049:
050: /**
051: * @return whether this object reperesents a concrete item, as opposed to being a
052: * placeholder for potential items. For example, a non-concrete item may be inserted
053: * into the completion tree to allow inserting completions in a certain text area. A
054: * concrete item should be created when the parser encounters an existing item in the
055: * token stream. During {@link #getCompletion completion lookup}, concrete items are
056: * preferred before non-concrete ones
057: */
058: protected boolean isConcrete() {
059: return true;
060: }
061:
062: public void setEndPosition(int position) {
063: this .endPosition = position;
064: }
065:
066: /**
067: * @return the completion text
068: * @throws UnsupportedOperationException
069: */
070: public String getText(int position) {
071: throw new UnsupportedOperationException(
072: "completion not available");
073: }
074:
075: /**
076: * @return the completion text, provided it is available
077: * @throws UnsupportedOperationException
078: */
079: public String getText(int position, String options) {
080: throw new UnsupportedOperationException(
081: "completion not available");
082: }
083:
084: public boolean hasTextPosition() {
085: return startPosition != NO_POSITION
086: && endPosition != NO_POSITION;
087: }
088:
089: public boolean isRepeatable() {
090: return false;
091: }
092:
093: public int getLength() {
094: return endPosition - startPosition + 1;
095: }
096:
097: public int getStart() {
098: return startPosition;
099: }
100:
101: public boolean mustReplace(int position) {
102: return false;
103: }
104:
105: /**
106: * @param position the text position to be checked
107: * @return whether the given text position is enclosed by this objects range
108: */
109: protected boolean isEnclosed(int position) {
110: return position >= startPosition && position <= endPosition;
111: }
112:
113: /**
114: * A comparator implementation which sorts descending according to startPosition,
115: * while preferring {@link #isConcrete concrete} items before non-concrete ones
116: */
117: public static class ChildComparator implements
118: Comparator<SQLCompletion>, Serializable {
119: private static final long serialVersionUID = -8912522485515591605L;
120:
121: public int compare(SQLCompletion c1, SQLCompletion c2) {
122: if (c1.isConcrete() == c2.isConcrete()) {
123: return c2.startPosition - c1.startPosition;
124: } else {
125: return c1.isConcrete() ? -1 : 1;
126: }
127: }
128: }
129: }
|