Jface ViewerFilter过滤完整的树深度

时间:2012-11-06 10:12:20

标签: eclipse jface

我有一个显示许多节点的FilteredTree,其中每个节点可以有多个子节点和子节点(n深度)。

过滤器会过滤与模式匹配的所有节点(以及任何深度的子节点)。

现在我想添加其他搜索功能:

每个节点代表一个对象,每个对象都有一些字段,所以我想列出具有与文本匹配的字段的节点。

我厌倦了使用ViewerFilter。

它的问题是它不会仅为当前打开的分支调用树中的每个节点。

public class TheFilter extends ViewerFilter {

          private String searchString;

          public void setSearchText(String s) {

          }


          public boolean select(Viewer viewer, 
              Object parentElement, 
              Object element) { //triggered Only for one level


            return true;
          }
        } 

更新:

当找到搜索到的项目时,我不仅要显示包含搜索项目的节点,还要显示包含搜索项目的父节点(所有父项)。

2 个答案:

答案 0 :(得分:1)

FilteredTree接受org.eclipse.ui.dialogs.PatternFilter作为参数来确定其过滤策略。

您可以通过继承PatternFilter并覆盖它的isLeafMatch方法来实现所需的结果。

例如:

PatternFilter filter = new PatternFilter() {
    @Override
    protected boolean isLeafMatch(Viewer viewer, Object element) {
        String field = ((Node) element).getField();
        if(field== null) {
            return false;
        }
        return wordMatches(field);
    }
};
FilteredTree tree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL
            | SWT.V_SCROLL, filter, true);

答案 1 :(得分:1)

据我了解,您希望将搜索应用于所有元素,而不管它们当前是否已扩展。虽然我不确定为什么你想要将过滤应用到最深的叶子上,是不是因为你想要不显示任何子节点的根节点也会消失?

这里可能有多种方法,如果你想强制你的过滤器应用于所有元素,你可以使用TreeViewer#expandAll扩展树中的所有项目,除非你使用一个懒惰的内容提供者,它应该调用过滤所有元素。如果您不想将其展开(可能希望在展开和折叠时禁用绘图以避免闪烁Tree#setRedraw(boolean)),则可以再次折叠树。通常在树中搜索某些内容时,所有过滤的内容都会显示为已展开,以便也可以看到与搜索条件匹配的最深的叶子。如果您希望像用户一样维护每个元素的树的扩展状态,则需要更多的工作来扩展所有元素,然后恢复扩展。

另一种方法是在内容提供商中实现搜索。因此,您的内容提供商可以采用当前搜索条件并仅返回与其匹配的元素。这意味着您必须自己管理某个父母是否应该可见。因此,在更改搜索字段时,您只需刷新树,您的内容提供商将确保过滤。