diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java index 5d6192b7b10..46281b74fa0 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java @@ -4063,6 +4063,12 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI } return realTool; } + + public static IToolChain getExtensionToolChain(IToolChain tc){ + IToolChain extTc = tc; + for(;extTc != null && !extTc.isExtensionElement(); extTc= extTc.getSuperClass()); + return extTc; + } public static IToolChain getRealToolChain(IToolChain tc){ IToolChain extTc = tc; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java index 4618feb4bd2..3ea553f0dec 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java @@ -255,7 +255,7 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { } - public static ITool[] filtereTools(ITool localTools[], IManagedProject manProj) { + public ITool[] filtereTools(ITool localTools[], IManagedProject manProj) { // ITool[] localTools = toolChain.getTools(); // IManagedProject manProj = getParent().getManagedProject(); if (manProj == null) { @@ -265,8 +265,8 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { IProject project = (IProject)manProj.getOwner(); Vector tools = new Vector(localTools.length); for (int i = 0; i < localTools.length; i++) { - ITool tool = localTools[i]; - if(!tool.isEnabled()) + Tool tool = (Tool)localTools[i]; + if(!tool.isEnabled(this)) continue; try { @@ -743,6 +743,9 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { IToolChain newReal = ManagedBuildManager.getRealToolChain(newSuperClass); if(newReal != curReal){ + IToolChain extTc = ManagedBuildManager.getExtensionToolChain(newSuperClass); + if(extTc != null) + newSuperClass = extTc; ToolChain oldToolChain = toolChain; IConfigurationElement el = getToolChainConverterElement(newSuperClass); ITool oldTools[] = oldToolChain.getTools(); @@ -802,18 +805,22 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { } private ITool[][] checkDups(ITool[] removed, ITool[] added){ - LinkedHashMap removedMap = createRealMap(removed); - LinkedHashMap addedMap = createRealMap(added); + LinkedHashMap removedMap = createRealToExtToolMap(removed, false); + LinkedHashMap addedMap = createRealToExtToolMap(added, true); LinkedHashMap rmCopy = (LinkedHashMap)removedMap.clone(); removedMap.keySet().removeAll(addedMap.keySet()); addedMap.keySet().removeAll(rmCopy.keySet()); if(removedMap.size() != 0){ - LinkedHashMap curMap = createRealMap(getTools()); - for(Iterator iter = removedMap.keySet().iterator(); iter.hasNext();){ - Object key = iter.next(); - if(!curMap.containsKey(key)) + LinkedHashMap curMap = createRealToExtToolMap(getTools(), false); + for(Iterator iter = removedMap.entrySet().iterator(); iter.hasNext();){ + Map.Entry entry = (Map.Entry)iter.next(); + Object key = entry.getKey(); + Object curTool = curMap.get(key); + if(curTool != null) + entry.setValue(curTool); + else iter.remove(); } } @@ -823,12 +830,14 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { return result; } - private LinkedHashMap createRealMap(ITool[] tools){ + private LinkedHashMap createRealToExtToolMap(ITool[] tools, boolean extValues){ LinkedHashMap map = new LinkedHashMap(); for(int i = 0; i < tools.length; i++){ Tool realTool = (Tool)ManagedBuildManager.getRealTool(tools[i]); Object key = realTool.getMatchKey(); - map.put(key, tools[i]); + ITool toolValue = extValues ? ManagedBuildManager.getExtensionTool(tools[i]) : tools[i]; + if(toolValue != null) + map.put(key, toolValue); } return map; @@ -1040,29 +1049,32 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { private ITool[] calculateToolsArray(ITool[] removed, ITool[] added){ ITool tools[] = getTools(); - Map map = calcExtToolIdToToolMap(tools); - Map removedMap = calcExtToolIdToToolMap(removed); - for(Iterator iter = removedMap.keySet().iterator(); iter.hasNext();){ - map.remove(iter.next()); - } - map.putAll(calcExtToolIdToToolMap(added)); + LinkedHashMap map = createRealToExtToolMap(tools, false); + LinkedHashMap removedMap = createRealToExtToolMap(removed, false); + map.keySet().removeAll(removedMap.keySet()); +// +// for(Iterator iter = removedMap.keySet().iterator(); iter.hasNext();){ +// map.remove(iter.next()); +// } + map.putAll(createRealToExtToolMap(added, true)); + return (ITool[])map.values().toArray(new ITool[map.size()]); } - private Map calcExtToolIdToToolMap(ITool tools[]){ - Map map = new HashMap(); - for(int i = 0; i < tools.length; i++){ - ITool tool = tools[i]; - ITool extTool = ManagedBuildManager.getExtensionTool(tool); - if(extTool == null) - extTool = tool; - - map.put(extTool.getId(), tool); - } - - return map; - } +// private Map calcExtToolIdToToolMap(ITool tools[]){ +// Map map = new HashMap(); +// for(int i = 0; i < tools.length; i++){ +// ITool tool = tools[i]; +// ITool extTool = ManagedBuildManager.getExtensionTool(tool); +// if(extTool == null) +// extTool = tool; +// +// map.put(extTool.getId(), tool); +// } +// +// return map; +// } private ITool[][] calculateConflictingTools(ITool[] newTools){ HashSet set = new HashSet(); @@ -1108,6 +1120,9 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { public IModificationStatus getToolChainModificationStatus(ITool[] removed, ITool[] added){ + ITool[][] checked = checkDups(removed, added); + removed = checked[0]; + added = checked[1]; // Map converterMap = calculateConverterTools(removed, added, null, null); ITool newTools[] = calculateToolsArray(removed, added); ITool[][] conflicting = calculateConflictingTools(filtereTools(newTools, getParent().getManagedProject())); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java index 79feda2a6d0..74c7052c793 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java @@ -249,7 +249,8 @@ public abstract class HoldsOptions extends BuildObject implements IHoldsOptions, */ public void removeOption(IOption option) { if(option.getParent() != this) - throw new IllegalArgumentException(); + return; +// throw new IllegalArgumentException(); getOptionList().remove(option); getOptionMap().remove(option.getId()); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java index 27ec19153e1..b0cbcef4ddc 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java @@ -3603,11 +3603,16 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch } public boolean isEnabled() { + return isEnabled(getParentResourceInfo()); + } + + public boolean isEnabled(IResourceInfo rcInfo) { + BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); if(calc == null) return true; - return calc.isToolUsedInCommandLine(getParentResourceInfo(), this); + return calc.isToolUsedInCommandLine(rcInfo, this); } public boolean matches(ITool tool){ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java index 4c475ec09c9..289a5b359dd 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java @@ -1019,6 +1019,21 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert tools = newTools; } } + + if(!isExtensionToolChain){ + for(int i = 0; i < tools.length; i++){ + if(tools[i].getParent() != this){ + ArrayList list = new ArrayList(Arrays.asList(tools)); + for(int k = 0; k < list.size(); k++){ + if(((ITool)list.get(k)).getParent() != this){ + list.remove(k); + } + } + tools = (ITool[])list.toArray(new ITool[list.size()]); + break; + } + } + } } else { tools = new ITool[getToolList().size()]; Iterator iter = getToolList().listIterator(); diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java index 4514819983b..bedb6153295 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ToolSelectionDialog.java @@ -235,7 +235,8 @@ public class ToolSelectionDialog extends Dialog { s = s + Messages.getString("ToolSelectionDialog.11"); //$NON-NLS-1$ } errorLabel.setText(s); - getButton(IDialogConstants.OK_ID).setEnabled(false); + if(getButton(IDialogConstants.OK_ID) != null) + getButton(IDialogConstants.OK_ID).setEnabled(false); } } }