1

我正在使用一个星云GridTreeViewer,我需要为其添加像 eclipse 过滤器这样的过滤器。当我们转到 Window->Preferences 时,我们会在左侧树的顶部看到一个过滤器,上面写着“输入过滤器文本”。

我尝试TreeViewerFilteredTree-

final FilteredTree filteredTree = new FilteredTree(parent, SWT.BORDER
                    | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION,
                    new MyPatternFilter(), true);
 TreeViewer treeViewer = filteredTree.getViewer();

上面的代码适用于TreeViewer. 有没有类似的方法将这种过滤器附加到星云上GridTreeViewer?如果是,请告诉我。会很有帮助。谢谢。

4

1 回答 1

2

您必须创建自己的快速搜索适配器。观察中的代码FilteredTree

我不能发布我自己的适配器,因为它是公司财产。这里有一些提示。

你需要的东西MyQuickSearchAdapter

  • public QuickSearchAdapter(Composite parent)构造函数

  • 一个setViewer(StructuredViewer)APIthis.viewer = viewerthis.viewer.addFilter(viewerFilter)(见下文viewerFilter

  • getLabelProvider()访问查看器的抽象方法LabelProvider(在我们的例子中,GridTreeViewer

  • Text代表快速搜索区域的字段的创建方法。

  • (可选)用于在单击时清除文本的标签/按钮的创建方法(如 中FilteredTree) - 尽管在我看来这太过分了。

  • private MyViewerFilter extends ViewerFilter嵌套类,执行实际过滤。这将有一个String包含搜索文本的实例字段;此字段将有一个设置器,每次您在过滤器框中键入内容时都会调用该设置器。看起来像viewerFilter.setSearchText(filterBox.getText());. 这个嵌套类还将覆盖select(Viewer, Object, Object),它将使用getLabelProvider().getText(element)来提取某个单元格的文本。就像是:

    // Automatically adds wildcard characters before and after search string:
    public static final String QSEARCH_REGEX_PATTERN = "(.*)%s(.*)"; //$NON-NLS-1$
    
    private class MyViewerFilter extends ViewerFilter 
    {
        // --------------------- <Instance Fields> -----------------------
    
        private String searchString;
    
        // --------------------- <Setters> -----------------------
    
        /**
         * @param 
         *      Text that goes inside the REGEX pattern
         */
        public void setSearchText(final String searchString) 
        {
            //this.searchString = "(.*)" + searchString.toLowerCase() + "(.*)";  //$NON-NLS-1$ //$NON-NLS-2$
            this.searchString = String.format(QSEARCH_REGEX_PATTERN, searchString.toLowerCase());
        }
    
        // --------------------- <Overridden search method> -----------------------
    
        @Override
        public boolean select(final Viewer viewer, final Object parentElement, final Object element) 
        {
            if (StringUtils.isEmpty(searchString))
                return true;
    
            final String text = getLabelProvider().getText(element);
    
            if (StringUtils.isEmpty(text))
                return true;
    
            return text.toLowerCase().matches(searchString);
        }
    }
    

那是困难的部分。之后,您只需创建一个名为 的类MyFilteredGridTreeViewer,并在网格查看器旁边添加快速搜索适配器。还记得打电话quickSearchAdapter.setViewer(gridViewer),大功告成!

于 2013-11-26T11:32:48.240 回答