Как лучше всего использовать ViewerFilter на TreeViewer? - PullRequest
9 голосов
/ 24 июня 2009

Я применяю ViewerFilter к дереву из нескольких ветвей, но в основном листья. Фильтр действительно применяется к листьям, используя свойства листьев. Все ветви остаются нетронутыми, чтобы могли появиться их листья.

Однако я бы хотел отфильтровать ветви, которые не содержат выбранных листьев, и я не вижу механизма внутри ViewerFilter, который бы позволял это.

Возможно ли это вообще?

Например, с учетом условного дерева ниже (где b - ветвь, L - лист)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

Я хотел бы применить ViewerFilter, который выбирает только четные листья и ветви, содержащие четные листья. Результирующее дерево будет ..

b0
  b1
    L2
    L4
    L8

.., где ветвь b2 не отображается, поскольку она не содержит выбранных дочерних элементов, но ветки b0 и b1 do.

Ответы [ 4 ]

13 голосов
/ 17 июля 2009
class MyFilter extends ViewerFilter{

  private boolean isLeaf(Object element){
    // implement this
  }

  private boolean isEvenLeaf(Object leaf){
    // implement this
  }

  @Override
  public boolean select(Viewer viewer, Object parentElement, Object element){
    if (isLeaf(element))
      return isEventLeaf(element);
    else {
      StructuredViewer sviewer = (StructuredViewer) viewer;
      ITreeContentProvider provider = (ITreeContentProvider) sviewer.getContentProvider();
      for (Object child: provider.getChildren(element)){
        if (select(viewer, element, child))
          return true;
      }
      return false;
    }
  }
}
2 голосов
/ 01 декабря 2011

Также взгляните на org.eclipse.ui.dialogs.FilteredTree, что правильно в отношении ребенка оставляет.

1 голос
/ 22 сентября 2009

Да, если вы не отфильтруете узлы ветвления, они будут показаны, даже если в них нет листьев. Если вы хотите, чтобы фильтр был постоянно включен, вы можете использовать ITreeContentProvider в качестве фильтра.

Поскольку у провайдера контента есть методы getChildren () и hasChildren (), у вас есть немного больше контроля.

0 голосов
/ 24 июня 2009

Я не уверен, что вы подразумеваете под выбранными листьями. Если вы имеете в виду выбранный в представлении, вы можете узнать это, вызвав Viewer.getSelection (). Метод select, который вы реализуете в своем фильтре, передается вьюеру, родителю и листу. Вы должны быть в состоянии использовать эту информацию, чтобы решить, выбран ли лист или нет, и отфильтровать их. Если вы можете дать больше информации, я могу ответить более подробно.

...