/******************************************************************************* * Copyright (c) 2001, 2011 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 Jens Lukowski/Innoopract - initial renaming/restructuring *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.search; import com.google.dart.tools.search.ui.ISearchQuery; import com.google.dart.tools.search.ui.ISearchResult; import com.google.dart.tools.search.ui.text.AbstractTextSearchResult; import com.google.dart.tools.search.ui.text.Match; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.wst.sse.ui.internal.Logger; /** * Defines a basic search query. This query does not do anything, it needs to be extended and the * <code>{@link #doQuery()}</code> method needs to be overridden to make the query actually be * functional. */ public class BasicSearchQuery implements ISearchQuery { /** * the file we're searching */ private IFile fFile = null; /** * The result of this query */ private AbstractTextSearchResult fResult = null; /** * The progress monitor for the query */ private IProgressMonitor fProgressMonitor = null; /** * <p> * Construct a new basic query. * </p> * <p> * <b>IMPORTANT: </b>It is very important that after creating the query and <b>before</b> running * the query that you call {@link #setResult(AbstractTextSearchResult)}. This is not a parameter * because typically a search result needs a reference to its query and thus the query needs to be * constructed before its result object can be set. * </p> * * @param file the file this query will take place on */ public BasicSearchQuery(IFile file) { this.fFile = file; } /** * Adds a match to the results of this query. * <p> * <b>IMPORTANT: </b>It is very important that after creating the query and <b>before</b> running * the query that you call {@link #setResult(AbstractTextSearchResult)}. This is not a parameter * because typically a search result needs a reference to its query and thus the query needs to be * constructed before its result object can be set. * </p> * * @param document the document the match is being added too * @param matchStart the start character of the match * @param matchEnd the end character of the match */ public void addMatch(IDocument document, int matchStart, int matchEnd) { try { int lineNumber = document.getLineOfOffset(matchStart); int lineStart = document.getLineOffset(lineNumber); int lineLength = document.getLineLength(lineNumber); String elementMessage = document.get().substring(lineStart, lineStart + lineLength); //add the match to the result BasicSearchMatchElement element = new BasicSearchMatchElement(fFile, lineNumber, lineStart, elementMessage); fResult.addMatch(new Match(element, Match.UNIT_CHARACTER, matchStart, matchEnd - matchStart)); } catch (BadLocationException e) { Logger.logException(e); } } /** * <p> * <i>Note: </i> as of yet no testing has gone into whether this query can be re-run or not or * what that even entails. * <p> * * @see org.eclipse.search.ui.ISearchQuery#canRerun() */ @Override public boolean canRerun() { return false; } /** * <p> * This query can be run in the background * </p> * * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground() */ @Override public boolean canRunInBackground() { return true; } /** * public to avoid synthetic method access from inner class * * @return */ public IFile getFile() { return this.fFile; } /** * There is no default label for a basic query, this should be overridden by implementing classes * * @see org.eclipse.search.ui.ISearchQuery#getLabel() */ @Override public String getLabel() { return ""; //$NON-NLS-1$ } /** * <p> * This will be <code>null</code> if {@link #setResult(AbstractTextSearchResult)} has not been * called yet. * </p> * * @see org.eclipse.search.ui.ISearchQuery#getSearchResult() */ @Override public ISearchResult getSearchResult() { return fResult; } /** * Runs the query * * @see org.eclipse.search.ui.ISearchQuery#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus run(IProgressMonitor monitor) { fProgressMonitor = monitor; return doQuery(); } /** * <p> * The actual work of the query, called by {@link #run(IProgressMonitor)} * </p> * <p> * <i>Note: </i>This method should be overridden by implementers so that their query will actually * do something * </p> * * @return the status of the query when it has finished * @deprecated use {@link #doQuery(IProgressMonitor)} so that the operation is cancelable */ @Deprecated protected IStatus doQuery() { return doQuery(fProgressMonitor); } /** * <p> * The actual work of the query, called by {@link #run(IProgressMonitor)} * </p> * <p> * <i>Note: </i>This method should be overridden by implementers so that their query will actually * do something * </p> * * @param monitor {@link IProgressMonitor} used to track progress and cancel the operation * @return the status of the query when it has finished */ protected IStatus doQuery(IProgressMonitor monitor) { return Status.OK_STATUS; } /** * @return the total number of matches this query found */ protected int getMatchCount() { return fResult.getMatchCount(); } /** * <p> * used in search result display labels, should be overridden by implementers * </p> * * @return */ protected String getSearchText() { return ""; //$NON-NLS-1$ } /** * <p> * This <b>needs</b> to be called after constructing the query but before running it, see note on * {@link #BasicSearchQuery(IFile)} * </p> * * @param result the result this query will use to store its results */ protected void setResult(AbstractTextSearchResult result) { this.fResult = result; } }