/**
  * Gathers the checked states of the given widget and its descendents, following a pre-order
  * traversal of the tree.
  *
  * @param result a writable list of elements (element type: <code>Object</code>)
  * @param widget the widget
  */
 private void internalCollectChecked(List result, Widget widget) {
   Item[] items = getChildren(widget);
   for (int i = 0; i < items.length; i++) {
     Item item = items[i];
     if (item instanceof TreeItem && ((TreeItem) item).getChecked()) {
       Object data = item.getData();
       if (data != null) {
         result.add(data);
       }
     }
     internalCollectChecked(result, item);
   }
 }
 /**
  * Returns a list of checked elements in this viewer's tree, including currently hidden ones that
  * are marked as checked but are under a collapsed ancestor.
  *
  * <p>This method is typically used when preserving the interesting state of a viewer; <code>
  * setCheckedElements</code> is used during the restore.
  *
  * @return the array of checked elements
  * @see #setCheckedElements
  */
 public Object[] getCheckedElements() {
   ArrayList v = new ArrayList();
   Control tree = getControl();
   internalCollectChecked(v, tree);
   return v.toArray();
 }