给TableViewer,TreeViewer,GridTableViewer和GridTreeViewer添加Filter

By | 2018年8月29日

添加Filter,相当于search功能,当某一行的内容和输入的text匹配时,该行就显示,其它行过滤掉。我写了一个ViewerFilterOnCellText,它对每个元素,遍历每列上显示的字符串,如果有包含search text的,该列就显示;如果没有输入,显示所有行。该ViewerFilterOnCellText支持TableViewer, TreeViewer,GridTableViewer和GridTreeViewer,只要在search text变化时,调用ViewerFilterOnCellText—> setSearchText(String),然后refresh viewer便可。

Note: 判断字符串是否包含search text,使用的是StringUtils.containsIgnoreCase(str, searchStr),忽略大小写,并且不会有正则表达式会遇到的异常,如果str是多行的,也能判断正确。

使用方法:

private final ViewerFilterOnCellText viewerFilter = new ViewerFilterOnCellText();
private TableViewer tableViewer;

Label searchLbl = toolkit.createLabel(parent, "Search", SWT.NONE);
GridDataFactory.swtDefaults().applyTo(searchLbl);

Text searchText = toolkit.createText(parent, "", SWT.BORDER);
GridDataFactory.swtDefaults().hint(300, SWT.DEFAULT).applyTo(searchText);
searchText.addModifyListener(event -> Display.getDefault().asyncExec(() -> {
    if (tableViewer != null) {
      viewerFilter.setSearchText(searchText.getText());
      tableViewer.refresh();
    }
  }));

tableViewer = new TableViewer(parent, ...);
tableViewer.addFilter(viewerFilter); 

显示效果,输入时就会滤掉不匹配的行:

image

源代码:https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/viewers/ViewerFilterOnCellText.java