Pergunta

Estou aplicando um ViewerFilter a uma árvore de alguns ramos, mas principalmente folhas. O filtro realmente se aplica para as folhas, usando propriedades dentro da folha. Todos os ramos ficam tão intocado que suas folhas podem aparecer.

No entanto, eu gostaria de filtrar os ramos que contêm as folhas não selecionados, e eu posso ver nenhum mecanismo dentro ViewerFilter que permite isso.

Isso é possível em tudo?

Por exemplo, dada a árvore nocional abaixo (onde b é um ramo, um L é uma folha)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

Eu gostaria de aplicar um ViewerFilter que só seleciona até mesmo folhas e galhos que contêm até mesmo folhas. A árvore resultante seria ..

b0
  b1
    L2
    L4
    L8

.. onde ramo b2 não apresenta, pois contém as crianças não selecionados, mas ramos b0 e b1 fazer.

Foi útil?

Solução

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

Outras dicas

Também ter um olhar para org.eclipse.ui.dialogs.FilteredTree que a coisa certa em relação às folhas criança.

Sim, se você não filtrar os nós de ramificação, que vai ser mostrado mesmo se não houver folhas na mesma. Se você deseja que o filtro a ser permanentemente, algo que você pode considerar é usar o ITreeContentProvider como um filtro.

Uma vez que o provedor de conteúdo tem tanto getChildren (métodos) e hasChildren (), você tem um pouco mais de controle.

Eu não tenho certeza do que você quer dizer com folhas selecionadas. Se você quer dizer selecionado na visualização, você pode descobrir isso chamando Viewer.getSelection (). O método de seleção que você implementar em seu filtro passa no visualizador, pai, e folha. Você deve ser capaz de usar essas informações para decidir se a folha for selecionado ou não e filtrá-los. Se você pode dar mais algumas informações, eu posso responder com mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top