Как лучше всего использовать ViewerFilter в TreeViewer?

Я применяю ViewerFilter к дереву с несколькими ветвями, но в основном листьями. Фильтр действительно применяется к листьям, используя свойства внутри листа. Все ветки оставляют нетронутыми, чтобы на них могли появиться листья.

Однако я хотел бы отфильтровать ветки, которые не содержат выбранных листьев, и я не вижу в ViewerFilter механизма, позволяющего это сделать.

Это вообще возможно?

Например, для условного дерева ниже (где b — ветвь, L — лист)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

Я хотел бы применить ViewerFilter, который выбирает только четные листья и ветви, содержащие четные листья. В результате получится дерево..

b0
  b1
    L2
    L4
    L8

.. где ветвь b2 не отображается, поскольку она не содержит выбранных дочерних элементов, а ветви b0 и b1 есть.


person Martin Cowie    schedule 23.06.2009    source источник


Ответы (4)


Да, если вы не отфильтруете узлы ветвления, они будут показаны, даже если в них нет листьев. Если вы хотите, чтобы фильтр был включен постоянно, вы можете рассмотреть возможность использования ITreeContentProvider в качестве фильтра.

Поскольку у поставщика содержимого есть методы getChildren() и hasChildren(), у вас немного больше контроля.

person thehiatus    schedule 21.09.2009

Также взгляните на org.eclipse.ui.dialogs.FilteredTree, что правильно в отношении дочерних листьев.

person Tonny Madsen    schedule 01.12.2011

Я не уверен, что вы имеете в виду под отборными листьями. Если вы имеете в виду выбранный в представлении, вы можете узнать это, вызвав Viewer.getSelection(). Метод выбора, который вы реализуете в своем фильтре, проходит в средстве просмотра, родительском элементе и листе. Вы должны иметь возможность использовать эту информацию, чтобы решить, выбран ли лист или нет, и отфильтровать их. Если вы можете дать дополнительную информацию, я, вероятно, смогу ответить более подробно.

person AdamC    schedule 23.06.2009
comment
Вместо листьев и ветвей давайте поговорим о каталогах и файлах. Учитывая произвольное дерево каталогов, я хочу отображать только файлы, соответствующие *.foo. Кроме того, я хотел бы отображать только каталоги, содержащие файлы *.foo, или рекурсивно содержать каталоги, в которых они есть. Каталоги, не содержащие таких файлов, не должны отображаться. Это помогает? М. - person Martin Cowie; 24.06.2009
comment
В этом случае в методе select вам нужно будет рекурсивно смотреть, начиная элемент, получая его дочерние элементы, пока вы не достигнете четного листа (возвратить true) или конца (вернуть false). - person AdamC; 24.06.2009

person    schedule
comment
Я подозреваю, что время работы этого довольно плохо для больших коллекций элементов. Например, все ресурсы — это рабочая область. Я думаю, что это будет для каждого ресурса посещать все содержащиеся в нем ресурсы. Следовательно, это O(n^2). Должно быть O(n) решение. - person Lii; 14.09.2016
comment
Это решение работает очень плохо, когда у зрителя есть другие фильтры. Например, в случае ресурсов рабочей области, когда другой фильтр отфильтровал все ресурсы из папки, этот фильтр по-прежнему будет сообщать о том, что папка не пуста, поскольку этот фильтр не знает о другом фильтре. - person Lii; 14.09.2016