001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 2003-2008 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.search;
043:
044: import javax.swing.event.ChangeListener;
045: import org.openide.util.Lookup;
046: import org.openidex.search.SearchInfo;
047:
048: /**
049: * Interface for obtaining information about scope of a search task.
050: *
051: * @author Marian Petras
052: */
053: public abstract class SearchScope {
054:
055: /**
056: * Identifies type of search scope.
057: */
058: public abstract String getTypeId();
059:
060: /**
061: * Returns human-readable, localized name of this search scope.
062: *
063: * @return name of this search scope
064: */
065: protected abstract String getDisplayName();
066:
067: /**
068: * Returns an additional information about this search scope.
069: * This information may (but may not) be displayed by the scope's
070: * display name, possibly rendered using a different font (style, colour).
071: * The default implementation returns {@code null}.
072: *
073: * @return string with the additional information,
074: * or {@code null} if no additional information is available
075: */
076: protected String getAdditionalInfo() {
077: return null;
078: }
079:
080: /**
081: * Is this search scope applicable at the moment?
082: * For example, search scope of all open projects is not applicable if there
083: * is no open project.
084: *
085: * @return {@code true} if this search scope is applicable,
086: * {@code false} otherwise
087: */
088: protected abstract boolean isApplicable();
089:
090: /**
091: * Registers a listener listening for changes of applicability.
092: * Registered listeners should be notified each time this {@code SearchScope}
093: * becomes applicable/unapplicable.
094: *
095: * @param l listener to be registered
096: * @see #isApplicable
097: */
098: protected abstract void addChangeListener(ChangeListener l);
099:
100: /**
101: * Unregisters a listener listening for changes of applicability.
102: * If the passed listener is not currently registered or if the passed
103: * listener is {@code null}, this method has no effect.
104: *
105: * @param l listener to be unregistered
106: * @see #addChangeListener
107: * @see #isApplicable
108: */
109: protected abstract void removeChangeListener(ChangeListener l);
110:
111: /**
112: * Returns lock for synchronization of access to set of registered listeners.
113: *
114: * @return lock to be used for synchronization
115: */
116: protected final Object getListenersLock() {
117: return this ;
118: }
119:
120: /**
121: * Returns object defining the actual search scope, i.e. the iterator over
122: * {@code DataObject}s to be searched.
123: *
124: * @return {@code SearchInfo} defining the search scope
125: */
126: protected abstract SearchInfo getSearchInfo();
127:
128: /**
129: * Returns a context-sensitive variant of this search scope.
130: * The returned instance may be the same as this instance.
131: *
132: * @return context-sensitive variant of this instance;
133: * the default implementation returns this
134: */
135: protected SearchScope getContextSensitiveInstance(Lookup context) {
136: return this ;
137: }
138:
139: @Override
140: public String toString() {
141: return getDisplayName();
142: }
143:
144: }
|