Il modo migliore per utilizzare ViewerFilter su un TreeViewer?
-
10-07-2019 - |
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.
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.