/*
   * @see ViewerSorter#category(Object)
   */
  public int category(Object obj) {
    if (obj instanceof CPListElement) {
      CPListElement element = (CPListElement) obj;
      if (element.getParentContainer() != null) {
        return CONTAINER_ENTRY;
      }

      if (element.isJRE()) {
        return JRE_ENTRY;
      }

      if (element.isInNonModifiableContainer()) {
        return REQUIRED_ENTRY;
      }

      switch (element.getEntryKind()) {
        case IIncludePathEntry.CPE_LIBRARY:
          return LIBRARY;
        case IIncludePathEntry.CPE_PROJECT:
          return PROJECT;
        case IIncludePathEntry.CPE_SOURCE:
          return SOURCE;
        case IIncludePathEntry.CPE_CONTAINER:
          return CONTAINER;
      }
    } else if (obj instanceof CPListElementAttribute) {
      return ATTRIBUTE;
    } else if (obj instanceof IAccessRule) {
      return ATTRIBUTE;
    }
    return OTHER;
  }
 private void editElementEntry(CPListElement elem) {
   CPListElement[] res = openProjectDialog(elem);
   if (res != null && res.length > 0) {
     CPListElement curr = res[0];
     curr.setExported(elem.isExported());
     fProjectsList.replaceElement(elem, curr);
   }
 }
  public ExclusionInclusionEntryDialog(
      Shell parent,
      boolean isExclusion,
      String patternToEdit,
      List existingPatterns,
      CPListElement entryToEdit) {
    super(parent);
    fIsExclusion = isExclusion;
    fExistingPatterns = existingPatterns;
    String title, message;
    if (isExclusion) {
      if (patternToEdit == null) {
        title = NewWizardMessages.ExclusionInclusionEntryDialog_exclude_add_title;
      } else {
        title = NewWizardMessages.ExclusionInclusionEntryDialog_exclude_edit_title;
      }
      message =
          Messages.format(
              NewWizardMessages.ExclusionInclusionEntryDialog_exclude_pattern_label,
              BasicElementLabels.getPathLabel(entryToEdit.getPath(), false));
    } else {
      if (patternToEdit == null) {
        title = NewWizardMessages.ExclusionInclusionEntryDialog_include_add_title;
      } else {
        title = NewWizardMessages.ExclusionInclusionEntryDialog_include_edit_title;
      }
      message =
          Messages.format(
              NewWizardMessages.ExclusionInclusionEntryDialog_include_pattern_label,
              BasicElementLabels.getPathLabel(entryToEdit.getPath(), false));
    }
    setTitle(title);
    if (patternToEdit != null) {
      fExistingPatterns.remove(patternToEdit);
    }

    IWorkspaceRoot root = entryToEdit.getJavaProject().getProject().getWorkspace().getRoot();
    IResource res = root.findMember(entryToEdit.getPath());
    if (res instanceof IContainer) {
      fCurrSourceFolder = (IContainer) res;
    }

    fExclusionPatternStatus = new StatusInfo();

    ExclusionPatternAdapter adapter = new ExclusionPatternAdapter();
    fExclusionPatternDialog = new StringButtonDialogField(adapter);
    fExclusionPatternDialog.setLabelText(message);
    fExclusionPatternDialog.setButtonLabel(
        NewWizardMessages.ExclusionInclusionEntryDialog_pattern_button);
    fExclusionPatternDialog.setDialogFieldListener(adapter);
    fExclusionPatternDialog.enableButton(fCurrSourceFolder != null);

    if (patternToEdit == null) {
      fExclusionPatternDialog.setText(""); // $NON-NLS-1$
    } else {
      fExclusionPatternDialog.setText(patternToEdit.toString());
    }
  }
  private void updateProjectsList(IJavaScriptProject currJProject) {
    // add the projects-cpentries that are already on the class path
    List cpelements = fClassPathList.getElements();

    final List checkedProjects = new ArrayList(cpelements.size());

    for (int i = cpelements.size() - 1; i >= 0; i--) {
      CPListElement cpelem = (CPListElement) cpelements.get(i);
      if (isEntryKind(cpelem.getEntryKind())) {
        checkedProjects.add(cpelem);
      }
    }
    fProjectsList.setElements(checkedProjects);
  }
  private void showAccessRestrictionDialog(CPListElement selElement) {
    AccessRulesDialog dialog =
        new AccessRulesDialog(getShell(), selElement, fCurrJProject, fPageContainer != null);
    int res = dialog.open();
    if (res == Window.OK || res == AccessRulesDialog.SWITCH_PAGE) {
      selElement.setAttribute(CPListElement.ACCESSRULES, dialog.getAccessRules());
      selElement.setAttribute(
          CPListElement.COMBINE_ACCESSRULES, new Boolean(dialog.doCombineAccessRules()));
      fProjectsList.refresh();
      fClassPathList.dialogFieldChanged(); // validate

      if (res == AccessRulesDialog.SWITCH_PAGE) {
        dialog.performPageSwitch(fPageContainer);
      }
    }
  }
  private CPListElement[] openProjectDialog(CPListElement elem) {

    try {
      ArrayList selectable = new ArrayList();
      selectable.addAll(Arrays.asList(fCurrJProject.getJavaScriptModel().getJavaScriptProjects()));
      selectable.remove(fCurrJProject);

      List elements = fProjectsList.getElements();
      for (int i = 0; i < elements.size(); i++) {
        CPListElement curr = (CPListElement) elements.get(0);
        IJavaScriptProject proj = (IJavaScriptProject) JavaScriptCore.create(curr.getResource());
        selectable.remove(proj);
      }
      Object[] selectArr = selectable.toArray();
      new JavaScriptElementComparator().sort(null, selectArr);

      ListSelectionDialog dialog =
          new ListSelectionDialog(
              getShell(),
              Arrays.asList(selectArr),
              new ArrayContentProvider(),
              new JavaUILabelProvider(),
              NewWizardMessages.ProjectsWorkbookPage_chooseProjects_message);
      dialog.setTitle(NewWizardMessages.ProjectsWorkbookPage_chooseProjects_title);
      dialog.setHelpAvailable(false);
      if (dialog.open() == Window.OK) {
        Object[] result = dialog.getResult();
        CPListElement[] cpElements = new CPListElement[result.length];
        for (int i = 0; i < result.length; i++) {
          IJavaScriptProject curr = (IJavaScriptProject) result[i];
          cpElements[i] =
              new CPListElement(
                  fCurrJProject, IIncludePathEntry.CPE_PROJECT, curr.getPath(), curr.getResource());
        }
        return cpElements;
      }
    } catch (JavaScriptModelException e) {
      return null;
    }
    return null;
  }
  private void updateClasspathList() {
    List projelements = fProjectsList.getElements();

    boolean remove = false;
    List cpelements = fClassPathList.getElements();
    // backwards, as entries will be deleted
    for (int i = cpelements.size() - 1; i >= 0; i--) {
      CPListElement cpe = (CPListElement) cpelements.get(i);
      if (isEntryKind(cpe.getEntryKind())) {
        if (!projelements.remove(cpe)) {
          cpelements.remove(i);
          remove = true;
        }
      }
    }
    for (int i = 0; i < projelements.size(); i++) {
      cpelements.add(projelements.get(i));
    }
    if (remove || (projelements.size() > 0)) {
      fClassPathList.setElements(cpelements);
    }
  }
 /**
  * @return Returns the container child status or <code>null</code> if the attribute is not in a
  *     container child
  */
 private IStatus getContainerChildStatus() {
   return fParent.getContainerChildStatus(this);
 }
 public int hashCode() {
   return fKey.hashCode() * 89 + fParent.getPath().hashCode();
 }
 public boolean equals(Object obj) {
   if (!(obj instanceof CPListElementAttribute)) return false;
   CPListElementAttribute attrib = (CPListElementAttribute) obj;
   return attrib.fKey == this.fKey && attrib.getParent().getPath().equals(fParent.getPath());
 }