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;
 }
 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 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 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 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);
    }
  }
 @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;
 }
 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 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 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;
 }