/* (non-Javadoc)
   * @see org.eclipse.jface.viewers.CheckboxTreeViewer#setAllChecked(boolean)
   */
  public void setAllChecked(boolean state) {
    for (TreeItem item : super.getTree().getItems()) item.setChecked(state);
    if (state) {

      // Find all visible children, add only the visible leaf nodes to the check state cache
      Object[] visible = getFilteredChildren(getRoot());

      ITreeContentProvider contentProvider = null;
      if (getContentProvider() instanceof ITreeContentProvider) {
        contentProvider = (ITreeContentProvider) getContentProvider();
      }

      if (contentProvider == null) {
        for (int i = 0; i < visible.length; i++) {
          checkState.add(visible[i]);
        }
      } else {
        Set<Object> toCheck = new HashSet<Object>();
        for (int i = 0; i < visible.length; i++) {
          addFilteredChildren(visible[i], contentProvider, toCheck);
        }
        checkState.addAll(toCheck);
      }
    } else {
      // Remove any item in the check state that is visible (passes the filters)
      if (checkState != null) {
        Object[] visible = filter(checkState.toArray());
        for (int i = 0; i < visible.length; i++) {
          checkState.remove(visible[i]);
        }
      }
    }
  }
 /**
  * If the element is a leaf node, it is added to the result collection. If the element has
  * children, this method will recursively look at the children and add any visible leaf nodes to
  * the collection.
  *
  * @param element element to check
  * @param contentProvider tree content provider to check for children
  * @param result collection to collect leaf nodes in
  */
 private void addFilteredChildren(
     Object element, ITreeContentProvider contentProvider, Collection<Object> result) {
   if (!contentProvider.hasChildren(element)) {
     result.add(element);
   } else {
     Object[] visibleChildren = getFilteredChildren(element);
     for (int i = 0; i < visibleChildren.length; i++) {
       addFilteredChildren(visibleChildren[i], contentProvider, result);
     }
   }
 }