diff --git a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/DestinationContentProvider.java b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/DestinationContentProvider.java index 802a967733e..375dbcf2fed 100644 --- a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/DestinationContentProvider.java +++ b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/DestinationContentProvider.java @@ -14,6 +14,7 @@ package org.eclipse.jdt.internal.ui.refactoring.reorg; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -32,6 +33,7 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.core.PackageFragment; import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgDestination; import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgDestinationValidator; import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgDestinationFactory; @@ -45,6 +47,13 @@ public final class DestinationContentProvider extends StandardJavaElementContent private IReorgDestinationValidator fValidator; + private String searchString; + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public DestinationContentProvider(IReorgDestinationValidator validator) { super(true); fValidator= validator; @@ -72,14 +81,25 @@ public boolean hasChildren(Object element) { public Object[] getChildren(Object element) { try { if (element instanceof IJavaModel) { - return concatenate(getJavaProjects((IJavaModel)element), getOpenNonJavaProjects((IJavaModel)element)); + Object [] javaProjects = getJavaProjects((IJavaModel)element); + + List filteredJavaProjectList= getFilteredProjectList(javaProjects); + + return concatenate(filteredJavaProjectList.toArray(), getOpenNonJavaProjects((IJavaModel)element)); } else { Object[] children= doGetChildren(element); ArrayList result= new ArrayList<>(children.length); for (Object child : children) { IReorgDestination destination= ReorgDestinationFactory.createDestination(child); if (fValidator.canElementBeDestination(destination) || fValidator.canChildrenBeDestinations(destination)) { - result.add(child); + + if(searchString != null && !searchString.isEmpty()) { + if(matchesSearchCriteria(child.toString())) { + result.add(child); + } + } else { + result.add(child); + } } } return result.toArray(); @@ -90,6 +110,50 @@ public Object[] getChildren(Object element) { } } + + private List getFilteredProjectList(Object[] javaProjects) throws JavaModelException { + boolean packageNameExistInProject= false; + List filteredJavaProjectList = new ArrayList<>(); + for(Object javaProject : javaProjects) { + IJavaProject javaModel = (IJavaProject) javaProject; + if(searchString != null && !searchString.isEmpty()) { + boolean matchesCriteria = matchesSearchCriteria(javaModel.getElementName()); + + if(matchesCriteria) { + filteredJavaProjectList.add(javaProject); + } else { + for(Object children : javaModel.getChildren()){ + packageNameExistInProject = isPackageNameExists(children); + if(packageNameExistInProject) { + filteredJavaProjectList.add(javaProject); + break; + } + } + } + } else { + filteredJavaProjectList = Arrays.asList(javaProjects); + } + } + return filteredJavaProjectList; + } + + private boolean isPackageNameExists(Object element) { + Object[] children= doGetChildren(element); + for (Object child : children) { + IReorgDestination destination= ReorgDestinationFactory.createDestination(child); + if (child.getClass().equals(PackageFragment.class) && (fValidator.canElementBeDestination(destination) || fValidator.canChildrenBeDestinations(destination))) { + PackageFragment packageFrag = (PackageFragment) child; + if(matchesSearchCriteria(packageFrag.getElementName())) { + return true; + } + } + } + return false; + } + private boolean matchesSearchCriteria(String text) { + return text.toLowerCase().contains(searchString.toLowerCase()); + } + private Object[] doGetChildren(Object parentElement) { if (parentElement instanceof IContainer) { final IContainer container= (IContainer) parentElement; diff --git a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/ReorgUserInputPage.java b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/ReorgUserInputPage.java index 7530fbbadd9..336644bc5da 100644 --- a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/ReorgUserInputPage.java +++ b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/reorg/ReorgUserInputPage.java @@ -20,6 +20,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -41,6 +42,7 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgDestinationValidator; import org.eclipse.jdt.internal.corext.util.Messages; @@ -49,16 +51,18 @@ import org.eclipse.jdt.ui.JavaElementLabels; import org.eclipse.jdt.internal.ui.JavaPlugin; -import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; -abstract class ReorgUserInputPage extends UserInputWizardPage{ +abstract class ReorgUserInputPage extends UserInputWizardPage { private static final long LABEL_FLAGS= JavaElementLabels.ALL_DEFAULT | JavaElementLabels.M_PRE_RETURNTYPE | JavaElementLabels.M_PARAMETER_NAMES | JavaElementLabels.F_PRE_TYPE_SIGNATURE; + private TreeViewer fViewer; + public ReorgUserInputPage(String pageName) { super(pageName); } + @Override public void createControl(Composite parent) { initializeDialogUnits(parent); @@ -109,7 +113,7 @@ private void viewerSelectionChanged(SelectionChangedEvent event) { ISelection selection= event.getSelection(); if (!(selection instanceof IStructuredSelection)) return; - IStructuredSelection ss= (IStructuredSelection)selection; + IStructuredSelection ss= (IStructuredSelection) selection; verifyDestination(ss.getFirstElement(), false); } @@ -125,6 +129,7 @@ private void viewerSelectionChanged(SelectionChangedEvent event) { protected abstract RefactoringStatus verifyDestination(Object selected) throws JavaModelException; protected abstract IResource[] getResources(); + protected abstract IJavaElement[] getJavaElements(); protected abstract IReorgDestinationValidator getDestinationValidator(); @@ -143,6 +148,12 @@ private final void verifyDestination(Object selected, boolean initialVerificatio } private TreeViewer createViewer(Composite parent) { + + + // Create Search Text + Text searchText= new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.CANCEL | SWT.ICON_SEARCH); + searchText.setMessage("Search"); //$NON-NLS-1$ + TreeViewer treeViewer= new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridData gd= new GridData(GridData.FILL_BOTH); gd.widthHint= convertWidthInCharsToPixels(40); @@ -151,6 +162,14 @@ private TreeViewer createViewer(Composite parent) { treeViewer.setLabelProvider(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_SMALL_ICONS)); treeViewer.setContentProvider(new DestinationContentProvider(getDestinationValidator())); treeViewer.setComparator(new JavaElementComparator()); + + // Add a ModifyListener to the search text to update the filter + searchText.addModifyListener(e -> { + String searchString= searchText.getText().trim(); + ((DestinationContentProvider) treeViewer.getContentProvider()).setSearchString(searchString); + treeViewer.refresh(); + treeViewer.expandAll(); + }); treeViewer.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot())); return treeViewer; } @@ -167,8 +186,7 @@ public void doubleClick(DoubleClickEvent event) { if (fViewer.isExpandable(element)) { if (fViewer.getExpandedState(element)) { fViewer.collapseToLevel(element, 1); - } - else { + } else { ITreeContentProvider contentProvider= (ITreeContentProvider) fViewer.getContentProvider(); Object[] children= contentProvider.getChildren(element); if (children.length > 0) { @@ -179,3 +197,4 @@ public void doubleClick(DoubleClickEvent event) { } } } +