Frage

Ich bin ein ViewerFilter an einen Baum von einigen Zweigen der Anwendung, aber vor allem Blätter. Der Filter passt dann wirklich auf die Blätter, mit Eigenschaften innerhalb des Blattes. Alle Zweige bleiben unberührt, so dass ihre Blätter erscheinen.

Allerdings würde Ich mag Zweige, um herauszufiltern, die keine ausgewählten Blätter enthalten, und ich kann keinen Mechanismus innerhalb ViewerFilter sehen, die dies ermöglicht.

Ist das möglich?

Zum Beispiel angesichts der fiktiven Baum unten (wo b ein Zweig, ein L ist ein Blatt)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

würde Ich mag eine ViewerFilter anzuwenden, die Blätter und Zweige wählt nur noch die sogar Blätter enthalten. Der resultierende Baum wäre ..

b0
  b1
    L2
    L4
    L8

.. wo Zweig b2 nicht angezeigt, da es keine ausgewählten Kinder enthält, sondern Zweige b0 und b1 tun.

War es hilfreich?

Lösung

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

Andere Tipps

Haben Sie auch einen Blick auf org.eclipse.ui.dialogs.FilteredTree, die das Richtige in Bezug auf das Kind verlässt.

Ja, wenn Sie die Zweigknoten nicht herausfiltern, werden sie auch sind, wenn es gezeigt werden keine Blätter in ihr. Wenn Sie die Filter wollen dauerhaft zu sein, kann etwas, das Sie prüfen, ist die ITreeContentProvider als Filter verwenden.

Da der Content-Provider hat beide getChildren () und hasChildren () Methoden, haben Sie ein wenig mehr Kontrolle.

Ich bin mir nicht sicher, was Sie durch ausgewählte Blätter bedeuten. Wenn Sie in der Ansicht ausgewählt bedeuten, können Sie dies herausfinden, indem Viewer.getSelection () aufrufen. Die Auswahlmethode, die Sie in Ihrem Filter implementieren geht in dem Betrachter, Eltern und Blatt. Sie sollten diese Informationen zu verwenden, um zu entscheiden, ob das Blatt ausgewählt ist oder nicht und filtern sie aus. Wenn Sie mehr Informationen geben können, kann ich wahrscheinlich mit ausführlicher beantworten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top