¿Cuál es la mejor manera de usar ViewerFilter en un TreeViewer?
-
10-07-2019 - |
Pregunta
Estoy aplicando un ViewerFilter
a un árbol de algunas ramas, pero principalmente hojas. El filtro realmente se aplica a las hojas, usando propiedades dentro de la hoja. Todas las ramas se dejan intactas para que puedan aparecer sus hojas.
Sin embargo, me gustaría filtrar las ramas que no contienen hojas seleccionadas, y no puedo ver ningún mecanismo dentro de ViewerFilter
que lo permita.
¿Es esto posible?
Por ejemplo, dado el árbol nocional a continuación (donde b
es una rama, un L
es una hoja)
b0
b1
L2
L4
L8
b2
L1
L3
L5
Me gustaría aplicar un ViewerFilter
que solo selecciona hojas pares y ramas que contienen hojas pares. El árbol resultante sería ...
b0
b1
L2
L4
L8
.. donde la rama b2
no se muestra ya que no contiene elementos secundarios seleccionados, pero las ramas b0
y b1
sí.
Solución
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;
}
}
}
Otros consejos
También eche un vistazo a org.eclipse.ui.dialogs.FilteredTree
que deja lo correcto con respecto al niño.
Sí, si no filtra los nodos de ramificación, se mostrarán incluso si no hay hojas en él. Si desea que el filtro esté permanentemente activado, algo que puede considerar es usar ITreeContentProvider como filtro.
Dado que el proveedor de contenido tiene los métodos getChildren () y hasChildren (), tiene un poco más de control.
No estoy seguro de lo que quieres decir con hojas seleccionadas. Si quiere decir seleccionado en la vista, puede averiguarlo llamando a Viewer.getSelection (). El método de selección que implementa en su filtro pasa en el visor, padre y hoja. Debería poder utilizar esta información para decidir si la hoja está seleccionada o no y filtrarla. Si puede dar más información, probablemente pueda responder con más detalle.