I am applying a ViewerFilter
to a tree of a few branches, but mostly leaves. The filter really applies to the leaves, using properties within the leaf. All branches are left untouched so that their leaves can appear.
However I would like to filter out branches that contain no selected leaves, and I can see no mechanism within ViewerFilter
that allows this.
Is this possible at all?
For example, given the notional tree below (where b
is a branch, a L
is a leaf)
b0
b1
L2
L4
L8
b2
L1
L3
L5
I would like to apply a ViewerFilter
that only selects even leaves and branches that contain even leaves. The resulting tree would be ..
b0
b1
L2
L4
L8
.. where branch b2
does not display as it contains no selected children, but branches b0
and b1
do.
class MyFilter extends ViewerFilter{
private boolean isLeaf(Object element){
// implement this
}
private boolean isEvenLeaf(Object leaf){
// implement this
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element){
if (isLeaf(element))
return isEventLeaf(element);
else {
StructuredViewer sviewer = (StructuredViewer) viewer;
ITreeContentProvider provider = (ITreeContentProvider) sviewer.getContentProvider();
for (Object child: provider.getChildren(element)){
if (select(viewer, element, child))
return true;
}
return false;
}
}
}