protected void updateCaches(IUElementListRoot newRoot, ProfileChangeOperation op) {
   resolvedOperation = op;
   if (newRoot != null) {
     setDrilldownElements(newRoot, resolvedOperation);
     if (treeViewer != null) {
       if (input != newRoot) treeViewer.setInput(newRoot);
       else treeViewer.refresh();
     }
     input = newRoot;
   }
 }
 public void toggleExpandState(int state, StructuredSelection selection) {
   TreeItem[] items = fExtensionTree.getTree().getSelection();
   if (state == NEEDS_EXPAND) { // expand sub tree
     traverseChildrenAndSetExpanded(items); // load non-expanded children
     fExtensionTree.refresh();
     expandChildrenElements(selection.toArray(), true);
     fExtensionTree.setSelection(selection, false);
   } else { // collapse sub tree
     for (Iterator<?> iterator = selection.iterator(); iterator.hasNext(); ) {
       fExtensionTree.setExpandedState(iterator.next(), false);
     }
   }
 }
 @Override
 public void run() {
   StructuredSelection selection = (StructuredSelection) fExtensionTree.getSelection();
   if (fExtensionTree.getTree().getSelectionCount() > 0) {
     TreeItem[] items = fExtensionTree.getTree().getSelection();
     try {
       fFilteredTree.setRedraw(false);
       int state = getStateChangeRequired(items);
       toggleExpandState(state, selection);
     } finally {
       fFilteredTree.setRedraw(true);
       fExtensionTree.refresh();
     }
   }
 }
 public void refresh() {
   fCategoryViewer.refresh();
   updateButtons();
   super.refresh();
 }