2009-06-23 80 views
9

我正在将一个ViewerFilter应用到一些分支的树上,但大部分是叶子。过滤器真的适用于叶子,使用叶子内的属性。所有分支都保持不变,以便它们的叶子可以出现。如何在TreeViewer上最佳使用ViewerFilter?

但是我想过滤掉不包含选定树叶的分支,我可以在ViewerFilter之内看到没有机制允许这样做。

这可能吗?

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

b0 
    b1 
    L2 
    L4 
    L8 
    b2 
    L1 
    L3 
    L5 

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

b0 
    b1 
    L2 
    L4 
    L8 

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

回答

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

我不知道你选择的叶子是什么意思。如果您是在视图中选择的,则可以通过调用Viewer.getSelection()来查找。您在过滤器中实现的select方法在查看器,父级和叶级中传递。你应该能够使用这些信息来决定叶子是否被选中并过滤出来。如果你可以提供更多的信息,我可以回答更多的细节。

+0

而不是叶子和分支,让我们谈谈目录和文件。 给定一个任意目录树,我只想显示匹配* .foo的文件。此外,我只想显示包含* .foo文件的目录,或者递归地包含目录。 不应显示不包含此类文件的目录。这有帮助吗? M. – 2009-06-24 15:57:33

+0

在这种情况下,在select方法中,您将需要递归地查看元素的开始,获取子元素,直到达到一个完整的叶子(返回true)或结束(返回false)。 – AdamC 2009-06-24 17:04:07

1

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

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

2

也看看org.eclipse.ui.dialogs.FilteredTree这是关于儿童的正确的事情离开。

相关问题