Как лучше всего использовать ViewerFilter на TreeViewer?
-
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 (). Метод select, который вы реализуете в своем фильтре, передается вьюеру, родителю и листу. Вы должны быть в состоянии использовать эту информацию, чтобы решить, выбран ли лист или нет, и отфильтровать их. Если вы можете дать больше информации, я могу ответить более подробно.