/**
   * Returns all of the openables defined in the region of this type hierarchy. Returns a map from
   * IJavaScriptProject to ArrayList of Openable
   */
  private HashMap determineOpenablesInRegion(IProgressMonitor monitor) {

    try {
      HashMap allOpenables = new HashMap();
      IJavaScriptElement[] roots = ((RegionBasedTypeHierarchy) this.hierarchy).region.getElements();
      int length = roots.length;
      if (monitor != null) monitor.beginTask("", length); // $NON-NLS-1$
      for (int i = 0; i < length; i++) {
        IJavaScriptElement root = roots[i];
        IJavaScriptProject javaProject = root.getJavaScriptProject();
        ArrayList openables = (ArrayList) allOpenables.get(javaProject);
        if (openables == null) {
          openables = new ArrayList();
          allOpenables.put(javaProject, openables);
        }
        switch (root.getElementType()) {
          case IJavaScriptElement.JAVASCRIPT_PROJECT:
            injectAllOpenablesForJavaProject((IJavaScriptProject) root, openables);
            break;
          case IJavaScriptElement.PACKAGE_FRAGMENT_ROOT:
            injectAllOpenablesForPackageFragmentRoot((IPackageFragmentRoot) root, openables);
            break;
          case IJavaScriptElement.PACKAGE_FRAGMENT:
            injectAllOpenablesForPackageFragment((IPackageFragment) root, openables);
            break;
          case IJavaScriptElement.CLASS_FILE:
          case IJavaScriptElement.JAVASCRIPT_UNIT:
            openables.add(root);
            break;
          case IJavaScriptElement.TYPE:
            IType type = (IType) root;
            if (type.isBinary()) {
              openables.add(type.getClassFile());
            } else {
              openables.add(type.getJavaScriptUnit());
            }
            break;
          default:
            break;
        }
        worked(monitor, 1);
      }
      return allOpenables;
    } finally {
      if (monitor != null) monitor.done();
    }
  }
  private Object[] getPackageContents(IPackageFragment fragment) throws JavaScriptModelException {
    ISourceReference[] sourceRefs;
    if (fragment.getKind() == IPackageFragmentRoot.K_SOURCE) {
      sourceRefs = fragment.getJavaScriptUnits();
    } else {
      IClassFile[] classFiles = fragment.getClassFiles();
      List topLevelClassFile = new ArrayList();
      for (int i = 0; i < classFiles.length; i++) {
        IType type = classFiles[i].getType();
        if (type != null
            && type.getDeclaringType() == null
            && !type.isAnonymous()
            && !type.isLocal()) topLevelClassFile.add(classFiles[i]);
      }
      sourceRefs =
          (ISourceReference[])
              topLevelClassFile.toArray(new ISourceReference[topLevelClassFile.size()]);
    }

    Object[] result = new Object[0];
    for (int i = 0; i < sourceRefs.length; i++)
      result = concatenate(result, removeImportAndPackageDeclarations(getChildren(sourceRefs[i])));
    return concatenate(result, fragment.getNonJavaScriptResources());
  }
  protected void computeResult() {
    TypeNameMatch[] selected = fContent.getSelection();
    if (selected == null || selected.length == 0) {
      setResult(null);
      return;
    }

    // If the scope is null then it got computed by the type selection component.
    if (fScope == null) {
      fScope = fContent.getScope();
    }

    OpenTypeHistory history = OpenTypeHistory.getInstance();
    List result = new ArrayList(selected.length);
    for (int i = 0; i < selected.length; i++) {
      TypeNameMatch typeInfo = selected[i];
      IType type = typeInfo.getType();
      if (!type.exists()) {
        String title = JavaUIMessages.TypeSelectionDialog_errorTitle;
        IPackageFragmentRoot root = typeInfo.getPackageFragmentRoot();
        String containerName =
            JavaScriptElementLabels.getElementLabel(root, JavaScriptElementLabels.ROOT_QUALIFIED);
        String message =
            Messages.format(
                JavaUIMessages.TypeSelectionDialog_dialogMessage,
                new String[] {typeInfo.getFullyQualifiedName(), containerName});
        MessageDialog.openError(getShell(), title, message);
        history.remove(typeInfo);
        setResult(null);
      } else {
        history.accessed(typeInfo);
        result.add(type);
      }
    }
    setResult(result);
  }
  /* (non-Javadoc)
   * @see org.eclipse.wst.jsdt.internal.corext.callhierarchy.IImplementorFinder#findImplementingTypes(org.eclipse.wst.jsdt.core.IType, org.eclipse.core.runtime.IProgressMonitor)
   */
  public Collection findImplementingTypes(IType type, IProgressMonitor progressMonitor) {
    ITypeHierarchy typeHierarchy;

    try {
      typeHierarchy = type.newTypeHierarchy(progressMonitor);

      IType[] implementingTypes = typeHierarchy.getAllClasses();
      HashSet result = new HashSet(Arrays.asList(implementingTypes));

      return result;
    } catch (JavaScriptModelException e) {
      JavaScriptPlugin.log(e);
    }

    return null;
  }
  private Object[] getChildren(IType type) throws JavaScriptModelException {
    IParent parent;
    if (type.isBinary()) parent = type.getClassFile();
    else {
      parent = type.getJavaScriptUnit();
    }
    if (type.getDeclaringType() != null) return type.getChildren();

    // Add import declarations
    IJavaScriptElement[] members = parent.getChildren();
    ArrayList tempResult = new ArrayList(members.length);
    for (int i = 0; i < members.length; i++)
      if ((members[i] instanceof IImportContainer)) tempResult.add(members[i]);
    tempResult.addAll(Arrays.asList(type.getChildren()));
    return tempResult.toArray();
  }