Bug 533655 - Can't deselect features from top level category which has
subcategories

Change-Id: I6214b2518b13c4243c84d61de0a2e4d21b20b5b5
Signed-off-by: Joshua Matsuoka <jmatsuok@redhat.com>
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/DelayedFilterCheckboxTree.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/DelayedFilterCheckboxTree.java
index d1527c5..f5238eb 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/DelayedFilterCheckboxTree.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/DelayedFilterCheckboxTree.java
@@ -73,10 +73,10 @@
 					// cache.
 					if (contentProvider.hasChildren(event.getElement())) {
 						Set<Object> unchecked = new HashSet<>();
-						Object[] children = contentProvider.getChildren(event.getElement());
-						for (Object element1 : children) {
-							unchecked.add(element1);
-						}
+						// See bug 533655, We should uncheck all of the children
+						// of the triggering element, not just the direct descendants.
+						uncheckAllChildren(unchecked, event.getElement());
+
 						Iterator<Object> iter = checkState.iterator();
 						while (iter.hasNext()) {
 							Object current = iter.next();
@@ -103,6 +103,15 @@
 		return checkboxViewer;
 	}
 
+	private void uncheckAllChildren(Set<Object> unchecked, Object element) {
+		for (Object child : contentProvider.getChildren(element)) {
+			unchecked.add(child);
+			if (contentProvider.getChildren(child).length > 0) {
+				uncheckAllChildren(unchecked, child);
+			}
+		}
+	}
+
 	@Override
 	protected Composite createFilterControls(Composite filterParent) {
 		super.createFilterControls(filterParent);