diff --git a/build/org.eclipse.cdt.make.core/.project b/build/org.eclipse.cdt.make.core/.project index 177b525e7d9..9631799138d 100644 --- a/build/org.eclipse.cdt.make.core/.project +++ b/build/org.eclipse.cdt.make.core/.project @@ -8,6 +8,7 @@ org.eclipse.cdt.core.qnx org.eclipse.cdt.core.solaris org.eclipse.cdt.core.win32 + org.eclipse.core.resources diff --git a/build/org.eclipse.cdt.make.core/plugin.properties b/build/org.eclipse.cdt.make.core/plugin.properties index abdd82e5f8e..0c13be60b2c 100644 --- a/build/org.eclipse.cdt.make.core/plugin.properties +++ b/build/org.eclipse.cdt.make.core/plugin.properties @@ -1,5 +1,6 @@ pluginName=C/C++ Standard make Build Core providerName=Eclipse.org +extensionTargetBuilder.name=Target Builder Extension natureMake.name=CDT Make Nature builderMake.name=CDT Makefile Builder \ No newline at end of file diff --git a/build/org.eclipse.cdt.make.core/plugin.xml b/build/org.eclipse.cdt.make.core/plugin.xml index b68ece0198f..0515739196a 100644 --- a/build/org.eclipse.cdt.make.core/plugin.xml +++ b/build/org.eclipse.cdt.make.core/plugin.xml @@ -15,7 +15,10 @@ - + + @@ -44,8 +47,10 @@ id="makeBuilder" name="%builderMake.name" point="org.eclipse.core.resources.builders"> - - + + @@ -61,4 +66,12 @@ class="org.eclipse.cdt.make.internal.core.MakeProject"> + + + + + diff --git a/build/org.eclipse.cdt.make.core/schema/MakeTargetBuilder.exsd b/build/org.eclipse.cdt.make.core/schema/MakeTargetBuilder.exsd new file mode 100644 index 00000000000..9a18b62b27e --- /dev/null +++ b/build/org.eclipse.cdt.make.core/schema/MakeTargetBuilder.exsd @@ -0,0 +1,105 @@ + + + + + + + + + This extension point is used to identify builders that support IMakeBuidlerInfo an arguments. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Eclipse builder ID of the builder that supports target builds. (Must support IMakeInfo as argument). + + + + + + + id used to identify this target builder + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + + + + + + + + + diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTarget.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTarget.java index 9f77544345e..816d6620a45 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTarget.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTarget.java @@ -11,14 +11,29 @@ package org.eclipse.cdt.make.core; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; public interface IMakeTarget { - IMakeTargetProvider getProvider(); String getName(); - IContainer getContainer(); + String getTargetBuilderID(); + + String getBuilderID(); + boolean isStopOnError(); + void setStopOnError(boolean stopOnError); + boolean isDefaultBuildCmd(); + void setUseDefaultBuildCmd(boolean useDefault); + IPath getBuildCommand(); + void setBuildCommand(IPath command); + String getBuildArguments(); + void setBuildArguments(); + + IContainer getContainer(); + + void build(IProgressMonitor monitor) throws CoreException; } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTargetProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTargetProvider.java index a27cc8ac3bc..a7809c718f9 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTargetProvider.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/IMakeTargetProvider.java @@ -11,14 +11,17 @@ package org.eclipse.cdt.make.core; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; public interface IMakeTargetProvider { + IMakeTarget addTarget(IContainer container, String targetBuilderID, String targetName) throws CoreException; + void removeTarget(IMakeTarget target) throws CoreException; + void renameTarget(IMakeTarget target, String name) throws CoreException; - IMakeTarget[] getTargets(); - IMakeTarget[] getTargets(IContainer container); - - IMakeBuilderInfo getBuilderInfo(IMakeTarget target); - + IMakeTarget[] getTargets(IContainer container) throws CoreException; + IProject[] getTargetBuilderProjects() throws CoreException; + void addListener(IMakeTargetListener listener); void removeListener(IMakeTargetListener listener); } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java index 9578a9225ad..8ae374dff1d 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java @@ -67,7 +67,7 @@ public class MakeBuilder extends ACBuilder { */ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { boolean bPerformBuild = true; - IMakeBuilderInfo info = MakeCorePlugin.create(args, MakeBuilder.BUILDER_ID); + IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(args, MakeBuilder.BUILDER_ID); if (!shouldBuild(kind, info)) { return new IProject[0]; } @@ -99,7 +99,7 @@ public class MakeBuilder extends ACBuilder { if (monitor == null) { monitor = new NullProgressMonitor(); } - monitor.beginTask("Invoking Make Builder: " + currProject.getName(), IProgressMonitor.UNKNOWN); + monitor.beginTask(MakeCorePlugin.getResourceString("MakeBuilder.Invoking_Make_Builder") + currProject.getName(), IProgressMonitor.UNKNOWN); //$NON-NLS-1$ try { IPath buildCommand = info.getBuildCommand(); @@ -118,7 +118,7 @@ public class MakeBuilder extends ACBuilder { isClean = true; // Before launching give visual cues via the monitor subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN); - subMonitor.subTask("Invoking Command: " + buildCommand.toString()); + subMonitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Invoking_Command") + buildCommand.toString()); //$NON-NLS-1$ String errMsg = null; CommandLauncher launcher = new CommandLauncher(); @@ -174,7 +174,7 @@ public class MakeBuilder extends ACBuilder { isCanceled = monitor.isCanceled(); monitor.setCanceled(false); subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN); - subMonitor.subTask("Updating project..."); + subMonitor.subTask(MakeCorePlugin.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$ try { currProject.refreshLocal(IResource.DEPTH_INFINITE, subMonitor); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java index 9444ea42e94..46b6492c1b7 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java @@ -91,7 +91,7 @@ public class MakeCorePlugin extends Plugin { } protected void initializeDefaultPluginPreferences() { - IMakeBuilderInfo info = create(getPluginPreferences(), MakeBuilder.BUILDER_ID, true); + IMakeBuilderInfo info = createBuildInfo(getPluginPreferences(), MakeBuilder.BUILDER_ID, true); try { info.setBuildCommand(new Path("make")); //$NON-NLS-1$ info.setBuildLocation(new Path("")); //$NON-NLS-1$ @@ -108,15 +108,15 @@ public class MakeCorePlugin extends Plugin { getPluginPreferences().setDefault(CCorePlugin.PREF_BINARY_PARSER, CCorePlugin.PLUGIN_ID + ".ELF"); //$NON-NLS-1$ } - public static IMakeBuilderInfo create(Preferences prefs, String builderID, boolean useDefaults) { + public static IMakeBuilderInfo createBuildInfo(Preferences prefs, String builderID, boolean useDefaults) { return BuildInfoFactory.create(prefs, builderID, useDefaults); } - public static IMakeBuilderInfo create(IProject project, String builderID) throws CoreException { + public static IMakeBuilderInfo createBuildInfo(IProject project, String builderID) throws CoreException { return BuildInfoFactory.create(project, builderID); } - public static IMakeBuilderInfo create(Map args, String builderID) { + public static IMakeBuilderInfo createBuildInfo(Map args, String builderID) { return BuildInfoFactory.create(args, builderID); } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeProjectNature.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeProjectNature.java index 987a21aa5f5..06a47090492 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeProjectNature.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeProjectNature.java @@ -100,8 +100,8 @@ public class MakeProjectNature implements IProjectNature { */ public void configure() throws CoreException { addBuildSpec(); - IMakeBuilderInfo info = MakeCorePlugin.create(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID, false); - IMakeBuilderInfo projectInfo = MakeCorePlugin.create(getProject(), MakeBuilder.BUILDER_ID); + IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID, false); + IMakeBuilderInfo projectInfo = MakeCorePlugin.createBuildInfo(getProject(), MakeBuilder.BUILDER_ID); projectInfo.setBuildLocation(info.getBuildLocation()); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeTargetEvent.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeTargetEvent.java index 7f227596fdb..4fe3126d923 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeTargetEvent.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeTargetEvent.java @@ -12,12 +12,17 @@ package org.eclipse.cdt.make.core; import java.util.EventObject; +import org.eclipse.core.resources.IProject; + public class MakeTargetEvent extends EventObject { - public final int TARGET_ADD = 1; - public final int TARGET_CHANGED = 2; - public final int TARGET_REMOVED = 3; + public static final int TARGET_ADD = 1; + public static final int TARGET_CHANGED = 2; + public static final int TARGET_REMOVED = 3; + public static final int PROJECT_ADDED = 4; + public static final int PROJECT_REMOVED = 5; IMakeTarget target; + IProject project; int type; /** @@ -29,6 +34,12 @@ public class MakeTargetEvent extends EventObject { this.target = target; } + public MakeTargetEvent(Object source, int type, IProject project) { + super(source); + this.type = type; + this.project = project; + } + public int getType() { return type; } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/PluginResources.properties b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/PluginResources.properties index bd5353c9062..e0fefdabd7e 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/PluginResources.properties +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/PluginResources.properties @@ -1,2 +1,11 @@ -MakeBuilder.buildError= Error launching builder ({0}) \ No newline at end of file +MakeBuilder.buildError=Error launching builder ({0}) +MakeBuilder.Invoking_Make_Builder=Invoking Make Builder: +MakeBuilder.Invoking_Command=Invoking Command: +MakeBuilder.Updating_project=Updating project... + +BuildInfoFactory.Missing_Builder=Missing Builder: + +MakeTargetProvider.add_to_workspace_root=Cannot add build targets to workspace root +MakeTargetProvider.target_exists=Target exists +MakeTargetProvider.failed_initializing_targets=Failed initializing build targets diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/BuildInfoFactory.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/BuildInfoFactory.java index 6ba49d43f7d..62ab15f3bb5 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/BuildInfoFactory.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/BuildInfoFactory.java @@ -221,7 +221,7 @@ public class BuildInfoFactory { builder = MakeProjectNature.getBuildSpec(project, builderID); if (builder == null) { throw new CoreException( - new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, "Missing Builder: " + builderID, null)); + new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("BuildInfoFactory.Missing_Builder") + builderID, null)); //$NON-NLS-1$ } args = builder.getArguments(); } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/ListenerList.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/ListenerList.java new file mode 100644 index 00000000000..2e526580b35 --- /dev/null +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/ListenerList.java @@ -0,0 +1,170 @@ +/* + * Created on 19-Aug-2003 + * + * Copyright (c) 2002,2003 QNX Software Systems Ltd. + * + * Contributors: + * QNX Software Systems - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.make.internal.core; + +/** + * This class is used to maintain a list of listeners, and + * is used in the implementations of several classes within JFace + * which allow you to register listeners of various kinds. + * It is a fairly lightweight object, occupying minimal space when + * no listeners are registered. + *

+ * Note that the add method checks for and eliminates + * duplicates based on identity (not equality). Likewise, the + * remove method compares based on identity. + *

+ *

+ * Use the getListeners method when notifying listeners. + * Note that no garbage is created if no listeners are registered. + * The recommended code sequence for notifying all registered listeners + * of say, FooListener.eventHappened, is: + *

+ * Object[] listeners = myListenerList.getListeners();
+ * for (int i = 0; i < listeners.length; ++i) {
+ *    ((FooListener) listeners[i]).eventHappened(event);
+ * }
+ * 
+ *

+ */ +public class ListenerList { + /** + * The initial capacity of the list. Always >= 1. + */ + private int capacity; + + /** + * The current number of listeners. + * Maintains invariant: 0 <= size <= listeners.length. + */ + private int size; + + /** + * The list of listeners. Initially null but initialized + * to an array of size capacity the first time a listener is added. + * Maintains invariant: listeners != null IFF size != 0 + */ + private Object[] listeners = null; + + /** + * The empty array singleton instance, returned by getListeners() + * when size == 0. + */ + private static final Object[] EmptyArray = new Object[0]; + + /** + * Creates a listener list with an initial capacity of 1. + */ + public ListenerList() { + this(1); + } + + /** + * Creates a listener list with the given initial capacity. + * + * @param capacity the number of listeners which this list can initially accept + * without growing its internal representation; must be at least 1 + */ + public ListenerList(int capacity) { + this.capacity = capacity; + } + + /** + * Adds the given listener to this list. Has no effect if an identical listener + * is already registered. + * + * @param listener the listener + */ + public void add(Object listener) { + if (size == 0) { + listeners = new Object[capacity]; + } else { + // check for duplicates using identity + for (int i = 0; i < size; ++i) { + if (listeners[i] == listener) { + return; + } + } + // grow array if necessary + if (size == listeners.length) { + System.arraycopy(listeners, 0, listeners = new Object[size * 2 + 1], 0, size); + } + } + listeners[size++] = listener; + } + + /** + * Removes all listeners from this list. + */ + public void clear() { + size = 0; + listeners = null; + } + + /** + * Returns an array containing all the registered listeners, + * in the order in which they were added. + *

+ * The resulting array is unaffected by subsequent adds or removes. + * If there are no listeners registered, the result is an empty array + * singleton instance (no garbage is created). + * Use this method when notifying listeners, so that any modifications + * to the listener list during the notification will have no effect on the + * notification itself. + *

+ * + * @return the list of registered listeners + */ + public Object[] getListeners() { + if (size == 0) + return EmptyArray; + Object[] result = new Object[size]; + System.arraycopy(listeners, 0, result, 0, size); + return result; + } + + /** + * Returns whether this listener list is empty. + * + * @return true if there are no registered listeners, and + * false otherwise + */ + public boolean isEmpty() { + return size == 0; + } + + /** + * Removes the given listener from this list. Has no effect if an identical + * listener was not already registered. + * + * @param listener the listener + */ + public void remove(Object listener) { + for (int i = 0; i < size; ++i) { + if (listeners[i] == listener) { + if (size == 1) { + listeners = null; + size = 0; + } else { + System.arraycopy(listeners, i + 1, listeners, i, --size - i); + listeners[size] = null; + } + return; + } + } + } + + /** + * Returns the number of registered listeners. + * + * @return the number of registered listeners + */ + public int size() { + return size; + } +} diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java new file mode 100644 index 00000000000..509f4ab3ada --- /dev/null +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java @@ -0,0 +1,95 @@ +/* + * Created on 19-Aug-2003 + * + * Copyright (c) 2002,2003 QNX Software Systems Ltd. + * + * Contributors: + * QNX Software Systems - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.make.internal.core; + +import org.eclipse.cdt.make.core.IMakeTarget; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; + +public class MakeTarget implements IMakeTarget { + + MakeTarget(String targetBuilderID, String targetName) { + // dinglis-TODO Auto-generated constructor stub + } + + void setName(String name) { + // dinglis-TODO Auto-generated method stub + } + + void setContainer(IContainer container) { + // dinglis-TODO Auto-generated method stub + } + + public String getName() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public String getTargetBuilderID() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public String getBuilderID() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public boolean isStopOnError() { + // dinglis-TODO Auto-generated method stub + return false; + } + + public void setStopOnError(boolean stopOnError) { + // dinglis-TODO Auto-generated method stub + + } + + public boolean isDefaultBuildCmd() { + // dinglis-TODO Auto-generated method stub + return false; + } + + public void setUseDefaultBuildCmd(boolean useDefault) { + // dinglis-TODO Auto-generated method stub + + } + + public IPath getBuildCommand() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public void setBuildCommand(IPath command) { + // dinglis-TODO Auto-generated method stub + + } + + public String getBuildArguments() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public void setBuildArguments() { + // dinglis-TODO Auto-generated method stub + + } + + public IContainer getContainer() { + // dinglis-TODO Auto-generated method stub + return null; + } + + public void build(IProgressMonitor monitor) throws CoreException { + // dinglis-TODO Auto-generated method stub + + } +} diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTargetProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTargetProvider.java index 9c7077f203e..c90489dba93 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTargetProvider.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTargetProvider.java @@ -10,55 +10,213 @@ ***********************************************************************/ package org.eclipse.cdt.make.internal.core; -import org.eclipse.cdt.make.core.IMakeBuilderInfo; +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Vector; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.core.IMakeTargetListener; import org.eclipse.cdt.make.core.IMakeTargetProvider; +import org.eclipse.cdt.make.core.MakeCorePlugin; +import org.eclipse.cdt.make.core.MakeTargetEvent; +import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; -public class MakeTargetProvider implements IMakeTargetProvider { +public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeListener { + private static String TARGET_BUILD_EXT = MakeCorePlugin.getUniqueIdentifier() + ".MakeTargetBuilder"; //$NON-NLS-1$ + + private static String BUILD_TARGET_ELEMENT = "buildTargets"; //$NON-NLS-1$ + private static String TARGET_ELEMENT = "target"; //$NON-NLS-1$ + + private ListenerList listeners = new ListenerList(); + private HashMap projectMap = new HashMap(); + private HashMap builderMap; public MakeTargetProvider() { } - /* (non-Javadoc) - * @see org.eclipse.cdt.make.core.IMakeTargetProvider#getTargets() - */ - public IMakeTarget[] getTargets() { - // dinglis-TODO Auto-generated method stub - return null; + public IMakeTarget addTarget(IContainer container, String targetBuilderID, String targetName) throws CoreException { + if (container instanceof IWorkspaceRoot) { + throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.add_to_workspace_root"), null)); //$NON-NLS-1$ + } + IProject project = container.getProject(); + HashMap targetMap = (HashMap) projectMap.get(project); + if (targetMap == null) { + targetMap = initializeTargets(project); + } + ArrayList list = (ArrayList) targetMap.get(container); + MakeTarget target = new MakeTarget(targetBuilderID, targetName); + if (list != null && list.contains(target)) { + throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.target_exists"), null)); //$NON-NLS-1$ + } + target.setContainer(container); + if (list == null) { + list = new ArrayList(); + targetMap.put(container, list); + } + list.add(target); + notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_ADD, target)); + return target; } - /* (non-Javadoc) - * @see org.eclipse.cdt.make.core.IMakeTargetProvider#getTargets(org.eclipse.core.resources.IContainer) - */ - public IMakeTarget[] getTargets(IContainer container) { - // dinglis-TODO Auto-generated method stub - return null; + public void removeTarget(IMakeTarget target) throws CoreException { + IProject project = target.getContainer().getProject(); + HashMap targetMap = (HashMap) projectMap.get(project); + if (targetMap == null) { + targetMap = initializeTargets(project); + } + ArrayList list = (ArrayList) targetMap.get(target.getContainer()); + if (list != null && !list.contains(target)) { + return; + } + list.remove(target); + if (list.size() == 0) { + targetMap.remove(list); + } + if (targetMap.size() == 0) { + projectMap.remove(project); + } + notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_REMOVED, target)); } - /* (non-Javadoc) - * @see org.eclipse.cdt.make.core.IMakeTargetProvider#getBuilderInfo(org.eclipse.cdt.make.core.IMakeTarget) - */ - public IMakeBuilderInfo getBuilderInfo(IMakeTarget target) { - // dinglis-TODO Auto-generated method stub - return null; + public void renameTarget(IMakeTarget target, String name) throws CoreException { + IProject project = target.getContainer().getProject(); + HashMap targetMap = (HashMap) projectMap.get(project); + if (targetMap == null) { + targetMap = initializeTargets(project); + } + ArrayList list = (ArrayList) targetMap.get(target.getContainer()); + if (list != null && !list.contains(target)) { + throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.target_does_not_exists"), null)); //$NON-NLS-1$ + } + ((MakeTarget) target).setName(name); + notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_CHANGED, target)); + } + + public IMakeTarget[] getTargets(IContainer container) throws CoreException { + IProject project = container.getProject(); + HashMap targetMap = (HashMap) projectMap.get(project); + if (targetMap == null) { + targetMap = initializeTargets(project); + } + ArrayList list = (ArrayList) targetMap.get(container); + if (list != null) { + return (IMakeTarget[]) list.toArray(new IMakeTarget[list.size()]); + } + return new IMakeTarget[0]; + } + + private HashMap initializeTargets(IProject project) throws CoreException { + HashMap targetMap = new HashMap(); + IPath targetFilePath = MakeCorePlugin.getDefault().getStateLocation().append(project.getName()); + File targetFile = targetFilePath.toFile(); + if (targetFile.exists()) { + try { + FileInputStream file = new FileInputStream(targetFile); + DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document document = parser.parse(file); + Node node = document.getFirstChild(); + if (node.getNodeName().equals(BUILD_TARGET_ELEMENT)) { + NodeList list = node.getChildNodes(); + for( int i = 0; i < list.getLength(); i++) { + Node item = list.item(i); + if ( item.getNodeName().equals(TARGET_ELEMENT)) { + NamedNodeMap attr = item.getAttributes(); + MakeTarget target = new MakeTarget(attr.getNamedItem("targetID").getNodeValue(), attr.getNamedItem("name").getNodeValue()); //$NON-NLS-1$ //$NON-NLS-2$ + +// targetMap.put(container, target); + } + } + } + } catch (Exception e) { + throw new CoreException( + new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.failed_initializing_targets"), e)); //$NON-NLS-1$ + } + } + return targetMap; + } + + public IProject[] getTargetBuilderProjects() throws CoreException { + Vector tProj = new Vector(); + IProject project[] = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + for (int i = 0; i < project.length; i++) { + IProjectDescription description = project[i].getDescription(); + ICommand builder[] = description.getBuildSpec(); + for (int j = 0; j < builder.length; j++) { + if (builderMap.containsValue(builder[j].getBuilderName())) { + tProj.add(project[i]); + break; + } + } + } + return (IProject[]) tProj.toArray(new IProject[tProj.size()]); + } + + public void startup() { + initializeBuilders(); + ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + } + + public void shutdown() { + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); + } + + private void initializeBuilders() { + builderMap = new HashMap(); + + IExtensionPoint point = MakeCorePlugin.getDefault().getDescriptor().getExtensionPoint(MakeTargetProvider.TARGET_BUILD_EXT); + IExtension[] ext = point.getExtensions(); + for (int i = 0; i < ext.length; i++) { + IConfigurationElement[] element = ext[i].getConfigurationElements(); + for (int j = 0; j < element.length; j++) { + if (element[j].getName().equals("builder")) { //$NON-NLS-1$ + String builderID = element[j].getAttribute("builderID"); //$NON-NLS-1$ + String targetID = element[j].getAttribute("id"); //$NON-NLS-1$ + builderMap.put(targetID, builderID); + } + } + } + } + + private void notifyListeners(MakeTargetEvent event) { + Object[] list = listeners.getListeners(); + for (int i = 0; i < list.length; i++) { + ((IMakeTargetListener) list[i]).targetChanged(event); + } } - /* (non-Javadoc) - * @see org.eclipse.cdt.make.core.IMakeTargetProvider#addListener(org.eclipse.cdt.make.core.IMakeTargetListener) - */ public void addListener(IMakeTargetListener listener) { - // dinglis-TODO Auto-generated method stub - + listeners.add(listener); } - /* (non-Javadoc) - * @see org.eclipse.cdt.make.core.IMakeTargetProvider#removeListener(org.eclipse.cdt.make.core.IMakeTargetListener) - */ public void removeListener(IMakeTargetListener listener) { - // dinglis-TODO Auto-generated method stub - + listeners.remove(listeners); } -} + public void resourceChanged(IResourceChangeEvent event) { + // dinglis-TODO listen for project that add/remove a target type builder + + } +} \ No newline at end of file diff --git a/build/org.eclipse.cdt.make.ui/.project b/build/org.eclipse.cdt.make.ui/.project index 4d8db9f7ba4..bacedc79cd0 100644 --- a/build/org.eclipse.cdt.make.ui/.project +++ b/build/org.eclipse.cdt.make.ui/.project @@ -10,6 +10,8 @@ org.eclipse.cdt.core.win32 org.eclipse.cdt.make.core org.eclipse.cdt.ui + org.eclipse.core.resources + org.eclipse.ui.workbench diff --git a/build/org.eclipse.cdt.make.ui/icons/obj16/make_target.gif b/build/org.eclipse.cdt.make.ui/icons/obj16/make_target.gif new file mode 100644 index 00000000000..3fc40d6a13a Binary files /dev/null and b/build/org.eclipse.cdt.make.ui/icons/obj16/make_target.gif differ diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeUIImages.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeUIImages.java new file mode 100644 index 00000000000..5fc7add2f46 --- /dev/null +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeUIImages.java @@ -0,0 +1,91 @@ +/* + * Created on 19-Aug-2003 + * + * Copyright (c) 2002,2003 QNX Software Systems Ltd. + * + * Contributors: + * QNX Software Systems - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.make.internal.ui; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.graphics.Image; + +public class MakeUIImages { + + /** + * Bundle of all images used by the Make plugin. + */ + + // The plugin registry + private static ImageRegistry imageRegistry = new ImageRegistry(); + + // Subdirectory (under the package containing this class) where 16 color images are + private static URL fgIconBaseURL; + static { + try { + fgIconBaseURL = new URL(MakeUIPlugin.getDefault().getDescriptor().getInstallURL(), "icons/"); //$NON-NLS-1$ + } catch (MalformedURLException e) { + MakeUIPlugin.log(e); + } + } + private static final String NAME_PREFIX = MakeUIPlugin.getUniqueIdentifier() + '.'; + private static final int NAME_PREFIX_LENGTH = NAME_PREFIX.length(); + + public static final String OBJ = "obj16/"; //$NON-NLS-1$ + + // For the build image + public static final String IMG_OBJS_MAKE_TARGET = NAME_PREFIX + "make_target.gif"; //$NON-NLS-1$ + public static final ImageDescriptor DESC_BUILD_TARGET = createManaged(OBJ, IMG_OBJS_MAKE_TARGET); + + private static ImageDescriptor createManaged(String prefix, String name) { + return createManaged(imageRegistry, prefix, name); + } + + private static ImageDescriptor createManaged(ImageRegistry registry, String prefix, String name) { + ImageDescriptor result = ImageDescriptor.createFromURL(makeIconFileURL(prefix, name.substring(NAME_PREFIX_LENGTH))); + registry.put(name, result); + return result; + } + + public static Image getImage(String key) { + return imageRegistry.get(key); + } + + private static ImageDescriptor create(String prefix, String name) { + return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name)); + } + + private static URL makeIconFileURL(String prefix, String name) { + StringBuffer buffer = new StringBuffer(prefix); + buffer.append(name); + try { + return new URL(fgIconBaseURL, buffer.toString()); + } catch (MalformedURLException e) { + MakeUIPlugin.log(e); + return null; + } + } + + /** + * Sets all available image descriptors for the given action. + */ + public static void setImageDescriptors(IAction action, String type, String relPath) { + relPath = relPath.substring(NAME_PREFIX_LENGTH); + action.setDisabledImageDescriptor(create("d" + type, relPath)); //$NON-NLS-1$ + action.setHoverImageDescriptor(create("c" + type, relPath)); //$NON-NLS-1$ + action.setImageDescriptor(create("e" + type, relPath)); //$NON-NLS-1$ + } + + /** + * Helper method to access the image registry from the JavaPlugin class. + */ + static ImageRegistry getImageRegistry() { + return imageRegistry; + } +} diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/SettingsBlock.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/SettingsBlock.java index a4de8beba57..71aaf3558ac 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/SettingsBlock.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/SettingsBlock.java @@ -262,9 +262,9 @@ public class SettingsBlock extends AbstractCOptionPage { monitor.beginTask("Applying Settings...", 1); IMakeBuilderInfo info; if (getContainer().getProject() != null) { - info = MakeCorePlugin.create(getContainer().getProject(), fBuilderID); + info = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID); } else { - info = MakeCorePlugin.create(fPrefs, fBuilderID, false); + info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false); } info.setStopOnError(isStopOnError()); info.setUseDefaultBuildCmd(useDefaultBuildCmd()); @@ -305,9 +305,9 @@ public class SettingsBlock extends AbstractCOptionPage { public void performDefaults() { IMakeBuilderInfo info; if (getContainer().getProject() != null) { - info = MakeCorePlugin.create(fPrefs, fBuilderID, false); + info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false); } else { - info = MakeCorePlugin.create(fPrefs, fBuilderID, true); + info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, true); } if (info.isStopOnError()) stopRadioButtons.setSelectValue(STOP_ARG); @@ -359,11 +359,11 @@ public class SettingsBlock extends AbstractCOptionPage { super.setContainer(container); if (getContainer().getProject() != null) { try { - fBuildInfo = MakeCorePlugin.create(getContainer().getProject(), fBuilderID); + fBuildInfo = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID); } catch (CoreException e) { } } else { - fBuildInfo = MakeCorePlugin.create(fPrefs, fBuilderID, false); + fBuildInfo = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false); } } diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/actions/UpdateMakeProjectAction.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/actions/UpdateMakeProjectAction.java index 963bca2e9a7..28314f50f2f 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/actions/UpdateMakeProjectAction.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/actions/UpdateMakeProjectAction.java @@ -118,7 +118,7 @@ public class UpdateMakeProjectAction implements IWorkbenchWindowActionDelegate { MakeProjectNature.addNature(project[i], new SubProgressMonitor(monitor, 1)); QualifiedName qlocation = new QualifiedName(CCorePlugin.PLUGIN_ID, "buildLocation"); String location = project[i].getPersistentProperty(qlocation); - IMakeBuilderInfo newInfo = MakeCorePlugin.create(project[i], MakeBuilder.BUILDER_ID); + IMakeBuilderInfo newInfo = MakeCorePlugin.createBuildInfo(project[i], MakeBuilder.BUILDER_ID); newInfo.setBuildCommand(new Path(location)); //remove old properties diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeContentProvider.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeContentProvider.java index da47c935b6d..a70f7ac1a9c 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeContentProvider.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeContentProvider.java @@ -7,9 +7,10 @@ package org.eclipse.cdt.make.ui.views; import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.core.IMakeTargetListener; -import org.eclipse.cdt.make.core.IMakeTargetProvider; +import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.MakeTargetEvent; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; @@ -27,12 +28,9 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis */ public Object[] getChildren(Object obj) { if (obj instanceof IContainer) { - if (viewer != null) { - Object input = viewer.getInput(); - if (input instanceof IMakeTargetProvider) { - IMakeTargetProvider provider = (IMakeTargetProvider)obj; - return provider.getTargets((IContainer)obj); - } + try { + return MakeCorePlugin.getDefault().getTargetProvider().getTargets((IContainer)obj); + } catch (CoreException e) { } } return new Object[0]; @@ -69,12 +67,7 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis */ public void dispose() { if (viewer != null) { - Object obj = viewer.getInput(); - if (obj instanceof IMakeTargetProvider) { - IMakeTargetProvider provider = (IMakeTargetProvider)obj; - provider.removeListener(this); - provider = null; - } + MakeCorePlugin.getDefault().getTargetProvider().removeListener(this); } } @@ -82,17 +75,10 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis * @see IContentProvider#inputChanged(Viewer, Object, Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + if (this.viewer == null) { + MakeCorePlugin.getDefault().getTargetProvider().addListener(this); + } this.viewer = viewer; - if (oldInput != null) { - if (oldInput instanceof IMakeTargetProvider) { - ((IMakeTargetProvider)oldInput).removeListener(this); - } - } - if (newInput != null) { - if (newInput instanceof IMakeTargetProvider) { - ((IMakeTargetProvider)newInput).addListener(this); - } - } } /* (non-Javadoc) diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeLabelProvider.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeLabelProvider.java index d1ee6f70140..b6a19c5f916 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeLabelProvider.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/views/MakeLabelProvider.java @@ -6,6 +6,7 @@ package org.eclipse.cdt.make.ui.views; */ import org.eclipse.cdt.make.core.IMakeTarget; +import org.eclipse.cdt.make.internal.ui.MakeUIImages; import org.eclipse.core.resources.IContainer; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; @@ -20,6 +21,7 @@ public class MakeLabelProvider extends LabelProvider { public Image getImage(Object obj) { Image image = null; if (obj instanceof IMakeTarget) { + return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKE_TARGET); } else if (obj instanceof IContainer) { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); } @@ -35,6 +37,6 @@ public class MakeLabelProvider extends LabelProvider { } else if (obj instanceof IContainer) { return ((IContainer)obj).getName(); } - return ""; + return ""; //$NON-NLS-1$ } }