From 7e7e45a917d6bc0e11e3e736125a6dcc8539c423 Mon Sep 17 00:00:00 2001 From: David Inglis Date: Tue, 19 Aug 2003 20:17:28 +0000 Subject: [PATCH] work in progress- make target provider/make target --- build/org.eclipse.cdt.make.core/.project | 1 + .../plugin.properties | 1 + build/org.eclipse.cdt.make.core/plugin.xml | 19 +- .../schema/MakeTargetBuilder.exsd | 105 +++++++++ .../eclipse/cdt/make/core/IMakeTarget.java | 19 +- .../cdt/make/core/IMakeTargetProvider.java | 13 +- .../eclipse/cdt/make/core/MakeBuilder.java | 8 +- .../eclipse/cdt/make/core/MakeCorePlugin.java | 8 +- .../cdt/make/core/MakeProjectNature.java | 4 +- .../cdt/make/core/MakeTargetEvent.java | 17 +- .../cdt/make/core/PluginResources.properties | 11 +- .../make/internal/core/BuildInfoFactory.java | 2 +- .../cdt/make/internal/core/ListenerList.java | 170 ++++++++++++++ .../cdt/make/internal/core/MakeTarget.java | 95 ++++++++ .../internal/core/MakeTargetProvider.java | 220 +++++++++++++++--- build/org.eclipse.cdt.make.ui/.project | 2 + .../icons/obj16/make_target.gif | Bin 0 -> 161 bytes .../cdt/make/internal/ui/MakeUIImages.java | 91 ++++++++ .../eclipse/cdt/make/ui/SettingsBlock.java | 12 +- .../ui/actions/UpdateMakeProjectAction.java | 2 +- .../make/ui/views/MakeContentProvider.java | 32 +-- .../cdt/make/ui/views/MakeLabelProvider.java | 4 +- 22 files changed, 749 insertions(+), 87 deletions(-) create mode 100644 build/org.eclipse.cdt.make.core/schema/MakeTargetBuilder.exsd create mode 100644 build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/ListenerList.java create mode 100644 build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java create mode 100644 build/org.eclipse.cdt.make.ui/icons/obj16/make_target.gif create mode 100644 build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeUIImages.java 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 0000000000000000000000000000000000000000..3fc40d6a13a0c4d921986dc50845f62f594f7f44 GIT binary patch literal 161 zcmZ?wbhEHb6ky@VYsp?bQKWQhc+}c95`^GepUT}I|u&%{-C85 z%76qEf3h%wxH=#LWQH?~pMb}KRa>>a)3_uPW~exs&YfJOz$3aZzj~WT?)ArkcWY`5 zyA~99NS!cSF