package org.openlca.app.navigation.filters;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.openlca.app.navigation.CategoryElement;
import org.openlca.app.navigation.INavigationElement;
import org.openlca.app.navigation.ModelElement;
/**
* A filter which removes empty categories.
*/
public final class EmptyCategoryFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (!(element instanceof CategoryElement))
return true;
if (!hasContent(viewer, (CategoryElement) element))
return false;
return true;
}
/**
* A category element is selected when there are model components in it
* which make it through all filters.
*/
private boolean hasContent(Viewer viewer, CategoryElement element) {
List<ModelElement> content = new ArrayList<>();
collectContent(element, content);
if (content.size() == 0)
return false;
ViewerFilter[] filters = getFilters(viewer);
if (filters.length == 0)
return true;
for (ModelElement model : content)
if (passesFilters(viewer, filters, model))
return true;
return false;
}
private void collectContent(CategoryElement element,
List<ModelElement> content) {
for (INavigationElement<?> contentElement : element.getChildren())
if (contentElement instanceof ModelElement)
content.add((ModelElement) contentElement);
else
collectContent((CategoryElement) contentElement, content);
}
private ViewerFilter[] getFilters(Viewer viewer) {
ViewerFilter[] filters = null;
if (viewer instanceof StructuredViewer)
filters = ((StructuredViewer) viewer).getFilters();
return filters == null ? new ViewerFilter[0] : filters;
}
private boolean passesFilters(Viewer viewer, ViewerFilter[] filters,
ModelElement element) {
for (ViewerFilter filter : filters)
if (!filter.select(viewer, element.getParent(), element))
return false;
return true;
}
}