private boolean moveDown(CPElement element) {
   boolean rc = false;
   int kind = element.getEntryKind();
   for (CPElementGroup group : fIncludeSymPathsList.getElements()) {
     CPElement[] children = group.getChildren(kind);
     for (int k = children.length - 1; k >= 0; --k) {
       CPElement child = children[k];
       if (element.equals(child)
           || (child.getInherited() != null && child.getInherited().equals(element))) {
         int prevIndex = k + 1;
         if (prevIndex < children.length) {
           // swap the two
           children[k] = children[prevIndex];
           children[prevIndex] = child;
           rc = true;
           break;
         }
       }
     }
     group.setChildren(children);
   }
   fIncludeSymPathsList.refresh();
   fIncludeSymPathsList.selectElements(new StructuredSelection(element));
   fIncludeSymPathsList.setFocus();
   return rc;
 }
 private void addPathToResourceGroup(
     CPElement element, CPElementGroup parent, CPElementGroup group) {
   IPath resPath = element.getPath();
   IPath[] exclusions = (IPath[]) element.getAttribute(CPElement.EXCLUSION);
   if ((group != parent || !group.getResource().equals(element.getResource()))
       && resPath.isPrefixOf(group.getPath())
       && (resPath.equals(group.getPath())
           || !CoreModelUtil.isExcludedPath(
               group.getResource().getFullPath().removeFirstSegments(resPath.segmentCount()),
               exclusions))) {
     if (parent != null) { // try to insert at proper place in group...
       int insertHere = -1;
       int ndx = parent.indexof(element);
       if (ndx != -1) {
         CPElement[] children = parent.getChildren(element.getEntryKind());
         for (int i = ndx; i < children.length; i++) {
           insertHere =
               group.indexof(new CPElement(children[i], group.getPath(), group.getResource()));
           if (insertHere != -1) {
             group.addChild(
                 new CPElement(element, group.getPath(), group.getResource()), insertHere);
             break;
           }
         }
       }
       if (insertHere == -1) {
         group.addChild(new CPElement(element, group.getPath(), group.getResource()));
       }
     } else {
       group.addChild(new CPElement(element, group.getPath(), group.getResource()));
     }
   }
 }
  private void updateStatus() {
    CPElement entryError = null;
    int nErrorEntries = 0;
    IStatus status = Status.OK_STATUS;
    List<CPElement> elements = getCPaths();
    for (int i = elements.size() - 1; i >= 0; i--) {
      CPElement currElement = elements.get(i);
      if (currElement.getStatus().getSeverity() != IStatus.OK) {
        nErrorEntries++;
        if (entryError == null) {
          entryError = currElement;
        }
      }
    }

    if (nErrorEntries > 0) {
      if (nErrorEntries == 1 && entryError != null) {
        status = entryError.getStatus();
      } else {
        status =
            new Status(
                IStatus.WARNING,
                CUIPlugin.PLUGIN_ID,
                -1,
                NLS.bind(
                    CPathEntryMessages.CPElement_status_multiplePathErrors,
                    String.valueOf(nErrorEntries)),
                null);
      }
    }
    fContext.statusChanged(status);
  }
 private CPElement removePathFromResourceGroups(CPElement element, List<CPElementGroup> groups) {
   CPElement Inherited = element.getInherited();
   CPElementGroup resGroup = element.getParent();
   resGroup.removeChild(element);
   if (Inherited != null) { // applied exclusion to orig.
     IPath exclude = element.getPath().removeFirstSegments(Inherited.getPath().segmentCount());
     IPath[] exclusions = (IPath[]) Inherited.getAttribute(CPElement.EXCLUSION);
     IPath[] newExlusions = new IPath[exclusions.length + 1];
     System.arraycopy(exclusions, 0, newExlusions, 0, exclusions.length);
     newExlusions[exclusions.length] = exclude;
     Inherited.setAttribute(CPElement.EXCLUSION, newExlusions);
     return null;
   }
   // remove all inherited
   for (int i = 0; i < groups.size(); i++) {
     CPElementGroup group = groups.get(i);
     CPElement elements[] = group.getChildren(element.getEntryKind());
     for (CPElement element2 : elements) {
       if (element2.getInherited() == element) {
         group.removeChild(element2);
         break;
       }
     }
   }
   return element;
 }
 @Override
 public Image getImage(Object element) {
   if (element instanceof CPElement) {
     CPElement cpentry = (CPElement) element;
     ImageDescriptor imageDescriptor = getCPElementBaseImage(cpentry);
     if (imageDescriptor != null) {
       switch (cpentry.getStatus().getSeverity()) {
         case IStatus.WARNING:
           imageDescriptor =
               new CPListImageDescriptor(
                   imageDescriptor, CPListImageDescriptor.WARNING, SMALL_SIZE);
           break;
         case IStatus.ERROR:
           imageDescriptor =
               new CPListImageDescriptor(imageDescriptor, CPListImageDescriptor.ERROR, SMALL_SIZE);
           break;
       }
       if (cpentry.getInherited() != null) {
         imageDescriptor =
             new CPListImageDescriptor(
                 imageDescriptor, CPListImageDescriptor.PATH_INHERIT, SMALL_SIZE);
       }
       return fRegistry.get(imageDescriptor);
     }
   } else if (element instanceof CPElementAttribute) {
     String key = ((CPElementAttribute) element).getKey();
     if (key.equals(CPElement.SOURCEATTACHMENT)) {
       return fRegistry.get(
           CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_SOURCE_ATTACH_ATTRIB));
     } else if (key.equals(CPElement.EXCLUSION)) {
       return CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_EXCLUSION_FILTER_ATTRIB);
     }
   } else if (element instanceof IPathEntry) {
     return getImage(CPElement.createFromExisting((IPathEntry) element, null));
   } else if (element instanceof CPElementGroup) {
     switch (((CPElementGroup) element).getEntryKind()) {
       case IPathEntry.CDT_INCLUDE:
         return CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_INCLUDES_CONTAINER);
       case IPathEntry.CDT_MACRO:
         return fRegistry.get(fMacroIcon);
       case IPathEntry.CDT_INCLUDE_FILE:
       case IPathEntry.CDT_MACRO_FILE:
         return CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_INCLUDE);
       case IPathEntry.CDT_LIBRARY:
         return CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_LIBRARY);
       case -1:
         IResource res = ((CPElementGroup) element).getResource();
         IWorkbenchAdapter adapter = (IWorkbenchAdapter) res.getAdapter(IWorkbenchAdapter.class);
         ImageDescriptor imageDescriptor = adapter.getImageDescriptor(res);
         if (!res.exists()) {
           imageDescriptor =
               new CPListImageDescriptor(
                   imageDescriptor, CPListImageDescriptor.WARNING, SMALL_SIZE);
         }
         return fRegistry.get(imageDescriptor);
     }
   }
   return null;
 }
 protected IPathEntry[] getRawPathEntries() {
   List<CPElement> paths = getCPaths();
   IPathEntry[] currEntries = new IPathEntry[paths.size()];
   for (int i = 0; i < currEntries.length; i++) {
     CPElement curr = paths.get(i);
     currEntries[i] = curr.getPathEntry();
   }
   return currEntries;
 }
  private void editElementEntry(CPElement element) {
    IPath path = (IPath) element.getAttribute(CPElement.BASE_REF);
    if (path != null && !path.equals(Path.EMPTY)) {
      return;
    } else if (element.getEntryKind() == IPathEntry.CDT_MACRO) {
      addSymbol(element);
    } else if (element.getEntryKind() == IPathEntry.CDT_INCLUDE) {
      path = (IPath) element.getAttribute(CPElement.BASE);
      if (path != null && !path.equals(Path.EMPTY)) {
        CPElement[] includes = openWorkspacePathEntryDialog(null);
        if (includes != null && includes.length > 0) {
          includes[0].setExported(element.isExported());
        }
      } else {
        addInclude(element);
      }
    } else if (element.getEntryKind() == IPathEntry.CDT_CONTAINER) {
      CPElement[] res = null;

      res = openContainerSelectionDialog(element);
      if (res != null && res.length > 0) {
        CPElement curr = res[0];
        curr.setExported(element.isExported());
        fTopGroup.replaceChild(element, curr);
        fIncludeSymPathsList.refresh();
      }
    }
  }
  protected void addNewPathResource() {
    Class<?>[] acceptedClasses =
        new Class[] {ICProject.class, ICContainer.class, ITranslationUnit.class};
    TypedElementSelectionValidator validator =
        new TypedElementSelectionValidator(acceptedClasses, false);
    ViewerFilter filter = new TypedViewerFilter(acceptedClasses);

    String title = CPathEntryMessages.IncludeSymbolEntryPage_newResource_title;
    String message = CPathEntryMessages.IncludeSymbolEntryPage_newResource_description;

    ElementTreeSelectionDialog dialog =
        new ElementTreeSelectionDialog(
            getShell(), new WorkbenchLabelProvider(), new CElementContentProvider());
    dialog.setValidator(validator);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.addFilter(filter);
    dialog.setInput(fCurrCProject);
    dialog.setInitialSelection(fCurrCProject);

    if (dialog.open() == Window.OK) {
      Object[] elements = dialog.getResult();
      IResource resource;
      if (elements[0] instanceof IResource) {
        resource = (IResource) elements[0];
      } else {
        resource = ((ICElement) elements[0]).getResource();
      }
      CPElementGroup newGroup = new CPElementGroup(resource);
      if (!fIncludeSymPathsList.getElements().contains(newGroup)) {
        List<CPElementGroup> groups = fIncludeSymPathsList.getElements();
        for (int i = 0; i < groups.size(); i++) {
          CPElementGroup group = groups.get(i);
          if (group.getPath().isPrefixOf(newGroup.getPath())) {
            CPElement[] cpelements = group.getChildren();
            for (CPElement cpelement : cpelements) {
              if (cpelement.getInherited() == null) {
                switch (cpelement.getEntryKind()) {
                  case IPathEntry.CDT_INCLUDE:
                  case IPathEntry.CDT_INCLUDE_FILE:
                  case IPathEntry.CDT_MACRO:
                  case IPathEntry.CDT_MACRO_FILE:
                    addPathToResourceGroup(cpelement, null, newGroup);
                }
              }
            }
          }
        }
        fIncludeSymPathsList.addElement(newGroup);
      }
      fIncludeSymPathsList.selectElements(new StructuredSelection(newGroup));
      fIncludeSymPathsList.expandElement(newGroup, 1);
    }
  }
 private void editAttributeEntry(CPElementAttribute elem) {
   String key = elem.getKey();
   if (key.equals(CPElement.EXCLUSION)) {
     CPElement selElement = elem.getParent();
     ExclusionPatternDialog dialog = new ExclusionPatternDialog(getShell(), selElement);
     if (dialog.open() == Window.OK) {
       selElement.setAttribute(CPElement.EXCLUSION, dialog.getExclusionPattern());
       updatePathOnResourceGroups(selElement, fIncludeSymPathsList.getElements());
       fIncludeSymPathsList.refresh();
       updateStatus();
     }
   }
 }
 private boolean canMoveUp(List<?> selected) {
   if (!canMove(selected)) {
     return false;
   }
   CPElement first = (CPElement) selected.get(0);
   CPElementGroup parent = first.getParent();
   CPElement children[] = parent.getChildren(first.getEntryKind());
   int indx = Arrays.asList(children).indexOf(first);
   if (indx <= 0) {
     return false;
   }
   return true;
 }
 private boolean canMoveDown(List<?> selected) {
   if (!canMove(selected)) {
     return false;
   }
   CPElement last = (CPElement) selected.get(selected.size() - 1);
   CPElementGroup parent = last.getParent();
   CPElement children[] = parent.getChildren(last.getEntryKind());
   int indx = Arrays.asList(children).indexOf(last);
   if (indx >= children.length - 1 || children[indx + 1].getInherited() != null) {
     return false;
   }
   return true;
 }
  protected CPElement[] openContainerSelectionDialog(CPElement existing) {
    IContainerEntry elem = null;
    String title;
    if (existing == null) {
      title = CPathEntryMessages.IncludeSymbolEntryPage_ContainerDialog_new_title;
    } else {
      title = CPathEntryMessages.IncludeSymbolEntryPage_ContainerDialog_edit_title;
      elem = (IContainerEntry) existing.getPathEntry();
    }
    CPathContainerWizard wizard =
        new CPathContainerWizard(
            elem,
            null,
            fCurrCProject,
            getRawPathEntries(),
            new int[] {IPathEntry.CDT_INCLUDE, IPathEntry.CDT_MACRO});
    wizard.setWindowTitle(title);
    if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
      IPathEntry parent = wizard.getEntriesParent();
      IPathEntry[] elements = wizard.getEntries();

      if (elements != null) {
        CPElement[] res = new CPElement[elements.length];
        CPElementGroup group = getSelectedGroup();
        for (int i = 0; i < res.length; i++) {
          if (elements[i].getEntryKind() == IPathEntry.CDT_INCLUDE) {
            res[i] =
                new CPElement(
                    fCurrCProject,
                    IPathEntry.CDT_INCLUDE,
                    group.getResource().getFullPath(),
                    group.getResource());
            res[i].setAttribute(CPElement.INCLUDE, ((IIncludeEntry) elements[i]).getIncludePath());
            res[i].setAttribute(CPElement.BASE_REF, parent.getPath());
          } else if (elements[i].getEntryKind() == IPathEntry.CDT_MACRO) {
            res[i] =
                new CPElement(
                    fCurrCProject,
                    IPathEntry.CDT_MACRO,
                    group.getResource().getFullPath(),
                    group.getResource());
            res[i].setAttribute(CPElement.MACRO_NAME, ((IMacroEntry) elements[i]).getMacroName());
            res[i].setAttribute(CPElement.BASE_REF, parent.getPath());
          }
        }
        return res;
      }
      return new CPElement[] {CPElement.createFromExisting(parent, fCurrCProject)};
    }
    return null;
  }
 @Override
 public List<CPElement> getCPaths() {
   List<CPElement> cPaths = new ArrayList<CPElement>();
   List<CPElementGroup> groups = fIncludeSymPathsList.getElements();
   for (int i = 0; i < groups.size(); i++) {
     CPElementGroup group = groups.get(i);
     CPElement[] elements = group.getChildren();
     for (CPElement element : elements) {
       if (element.getInherited() == null) {
         cPaths.add(element);
       }
     }
   }
   return cPaths;
 }
 private boolean canExport(List<?> selected) {
   if (selected.size() != 1) {
     return false;
   }
   Object elem = selected.get(0);
   if (elem instanceof CPElement) {
     CPElement element = (CPElement) selected.get(0);
     if (element.getParentContainer() == null && element.getInherited() == null) {
       IPath base_ref = (IPath) element.getAttribute(CPElement.BASE_REF);
       if (base_ref != null && !base_ref.equals(Path.EMPTY)) return false;
       return element.getEntryKind() == IPathEntry.CDT_INCLUDE
           || element.getEntryKind() == IPathEntry.CDT_MACRO;
     }
   }
   return false;
 }
 protected void addInclude(CPElement existing) {
   InputDialog dialog;
   if (existing == null) {
     dialog =
         new SelectPathInputDialog(
             getShell(),
             CPathEntryMessages.IncludeSymbolEntryPage_addExternal_title,
             CPathEntryMessages.IncludeSymbolEntryPage_addExternal_message,
             null,
             null);
   } else {
     dialog =
         new SelectPathInputDialog(
             getShell(),
             CPathEntryMessages.IncludeSymbolEntryPage_editExternal_title,
             CPathEntryMessages.IncludeSymbolEntryPage_editExternal_message,
             ((IPath) existing.getAttribute(CPElement.INCLUDE)).toOSString(),
             null);
   }
   String newItem = null;
   if (dialog.open() == Window.OK) {
     newItem = dialog.getValue();
     if (newItem != null && !newItem.isEmpty()) {
       if (existing == null) {
         CPElementGroup group = getSelectedGroup();
         CPElement newPath =
             new CPElement(
                 fCurrCProject,
                 IPathEntry.CDT_INCLUDE,
                 group.getResource().getFullPath(),
                 group.getResource());
         newPath.setAttribute(CPElement.INCLUDE, new Path(newItem));
         if (!group.contains(newPath)) {
           addPathToResourceGroups(newPath, group, fIncludeSymPathsList.getElements());
           fIncludeSymPathsList.refresh();
           fIncludeSymPathsList.selectElements(new StructuredSelection(newPath));
         }
       } else {
         existing.setAttribute(CPElement.INCLUDE, new Path(newItem));
         updatePathOnResourceGroups(existing, fIncludeSymPathsList.getElements());
         fIncludeSymPathsList.refresh();
       }
       updateStatus();
     }
   }
 }
 private void updateStatus(List<?> selected) {
   if (selected.size() != 1) {
     updateStatus();
     return;
   }
   CPElement element = null;
   if (selected.get(0) instanceof CPElement) {
     element = (CPElement) selected.get(0);
   } else if (selected.get(0) instanceof CPElementAttribute) {
     element = ((CPElementAttribute) selected.get(0)).getParent();
   }
   if (element != null && element.getStatus().getSeverity() != IStatus.OK) {
     fContext.statusChanged(element.getStatus());
   } else {
     updateStatus();
     return;
   }
 }
  protected CPElement[] openWorkspacePathEntryDialog(CPElement existing) {
    Class<?>[] acceptedClasses =
        new Class[] {ICProject.class, IProject.class, IContainer.class, ICContainer.class};
    TypedElementSelectionValidator validator =
        new TypedElementSelectionValidator(acceptedClasses, existing == null);
    ViewerFilter filter = new TypedViewerFilter(acceptedClasses);

    String title =
        (existing == null)
            ? CPathEntryMessages.IncludeSymbolEntryPage_fromWorkspaceDialog_new_title
            : CPathEntryMessages.IncludeSymbolEntryPage_fromWorkspaceDialog_edit_title;
    String message =
        (existing == null)
            ? CPathEntryMessages.IncludeSymbolEntryPage_fromWorkspaceDialog_new_description
            : CPathEntryMessages.IncludeSymbolEntryPage_fromWorkspaceDialog_edit_description;

    ElementTreeSelectionDialog dialog =
        new ElementTreeSelectionDialog(
            getShell(), new WorkbenchLabelProvider(), new CElementContentProvider());
    dialog.setValidator(validator);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.addFilter(filter);
    dialog.setInput(CoreModel.getDefault().getCModel());
    if (existing == null) {
      dialog.setInitialSelection(fCurrCProject);
    } else {
      dialog.setInitialSelection(existing.getCProject());
    }

    if (dialog.open() == Window.OK) {
      Object[] elements = dialog.getResult();
      CPElement[] res = new CPElement[elements.length];
      for (int i = 0; i < res.length; i++) {
        IProject project;
        IPath includePath;
        if (elements[i] instanceof IResource) {
          project = ((IResource) elements[i]).getProject();
          includePath = ((IResource) elements[i]).getProjectRelativePath();
        } else {
          project = ((ICElement) elements[i]).getCProject().getProject();
          includePath = ((ICElement) elements[i]).getResource().getProjectRelativePath();
        }
        CPElementGroup group = getSelectedGroup();
        res[i] =
            new CPElement(
                fCurrCProject,
                IPathEntry.CDT_INCLUDE,
                group.getResource().getFullPath(),
                group.getResource());
        res[i].setAttribute(CPElement.BASE, project.getFullPath().makeRelative());
        res[i].setAttribute(CPElement.INCLUDE, includePath);
      }
      return res;
    }
    return null;
  }
 /**
  * @param cpentry
  * @param str
  */
 private void addParentInfo(CPElement cpentry, StringBuffer str) {
   if (bShowParentInfo) {
     CPElement parent = cpentry.getParentContainer();
     if (parent != null) {
       str.append(" ["); // $NON-NLS-1$
       try {
         IPathEntryContainer container =
             CoreModel.getPathEntryContainer(cpentry.getPath(), cpentry.getCProject());
         if (container != null) {
           str.append(container.getDescription());
         }
       } catch (CModelException e) {
         str.append(parent.getPath());
       }
       str.append(']');
     }
   }
 }
 private boolean canMove(List<?> selected) {
   if (selected.size() == 0) {
     return false;
   }
   for (int i = 0; i < selected.size(); i++) {
     Object element = selected.get(i);
     if (!(element instanceof CPElement)) return false;
     CPElement elem = (CPElement) element;
     if (elem.getEntryKind() != IPathEntry.CDT_INCLUDE
         && elem.getEntryKind() != IPathEntry.CDT_MACRO) {
       return false;
     }
     if (elem.getParentContainer() != null || elem.getInherited() != null) {
       return false;
     }
   }
   return true;
 }
 private boolean canRemove(List<?> selected) {
   if (selected.size() != 1) {
     return false;
   }
   Object elem = selected.get(0);
   if (elem instanceof CPElement) {
     CPElement element = (CPElement) elem;
     if (element.getParentContainer() == null) {
       return element.getEntryKind() == IPathEntry.CDT_INCLUDE
           || element.getEntryKind() == IPathEntry.CDT_MACRO;
     }
   } else if (elem instanceof CPElementAttribute) {
     CPElementAttribute attrib = (CPElementAttribute) elem;
     if (attrib.getKey().equals(CPElement.EXCLUSION)) {
       if (((IPath[]) attrib.getValue()).length > 0) {
         return true;
       }
     }
   }
   return false;
 }
 private void removeEntry() {
   List<?> selected = getSelection();
   Object elem = selected.get(0);
   if (elem instanceof CPElement) {
     CPElement element = (CPElement) elem;
     CPElementGroup parent = element.getParent();
     if (removePathFromResourceGroups(element, fIncludeSymPathsList.getElements()) == null) {
       updatePathOnResourceGroups(element.getInherited(), fIncludeSymPathsList.getElements());
     }
     fIncludeSymPathsList.refresh();
     fIncludeSymPathsList.selectElements(new StructuredSelection(parent));
   } else if (elem instanceof CPElementAttribute) {
     CPElementAttribute attrib = (CPElementAttribute) elem;
     String key = attrib.getKey();
     Object value = key.equals(CPElement.EXCLUSION) ? new Path[0] : null;
     attrib.getParent().setAttribute(key, value);
     updatePathOnResourceGroups(attrib.getParent(), fIncludeSymPathsList.getElements());
     fIncludeSymPathsList.refresh();
   }
   updateStatus();
 }
 private void updatePathOnResourceGroups(CPElement element, List<CPElementGroup> groups) {
   CPElementGroup parent = element.getParent();
   IPath resPath = element.getPath();
   IPath[] exclusions = (IPath[]) element.getAttribute(CPElement.EXCLUSION);
   for (int i = 0; i < groups.size(); i++) {
     CPElementGroup group = groups.get(i);
     if (group != parent) {
       boolean found = false;
       CPElement[] elements = group.getChildren(element.getEntryKind());
       for (CPElement element2 : elements) {
         if (element2.getInherited() == element) {
           found = true;
           if (!CoreModelUtil.isExcludedPath(
               group.getResource().getFullPath().removeFirstSegments(resPath.segmentCount()),
               exclusions)) {
             group.replaceChild(
                 element2, new CPElement(element, group.getPath(), group.getResource()));
           } else {
             group.removeChild(element2);
           }
           break;
         }
       }
       if (!found) {
         addPathToResourceGroup(element, parent, group);
       }
     }
   }
 }
 @Override
 public String getText(Object element) {
   if (element instanceof CPElement) {
     return getCPElementText((CPElement) element);
   } else if (element instanceof CPElementAttribute) {
     return getCPElementAttributeText((CPElementAttribute) element);
   } else if (element instanceof IPathEntry) {
     return getCPElementText(CPElement.createFromExisting((IPathEntry) element, null));
   } else if (element instanceof CPElementGroup) {
     return (getCPContainerGroupText((CPElementGroup) element));
   }
   return super.getText(element);
 }
 private void addBaseString(IPath endPath, CPElement cpentry, StringBuffer str) {
   IPath baseRef = (IPath) cpentry.getAttribute(CPElement.BASE_REF);
   if (!baseRef.isEmpty()) {
     if (baseRef.isAbsolute()) {
       //				str.append("From project ");
       IPath path = baseRef;
       if (endPath != null) {
         path = path.append(endPath);
       }
       str.append(path.makeRelative().toPortableString());
     } else {
       //				str.append("From contribution ");
       IPathEntryContainer container;
       if (endPath != null) {
         str.append(endPath.toPortableString());
       }
       str.append(" - ("); // $NON-NLS-1$
       try {
         container = CoreModel.getPathEntryContainer(baseRef, cpentry.getCProject());
         if (container != null) {
           str.append(container.getDescription());
         }
       } catch (CModelException e1) {
       }
       str.append(')');
     }
   } else {
     IPath path = (IPath) cpentry.getAttribute(CPElement.BASE);
     if (!path.isEmpty()) {
       if (endPath != null) {
         path = path.append(endPath);
       }
       str.insert(0, path.toPortableString());
     } else if (endPath != null) {
       str.insert(0, endPath.toPortableString());
     }
   }
 }
 private ImageDescriptor getCPElementBaseImage(CPElement cpentry) {
   switch (cpentry.getEntryKind()) {
     case IPathEntry.CDT_OUTPUT:
       if (cpentry.getPath().segmentCount() == 1) {
         return fProjectImage;
       }
       return fOutputImage;
     case IPathEntry.CDT_SOURCE:
       if (cpentry.getPath().segmentCount() == 1) {
         return fProjectImage;
       }
       return fFolderImage;
     case IPathEntry.CDT_LIBRARY:
       IPath path = (IPath) cpentry.getAttribute(CPElement.SOURCEATTACHMENT);
       if (path == null || path.isEmpty()) {
         return fLibIcon;
       }
       return fLibWSrcIcon;
     case IPathEntry.CDT_PROJECT:
       return fProjectImage;
     case IPathEntry.CDT_CONTAINER:
       return fContainerImage;
     case IPathEntry.CDT_INCLUDE:
       if (((Boolean) cpentry.getAttribute(CPElement.SYSTEM_INCLUDE)).booleanValue())
         return fIncludeIcon;
       return fQuoteIncludeIcon;
     case IPathEntry.CDT_INCLUDE_FILE:
       return fIncludeFileIcon;
     case IPathEntry.CDT_MACRO:
       return fMacroIcon;
     case IPathEntry.CDT_MACRO_FILE:
       return fMacrosFileIcon;
     default:
       return null;
   }
 }
 /* (non-Javadoc)
  * @see org.eclipse.cdt.internal.ui.dialogs.cpaths.CPElementFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
  */
 @Override
 public boolean select(Viewer viewer, Object parent, Object element) {
   IResource res = null;
   if (element instanceof CPElement) {
     CPElement cpElem = (CPElement) element;
     res = cpElem.getResource();
   } else if (element instanceof CPElementGroup) {
     CPElementGroup cpElemGroup = (CPElementGroup) element;
     res = cpElemGroup.getResource();
   }
   if (res != null && !res.equals(fCurrCElement.getResource())) {
     IPath currResPath = fCurrCElement.getResource().getFullPath();
     IPath resPath = res.getFullPath();
     boolean found = false;
     for (int i = currResPath.segmentCount() - 1; i >= 0; --i) {
       if (resPath.equals(currResPath.uptoSegment(i))) {
         found = true;
         break;
       }
     }
     if (found == false) return false;
   }
   return super.select(viewer, parent, element);
 }
  private List<CPElementGroup> createGroups(ICElement element, List<CPElement> cPaths) {
    // create resource groups
    List<CPElementGroup> resourceGroups = new ArrayList<CPElementGroup>(5);
    fTopGroup = new CPElementGroup(element.getResource());
    resourceGroups.add(fTopGroup);
    // add containers first so that they appear at top of list
    for (int i = 0; i < cPaths.size(); i++) {
      CPElement cpelement = cPaths.get(i);
      switch (cpelement.getEntryKind()) {
        case IPathEntry.CDT_CONTAINER:
          fTopGroup.addChild(cpelement);
          break;
      }
    }
    for (int i = 0; i < cPaths.size(); i++) {
      CPElement cpelement = cPaths.get(i);
      switch (cpelement.getEntryKind()) {
        case IPathEntry.CDT_INCLUDE:
        case IPathEntry.CDT_INCLUDE_FILE:
        case IPathEntry.CDT_MACRO:
        case IPathEntry.CDT_MACRO_FILE:
          CPElementGroup resGroup = new CPElementGroup(cpelement.getResource());
          int ndx = resourceGroups.indexOf(resGroup);
          if (ndx == -1) {
            resourceGroups.add(resGroup);
          } else {
            resGroup = resourceGroups.get(ndx);
          }
          resGroup.addChild(cpelement);
      }
    }

    // place each path in its appropriate inherited group (or not if
    // excluded)
    for (int i = 0; i < cPaths.size(); i++) {
      CPElement cpelement = cPaths.get(i);
      switch (cpelement.getEntryKind()) {
        case IPathEntry.CDT_INCLUDE:
        case IPathEntry.CDT_INCLUDE_FILE:
        case IPathEntry.CDT_MACRO:
        case IPathEntry.CDT_MACRO_FILE:
          addPathToResourceGroups(cpelement, null, resourceGroups);
      }
    }
    return resourceGroups;
  }
 private boolean canEdit(List<?> selected) {
   if (selected.size() != 1) {
     return false;
   }
   Object elem = selected.get(0);
   if (elem instanceof CPElement) {
     CPElement element = (CPElement) selected.get(0);
     if (element.getParentContainer() == null && element.getInherited() == null) {
       IPath path = (IPath) element.getAttribute(CPElement.BASE_REF);
       if (path != null && !path.equals(Path.EMPTY)) {
         return false;
       }
       return element.getEntryKind() == IPathEntry.CDT_INCLUDE
           || element.getEntryKind() == IPathEntry.CDT_MACRO
           || element.getEntryKind() == IPathEntry.CDT_CONTAINER;
     }
   }
   if (elem instanceof CPElementAttribute) {
     return true;
   }
   return false;
 }
  protected void addSymbol(CPElement existing) {
    // Popup an entry dialog
    InputDialog dialog;
    if (existing == null) {
      dialog =
          new InputDialog(
              getShell(),
              CPathEntryMessages.IncludeSymbolEntryPage_addSymbol_title,
              CPathEntryMessages.IncludeSymbolEntryPage_addSymbol_message,
              "", //$NON-NLS-1$
              null);
    } else {
      StringBuilder initialValue = new StringBuilder();
      initialValue.append((String) existing.getAttribute(CPElement.MACRO_NAME));
      initialValue.append('=');
      initialValue.append((String) existing.getAttribute(CPElement.MACRO_VALUE));
      dialog =
          new InputDialog(
              getShell(),
              CPathEntryMessages.IncludeSymbolEntryPage_editSymbol_title,
              CPathEntryMessages.IncludeSymbolEntryPage_editSymbol_message,
              initialValue.toString(),
              null);
    }

    String symbol = null;
    if (dialog.open() == Window.OK) {
      symbol = dialog.getValue();
      if (symbol != null && symbol.length() > 0) {
        CPElementGroup group = getSelectedGroup();
        CPElement newPath =
            new CPElement(
                fCurrCProject,
                IPathEntry.CDT_MACRO,
                group.getResource().getFullPath(),
                group.getResource());
        String name, value = ""; // $NON-NLS-1$
        int index = symbol.indexOf("="); // $NON-NLS-1$
        if (index != -1) {
          name = symbol.substring(0, index).trim();
          value = symbol.substring(index + 1).trim();
        } else {
          name = symbol.trim();
        }
        if (existing != null) {
          existing.setAttribute(CPElement.MACRO_NAME, name);
          existing.setAttribute(CPElement.MACRO_VALUE, value);
          updatePathOnResourceGroups(existing, fIncludeSymPathsList.getElements());
          fIncludeSymPathsList.refresh();
        } else {
          newPath.setAttribute(CPElement.MACRO_NAME, name);
          newPath.setAttribute(CPElement.MACRO_VALUE, value);
          if (!group.contains(newPath)) {
            addPathToResourceGroups(newPath, group, fIncludeSymPathsList.getElements());
            fIncludeSymPathsList.refresh();
            fIncludeSymPathsList.selectElements(new StructuredSelection(newPath));
          }
          updateStatus();
        }
      }
    }
  }
 private void exportEntry() {
   CPElement element = (CPElement) getSelection().get(0);
   element.setExported(!element.isExported()); // toggle
   fIncludeSymPathsList.refresh(element);
 }