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 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;
  }
 /* (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);
 }
 public String getCPElementText(CPElement cpentry) {
   IPath path = cpentry.getPath();
   switch (cpentry.getEntryKind()) {
     case IPathEntry.CDT_LIBRARY:
       {
         IPath libPath = (IPath) cpentry.getAttribute(CPElement.LIBRARY);
         StringBuffer str = new StringBuffer();
         addBaseString(libPath, cpentry, str);
         addExport(cpentry, str);
         addParentInfo(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_PROJECT:
       return path.lastSegment();
     case IPathEntry.CDT_INCLUDE:
       {
         IPath incPath = ((IPath) cpentry.getAttribute(CPElement.INCLUDE));
         StringBuffer str = new StringBuffer();
         addBaseString(incPath, cpentry, str);
         addExport(cpentry, str);
         addParentInfo(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_INCLUDE_FILE:
       {
         IPath incFilePath = ((IPath) cpentry.getAttribute(CPElement.INCLUDE_FILE));
         StringBuffer str = new StringBuffer();
         addBaseString(incFilePath, cpentry, str);
         addExport(cpentry, str);
         addParentInfo(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_MACRO:
       {
         StringBuffer str =
             new StringBuffer(
                 (String) cpentry.getAttribute(CPElement.MACRO_NAME)
                     + "=" //$NON-NLS-1$
                     + (String) cpentry.getAttribute(CPElement.MACRO_VALUE));
         addBaseString(null, cpentry, str);
         addExport(cpentry, str);
         addParentInfo(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_MACRO_FILE:
       {
         IPath macroFilePath = ((IPath) cpentry.getAttribute(CPElement.MACROS_FILE));
         StringBuffer str = new StringBuffer();
         addBaseString(macroFilePath, cpentry, str);
         addExport(cpentry, str);
         addParentInfo(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_CONTAINER:
       {
         StringBuffer str = new StringBuffer(path.toString());
         try {
           IPathEntryContainer container =
               CoreModel.getPathEntryContainer(cpentry.getPath(), cpentry.getCProject());
           if (container != null) {
             str.setLength(0);
             str.append(container.getDescription());
           }
         } catch (CModelException e) {
         }
         addExport(cpentry, str);
         return str.toString();
       }
     case IPathEntry.CDT_SOURCE:
     case IPathEntry.CDT_OUTPUT:
       {
         StringBuffer buf = new StringBuffer(path.makeRelative().toString());
         IResource resource = cpentry.getResource();
         if (resource != null && !resource.exists()) {
           buf.append(' ');
           if (cpentry.getStatus().getSeverity()
               != IStatus.OK) { // only valid error for src/output would missing path...
             buf.append(fCreateLabel);
           } else {
             buf.append(fNewLabel);
           }
         }
         return buf.toString();
       }
     default:
       // pass
   }
   return CPathEntryMessages.CPElementLabelProvider_unknown_element_label;
 }