我正在使用星云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
?
如果是,请告诉我。会非常有帮助的。感谢。
答案 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)
,你就完成了!