Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add search bar to Unresolved requirements in ResolutionFailedPanel #6112

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.bndtools.core.resolve.ResolutionResult;
import org.bndtools.core.ui.icons.Icons;
import org.bndtools.core.ui.resource.RequirementWithResourceLabelProvider;
import org.bndtools.utils.swt.FilterPanelPart;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
Expand All @@ -35,6 +36,7 @@
import org.osgi.service.resolver.ResolutionException;

import biz.aQute.resolve.ResolveProcess;
import bndtools.Plugin;
import bndtools.model.obr.SorterComparatorAdapter;

public class ResolutionFailurePanel {
Expand All @@ -50,7 +52,13 @@ public class ResolutionFailurePanel {
private Section sectProcessingErrors;
private Section sectUnresolved;

private UnresolvedRequirementsContentProvider unresolvedRequirementsContentProvider;
private final FilterPanelPart unresolvedFilterPart = new FilterPanelPart(Plugin.getDefault()
.getScheduler());
private static final String SEARCHSTRING_HINT = "Enter search string to filter unresolved requirements (Space to separate terms; '*' for partial matches)";

private static final boolean failureTreeMode = true;
private RequirementWithResourceLabelProvider requirementWithResourceLabelProvider;

public void createControl(final Composite parent) {
FormToolkit toolkit = new FormToolkit(parent.getDisplay());
Expand Down Expand Up @@ -85,10 +93,18 @@ public void createControl(final Composite parent) {
gd.heightHint = 300;
sectUnresolved.setLayoutData(gd);


unresolvedViewer = new TreeViewer(treeUnresolved);
unresolvedViewer.setContentProvider(new UnresolvedRequirementsContentProvider());
unresolvedViewer.setLabelProvider(new RequirementWithResourceLabelProvider());

requirementWithResourceLabelProvider = new RequirementWithResourceLabelProvider();
unresolvedViewer.setLabelProvider(requirementWithResourceLabelProvider);
unresolvedRequirementsContentProvider = new UnresolvedRequirementsContentProvider(
requirementWithResourceLabelProvider);
unresolvedViewer.setContentProvider(unresolvedRequirementsContentProvider);
setFailureViewMode();

addSearchbarForUnresolved();

}

public Control getControl() {
Expand Down Expand Up @@ -301,4 +317,15 @@ private void appendLabels(Object unresolvedTreeElem, ITreeContentProvider conten

void dispose() {}

private void addSearchbarForUnresolved() {
Control reqsFilterPanel = unresolvedFilterPart.createControl(composite, 5, 5);
unresolvedFilterPart.setHint(SEARCHSTRING_HINT);
unresolvedFilterPart.addPropertyChangeListener(event -> {
String filter = (String) event.getNewValue();

unresolvedRequirementsContentProvider.setFilter(filter);
unresolvedViewer.refresh();
});
}

}
Original file line number Diff line number Diff line change
@@ -1,23 +1,58 @@
package org.bndtools.core.resolve.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.bndtools.core.ui.resource.RequirementWithResourceLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.osgi.resource.Requirement;

import aQute.libg.glob.Glob;

public class UnresolvedRequirementsContentProvider implements ITreeContentProvider {

private String wildcardFilter = null;
private RequirementWithResourceLabelProvider labelProvider;

public UnresolvedRequirementsContentProvider(RequirementWithResourceLabelProvider labelProvider) {
this.labelProvider = labelProvider;
}

@Override
public Object[] getElements(Object inputElement) {

List<Object[]> arrays = new LinkedList<>();

if (inputElement instanceof Object[])
return (Object[]) inputElement;
arrays.add((Object[]) inputElement);

if (inputElement instanceof Collection<?>) {
Collection<?> coll = (Collection<?>) inputElement;
return coll.toArray();
arrays.add(coll.toArray());
}

return null;
return filter(flatten(arrays));
}

private Object[] flatten(List<Object[]> arrays) {
// Iterate over once to count the lengths
int length = 0;
for (Object[] array : arrays) {
length += array.length;
}
Object[] result = new Object[length];

// Iterate again to flatten out the arrays
int position = 0;
for (Object[] array : arrays) {
System.arraycopy(array, 0, result, position, array.length);
position += array.length;
}
return result;
}

@Override
Expand Down Expand Up @@ -50,4 +85,42 @@ public boolean hasChildren(Object element) {
return false;
}

private Object[] filter(Object[] array) {
List<Object> filteredResults = new ArrayList<>();
if (wildcardFilter == null || wildcardFilter.equals("*") || wildcardFilter.equals("")) {
return array;
} else {
String[] split = wildcardFilter.split("\\s+");
Glob globs[] = new Glob[split.length];
for (int i = 0; i < split.length; i++) {
globs[i] = new Glob(split[i].toLowerCase());
}

Arrays.stream(array)
.forEach(obj -> {

if (obj instanceof Requirement rw) {

for (Glob g : globs) {
if (g.matcher(labelProvider.getLabel(rw)
.toString()
.toLowerCase())
.find()) {
filteredResults.add(obj);
return;
}
}
}

});

}

return filteredResults.toArray();
}

public void setFilter(String filter) {
this.wildcardFilter = filter;
}

}
Loading