Eclipse JFace infrastructure provides a powerful infrastructure called ViewerFilter, to allow the user to filter content presented in a viewer.
Especially TreeViewers as extensively used by common navigator framework (CNF) based viewers such as the Project Explorer or Package Explorer make use of them.Eclipse Viewer Filter Configuration

Providing as Extension or Programmatically

To provide such a filter one can either programmatically add it to a filter enabled viewer such as to FilteredTreeViewers

PatternFilter filter = new PatternFilter();
FilteredTree tree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter, true);

To use an Eclipse extension point declare it this way:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
  <extension
      point="org.eclipse.ui.navigator.navigatorContent">
    <commonFilter
      class="org.splevo.jamopp.ui.vpexplorer.filter.ImportOnlyVPFilter"
      description="Show only VariationPoints which are about variying imports"
      id="org.splevo.jamopp.ui.vpexplorer.filter.Imports"
      name="VariationPoints: Imports Only">
    </commonFilter>
  ...
  </extension>
  <extension
      point="org.eclipse.ui.navigator.viewer">
    <viewerContentBinding
        viewerId="org.splevo.ui.vpexplorer">
      <includes>
        <contentExtension
          pattern="org.splevo.jamopp.ui.vpexplorer.filter.*">
        </contentExtension>
      </includes>
    </viewerContentBinding>
  </extension>
</plugin>

Filtering Empty Parent Folders

If you have implemented a filter for specific elements explicitly and to filter parent elements if they do not include any sub element.


public abstract class MyFilter extends ViewerFilter {

@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {

if (isChildElement(element)) {
return handleChild(element);

} else {
// manipulate tree viewer based on select
// decision for the sub elements
StructuredViewer sviewer = (StructuredViewer) viewer;
ITreeContentProvider provider = (ITreeContentProvider) sviewer.getContentProvider();
for (Object child : provider.getChildren(element)) {
if (select(viewer, element, child)) {
return true;
}
}
return false;
}
}
Eclipse JFace ViewerFilter

Post navigation