10

私はViewerFilterいくつかの枝の木にを適用していますが、ほとんどは葉です。フィルタは、葉内のプロパティを使用して、実際に葉に適用されます。葉が表示されるように、すべてのブランチはそのまま残されます。

ただし、選択した葉を含まないブランチを除外したいのですが、ViewerFilterこれを可能にするメカニズムはありません。

これは可能ですか?

たとえば、以下の概念的なツリーが与えられた場合(ここbで、はブランチ、aLはリーフ)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

ViewerFilter偶数の葉と偶数の葉を含む枝のみを選択するを適用したいと思います。結果のツリーは..になります。

b0
  b1
    L2
    L4
    L8

..b2選択された子が含まれていないため、ブランチは表示されませんが、ブランチb0して表示されb1ます。

4

4 に答える 4

14
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;
    }
  }
}
于 2009-07-16T22:05:21.437 に答える
2

また、org.eclipse.ui.dialogs.FilteredTree子供に関して正しいことを見てください。

于 2011-12-01T15:04:27.607 に答える
2

はい、分岐ノードを除外しない場合、葉がなくても表示されます。フィルターを永続的にオンにしたい場合は、ITreeContentProvider をフィルターとして使用することを検討できます。

コンテンツ プロバイダーには getChildren() メソッドと hasChildren() メソッドの両方があるため、もう少し制御できます。

于 2009-09-21T22:59:04.997 に答える
0

選択された葉の意味がわかりません。ビューで選択されていることを意味する場合は、Viewer.getSelection() を呼び出すことで確認できます。フィルターに実装する select メソッドは、ビューアー、親、およびリーフを渡します。この情報を使用して、葉が選択されているかどうかを判断し、それらを除外できるはずです。もう少し詳しく教えていただければ、より詳しくお答えできると思います。

于 2009-06-23T22:30:55.733 に答える