Nebula GridTreeViewer - 有没有办法在eclipse中显示像FilteredTree这样的过滤器?

时间:2013-11-13 04:55:34

标签: eclipse treeview eclipse-rcp nebula

我正在使用星云GridTreeViewer我需要添加像eclipse滤镜这样的滤镜。 当我们转到Window->偏好设置时,我们会在左侧树的顶部显示一个过滤器,其中显示了'类型过滤文字'。

我使用TreeViewer -

尝试了FilteredTree
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? 如果是,请告诉我。会非常有帮助的。感谢。

1 个答案:

答案 0 :(得分:2)

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

我无法发布自己的适配器,因为它是公司属性。这里有一些提示。

MyQuickSearchAdapter中需要的内容:

  • public QuickSearchAdapter(Composite parent)构造函数

  • 执行setViewer(StructuredViewer)this.viewer = viewer的{​​{1}} API(请参阅下面的this.viewer.addFilter(viewerFilter)

  • 用于访问查看者viewerFilter的抽象方法getLabelProvider()(在我们的例子中为LabelProvider

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

  • (可选)标签/按钮的创建方法,用于在点击时清除文本(如Text中所述) - 虽然这在我看来是过度的。

  • FilteredTree嵌套类,用于执行实际过滤。这将有一个private MyViewerFilter extends ViewerFilter实例字段,用于保存搜索文本;此字段将具有一个setter,每次在过滤器框中键入内容时都会调用该setter。看起来像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),你就完成了!