Как най-добре да използвате 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