Domanda

Sto applicando un ViewerFilter su un albero di alcuni rami, ma principalmente foglie. Il filtro si applica davvero alle foglie, usando le proprietà all'interno della foglia. Tutti i rami rimangono intatti in modo che le loro foglie possano apparire.

Tuttavia, vorrei filtrare i rami che non contengono foglie selezionate e non riesco a vedere alcun meccanismo all'interno di ViewerFilter che lo consenta.

È possibile?

Ad esempio, dato l'albero nozionale di seguito (dove b è un ramo, un L è una foglia)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

Vorrei applicare un ViewerFilter che seleziona solo foglie e rami che contengono anche foglie. L'albero risultante sarebbe ..

b0
  b1
    L2
    L4
    L8

.. dove il ramo b2 non viene visualizzato in quanto non contiene figli selezionati, ma i rami b0 e b1 lo fanno.

È stato utile?

Soluzione

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

Altri suggerimenti

Dai anche un'occhiata a org.eclipse.ui.dialogs.FilteredTree che lascia la cosa giusta riguardo ai bambini.

Sì, se non filtrate i nodi del ramo, verranno mostrati anche se non ci sono foglie. Se si desidera che il filtro sia permanentemente attivo, è possibile considerare l'utilizzo di ITreeContentProvider come filtro.

Dato che il fornitore di contenuti ha entrambi i metodi getChildren () e hasChildren (), hai un po 'più di controllo.

Non sono sicuro di cosa intendi per foglie selezionate. Se vuoi dire selezionato nella vista, puoi scoprirlo chiamando Viewer.getSelection (). Il metodo di selezione implementato nel filtro passa nel visualizzatore, nel genitore e nella foglia. Dovresti essere in grado di utilizzare queste informazioni per decidere se la foglia è selezionata o meno e filtrarle. Se puoi fornire qualche informazione in più, probabilmente posso rispondere con maggiori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top