Вопрос

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

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

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

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

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

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

b0
  b1
    L2
    L4
    L8

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

Это было полезно?

Решение

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;
    }
  }
}

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top