44import java .util .concurrent .ConcurrentHashMap ;
55import java .util .function .Predicate ;
66
7+ import org .eclipse .jface .viewers .ITreeContentProvider ;
78import org .eclipse .jface .viewers .TreeViewer ;
89import org .eclipse .jface .viewers .Viewer ;
910import org .eclipse .jface .viewers .ViewerFilter ;
@@ -19,22 +20,39 @@ public TreeViewerFilter() {
1920
2021 @ Override
2122 public boolean select (Viewer viewer , Object parentElement , Object element ) {
22- if (!(element instanceof IssueTreeNode ) || !(viewer instanceof TreeViewer ))
23- return true ;
24-
25- IssueTreeNode IssueTreeNode = (IssueTreeNode ) element ;
26- var issue = IssueTreeNode .getIssue ();
27- if (issue == null ) {
28- return true ;
29- }
30-
31- for (var kv : this .filters .entrySet ()) {
32- var filter = kv .getValue ();
33- if (!filter .test (issue )) {
34- return false ;
35- }
36- }
37- return true ;
23+ if (element instanceof FileTreeNode ) {
24+ return hasVisibleChildren ((FileTreeNode ) element , viewer );
25+ }
26+
27+ if (!(element instanceof IssueTreeNode ) || !(viewer instanceof TreeViewer )) {
28+ return true ;
29+ }
30+
31+ return isIssueVisible ((IssueTreeNode ) element );
32+ }
33+
34+ private boolean hasVisibleChildren (FileTreeNode fileNode , Viewer viewer ) {
35+ Object [] children = ((ITreeContentProvider ) ((TreeViewer ) viewer ).getContentProvider ()).getChildren (fileNode );
36+ for (Object child : children ) {
37+ if (child instanceof IssueTreeNode && isIssueVisible ((IssueTreeNode ) child )) {
38+ return true ;
39+ }
40+ }
41+ return false ;
42+ }
43+
44+ private boolean isIssueVisible (IssueTreeNode issueNode ) {
45+ Issue issue = issueNode .getIssue ();
46+ if (issue == null ) {
47+ return true ;
48+ }
49+
50+ for (var filter : this .filters .values ()) {
51+ if (!filter .test (issue )) {
52+ return false ;
53+ }
54+ }
55+ return true ;
3856 }
3957
4058 public void setFilterPredicate (String filterName , Predicate <? super Issue > predicate ) {
0 commit comments