| /******************************************************************************* |
| * 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 |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.search; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.swt.widgets.Shell; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IPath; |
| |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.window.Window; |
| |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog; |
| |
| import org.eclipse.jdt.core.IClasspathContainer; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragment; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.core.search.IJavaSearchScope; |
| import org.eclipse.jdt.core.search.SearchEngine; |
| |
| import org.eclipse.jdt.internal.corext.util.Messages; |
| |
| import org.eclipse.jdt.ui.JavaElementLabels; |
| import org.eclipse.jdt.ui.JavaUI; |
| |
| import org.eclipse.jdt.internal.ui.JavaPlugin; |
| import org.eclipse.jdt.internal.ui.browsing.LogicalPackage; |
| import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; |
| import org.eclipse.jdt.internal.ui.workingsets.WorkingSetComparator; |
| |
| public class JavaSearchScopeFactory { |
| |
| public static final int JRE= IJavaSearchScope.SYSTEM_LIBRARIES; |
| public static final int LIBS= IJavaSearchScope.APPLICATION_LIBRARIES; |
| public static final int PROJECTS= IJavaSearchScope.REFERENCED_PROJECTS; |
| public static final int SOURCES= IJavaSearchScope.SOURCES; |
| |
| public static final int ALL= JRE | LIBS | PROJECTS | SOURCES; |
| public static final int NO_PROJ= JRE | LIBS | SOURCES; |
| public static final int NO_JRE= LIBS | PROJECTS | SOURCES; |
| public static final int NO_JRE_NO_PROJ= LIBS | PROJECTS | SOURCES; |
| |
| private static JavaSearchScopeFactory fgInstance; |
| private final IJavaSearchScope EMPTY_SCOPE= SearchEngine.createJavaSearchScope(new IJavaElement[] {}); |
| |
| private JavaSearchScopeFactory() { |
| } |
| |
| public static JavaSearchScopeFactory getInstance() { |
| if (fgInstance == null) |
| fgInstance= new JavaSearchScopeFactory(); |
| return fgInstance; |
| } |
| |
| public IWorkingSet[] queryWorkingSets() throws InterruptedException { |
| Shell shell= JavaPlugin.getActiveWorkbenchShell(); |
| if (shell == null) |
| return null; |
| IWorkingSetSelectionDialog dialog= PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetSelectionDialog(shell, true); |
| if (dialog.open() != Window.OK) { |
| throw new InterruptedException(); |
| } |
| |
| IWorkingSet[] workingSets= dialog.getSelection(); |
| if (workingSets.length > 0) |
| return workingSets; |
| return null; // 'no working set' selected |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IWorkingSet[] workingSets, boolean includeJRE) { |
| return createJavaSearchScope(workingSets, includeJRE ? ALL : NO_JRE); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IWorkingSet[] workingSets, int includeMask) { |
| if (workingSets == null || workingSets.length < 1) |
| return EMPTY_SCOPE; |
| |
| Set<IJavaElement> javaElements= new HashSet<IJavaElement>(workingSets.length * 10); |
| for (int i= 0; i < workingSets.length; i++) { |
| IWorkingSet workingSet= workingSets[i]; |
| if (workingSet.isEmpty() && workingSet.isAggregateWorkingSet()) { |
| return createWorkspaceScope(includeMask); |
| } |
| addJavaElements(javaElements, workingSet); |
| } |
| return createJavaSearchScope(javaElements, includeMask); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IWorkingSet workingSet, boolean includeJRE) { |
| return createJavaSearchScope(workingSet, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IWorkingSet workingSet, int includeMask) { |
| Set<IJavaElement> javaElements= new HashSet<IJavaElement>(10); |
| if (workingSet.isEmpty() && workingSet.isAggregateWorkingSet()) { |
| return createWorkspaceScope(includeMask); |
| } |
| addJavaElements(javaElements, workingSet); |
| return createJavaSearchScope(javaElements, includeMask); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IResource[] resources, boolean includeJRE) { |
| return createJavaSearchScope(resources, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IResource[] resources, int includeMask) { |
| if (resources == null) |
| return EMPTY_SCOPE; |
| Set<IJavaElement> javaElements= new HashSet<IJavaElement>(resources.length); |
| addJavaElements(javaElements, resources); |
| return createJavaSearchScope(javaElements, includeMask); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(ISelection selection, boolean includeJRE) { |
| return createJavaSearchScope(selection, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(ISelection selection, int includeMask) { |
| return createJavaSearchScope(getJavaElements(selection), includeMask); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(String[] projectNames, boolean includeJRE) { |
| return createJavaProjectSearchScope(projectNames, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(String[] projectNames, int includeMask) { |
| ArrayList<IJavaElement> res= new ArrayList<IJavaElement>(); |
| IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); |
| for (int i= 0; i < projectNames.length; i++) { |
| IJavaProject project= JavaCore.create(root.getProject(projectNames[i])); |
| if (project.exists()) { |
| res.add(project); |
| } |
| } |
| return createJavaSearchScope(res, includeMask); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(IJavaProject project, boolean includeJRE) { |
| return createJavaProjectSearchScope(project, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(IJavaProject project, int includeMask) { |
| return SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, getSearchFlags(includeMask)); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(IEditorInput editorInput, boolean includeJRE) { |
| return createJavaProjectSearchScope(editorInput, includeJRE ? ALL : NO_JRE); |
| } |
| |
| public IJavaSearchScope createJavaProjectSearchScope(IEditorInput editorInput, int includeMask) { |
| IJavaElement elem= JavaUI.getEditorInputJavaElement(editorInput); |
| if (elem != null) { |
| IJavaProject project= elem.getJavaProject(); |
| if (project != null) { |
| return createJavaProjectSearchScope(project, includeMask); |
| } |
| } |
| return EMPTY_SCOPE; |
| } |
| |
| public String getWorkspaceScopeDescription(boolean includeJRE) { |
| return includeJRE ? SearchMessages.WorkspaceScope : SearchMessages.WorkspaceScopeNoJRE; |
| } |
| |
| public String getWorkspaceScopeDescription(int includeMask) { |
| return getWorkspaceScopeDescription((includeMask & JRE) != 0); |
| } |
| |
| public String getProjectScopeDescription(String[] projectNames, int includeMask) { |
| if (projectNames.length == 0) { |
| return SearchMessages.JavaSearchScopeFactory_undefined_projects; |
| } |
| boolean includeJRE= (includeMask & JRE) != 0; |
| String scopeDescription; |
| if (projectNames.length == 1) { |
| String label= includeJRE ? SearchMessages.EnclosingProjectScope : SearchMessages.EnclosingProjectScopeNoJRE; |
| scopeDescription= Messages.format(label, BasicElementLabels.getJavaElementName(projectNames[0])); |
| } else if (projectNames.length == 2) { |
| String label= includeJRE ? SearchMessages.EnclosingProjectsScope2 : SearchMessages.EnclosingProjectsScope2NoJRE; |
| scopeDescription= Messages.format(label, new String[] { BasicElementLabels.getJavaElementName(projectNames[0]), BasicElementLabels.getJavaElementName(projectNames[1])}); |
| } else { |
| String label= includeJRE ? SearchMessages.EnclosingProjectsScope : SearchMessages.EnclosingProjectsScopeNoJRE; |
| scopeDescription= Messages.format(label, new String[] { BasicElementLabels.getJavaElementName(projectNames[0]), BasicElementLabels.getJavaElementName(projectNames[1])}); |
| } |
| return scopeDescription; |
| } |
| |
| public String getProjectScopeDescription(IJavaProject project, boolean includeJRE) { |
| if (includeJRE) { |
| return Messages.format(SearchMessages.ProjectScope, BasicElementLabels.getJavaElementName(project.getElementName())); |
| } else { |
| return Messages.format(SearchMessages.ProjectScopeNoJRE, BasicElementLabels.getJavaElementName(project.getElementName())); |
| } |
| } |
| |
| public String getProjectScopeDescription(IEditorInput editorInput, boolean includeJRE) { |
| IJavaElement elem= JavaUI.getEditorInputJavaElement(editorInput); |
| if (elem != null) { |
| IJavaProject project= elem.getJavaProject(); |
| if (project != null) { |
| return getProjectScopeDescription(project, includeJRE); |
| } |
| } |
| return Messages.format(SearchMessages.ProjectScope, ""); //$NON-NLS-1$ |
| } |
| |
| public String getHierarchyScopeDescription(IType type) { |
| return Messages.format(SearchMessages.HierarchyScope, new String[] { JavaElementLabels.getElementLabel(type, JavaElementLabels.ALL_DEFAULT) }); |
| } |
| |
| public String getSelectionScopeDescription(IJavaElement[] javaElements, int includeMask) { |
| return getSelectionScopeDescription(javaElements, (includeMask & JRE) != 0); |
| } |
| |
| |
| public String getSelectionScopeDescription(IJavaElement[] javaElements, boolean includeJRE) { |
| if (javaElements.length == 0) { |
| return SearchMessages.JavaSearchScopeFactory_undefined_selection; |
| } |
| String scopeDescription; |
| if (javaElements.length == 1) { |
| String label= includeJRE ? SearchMessages.SingleSelectionScope : SearchMessages.SingleSelectionScopeNoJRE; |
| scopeDescription= Messages.format(label, JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT)); |
| } else if (javaElements.length == 2) { |
| String label= includeJRE ? SearchMessages.DoubleSelectionScope : SearchMessages.DoubleSelectionScopeNoJRE; |
| scopeDescription= Messages.format(label, new String[] { JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT), JavaElementLabels.getElementLabel(javaElements[1], JavaElementLabels.ALL_DEFAULT)}); |
| } else { |
| String label= includeJRE ? SearchMessages.SelectionScope : SearchMessages.SelectionScopeNoJRE; |
| scopeDescription= Messages.format(label, new String[] { JavaElementLabels.getElementLabel(javaElements[0], JavaElementLabels.ALL_DEFAULT), JavaElementLabels.getElementLabel(javaElements[1], JavaElementLabels.ALL_DEFAULT)}); |
| } |
| return scopeDescription; |
| } |
| |
| public String getWorkingSetScopeDescription(IWorkingSet[] workingSets, int includeMask) { |
| return getWorkingSetScopeDescription(workingSets, (includeMask & JRE) != 0); |
| } |
| |
| public String getWorkingSetScopeDescription(IWorkingSet[] workingSets, boolean includeJRE) { |
| if (workingSets.length == 0) { |
| return SearchMessages.JavaSearchScopeFactory_undefined_workingsets; |
| } |
| if (workingSets.length == 1) { |
| String label= includeJRE ? SearchMessages.SingleWorkingSetScope : SearchMessages.SingleWorkingSetScopeNoJRE; |
| return Messages.format(label, BasicElementLabels.getWorkingSetLabel(workingSets[0])); |
| } |
| Arrays.sort(workingSets, new WorkingSetComparator()); |
| if (workingSets.length == 2) { |
| String label= includeJRE ? SearchMessages.DoubleWorkingSetScope : SearchMessages.DoubleWorkingSetScopeNoJRE; |
| return Messages.format(label, new String[] { BasicElementLabels.getWorkingSetLabel(workingSets[0]), BasicElementLabels.getWorkingSetLabel(workingSets[1])}); |
| } |
| String label= includeJRE ? SearchMessages.WorkingSetsScope : SearchMessages.WorkingSetsScopeNoJRE; |
| return Messages.format(label, new String[] { BasicElementLabels.getWorkingSetLabel(workingSets[0]), BasicElementLabels.getWorkingSetLabel(workingSets[1])}); |
| } |
| |
| public IProject[] getProjects(IJavaSearchScope scope) { |
| IPath[] paths= scope.enclosingProjectsAndJars(); |
| HashSet<IResource> temp= new HashSet<IResource>(); |
| for (int i= 0; i < paths.length; i++) { |
| IResource resource= ResourcesPlugin.getWorkspace().getRoot().findMember(paths[i]); |
| if (resource != null && resource.getType() == IResource.PROJECT) |
| temp.add(resource); |
| } |
| return temp.toArray(new IProject[temp.size()]); |
| } |
| |
| public IJavaElement[] getJavaElements(ISelection selection) { |
| if (selection instanceof IStructuredSelection && !selection.isEmpty()) { |
| return getJavaElements(((IStructuredSelection)selection).toArray()); |
| } else { |
| return new IJavaElement[0]; |
| } |
| } |
| |
| private IJavaElement[] getJavaElements(Object[] elements) { |
| if (elements.length == 0) |
| return new IJavaElement[0]; |
| |
| Set<IJavaElement> result= new HashSet<IJavaElement>(elements.length); |
| for (int i= 0; i < elements.length; i++) { |
| Object selectedElement= elements[i]; |
| if (selectedElement instanceof IJavaElement) { |
| addJavaElements(result, (IJavaElement) selectedElement); |
| } else if (selectedElement instanceof IResource) { |
| addJavaElements(result, (IResource) selectedElement); |
| } else if (selectedElement instanceof LogicalPackage) { |
| addJavaElements(result, (LogicalPackage) selectedElement); |
| } else if (selectedElement instanceof IWorkingSet) { |
| IWorkingSet ws= (IWorkingSet)selectedElement; |
| addJavaElements(result, ws); |
| } else if (selectedElement instanceof IAdaptable) { |
| IResource resource= (IResource) ((IAdaptable) selectedElement).getAdapter(IResource.class); |
| if (resource != null) |
| addJavaElements(result, resource); |
| } |
| |
| } |
| return result.toArray(new IJavaElement[result.size()]); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IJavaElement[] javaElements, boolean includeJRE) { |
| return createJavaSearchScope(javaElements, includeJRE ? NO_PROJ : NO_JRE_NO_PROJ); |
| } |
| |
| public IJavaSearchScope createJavaSearchScope(IJavaElement[] javaElements, int includeMask) { |
| if (javaElements.length == 0) |
| return EMPTY_SCOPE; |
| return SearchEngine.createJavaSearchScope(javaElements, getSearchFlags(includeMask)); |
| } |
| |
| private IJavaSearchScope createJavaSearchScope(Collection<IJavaElement> javaElements, int includeMask) { |
| if (javaElements.isEmpty()) |
| return EMPTY_SCOPE; |
| IJavaElement[] elementArray= javaElements.toArray(new IJavaElement[javaElements.size()]); |
| return SearchEngine.createJavaSearchScope(elementArray, getSearchFlags(includeMask)); |
| } |
| |
| private static int getSearchFlags(int includeMask) { |
| return includeMask; |
| } |
| |
| private void addJavaElements(Set<IJavaElement> javaElements, IResource[] resources) { |
| for (int i= 0; i < resources.length; i++) |
| addJavaElements(javaElements, resources[i]); |
| } |
| |
| private void addJavaElements(Set<IJavaElement> javaElements, IResource resource) { |
| IJavaElement javaElement= (IJavaElement)resource.getAdapter(IJavaElement.class); |
| if (javaElement == null) |
| // not a Java resource |
| return; |
| |
| if (javaElement.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { |
| // add other possible package fragments |
| try { |
| addJavaElements(javaElements, ((IFolder)resource).members()); |
| } catch (CoreException ex) { |
| // don't add elements |
| } |
| } |
| |
| javaElements.add(javaElement); |
| } |
| |
| private void addJavaElements(Set<IJavaElement> javaElements, IJavaElement javaElement) { |
| javaElements.add(javaElement); |
| } |
| |
| private void addJavaElements(Set<IJavaElement> javaElements, IWorkingSet workingSet) { |
| if (workingSet == null) |
| return; |
| |
| if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) { |
| try { |
| IJavaProject[] projects= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects(); |
| javaElements.addAll(Arrays.asList(projects)); |
| } catch (JavaModelException e) { |
| JavaPlugin.log(e); |
| } |
| return; |
| } |
| |
| IAdaptable[] elements= workingSet.getElements(); |
| for (int i= 0; i < elements.length; i++) { |
| IJavaElement javaElement=(IJavaElement) elements[i].getAdapter(IJavaElement.class); |
| if (javaElement != null) { |
| addJavaElements(javaElements, javaElement); |
| continue; |
| } |
| IResource resource= (IResource)elements[i].getAdapter(IResource.class); |
| if (resource != null) { |
| addJavaElements(javaElements, resource); |
| } |
| |
| // else we don't know what to do with it, ignore. |
| } |
| } |
| |
| private void addJavaElements(Set<IJavaElement> javaElements, LogicalPackage selectedElement) { |
| IPackageFragment[] packages= selectedElement.getFragments(); |
| for (int i= 0; i < packages.length; i++) |
| addJavaElements(javaElements, packages[i]); |
| } |
| |
| public IJavaSearchScope createWorkspaceScope(boolean includeJRE) { |
| return createWorkspaceScope(includeJRE ? ALL : NO_JRE); |
| } |
| |
| public IJavaSearchScope createWorkspaceScope(int includeMask) { |
| if ((includeMask & NO_PROJ) != NO_PROJ) { |
| try { |
| IJavaProject[] projects= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects(); |
| return SearchEngine.createJavaSearchScope(projects, getSearchFlags(includeMask)); |
| } catch (JavaModelException e) { |
| // ignore, use workspace scope instead |
| } |
| } |
| return SearchEngine.createWorkspaceScope(); |
| } |
| |
| public boolean isInsideJRE(IJavaElement element) { |
| IPackageFragmentRoot root= (IPackageFragmentRoot) element.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); |
| if (root != null) { |
| try { |
| IClasspathEntry entry= root.getRawClasspathEntry(); |
| if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { |
| IClasspathContainer container= JavaCore.getClasspathContainer(entry.getPath(), root.getJavaProject()); |
| return container != null && container.getKind() == IClasspathContainer.K_DEFAULT_SYSTEM; |
| } |
| return false; |
| } catch (JavaModelException e) { |
| JavaPlugin.log(e); |
| } |
| } |
| return true; // include JRE in doubt |
| } |
| } |