10

我正在将 aViewerFilter应用于有几根树枝的树,但主要是树叶。过滤器确实适用于叶子,使用叶子内的属性。所有树枝都保持原样,以便它们的叶子可以出现。

但是,我想过滤掉不包含选定叶子的分支,并且我看不到任何机制ViewerFilter允许这样做。

这可能吗?

例如,给定下面的概念树(其中b是分支,aL是叶子)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

我想应用一个ViewerFilter只选择偶数叶子和包含偶数叶子的树枝。结果树将是..

b0
  b1
    L2
    L4
    L8

.. 分支b2不显示,因为它不包含选定的子项,但分支b0b1执行。

4

4 回答 4

14
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;
    }
  }
}
于 2009-07-16T22:05:21.437 回答
2

是的,如果您不过滤掉分支节点,即使其中没​​有叶子,它们也会显示出来。如果您希望过滤器永久打开,您可以考虑使用 ITreeContentProvider 作为过滤器。

由于内容提供者同时具有 getChildren() 和 hasChildren() 方法,因此您拥有更多控制权。

于 2009-09-21T22:59:04.997 回答
2

也看看org.eclipse.ui.dialogs.FilteredTree关于孩子离开的正确事情。

于 2011-12-01T15:04:27.607 回答
0

我不确定您所说的选定叶子是什么意思。如果你的意思是在视图中被选中,你可以通过调用 Viewer.getSelection() 来找到它。您在过滤器中实现的 select 方法传入查看器、父级和叶子。您应该能够使用此信息来决定是否选择了叶子并将它们过滤掉。如果您可以提供更多信息,我可能可以更详细地回答。

于 2009-06-23T22:30:55.733 回答