package org.openlca.app.navigation.filters;
import org.eclipse.jface.viewers.TreeViewer;
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;
import org.openlca.core.model.Category;
import org.openlca.core.model.FlowType;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.descriptors.FlowDescriptor;
/**
* Filter for excluding specific flow types.
*/
public class FlowTypeFilter extends ViewerFilter {
private FlowType[] flowTypes;
public FlowTypeFilter(FlowType... types) {
this.flowTypes = types;
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
boolean select = true;
TreeViewer treeViewer = (TreeViewer) viewer;
if (element instanceof ModelElement) {
select = !matchType((ModelElement) element);
} else if (element instanceof CategoryElement) {
if (filterEmptyCategories(treeViewer)) {
CategoryElement catElem = (CategoryElement) element;
Category category = catElem.getContent();
if (category.getModelType() == ModelType.FLOW)
select = containsOtherTypes(catElem);
}
}
return select;
}
private boolean matchType(ModelElement element) {
if (element.getContent().getModelType() != ModelType.FLOW)
return false;
FlowDescriptor flow = (FlowDescriptor) element.getContent();
for (FlowType flowType : flowTypes)
if (flow != null && flow.getFlowType() == flowType)
return true;
return false;
}
private boolean containsOtherTypes(CategoryElement element) {
for (INavigationElement<?> child : element.getChildren()) {
if (child instanceof ModelElement
&& !matchType((ModelElement) child))
return true;
else if (child instanceof CategoryElement
&& containsOtherTypes((CategoryElement) child))
return true;
}
return false;
}
private boolean filterEmptyCategories(TreeViewer treeViewer) {
for (ViewerFilter filter : treeViewer.getFilters())
if (filter.getClass() == EmptyCategoryFilter.class)
return true;
return false;
}
}