How best to use ViewerFilter on a TreeViewer?

eclipse-plugin, jface, swt, treeviewer

Solution

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;
    }
  }
}

Problem

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.

Original source