diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java index dcbd6a5dcff..964b0978c5f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java @@ -11,6 +11,7 @@ public interface ICDescriptor { public String getPlatform(); public IProject getProject(); public ICExtensionReference[] get(String name); + public ICExtensionReference[] get(String name, boolean update); public ICExtensionReference create(String name, String id); public void remove(ICExtensionReference extension); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICOwner.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICOwner.java index eeb56d49717..33ee00dd437 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICOwner.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICOwner.java @@ -6,5 +6,5 @@ package org.eclipse.cdt.core; public interface ICOwner { public void configure(ICDescriptor cproject); - public void update(ICDescriptor cproject); + public void update(ICDescriptor cproject, String extensionID); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptor.java index b756f08d701..41c35343066 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptor.java @@ -45,7 +45,7 @@ import org.xml.sax.SAXException; public class CDescriptor implements ICDescriptor { /* constants */ private static final String[] EMPTY_STRING_ARRAY = new String[0]; - private ICOwnerInfo fOwner; + private COwner fOwner; private IProject fProject; private String fPlatform = "*"; private HashMap extMap = new HashMap(4); @@ -57,6 +57,8 @@ public class CDescriptor implements ICDescriptor { private final String PROJECT_EXTENSION = "extension"; private final String PROJECT_EXTENSION_ATTRIBUTE = "attribute"; + private boolean fDirty; + protected void readCDTProject(IPath projectLocation) { FileInputStream file = null; try { @@ -141,10 +143,24 @@ public class CDescriptor implements ICDescriptor { return fProject; } - public ICExtensionReference[] get(String name) { - return (CExtensionReference[]) extMap.get(name); + public ICExtensionReference[] get(String extensionID) { + return (CExtensionReference[]) extMap.get(extensionID); } + public ICExtensionReference[] get(String extensionID, boolean update) { + ICExtensionReference[] ext = get(extensionID); + if ( (ext == null || ext.length == 0) && update) { + try { + fOwner.update(fProject, this, extensionID); + saveInfo(); + ext = get(extensionID); + } + catch (CoreException e) { + } + } + return ext; + } + public ICExtensionReference create(String name, String id) { CExtensionReference extensions[] = (CExtensionReference[]) extMap.get(name); if ( extensions == null ) { @@ -156,6 +172,7 @@ public class CDescriptor implements ICDescriptor { extensions = newExtensions; extMap.put(name, extensions); } + setDirty(); extensions[extensions.length-1] = new CExtensionReference(this, name, id); return extensions[extensions.length-1]; } @@ -173,6 +190,7 @@ public class CDescriptor implements ICDescriptor { } else { extMap.put(ext.getExtension(), extensions); } + setDirty(); } } } @@ -200,8 +218,8 @@ public class CDescriptor implements ICDescriptor { return node != null ? (node.getFirstChild() == null ? null : node.getFirstChild().getNodeValue()) : null; } - private ICOwnerInfo readProjectDescription(Node node) { - ICOwnerInfo owner = null; + private COwner readProjectDescription(Node node) { + COwner owner = null; NamedNodeMap attrib = node.getAttributes(); try { owner = new COwner(attrib.getNamedItem("id").getNodeValue()); @@ -254,10 +272,15 @@ public class CDescriptor implements ICDescriptor { } else { rscFile.create(inputStream, IResource.FORCE, null); } + fDirty = false; } - private boolean isDirty() { - return true; + protected void setDirty() { + fDirty = true; + } + + protected boolean isDirty() { + return fDirty; } protected String serializeDocument(Document doc) throws IOException { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptorManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptorManager.java index db84fb99d2c..05b1b5819db 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptorManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptorManager.java @@ -107,7 +107,7 @@ public class CDescriptorManager implements IResourceChangeListener { public ICExtension[] createExtensions(String extensionID, IProject project) throws CoreException { ArrayList extensionList = new ArrayList(1); ICDescriptor cDescriptor = getDescriptor(project); - ICExtensionReference ext[] = cDescriptor.get(extensionID); + ICExtensionReference ext[] = cDescriptor.get(extensionID, true); IPluginRegistry pluginRegistry = Platform.getPluginRegistry(); for( int i = 0; i < ext.length; i++ ) { IExtensionPoint extensionPoint = pluginRegistry.getExtensionPoint(ext[i].getExtension()); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/COwner.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/COwner.java index 8e3c9045fe3..27700db8c41 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/COwner.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/COwner.java @@ -89,12 +89,12 @@ public class COwner implements ICOwnerInfo { throw new CoreException(status); } - void update(IProject project, ICDescriptor cproject) throws CoreException { + void update(IProject project, ICDescriptor cproject, String extensionID) throws CoreException { IConfigurationElement element[] = extension.getConfigurationElements(); for( int i = 0; i < element.length; i++ ) { if ( element[i].getName().equalsIgnoreCase("run") ) { ICOwner owner = (ICOwner) element[i].createExecutableExtension("class"); - owner.update(cproject); + owner.update(cproject, extensionID); return; } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/make/MakeProject.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/make/MakeProject.java index dda857f06d3..fca9ebb0c18 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/make/MakeProject.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/make/MakeProject.java @@ -16,6 +16,10 @@ public class MakeProject implements ICOwner { ext.setExtensionData("command", "make"); } - public void update(ICDescriptor cproject) { + public void update(ICDescriptor cproject, String extensionID) { + if ( extensionID.equals(CCorePlugin.BUILDER_MODEL_ID ) ) { + ICExtensionReference ext = cproject.create(CCorePlugin.BUILDER_MODEL_ID, CCorePlugin.getDefault().PLUGIN_ID + ".makeBuilder"); + ext.setExtensionData("command", "make"); + } } }