/** @see ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) */
 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
   if (!(selection instanceof IStructuredSelection)) return;
   Object element = ((IStructuredSelection) selection).getFirstElement();
   long id = -1;
   String name = null;
   if (element instanceof BundleDescription) {
     id = ((BundleDescription) element).getBundleId();
     name = ((BundleDescription) element).getSymbolicName();
   }
   if (element instanceof BundleStats) {
     id = ((BundleStats) element).getId();
     name = ((BundleStats) element).getSymbolicName();
   }
   if (id == -1) return;
   PluginDependencyGraphNode node =
       (PluginDependencyGraphNode) getDependencyGraph().get(new Long(id));
   String text =
       node == null ? NLS.bind(Messages.depend_noInformation, name) : node.toDeepString();
   viewer.getDocument().set(text);
   viewer.refresh();
 }
  /**
   * Build the table of plug-in dependencies. Iterate over all the plug-ins in the plug-in registry
   * and the cycle through the list of pre-requisites and create the parent/child relationships in
   * the nodes.
   */
  private Map getDependencyGraph() {
    if (dependencyGraph != null) return dependencyGraph;
    // Build up the dependency graph (see PluginDependencyGraphNode) so
    // we have the information readily available for any plug-in.
    State state = Platform.getPlatformAdmin().getState(false);
    BundleDescription[] plugins = state.getBundles();
    dependencyGraph = new HashMap();
    for (int i = 0; i < plugins.length; i++) {
      BundleDescription descriptor = plugins[i];
      PluginDependencyGraphNode node =
          (PluginDependencyGraphNode) dependencyGraph.get(new Long(descriptor.getBundleId()));
      if (node == null) {
        node = new PluginDependencyGraphNode(descriptor);
        dependencyGraph.put(new Long(descriptor.getBundleId()), node);
      }

      // Cycle through the prerequisites
      BundleSpecification[] requires = descriptor.getRequiredBundles();
      for (int j = 0; j < requires.length; j++) {
        BundleDescription childDesc = (BundleDescription) requires[j].getSupplier();
        // if the child doesn't exist then move to the next child
        if (childDesc == null) continue;

        // if the child entry is not in the table yet then add it
        PluginDependencyGraphNode childNode =
            (PluginDependencyGraphNode) dependencyGraph.get(new Long(childDesc.getBundleId()));
        if (childNode == null) {
          childNode = new PluginDependencyGraphNode(childDesc);
          dependencyGraph.put(new Long(childDesc.getBundleId()), childNode);
        }

        // Add the child to this node's children and set this node as an ancestor
        // of the child node
        node.addChild(childNode);
        childNode.addAncestor(node);
      }
    }
    return dependencyGraph;
  }