/* (non-Javadoc)
   * Method declared on SelectionDispatchAction.
   */
  public void run(ITextSelection selection) {
    IModelElement input = SelectionConverter.getInput(fEditor);
    if (!ActionUtil.isProcessable(getShell(), input)) return;

    try {
      IModelElement[] elements = resolveModelElements();
      if (elements == null) return;
      List candidates = new ArrayList(elements.length);
      for (int i = 0; i < elements.length; i++) {
        IModelElement[] resolvedElements = CallHierarchyUI.getCandidates(elements[i]);
        if (resolvedElements != null) candidates.addAll(Arrays.asList(resolvedElements));
      }
      if (candidates.isEmpty()) {
        IModelElement enclosingMethod = getEnclosingMethod(input, selection);
        if (enclosingMethod != null) {
          candidates.add(enclosingMethod);
        }
      }
      run((IModelElement[]) candidates.toArray(new IModelElement[candidates.size()]));
    } catch (InvocationTargetException e) {
      ExceptionHandler.handle(
          e,
          getShell(),
          getErrorDialogTitle(),
          ActionMessages.SelectionConverter_codeResolve_failed);
    } catch (InterruptedException e) {
      // cancelled
    }
  }
  /* (non-Javadoc)
   * Method declared on SelectionDispatchAction.
   */
  public void run(IStructuredSelection selection) {
    if (selection.size() != 1) return;
    Object input = selection.getFirstElement();
    if (!(input instanceof IModelElement))
      input = (IModelElement) ((IAdaptable) input).getAdapter(IModelElement.class);
    if (!(input instanceof IModelElement)) {
      IStatus status =
          createStatus(CallHierarchyMessages.OpenCallHierarchyAction_messages_no_java_element);
      openErrorDialog(status);
      return;
    }
    IModelElement element = (IModelElement) input;
    if (!ActionUtil.isProcessable(getShell(), element)) return;

    List result = new ArrayList(1);
    IStatus status = compileCandidates(result, element);
    if (status.isOK()) {
      run((IModelElement[]) result.toArray(new IModelElement[result.size()]));
    } else {
      openErrorDialog(status);
    }
  }