diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties index a88631dc935..12feae5fdf5 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2009 IBM Corporation and others. +# Copyright (c) 2000, 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 @@ -62,10 +62,10 @@ CSearch_FindReferencesInWorkingSetAction_tooltip= Search for References to the S CSearchOperation_operationUnavailable_message= The operation is unavailable on the current selection. -WorkspaceScope= Workspace -WorkingSetScope= Working Set - {0} -SelectionScope= Selection -ProjectScope = Project +WorkspaceScope= workspace +WorkingSetScope= working set - {0} +SelectionScope= selection +ProjectScope = project PDOMSearchQuery_refs_label = Search references PDOMSearchQuery_defs_label = Search definitions diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java index 284dfe68e1e..439ce6c4a29 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems 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 @@ -8,16 +8,17 @@ * Contributors: * QNX - Initial API and implementation * IBM Corporation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.search; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.regex.PatternSyntaxException; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.dialogs.Dialog; @@ -55,8 +56,11 @@ import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.ISourceReference; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.ui.CUIPlugin; @@ -150,16 +154,27 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage { private IStatusLineManager fLineManager; - private static ICProject getProject(Object object) { - if (object instanceof ICElement) { - return ((ICElement) object).getCProject(); - } else if (object instanceof IResource) { - return CoreModel.getDefault().create(((IResource) object).getProject()); - } else { - return null; - } + private static ICProject getProject(String name) { + return CoreModel.getDefault().create(ResourcesPlugin.getWorkspace().getRoot().getProject(name)); } + private ICElement getElement(Object obj) { + if (obj instanceof IResource) { + return CoreModel.getDefault().create((IResource)obj); + } + if (obj instanceof ICElement) { + ICElement elem= (ICElement) obj; + if (elem instanceof ISourceReference) + return ((ISourceReference) elem).getTranslationUnit(); + if (elem instanceof ITranslationUnit || elem instanceof ICContainer || elem instanceof ICProject) + return elem; + + return elem.getCProject(); + } + return null; + } + + public boolean performAction() { fLineManager.setErrorMessage(null); @@ -184,28 +199,54 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage { } // get the list of elements for the scope - List elements = new ArrayList(); + Set elements = new HashSet(); String scopeDescription = ""; //$NON-NLS-1$ switch (getContainer().getSelectedScope()) { case ISearchPageContainer.SELECTED_PROJECTS_SCOPE: - if (structuredSelection != null) { - scopeDescription = CSearchMessages.ProjectScope; - for (Iterator i = structuredSelection.iterator(); i.hasNext();) { - ICProject project = getProject(i.next()); - if (project != null) - elements.add(project); + final String[] prjNames = getContainer().getSelectedProjectNames(); + scopeDescription= CSearchMessages.ProjectScope; + int ip= 0; + for (String prjName: prjNames) { + ICProject project = getProject(prjName); + if (project != null) { + elements.add(project); + switch(ip++) { + case 0: + scopeDescription+= " '" + prjName + "'"; //$NON-NLS-1$//$NON-NLS-2$ + break; + case 1: + scopeDescription= scopeDescription + ", '" + prjName + "'"; //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 2: + scopeDescription+= ", ..."; //$NON-NLS-1$ + break; + default: + break; + } } } break; case ISearchPageContainer.SELECTION_SCOPE: if (structuredSelection != null) { scopeDescription = CSearchMessages.SelectionScope; - for (Iterator i = structuredSelection.iterator(); i.hasNext();) { - Object obj = i.next(); - if (obj instanceof IResource) { - elements.add(CoreModel.getDefault().create((IResource)obj)); - } else if (obj instanceof ICElement) { - elements.add(obj); + int ie= 0; + for (Object sel : structuredSelection.toList()) { + ICElement elem= getElement(sel); + if (elem != null) { + elements.add(elem); + switch(ie++) { + case 0: + scopeDescription= " '" + elem.toString() + "'"; //$NON-NLS-1$//$NON-NLS-2$ + break; + case 1: + scopeDescription= scopeDescription + ", '" + elem.toString() + "'"; //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 2: + scopeDescription+= ", ..."; //$NON-NLS-1$ + break; + default: + break; + } } } break; @@ -221,9 +262,9 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage { for (int i = 0; i < workingSets.length; ++i) { IAdaptable[] wsElements = workingSets[i].getElements(); for (int j = 0; j < wsElements.length; ++j) { - ICProject project = getProject(wsElements[j]); - if (project != null) - elements.add(project); + ICElement elem = getElement(wsElements[j]); + if (elem != null) + elements.add(elem); } } break; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java index 734437da53e..5db40ae4d7d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems 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 @@ -23,7 +23,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; @@ -197,8 +196,6 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery { @Override public String getResultLabel(int numMatches) { - String patternInScope = NLS.bind( - CSearchMessages.PDOMSearchPatternQuery_PatternQuery_labelPatternInScope, patternStr, scopeDesc); - return getResultLabel(patternInScope, numMatches); + return getResultLabel(patternStr, scopeDesc, numMatches); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java index dd9206d5222..92990069fb9 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 QNX Software Systems and others. + * Copyright (c) 2006, 2011 QNX Software Systems 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 @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -89,6 +91,7 @@ public abstract class PDOMSearchQuery implements ISearchQuery { protected ICElement[] scope; protected ICProject[] projects; + private Set fullPathFilter; protected PDOMSearchQuery(ICElement[] scope, int flags) { result = new PDOMSearchResult(this); @@ -110,15 +113,24 @@ public abstract class PDOMSearchQuery implements ISearchQuery { projects = (ICProject[]) ArrayUtil.removeNulls(ICProject.class, allProjects); } else { Map projectMap = new HashMap(); - + Set pathFilter = new HashSet(); + boolean needFilter= false; for (int i = 0; i < scope.length; ++i) { ICProject project = scope[i].getCProject(); if (project != null && project.getProject().isOpen()) { + IResource res= scope[i].getResource(); + if (res != null) { + pathFilter.add(res.getFullPath().toString()); + needFilter= needFilter || !(res instanceof IProject); + } projectMap.put(project.getElementName(), project); } } projects = projectMap.values().toArray(new ICProject[projectMap.size()]); + if (needFilter) { + fullPathFilter= pathFilter; + } } } catch (CoreException e) { CUIPlugin.log(e); @@ -149,8 +161,12 @@ public abstract class PDOMSearchQuery implements ISearchQuery { } public abstract String getResultLabel(int matchCount); - + public String getResultLabel(String pattern, int matchCount) { + return getResultLabel(pattern, null, matchCount); + } + + public String getResultLabel(String pattern, String scope, int matchCount) { // Report pattern and number of matches String label; final int kindFlags= flags & FIND_ALL_OCCURRENCES; @@ -171,6 +187,10 @@ public abstract class PDOMSearchQuery implements ISearchQuery { label = NLS.bind(CSearchMessages.PDOMSearchQuery_occurrences_result_label, pattern); break; } + + if (scope != null) + label= NLS.bind(CSearchMessages.PDOMSearchPatternQuery_PatternQuery_labelPatternInScope, label, scope); + String countLabel = Messages.format(CSearchMessages.CSearchResultCollector_matches, new Integer( matchCount)); return label + " " + countLabel; //$NON-NLS-1$ @@ -355,7 +375,26 @@ public abstract class PDOMSearchQuery implements ISearchQuery { private void createMatches1(IIndex index, IBinding binding, List names) throws CoreException { IIndexName[] bindingNames= index.findNames(binding, flags); - names.addAll(Arrays.asList(bindingNames)); + if (fullPathFilter == null) { + names.addAll(Arrays.asList(bindingNames)); + } else { + for (IIndexName name : bindingNames) { + String fullPath= name.getFile().getLocation().getFullPath(); + if (accept(fullPath)) + names.add(name); + } + } + } + + private boolean accept(String fullPath) { + for(;;) { + if (fullPathFilter.contains(fullPath)) + return true; + int idx= fullPath.lastIndexOf('/'); + if (idx < 0) + return false; + fullPath= fullPath.substring(0, idx); + } } protected void createLocalMatches(IASTTranslationUnit ast, IBinding binding) throws CoreException {