我有一个显示许多节点的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;
}
}
更新:
当找到搜索到的项目时,我不仅要显示包含搜索项目的节点,还要显示包含搜索项目的父节点(所有父项)。
答案 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)
),则可以再次折叠树。通常在树中搜索某些内容时,所有过滤的内容都会显示为已展开,以便也可以看到与搜索条件匹配的最深的叶子。如果您希望像用户一样维护每个元素的树的扩展状态,则需要更多的工作来扩展所有元素,然后恢复扩展。
另一种方法是在内容提供商中实现搜索。因此,您的内容提供商可以采用当前搜索条件并仅返回与其匹配的元素。这意味着您必须自己管理某个父母是否应该可见。因此,在更改搜索字段时,您只需刷新树,您的内容提供商将确保过滤。