質問

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

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

これはまったく可能ですか?

たとえば、以下の概念ツリーを指定します( b はブランチ、 L はリーフです)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

偶数の葉と偶数の葉を含むブランチのみを選択する ViewerFilter を適用したいと思います。結果のツリーは..

になります
b0
  b1
    L2
    L4
    L8

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

役に立ちましたか?

解決

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

他のヒント

また、 org.eclipse.ui.dialogs.FilteredTree を見てください。これは、子に関する正しいことから離れています。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top