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í.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top