Skip to content

Commit

Permalink
Add Filter Mechanism for Target in Move Refactoring#18
Browse files Browse the repository at this point in the history
To let user filter the projects or packages from a search bar in a move refactor dialog.

Fixes vi-eclipse/Eclipse-JDT#18
  • Loading branch information
ShahzaibIbrahim committed Dec 6, 2023
1 parent 16c8792 commit aa6dbb5
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<Object> filteredJavaProjectList= getFilteredProjectList(javaProjects);

return concatenate(filteredJavaProjectList.toArray(), getOpenNonJavaProjects((IJavaModel)element));
} else {
Object[] children= doGetChildren(element);
ArrayList<Object> 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();
Expand All @@ -90,6 +110,50 @@ public Object[] getChildren(Object element) {
}
}


private List<Object> getFilteredProjectList(Object[] javaProjects) throws JavaModelException {
boolean packageNameExistInProject= false;
List<Object> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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);
}

Expand All @@ -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();
Expand All @@ -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);
Expand All @@ -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;
}
Expand All @@ -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) {
Expand All @@ -179,3 +197,4 @@ public void doubleClick(DoubleClickEvent event) {
}
}
}

0 comments on commit aa6dbb5

Please sign in to comment.