blob: aa1bbc54bb4a708e2eb0435d74e875344ae66f5e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 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 org.eclipse.jdt.internal.ui.search2;
import java.text.MessageFormat;
import java.util.HashMap;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.search.ui.IActionGroupFactory;
import org.eclipse.search.ui.ISearchResultView;
import org.eclipse.search.ui.SearchUI;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog;
import org.eclipse.jdt.internal.ui.search.GotoMarkerAction;
import org.eclipse.jdt.internal.ui.search.GroupByKeyComputer;
import org.eclipse.jdt.internal.ui.search.IJavaSearchUIConstants;
import org.eclipse.jdt.internal.ui.search.JavaSearchResultLabelProvider;
import org.eclipse.jdt.internal.ui.search.SearchMessages;
public class JavaSearchResultCollector implements IJavaSearchResultCollector {
private static final String MATCH= SearchMessages.getString("SearchResultCollector.match"); //$NON-NLS-1$
private static final String MATCHES= SearchMessages.getString("SearchResultCollector.matches"); //$NON-NLS-1$
private static final String DONE= SearchMessages.getString("SearchResultCollector.done"); //$NON-NLS-1$
private static final String SEARCHING= SearchMessages.getString("SearchResultCollector.searching"); //$NON-NLS-1$
private static final Boolean POTENTIAL_MATCH_VALUE= new Boolean(true);
private static final String POTENTIAL_MATCH_DIALOG_ID= "Search.PotentialMatchDialog"; //$NON-NLS-1$
private IProgressMonitor fMonitor;
private ISearchResultView fView;
private JavaSearchOperation fOperation;
private int fMatchCount= 0;
private int fPotentialMatchCount= 0;
private long fLastUpdateTime;
private Integer[] fMessageFormatArgs= new Integer[1];
private class ActionGroupFactory implements IActionGroupFactory {
public ActionGroup createActionGroup(ISearchResultView part) {
return new SearchViewActionGroup(part);
}
}
public JavaSearchResultCollector() {
// This ensures that the image class is loaded correctly
JavaPlugin.getDefault().getImageRegistry();
}
/**
* @see IJavaSearchResultCollector#aboutToStart().
*/
public void aboutToStart() {
fPotentialMatchCount= 0;
fView= SearchUI.getSearchResultView();
fMatchCount= 0;
fLastUpdateTime= 0;
if (fView != null) {
fView.searchStarted(
new ActionGroupFactory(),
fOperation.getSingularLabel(),
fOperation.getPluralLabelPattern(),
fOperation.getImageDescriptor(),
JavaSearchPage2.EXTENSION_POINT_ID,
new JavaSearchResultLabelProvider(),
new GotoMarkerAction(),
new GroupByKeyComputer(),
fOperation);
}
if (!getProgressMonitor().isCanceled())
getProgressMonitor().subTask(SEARCHING);
}
/**
* @see IJavaSearchResultCollector#accept
*/
public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) throws CoreException {
if (enclosingElement == null) { // non-Java match
IMarker marker= resource.createMarker(SearchUI.SEARCH_MARKER);
String description= resource.getFullPath().lastSegment();
if (description == null)
description= ""; //$NON-NLS-1$
HashMap attributes= new HashMap(3);
attributes.put(IMarker.CHAR_START, new Integer(Math.max(start, 0)));
attributes.put(IMarker.CHAR_END, new Integer(Math.max(end, 0)));
marker.setAttributes(attributes);
fView.addMatch(description, resource, resource, marker);
fMatchCount++;
if (!getProgressMonitor().isCanceled() && System.currentTimeMillis() - fLastUpdateTime > 1000) {
getProgressMonitor().subTask(getFormattedMatchesString(fMatchCount));
fLastUpdateTime= System.currentTimeMillis();
}
return;
}
if (accuracy == POTENTIAL_MATCH && SearchUI.arePotentialMatchesIgnored())
return;
IMarker marker= resource.createMarker(SearchUI.SEARCH_MARKER);
HashMap attributes;
Object groupKey= enclosingElement;
attributes= new HashMap(7);
if (accuracy == POTENTIAL_MATCH) {
fPotentialMatchCount++;
attributes.put(SearchUI.POTENTIAL_MATCH, POTENTIAL_MATCH_VALUE);
if (groupKey == null)
groupKey= "?:null"; //$NON-NLS-1$
else
groupKey= "?:" + enclosingElement.getHandleIdentifier(); //$NON-NLS-1$
}
ICompilationUnit cu= SearchUtil.findCompilationUnit(enclosingElement);
if (cu != null && cu.isWorkingCopy())
attributes.put(IJavaSearchUIConstants.ATT_IS_WORKING_COPY, new Boolean(true)); //$NON-NLS-1$
JavaCore.addJavaElementMarkerAttributes(attributes, enclosingElement);
attributes.put(IJavaSearchUIConstants.ATT_JE_HANDLE_ID, enclosingElement.getHandleIdentifier());
attributes.put(IMarker.CHAR_START, new Integer(Math.max(start, 0)));
attributes.put(IMarker.CHAR_END, new Integer(Math.max(end, 0)));
if (enclosingElement instanceof IMember && ((IMember)enclosingElement).isBinary())
attributes.put(IWorkbenchPage.EDITOR_ID_ATTR, JavaUI.ID_CF_EDITOR);
else
attributes.put(IWorkbenchPage.EDITOR_ID_ATTR, JavaUI.ID_CU_EDITOR);
marker.setAttributes(attributes);
fView.addMatch(enclosingElement.getElementName(), groupKey, resource, marker);
fMatchCount++;
if (!getProgressMonitor().isCanceled() && System.currentTimeMillis() - fLastUpdateTime > 1000) {
getProgressMonitor().subTask(getFormattedMatchesString(fMatchCount));
fLastUpdateTime= System.currentTimeMillis();
}
}
/**
* @see IJavaSearchResultCollector#done().
*/
public void done() {
if (!getProgressMonitor().isCanceled()) {
String matchesString= getFormattedMatchesString(fMatchCount);
getProgressMonitor().setTaskName(MessageFormat.format(DONE, new String[]{matchesString}));
}
if (fView != null) {
if (fPotentialMatchCount > 0)
explainPotentialMatch(fPotentialMatchCount);
fView.searchFinished();
}
// Cut no longer unused references because the collector might be re-used
fView= null;
fMonitor= null;
}
private void explainPotentialMatch(final int potentialMatchCount) {
// Make sure we are doing it in the right thread.
final Shell shell= fView.getSite().getShell();
final String title;
if (potentialMatchCount == 1)
title= new String(SearchMessages.getString("Search.potentialMatchDialog.title.foundPotentialMatch")); //$NON-NLS-1$
else
title= new String(SearchMessages.getFormattedString("Search.potentialMatchDialog.title.foundPotentialMatches", "" + potentialMatchCount)); //$NON-NLS-1$ //$NON-NLS-2$
shell.getDisplay().syncExec(new Runnable() {
public void run() {
OptionalMessageDialog.open(
POTENTIAL_MATCH_DIALOG_ID, //$NON-NLS-1$,
shell,
title,
null,
SearchMessages.getString("Search.potentialMatchDialog.message"), //$NON-NLS-1$,
MessageDialog.INFORMATION,
new String[] { IDialogConstants.OK_LABEL },
0);
}
});
}
/*
* @see IJavaSearchResultCollector#getProgressMonitor().
*/
public IProgressMonitor getProgressMonitor() {
return fMonitor;
}
void setProgressMonitor(IProgressMonitor pm) {
fMonitor= pm;
}
void setOperation(JavaSearchOperation operation) {
fOperation= operation;
}
private String getFormattedMatchesString(int count) {
if (fMatchCount == 1)
return MATCH;
fMessageFormatArgs[0]= new Integer(count);
return MessageFormat.format(MATCHES, fMessageFormatArgs);
}
}