TreeViewerでViewerFilterを使用する最良の方法は?
-
10-07-2019 - |
質問
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()を呼び出すことでこれを確認できます。フィルターに実装する選択メソッドは、ビューアー、親、およびリーフに渡されます。この情報を使用して、リーフが選択されているかどうかを判断し、それらを除外できる必要があります。さらに情報を提供できる場合は、詳細をお答えします。