Question

J'applique un ViewerFilter à un arbre composé de quelques branches, mais principalement de feuilles. Le filtre s'applique vraiment aux feuilles, en utilisant les propriétés dans la feuille. Toutes les branches ne sont pas touchées afin que leurs feuilles puissent apparaître.

Toutefois, je souhaiterais filtrer les branches qui ne contiennent aucune feuille sélectionnée et je ne vois aucun mécanisme dans ViewerFilter qui permet cela.

Est-ce possible?

Par exemple, étant donné l'arborescence théorique ci-dessous (où b est une branche, un L est une feuille)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

Je souhaite appliquer un ViewerFilter qui sélectionne uniquement les feuilles et les branches qui contiennent même des feuilles. L'arbre résultant serait ..

b0
  b1
    L2
    L4
    L8

.. où la branche b2 ne s'affiche pas car elle ne contient aucun enfant sélectionné, mais les branches b0 et b1 sont supprimées.

Était-ce utile?

La solution

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

Autres conseils

Jetez également un coup d'oeil à org.eclipse.ui.dialogs.FilteredTree que la bonne chose à propos de l'enfant laisse.

Oui, si vous ne filtrez pas les nœuds de branche, ils seront affichés même s'il n'y a pas de feuilles dans celui-ci. Si vous souhaitez que le filtre soit activé en permanence, vous pouvez envisager d'utiliser ITreeContentProvider en tant que filtre.

Le fournisseur de contenu ayant à la fois les méthodes getChildren () et hasChildren (), vous disposez d'un peu plus de contrôle.

Je ne suis pas sûr de comprendre ce que vous entendez par feuilles sélectionnées. Si vous voulez dire sélectionné dans la vue, vous pouvez le savoir en appelant Viewer.getSelection (). La méthode de sélection que vous implémentez dans votre filtre passe dans l'afficheur, le parent et la feuille. Vous devriez pouvoir utiliser ces informations pour décider si la feuille est sélectionnée ou non et les filtrer. Si vous pouvez donner plus d’informations, je pourrai probablement vous donner plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top