diff --git a/build/org.eclipse.cdt.make.ui/plugin.xml b/build/org.eclipse.cdt.make.ui/plugin.xml index 65fc01a65f5..ea69a2054b3 100644 --- a/build/org.eclipse.cdt.make.ui/plugin.xml +++ b/build/org.eclipse.cdt.make.ui/plugin.xml @@ -258,6 +258,16 @@ value="org.eclipse.cdt.make.core.makeNature"> + + + = 0; --i) { + if (resPath.equals(currResPath.uptoSegment(i))) { + found = true; + break; + } + } + if (found == false) + return false; + } + } + return super.select(viewer, parent, element); + } + + } + + private class IncludeSymbolAdapter implements IDialogFieldListener, ITreeListAdapter { + + private final Object[] EMPTY_ARR = new Object[0]; + + // -------- IListAdapter -------- + public void customButtonPressed(TreeListDialogField field, int index) { + listCustomButtonPressed(field, index); + } + + public void selectionChanged(TreeListDialogField field) { + listPageSelectionChanged(field); + } + + public void doubleClicked(TreeListDialogField field) { + listPageDoubleClicked(field); + } + + public void keyPressed(TreeListDialogField field, KeyEvent event) { + listPageKeyPressed(field, event); + } + + public Object[] getChildren(TreeListDialogField field, Object element) { + if (element instanceof CPElement) { + return ((CPElement)element).getChildren(); + } else if (element instanceof CPElementGroup) { + return ((CPElementGroup)element).getChildren(); + } + return EMPTY_ARR; + } + + public Object getParent(TreeListDialogField field, Object element) { + if (element instanceof CPElementGroup) { + return ((CPElementGroup)element).getParent(); + } else if (element instanceof CPElement) { + return ((CPElement)element).getParent(); + } + return null; + } + + public boolean hasChildren(TreeListDialogField field, Object element) { + if (element instanceof CPElementGroup) { + return true; + } + if (element instanceof CPElement) { + return ((CPElement)element).getChildren().length > 0; + } + return false; + } + + // ---------- IDialogFieldListener -------- + + public void dialogFieldChanged(DialogField field) { + listPageDialogFieldChanged(field); + } + + } + + public CPathIncludeSymbolEntryPerFilePage(IStatusChangeListener context) { + super(CPathEntryMessages.getString("IncludeSymbolEntryPage.title")); //$NON-NLS-1$ + fContext = context; + IncludeSymbolAdapter adapter = new IncludeSymbolAdapter(); + fIncludeSymPathsList = new TreeListDialogField(adapter, buttonLabel, new CPElementLabelProvider(true, false)) { + + protected int getTreeStyle() { + return super.getTreeStyle() & ~SWT.MULTI; + } + }; + fIncludeSymPathsList.setLabelText(CPathEntryMessages.getString("IncludeSymbolEntryPage.label")); //$NON-NLS-1$ + fIncludeSymPathsList.enableButton(IDX_REMOVE, false); + fIncludeSymPathsList.enableButton(IDX_EDIT, false); + fIncludeSymPathsList.enableButton(IDX_ADD_CONTRIBUTED, true); + fIncludeSymPathsList.enableButton(IDX_ADD_EXT_INCLUDE, true); + fIncludeSymPathsList.enableButton(IDX_ADD_WS_INCLUDE, true); + fIncludeSymPathsList.enableButton(IDX_ADD_SYMBOL, true); + fIncludeSymPathsList.enableButton(IDX_EXPORT, false); + fIncludeSymPathsList.enableButton(IDX_UP, false); + fIncludeSymPathsList.enableButton(IDX_DOWN, false); + fIncludeSymPathsList.setTreeExpansionLevel(fTreeExpansionLevel); + fShowInheritedPaths = new SelectionButtonDialogField(SWT.CHECK); + fShowInheritedPaths.setSelection(true); + fShowInheritedPaths.setLabelText(CPathEntryMessages.getString("IncludeSymbolsEntryPage.show_inherited.check")); //$NON-NLS-1$ + fShowInheritedPaths.setDialogFieldListener(adapter); + fShowUnrelatedResources = new SelectionButtonDialogField(SWT.CHECK); + fShowUnrelatedResources.setSelection(false); + fShowUnrelatedResources.setLabelText(CPathEntryMessages.getString("IncludeSymbolsEntryPage.show_unrelated.check")); //$NON-NLS-1$ + fShowUnrelatedResources.setDialogFieldListener(adapter); + + fFilter = new CPElementPerFileFilter(new int[]{-1, IPathEntry.CDT_INCLUDE, IPathEntry.CDT_INCLUDE_FILE, + IPathEntry.CDT_MACRO, IPathEntry.CDT_MACRO_FILE, IPathEntry.CDT_CONTAINER}, + false, true, false); + } + + public void createControl(Composite parent) { + PixelConverter converter = new PixelConverter(parent); + + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + LayoutUtil.doDefaultLayout(composite, new DialogField[]{fIncludeSymPathsList, fShowInheritedPaths, fShowUnrelatedResources}, true); + LayoutUtil.setHorizontalGrabbing(fIncludeSymPathsList.getTreeControl(null)); + + int buttonBarWidth = converter.convertWidthInCharsToPixels(24); + fIncludeSymPathsList.setButtonsMinWidth(buttonBarWidth); + setControl(composite); + fIncludeSymPathsList.getTreeViewer().addFilter(fFilter); + CUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(composite, ICHelpContextIds.PROJECT_INCLUDE_PATHS_SYMBOLS); + } + + public Image getImage() { + return CPluginImages.get(CPluginImages.IMG_OBJS_INCLUDES_CONTAINER); + } + + public void init(ICElement cElement, List cPaths) { + fCurrCElement = cElement; + fCurrCProject = cElement.getCProject(); + List elements = createGroups(cElement, cPaths); + fIncludeSymPathsList.setElements(elements); + updateStatus(); + } + + private void updateStatus() { + CPElement entryError = null; + int nErrorEntries = 0; + IStatus status = Status.OK_STATUS; + List elements = getCPaths(); + for (int i = elements.size() - 1; i >= 0; i--) { + CPElement currElement = (CPElement)elements.get(i); + if (currElement.getStatus().getSeverity() != IStatus.OK) { + nErrorEntries++; + if (entryError == null) { + entryError = currElement; + } + } + } + + if (nErrorEntries > 0) { + if (nErrorEntries == 1) { + status = entryError.getStatus(); + } else { + status = new Status(IStatus.WARNING, CUIPlugin.PLUGIN_ID, -1, CPathEntryMessages.getFormattedString( + "CPElement.status.multiplePathErrors", //$NON-NLS-1$ + String.valueOf(nErrorEntries)), null); + } + } + fContext.statusChanged(status); + } + + 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; + } + } + + private List createGroups(ICElement element, List cPaths) { + // create resource groups + List resourceGroups = new ArrayList(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 = (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 = (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 = (CPElementGroup)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 = (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 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 addPathToResourceGroups(CPElement element, CPElementGroup parent, List groups) { + if (parent != null) { + parent.addChild(element); + } + for (int i = 0; i < groups.size(); i++) { + CPElementGroup group = (CPElementGroup)groups.get(i); + addPathToResourceGroup(element, parent, group); + } + } + + private void updatePathOnResourceGroups(CPElement element, List 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 = (CPElementGroup)groups.get(i); + if (group != parent) { + boolean found = false; + CPElement[] elements = group.getChildren(element.getEntryKind()); + for (int j = 0; j < elements.length; j++) { + if (elements[j].getInherited() == element) { + found = true; + if (!CoreModelUtil.isExcludedPath(group.getResource().getFullPath().removeFirstSegments( + resPath.segmentCount()), exclusions)) { + group.replaceChild(elements[j], new CPElement(element, group.getPath(), group.getResource())); + } else { + group.removeChild(elements[j]); + } + break; + } + } + if (!found) { + addPathToResourceGroup(element, parent, group); + } + } + } + } + + private CPElement removePathFromResourceGroups(CPElement element, List 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 = (CPElementGroup)groups.get(i); + CPElement elements[] = group.getChildren(element.getEntryKind()); + for (int j = 0; j < elements.length; j++) { + if (elements[j].getInherited() == element) { + group.removeChild(elements[j]); + break; + } + } + } + return element; + } + + private boolean canAddPath(List selected) { + CPElementGroup group = getSelectedGroup(); + if (group != null) { + return group.getEntryKind() == -1; // resource group + } + return false; + } + + 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 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; + } + + private void editEntry() { + List selElements = fIncludeSymPathsList.getSelectedElements(); + if (selElements.size() != 1) { + return; + } + Object element = selElements.get(0); + + if (element instanceof CPElement) { + editElementEntry((CPElement)element); + } else if (element instanceof CPElementAttribute) { + editAttributeEntry((CPElementAttribute)element); + } + } + + 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(); + } + } + } + + 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 void exportEntry() { + CPElement element = (CPElement)getSelection().get(0); + element.setExported(!element.isExported()); // toggle + fIncludeSymPathsList.refresh(element); + } + + 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 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; + } + + private boolean moveUp(CPElement element) { + boolean rc = false; + int kind = element.getEntryKind(); + for (Iterator j = fIncludeSymPathsList.getElements().iterator(); j.hasNext();) { + CPElementGroup group = (CPElementGroup)j.next(); + CPElement[] children = group.getChildren(kind); + for (int k = 0; k < children.length; ++k) { + CPElement child = children[k]; + if (element.equals(child) || (child.getInherited() != null && child.getInherited().equals(element))) { + if (child.getInherited() != null && k > 0 && children[k - 1].getInherited() == null) { + break; + } + int prevIndex = k - 1; + if (prevIndex >= 0) { + // 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 boolean moveDown(CPElement element) { + boolean rc = false; + int kind = element.getEntryKind(); + for (Iterator j = fIncludeSymPathsList.getElements().iterator(); j.hasNext();) { + CPElementGroup group = (CPElementGroup)j.next(); + 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 CPElementGroup getSelectedGroup() { + List selected = fIncludeSymPathsList.getSelectedElements(); + if (!selected.isEmpty()) { + Object item = selected.get(0); + if (item instanceof CPElement) { + item = ((CPElement)item).getParent(); + } + if (item instanceof CPElementGroup) { + return (CPElementGroup)item; + } + } + return fTopGroup; + } + + protected void listPageDialogFieldChanged(DialogField field) { + boolean showInherited = fShowInheritedPaths.isSelected(); + boolean showUnrelated = fShowUnrelatedResources.isSelected(); + if (field == fShowInheritedPaths || field == fShowUnrelatedResources) { + if (fFilter != null) { + fIncludeSymPathsList.getTreeViewer().removeFilter(fFilter); + } + fFilter = new CPElementPerFileFilter(new int[]{-1, IPathEntry.CDT_INCLUDE, IPathEntry.CDT_INCLUDE_FILE, + IPathEntry.CDT_MACRO, IPathEntry.CDT_MACRO_FILE, IPathEntry.CDT_CONTAINER}, + false, showInherited, showUnrelated); + fIncludeSymPathsList.getTreeViewer().addFilter(fFilter); + fIncludeSymPathsList.setTreeExpansionLevel(fTreeExpansionLevel); + fIncludeSymPathsList.refresh(); + } + updateStatus(); + } + + protected void listPageSelectionChanged(TreeListDialogField field) { + List selected = field.getSelectedElements(); + field.enableButton(IDX_REMOVE, canRemove(selected)); + field.enableButton(IDX_EDIT, canEdit(selected)); + field.enableButton(IDX_ADD_CONTRIBUTED, canAddPath(selected)); + field.enableButton(IDX_ADD_EXT_INCLUDE, canAddPath(selected)); + field.enableButton(IDX_ADD_WS_INCLUDE, canAddPath(selected)); + field.enableButton(IDX_ADD_SYMBOL, canAddPath(selected)); + field.enableButton(IDX_EXPORT, canExport(selected)); + field.enableButton(IDX_DOWN, canMoveDown(selected)); + field.enableButton(IDX_UP, canMoveUp(selected)); + updateStatus(selected); + } + + protected void listCustomButtonPressed(TreeListDialogField field, int index) { + switch (index) { + case IDX_ADD_FOLDER_FILE : + addNewPathResource(); + break; + case IDX_ADD_SYMBOL : + addSymbol(null); + break; + case IDX_ADD_EXT_INCLUDE : + addInclude(null); + break; + case IDX_ADD_WS_INCLUDE : + addFromWorkspace(); + break; + case IDX_ADD_CONTRIBUTED : + addContributed(); + break; + case IDX_EDIT : + if (canEdit(field.getSelectedElements())) { + editEntry(); + } + break; + case IDX_REMOVE : + if (canRemove(field.getSelectedElements())) { + removeEntry(); + } + break; + case IDX_DOWN : + if (canMoveDown(field.getSelectedElements())) { + moveDown((CPElement)field.getSelectedElements().get(0)); + } + break; + case IDX_UP : + if (canMoveUp(field.getSelectedElements())) { + moveUp((CPElement)field.getSelectedElements().get(0)); + } + break; + case IDX_EXPORT : + if (canExport(field.getSelectedElements())) { + exportEntry(); + } + + } + } + + protected void listPageDoubleClicked(TreeListDialogField field) { + if (canEdit(fIncludeSymPathsList.getSelectedElements())) { + editEntry(); + } + } + + protected void listPageKeyPressed(TreeListDialogField field, KeyEvent event) { + if (field == fIncludeSymPathsList) { + if (event.character == SWT.DEL && event.stateMask == 0) { + List selection = field.getSelectedElements(); + if (canEdit(selection)) { + removeEntry(); + } + } + } + } + + protected IPathEntry[] getRawPathEntries() { + List paths = getCPaths(); + IPathEntry[] currEntries = new IPathEntry[paths.size()]; + for (int i = 0; i < currEntries.length; i++) { + CPElement curr = (CPElement)paths.get(i); + currEntries[i] = curr.getPathEntry(); + } + return currEntries; + } + + 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.getString("IncludeSymbolEntryPage.newResource.title"); //$NON-NLS-1$ + String message = CPathEntryMessages.getString("IncludeSymbolEntryPage.newResource.description"); //$NON-NLS-1$ + + 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 groups = fIncludeSymPathsList.getElements(); + for (int i = 0; i < groups.size(); i++) { + CPElementGroup group = (CPElementGroup)groups.get(i); + if (group.getPath().isPrefixOf(newGroup.getPath())) { + CPElement[] cpelements = group.getChildren(); + for (int j = 0; j < cpelements.length; j++) { + if (cpelements[j].getInherited() == null) { + switch (cpelements[j].getEntryKind()) { + case IPathEntry.CDT_INCLUDE : + case IPathEntry.CDT_INCLUDE_FILE : + case IPathEntry.CDT_MACRO : + case IPathEntry.CDT_MACRO_FILE : + addPathToResourceGroup(cpelements[j], null, newGroup); + } + } + } + } + } + fIncludeSymPathsList.addElement(newGroup); + } + fIncludeSymPathsList.selectElements(new StructuredSelection(newGroup)); + fIncludeSymPathsList.expandElement(newGroup, 1); + } + } + + protected void addSymbol(CPElement existing) { + // Popup an entry dialog + InputDialog dialog; + if (existing == null) { + dialog = new InputDialog(getShell(), CPathEntryMessages.getString("IncludeSymbolEntryPage.addSymbol.title"), //$NON-NLS-1$ + CPathEntryMessages.getString("IncludeSymbolEntryPage.addSymbol.message"), "", //$NON-NLS-1$ //$NON-NLS-2$ + null); + } else { + StringBuffer initialValue = new StringBuffer(); + initialValue.append((String)existing.getAttribute(CPElement.MACRO_NAME)); + initialValue.append('='); + initialValue.append((String)existing.getAttribute(CPElement.MACRO_VALUE)); + dialog = new InputDialog(getShell(), CPathEntryMessages.getString("IncludeSymbolEntryPage.editSymbol.title"), //$NON-NLS-1$ + CPathEntryMessages.getString("IncludeSymbolEntryPage.editSymbol.message"), initialValue.toString(), //$NON-NLS-1$ //$NON-NLS-2$ + 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(); + } + } + } + } + + protected void addInclude(CPElement existing) { + InputDialog dialog; + if (existing == null) { + dialog = new SelectPathInputDialog(getShell(), + CPathEntryMessages.getString("IncludeSymbolEntryPage.addExternal.title"), //$NON-NLS-1$ + CPathEntryMessages.getString("IncludeSymbolEntryPage.addExternal.message"), null, null); //$NON-NLS-1$ + } else { + dialog = new SelectPathInputDialog( + getShell(), + CPathEntryMessages.getString("IncludeSymbolEntryPage.editExternal.title"), //$NON-NLS-1$ + CPathEntryMessages.getString("IncludeSymbolEntryPage.editExternal.message"), ((IPath)existing.getAttribute(CPElement.INCLUDE)).toOSString(), null); //$NON-NLS-1$ + } + String newItem = null; + if (dialog.open() == Window.OK) { + newItem = dialog.getValue(); + if (newItem != null && !newItem.equals("")) { //$NON-NLS-1$ + 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(); + } + } + } + + protected void addFromWorkspace() { + CPElement[] includes = openWorkspacePathEntryDialog(null); + if (includes != null && includes.length > 0) { + int nElementsChosen = includes.length; + CPElementGroup group = getSelectedGroup(); + for (int i = 0; i < nElementsChosen; i++) { + CPElement curr = includes[i]; + if (!group.contains(curr)) { + addPathToResourceGroups(curr, group, fIncludeSymPathsList.getElements()); + fIncludeSymPathsList.refresh(); + fIncludeSymPathsList.selectElements(new StructuredSelection(curr)); + updateStatus(); + } + } + } + + } + + protected void addContributed() { + CPElement[] includes = openContainerSelectionDialog(null); + if (includes != null && includes.length > 0) { + int nElementsChosen = includes.length; + // remove duplicates + CPElementGroup group = getSelectedGroup(); + for (int i = 0; i < nElementsChosen; i++) { + CPElement curr = includes[i]; + if (!group.contains(curr)) { + addPathToResourceGroups(curr, getSelectedGroup(), fIncludeSymPathsList.getElements()); + fIncludeSymPathsList.refresh(); + fIncludeSymPathsList.selectElements(new StructuredSelection(curr)); + updateStatus(); + } + } + } + } + + 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.getString("IncludeSymbolEntryPage.fromWorkspaceDialog.new.title") //$NON-NLS-1$ + : CPathEntryMessages.getString("IncludeSymbolEntryPage.fromWorkspaceDialog.edit.title"); //$NON-NLS-1$ + String message = (existing == null) + ? CPathEntryMessages.getString("IncludeSymbolEntryPage.fromWorkspaceDialog.new.description") //$NON-NLS-1$ + : CPathEntryMessages.getString("IncludeSymbolEntryPage.fromWorkspaceDialog.edit.description"); //$NON-NLS-1$ + + 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; + } + + protected CPElement[] openContainerSelectionDialog(CPElement existing) { + IContainerEntry elem = null; + String title; + if (existing == null) { + title = CPathEntryMessages.getString("IncludeSymbolEntryPage.ContainerDialog.new.title"); //$NON-NLS-1$ + } else { + title = CPathEntryMessages.getString("IncludeSymbolEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$ + 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; + } + + private class SelectPathInputDialog extends InputDialog { + + public SelectPathInputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue, + IInputValidator validator) { + super(parentShell, dialogTitle, dialogMessage, initialValue, validator); + } + + protected void createButtonsForButtonBar(Composite parent) { + super.createButtonsForButtonBar(parent); + Button browse = createButton(parent, 3, + CPathEntryMessages.getString("IncludeSymbolEntryPage.addExternal.button.browse"), //$NON-NLS-1$ + false); + browse.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent ev) { + DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN); + dialog.setText(CPathEntryMessages.getString("IncludeSymbolEntryPage.browseForFolder")); //$NON-NLS-1$ + String currentName = getText().getText(); + if (currentName != null && currentName.trim().length() != 0) { + dialog.setFilterPath(currentName); + } + String dirname = dialog.open(); + if (dirname != null) { + getText().setText(dirname); + } + } + }); + } + + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathBasePage#getSelection() + */ + public List getSelection() { + return fIncludeSymPathsList.getSelectedElements(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathBasePage#setSelection(java.util.List) + */ + public void setSelection(List selElements) { + fIncludeSymPathsList.selectElements(new StructuredSelection(selElements)); + } + + public boolean isEntryKind(int kind) { + return kind == IPathEntry.CDT_INCLUDE || kind == IPathEntry.CDT_MACRO; + } + + public void performApply(IProgressMonitor monitor) throws CoreException { + } + + public void performDefaults() { + } + + /** + * @return + */ + public List getCPaths() { + List cPaths = new ArrayList(); + List groups = fIncludeSymPathsList.getElements(); + for (int i = 0; i < groups.size(); i++) { + CPElementGroup group = (CPElementGroup)groups.get(i); + CPElement[] elements = group.getChildren(); + for (int j = 0; j < elements.length; j++) { + if (elements[j].getInherited() == null) { + cPaths.add(elements[j]); + } + } + } + return cPaths; + } + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/dialogs/cpaths/NewIncludesSymbolsTabBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/dialogs/cpaths/NewIncludesSymbolsTabBlock.java index 3aac23a653d..c89d9376ba7 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/dialogs/cpaths/NewIncludesSymbolsTabBlock.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/dialogs/cpaths/NewIncludesSymbolsTabBlock.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.ui.dialogs.cpaths; import java.util.List; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IPathEntry; import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener; import org.eclipse.cdt.ui.dialogs.ICOptionPage; @@ -23,7 +24,7 @@ import org.eclipse.swt.widgets.Control; public class NewIncludesSymbolsTabBlock extends AbstractPathOptionBlock implements IStatusChangeListener { - private CPathIncludeSymbolEntryPage fIncludeSymbols; + private CPathIncludeSymbolEntryBasePage fIncludeSymbols; private List fCPaths; @@ -31,7 +32,6 @@ public class NewIncludesSymbolsTabBlock extends AbstractPathOptionBlock implemen public NewIncludesSymbolsTabBlock(IStatusChangeListener context, int pageToShow) { super(context, pageToShow); - fIncludeSymbols = new CPathIncludeSymbolEntryPage(this); } protected void addTab(ICOptionPage tab) { @@ -76,7 +76,13 @@ public class NewIncludesSymbolsTabBlock extends AbstractPathOptionBlock implemen protected void initialize(ICElement element, List cPaths) { fCPaths = cPaths; - if (fIncludeSymbols != null) { + if (element instanceof ICProject) { + fIncludeSymbols = new CPathIncludeSymbolEntryPage(this); + } + else { + fIncludeSymbols = new CPathIncludeSymbolEntryPerFilePage(this); + } + if (fIncludeSymbols != null) { fIncludeSymbols.init(element, cPaths); } doStatusLineUpdate(); @@ -105,4 +111,5 @@ public class NewIncludesSymbolsTabBlock extends AbstractPathOptionBlock implemen updateBuildPathStatus(); doStatusLineUpdate(); } + } \ No newline at end of file