如何最好地对TreeViewer中使用ViewerFilter?(How best to use V

2019-07-29 04:44发布

我申请一个ViewerFilter几个分支的树,但大多离开了。 该过滤器真的适用于叶,用茶叶中的属性。 所有分支保持不变,这样它们的叶子可以出现。

不过,我想筛选出不包含选定的叶子的树枝,我可以看到内没有任何机制ViewerFilter ,允许这一点。

这是可能的呢?

例如,下面给出的名义树(其中b是一个分支,一个L是叶)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

我想申请一个ViewerFilter只选择甚至树叶和树枝包含甚至叶子。 结果树将..

b0
  b1
    L2
    L4
    L8

..哪里分支b2不显示,因为它不包含任何选择的孩子,但分支b0b1做。

Answer 1:

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


Answer 2:

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



Answer 3:

是的,如果你没有过滤掉的分支节点,它们会显示即使在它没有树叶。 如果你希望过滤器是永久的,有些东西你可以使用ITreeContentProvider作为过滤考虑。

由于内容提供商既有的getChildren()和hasChildren()方法,你有一点点更多的控制。



Answer 4:

我不知道你所选择的叶子是什么意思。 如果您在视图中选择的意思,你可以通过调用Viewer.getSelection找到这个()。 您在过滤器的选择方法,通过在浏览器,父母,和叶。 您应该能够使用这个信息,如果选择了叶子来决定是否和他们过滤掉。 如果你可以给一些更多的信息,我也许可以用更详细的回答。



文章来源: How best to use ViewerFilter on a TreeViewer?