1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

New build model from Sam Robb.

This commit is contained in:
Doug Schaefer 2003-02-17 19:13:07 +00:00
parent f79f421947
commit 18177e7a35
94 changed files with 12140 additions and 293 deletions

View file

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="builder/"/>
<classpathentry kind="src" path="index/"/>
<classpathentry kind="src" path="model/"/>
<classpathentry kind="src" path="src/"/>
<classpathentry kind="src" path="utils/"/>
<classpathentry kind="src" path="build"/>
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
<classpathentry kind="src" path="/org.apache.xerces"/>
@ -12,6 +12,6 @@
<classpathentry kind="src" path="/org.eclipse.compare"/>
<classpathentry kind="src" path="/org.eclipse.debug.core"/>
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
<classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -1,3 +1,10 @@
2003-02-17 Doug Schaefer
Merged in Sam Robb's source for the build model. The source can be
found in the build source folder. There are new extension point schema
in the schema folder. As well a number of extension points and extensions
have been added to the plugin.xml file.
2003-02-13 Alain Magloire
* src/org/eclipse/cdt/core/CCorePlugin.java:

View file

@ -0,0 +1,197 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import java.io.File;
import java.io.IOException;
import org.eclipse.cdt.core.builder.model.ICTool;
import org.eclipse.cdt.core.builder.util.Filesystem;
import org.eclipse.cdt.internal.core.ProcessClosure;
import org.eclipse.cdt.utils.spawner.ProcessFactory;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* <p>
* Abstract base class to make the life of ICTool implementers
* somewhat simpler.
* <p>
* Provides default implementations of all methods, such that
* a basic tool can be defined simply by calling the appropriate
* constructor.
* <p>
* Examples:
* <p>
* <code>
* class CGenericTool extends ACTool {
* CGenericTool() {
* super("typeid", "toolid", "toolname");
* }
* }
*
* class CExplicitTool extends ACTool {
* CGenericTool(IPath pathToTool) {
* super("typeid", "toolid", pathToTool);
* }
* }
* </code>
*/
public abstract class ACTool implements ICTool {
private String fTypeId;
private String fToolId;
private IPath fToolPath;
/**
* Constructor.
* <br>
* Create a tool with the given type ID and unqiue ID by specifying
* the absolute path to the executable.
* <br>
* @param typeId tool type ID, corresponds to a CToolType extension ID.
* @param id unqiue identifier for this tool instance.
* @param path explicit path to the tool.
*/
public ACTool(String typeId, String id, IPath path) {
fTypeId = typeId;
fToolId = id;
fToolPath = path;
}
/**
* Constructor.
* <br>
* Create a tool with the given type ID and unqiue ID by specifying
* the name of an executable. The executable is located using the
* "which" utility.
* <br>
* @param typeId tool type ID, corresponds to a CToolType extension ID.
* @param id unqiue identifier for this tool instance.
* @param name name of the tool executable.
*/
public ACTool(String typeId, String id, String exeName) {
fTypeId = typeId;
fToolId = id;
fToolPath = locateExe(exeName);
}
/**
* Locate the given executable by running "which name".
*
* @param name of executable.
* @param path to executable.
* @return path specifying the location of the executable
* with the given name. If the executable could not be
* located, returns <b>null</b>.
*/
protected IPath locateExe(String name) {
IOResults ior = execHelper("which", new String[] { name }, null);
if (ior.stdout.size() > 0) {
return new Path(
Filesystem.getNativePath(ior.stdout.toString().trim()));
}
return null;
}
/**
* Explicity set the path to this tool's executable.
*
* @param path path to executable.
*/
protected void setPath(String path) {
fToolPath = new Path(path);
}
/**
* Helper method that runs this tool using the provided parameters.
*
* @param parameters parameters to pass to tool when executing.
* @param workingDir working directory for tool execution.
* @return object IOResults object containing the stdout and stderr
* streams that resulted from running the tool.
*/
protected IOResults execHelper(String[] parameters, String workingDir) {
return execHelper(
fToolPath.toString(),
parameters,
new File(workingDir));
}
/**
* Helper method that runs a specified tool using the provided parameters.
*
* @param exeName name of executable; may be a simple name or a full path.
* @param parameters parameters to pass to tool when executing.
* @param workingDir working directory for tool execution.
* @return object IOResults object containing the stdout and stderr
* streams that resulted from running the tool.
*/
protected IOResults execHelper(
String exeName,
String[] parameters,
File dir) {
IOResults ior = new IOResults();
String[] cmds = new String[parameters.length + 1];
cmds[0] = exeName;
for (int i = 1; i < cmds.length; i++) {
cmds[i] = parameters[i - 1];
}
try {
ProcessFactory pf = ProcessFactory.getFactory();
Process pid = pf.exec(cmds, null, dir);
ProcessClosure pc = new ProcessClosure(pid, ior.stdout, ior.stderr);
pc.runBlocking();
} catch (IOException e) {
e.printStackTrace();
}
return ior;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#getTypeId()
*/
public String getTypeId() {
return fTypeId;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#getId()
*/
public String getId() {
return fToolId;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#getPath()
*/
public IPath getPath() {
return (IPath) fToolPath.clone();
}
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#exists()
*/
public boolean exists() {
return fToolPath.toFile().exists();
}
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#exec(String[], String)
*/
public IOResults exec(String[] parameters, String workingDir) {
return execHelper(parameters, workingDir);
}
}

View file

@ -0,0 +1,132 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.builder.model.ICToolchain;
import org.eclipse.cdt.core.builder.model.ICToolchainProvider;
/**
* Abstract base class to make the life of ICToolchainProvider
* implementers somewhat simpler.
* <p>
* Provides default implementations of all methods, such that
* a basic toolchain can be defined simply by implementing the
* abstract doRefresh() method.
* <p>
* Examples:
* <p>
* <code>
* class CGenericToolchain extends ACToolchainProvider {
* void doRefresh() {
* ICToolchain tc = readToolchainInfoFromFile();
* addToolchain(tc.getId(), tc);
* }
* }
* </code>
*/
public abstract class ACToolchainProvider implements ICToolchainProvider {
/**
* Internal map of toolchain ID to toolchain instances.
*/
private Map fToolchainMap;
/**
* Constructor.
* <br>
* Creates a new toolchain map, then calls the abstract
* doRefresh() method to allow derived classes to populate
* the map.
*/
public ACToolchainProvider() {
fToolchainMap = new HashMap();
doRefresh();
}
/**
* Determines if a toolchain exists in the internal map of
* toolchain instances.
*
* @param id toolchain identifier.
* @return true if there is a toolchain instances that corresponds
* to the provided id.
*/
protected boolean toolchainExists(String id) {
return fToolchainMap.containsKey(id);
}
/**
* Add a toolchain to the internal map of toolchain instances.
*
* @param id toolchain identifier.
* @param tc toolchain instance.
*/
protected void addToolchain(String id, ICToolchain tc) {
fToolchainMap.put(id, tc);
}
/**
* Helper method used to retrieve a toolchain from the internal
* map of toolchain instances.
*
* @param id toolchain identifier.
* @return toolchain instance, or null if not found.
*/
protected ICToolchain getToolchainHelper(String id) {
ICToolchain tc = null;
Object obj = fToolchainMap.get(id);
if (obj instanceof ICToolchain) {
tc = (ICToolchain) obj;
}
return tc;
}
/**
* Remove a toolchain from the internal map of toolchain instances.
*
* @param id toolchain identifier.
* @return true if toolchain is removed.
*/
protected boolean removeToolchain(String id) {
boolean exists = toolchainExists(id);
if (exists) {
Object obj = fToolchainMap.remove(id);
obj = null;
}
return exists;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchainProvider#getToolchain(String)
*/
public ICToolchain getToolchain(String id) {
return getToolchainHelper(id);
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchainProvider#getToolchains()
*/
public ICToolchain[] getToolchains() {
Collection tcc = fToolchainMap.values();
return (ICToolchain[]) tcc.toArray(new ICToolchain[tcc.size()]);
}
/**
* Implemented by derived classes. Called whenever the toolchain list needs
* to be refreshed.
*/
abstract public void doRefresh();
}

View file

@ -0,0 +1,247 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.builder.internal.CBuildConfigPoint;
import org.eclipse.cdt.core.builder.internal.CBuildVariablePoint;
import org.eclipse.cdt.core.builder.internal.CToolPoint;
import org.eclipse.cdt.core.builder.internal.CToolTypePoint;
import org.eclipse.cdt.core.builder.internal.CToolchainPoint;
import org.eclipse.cdt.core.builder.model.ICToolType;
import org.eclipse.cdt.core.builder.model.internal.CBuildConfigManager;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPluginDescriptor;
/**
* Fragments aren't first class citizens in the Eclipse world.
* This class lets me write code in the experimental builder
* fragment as if there was a real plugin class that implemented
* some of these methods.
* <p>
* Also - I'm not sure that some of these methods don't belong
* elsewhere. Suggestions are welcome.
*/
public class BuilderPlugin {
// Pretend this is a real plugin.
static private BuilderPlugin thisPlugin;
// Pretend this is a real plugin.
static {
thisPlugin = new BuilderPlugin();
thisPlugin.loadToolTypes();
thisPlugin.loadToolProviders();
thisPlugin.loadToolchainProviders();
thisPlugin.loadConfigProviders();
thisPlugin.loadBuildVarProviders();
thisPlugin.dump();
}
// Pretend this is a real plugin.
private BuilderPlugin() {
fBuildConfigManager = new CBuildConfigManager();
}
// Pretend this is a real plugin.
private void dump() {
for (Iterator iter = fToolTypes.entrySet().iterator();
iter.hasNext();
) {
ICToolType element =
(ICToolType) ((Map.Entry) iter.next()).getValue();
System.err.println(
"Tool type ("
+ element.getName()
+ ", "
+ element.getId()
+ ")");
}
for (Iterator iter = fToolProviders.entrySet().iterator();
iter.hasNext();
) {
ICToolPoint element =
(ICToolPoint) ((Map.Entry) iter.next()).getValue();
System.err.println(
"Tool ("
+ element.getName()
+ ", "
+ element.getId()
+ ", "
+ element.getProviderClassName()
+ ")");
}
for (Iterator iter = fToolchainProviders.entrySet().iterator();
iter.hasNext();
) {
ICToolchainPoint element =
(ICToolchainPoint) ((Map.Entry) iter.next()).getValue();
System.err.println(
"Toolchain ("
+ element.getId()
+ ", "
+ element.getProviderClassName()
+ ")");
}
for (Iterator iter = fBuildConfigProviders.entrySet().iterator();
iter.hasNext();
) {
ICBuildConfigPoint element =
(ICBuildConfigPoint) ((Map.Entry) iter.next()).getValue();
System.err.println(
"BuildConfig ("
+ element.getName()
+ ", "
+ element.getId()
+ ", "
+ element.getProviderClassName()
+ ")");
}
for (Iterator iter = fBuildVarProviders.entrySet().iterator();
iter.hasNext();
) {
ICBuildVariablePoint element =
(ICBuildVariablePoint) ((Map.Entry) iter.next()).getValue();
System.err.println(
"BuildVar ("
+ element.getId()
+ ", "
+ element.getProviderClassName()
+ ")");
}
}
// Pretend this is a real plugin.
static public BuilderPlugin getDefault() {
return thisPlugin;
}
// Pretend this is a real plugin.
public IPluginDescriptor getDescriptor() {
return CCorePlugin.getDefault().getDescriptor();
}
/*
* Data and methods to merge with CCorePlugin
*/
private CBuildConfigManager fBuildConfigManager;
private Map fToolTypes;
private Map fToolProviders;
private Map fToolchainProviders;
private Map fBuildConfigProviders;
private Map fBuildVarProviders;
public CBuildConfigManager getBuildConfigurationManager() {
return fBuildConfigManager;
}
public Map getToolTypes() {
return fToolTypes;
}
public Map getToolProviders() {
return fToolProviders;
}
public Map getToolchainProviders() {
return fToolchainProviders;
}
public Map getBuildConfigurationProviders() {
return fBuildConfigProviders;
}
public Map getBuildVariableProviders() {
return fBuildVarProviders;
}
private void loadToolTypes() {
IPluginDescriptor descriptor = getDefault().getDescriptor();
IExtensionPoint extensionPoint =
descriptor.getExtensionPoint("CToolType");
IExtension[] exts = extensionPoint.getExtensions();
IConfigurationElement[] infos =
extensionPoint.getConfigurationElements();
fToolTypes = new HashMap(infos.length);
for (int i = 0; i < infos.length; i++) {
IConfigurationElement configurationElement = infos[i];
CToolTypePoint provider = new CToolTypePoint(configurationElement);
fToolTypes.put(provider.getId(), provider);
}
}
private void loadToolProviders() {
IPluginDescriptor descriptor = getDefault().getDescriptor();
IExtensionPoint extensionPoint = descriptor.getExtensionPoint("CTool");
IConfigurationElement[] infos =
extensionPoint.getConfigurationElements();
fToolProviders = new HashMap(infos.length);
for (int i = 0; i < infos.length; i++) {
IConfigurationElement configurationElement = infos[i];
CToolPoint provider = new CToolPoint(configurationElement);
fToolProviders.put(provider.getId(), provider);
}
}
private void loadToolchainProviders() {
IPluginDescriptor descriptor = getDefault().getDescriptor();
IExtensionPoint extensionPoint =
descriptor.getExtensionPoint("CToolchain");
IConfigurationElement[] infos =
extensionPoint.getConfigurationElements();
fToolchainProviders = new HashMap(infos.length);
for (int i = 0; i < infos.length; i++) {
IConfigurationElement configurationElement = infos[i];
CToolchainPoint provider =
new CToolchainPoint(configurationElement);
fToolchainProviders.put(provider.getId(), provider);
}
}
private void loadConfigProviders() {
IPluginDescriptor descriptor = getDefault().getDescriptor();
IExtensionPoint extensionPoint =
descriptor.getExtensionPoint("CBuildConfig");
IConfigurationElement[] infos =
extensionPoint.getConfigurationElements();
fBuildConfigProviders = new HashMap(infos.length);
for (int i = 0; i < infos.length; i++) {
IConfigurationElement configurationElement = infos[i];
CBuildConfigPoint provider =
new CBuildConfigPoint(configurationElement);
fBuildConfigProviders.put(provider.getId(), provider);
}
}
private void loadBuildVarProviders() {
IPluginDescriptor descriptor = getDefault().getDescriptor();
IExtensionPoint extensionPoint =
descriptor.getExtensionPoint("CBuildVariable");
IConfigurationElement[] infos =
extensionPoint.getConfigurationElements();
fBuildVarProviders = new HashMap(infos.length);
for (int i = 0; i < infos.length; i++) {
IConfigurationElement configurationElement = infos[i];
CBuildVariablePoint provider =
new CBuildVariablePoint(configurationElement);
fBuildVarProviders.put(provider.getId(), provider);
}
}
}

View file

@ -0,0 +1,59 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import org.eclipse.cdt.core.builder.model.ICBuildConfigProvider;
import org.eclipse.core.runtime.CoreException;
/**
* Interface representing an instance of
* a CBuildConfig extension point.
*/
public interface ICBuildConfigPoint {
/**
* Returns the unique id for the provider.
*
* @return unique id.
*/
public String getId();
/**
* Returns the name of the provider.
*
* @return provider name.
*/
public String getName();
/**
* Returns the natures supported by the provider.
*
* @return natures supported by the provider.
*/
public String[] getNatures();
/**
* Returns the name of the provider's
* implementing class.
*
* @return name of the provider's implementing class.
*/
public String getProviderClassName();
/**
* Returns an instance of the provider's
* implementing class.
*
* @return instance of ICBuildConfigProvider.
*/
public ICBuildConfigProvider getProvider() throws CoreException;
}

View file

@ -0,0 +1,51 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import org.eclipse.cdt.core.builder.model.ICBuildVariableProvider;
import org.eclipse.core.runtime.CoreException;
/**
* Interface representing an instance of
* a CBuildVariable extension point.
*/
public interface ICBuildVariablePoint {
/**
* Returns the unique id for the provider.
*
* @return unique id.
*/
public String getId();
/**
* Returns the the natures supported by the provider.
*
* @return the natures supported by the provider.
*/
public String[] getNatures();
/**
* Returns the name of the provider's
* implementing class.
*
* @return name of the provider's implementing class.
*/
public String getProviderClassName();
/**
* Returns an instance of the provider's
* implementing class.
*
* @return instance of ICBuildVariableProvider.
*/
public ICBuildVariableProvider getProvider() throws CoreException;
}

View file

@ -0,0 +1,59 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import org.eclipse.cdt.core.builder.model.ICTool;
import org.eclipse.core.runtime.CoreException;
/**
* Interface representing an instance of
* a CTool extension point.
*/
public interface ICToolPoint {
/**
* Returns the unique id for the provider.
*
* @return unique id.
*/
public String getId();
/**
* Returns the name of the provider.
*
* @return provider name.
*/
public String getName();
/**
* Returns the string identifying the type of tool.
*
* @return type string.
*/
public String getType();
/**
* Returns the name of the provider's
* implementing class.
*
* @return name of the provider's implementing class.
*/
public String getProviderClassName();
/**
* Returns an instance of the provider's
* implementing class.
*
* @return instance of ICToolProvider.
*/
public ICTool getProvider() throws CoreException;
}

View file

@ -0,0 +1,24 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import org.eclipse.cdt.core.builder.model.ICToolType;
/**
* Interface representing an instance of
* a CToolType extension point.
* <p>
* This interface exists solely to parallel the
* other extension point interfaces (ICToolPoint, etc.)
*/
public interface ICToolTypePoint extends ICToolType {
}

View file

@ -0,0 +1,51 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder;
import org.eclipse.cdt.core.builder.model.ICToolchainProvider;
import org.eclipse.core.runtime.CoreException;
/**
* Interface representing an instance of
* a CToolchain extension point.
*/
public interface ICToolchainPoint {
/**
* Returns the unique id for the provider.
*
* @return unique id.
*/
public String getId();
/**
* Returns the natures supported by the provider.
*
* @return natures supported by the provider.
*/
public String[] getNatures();
/**
* Returns the name of the provider's
* implementing class.
*
* @return name of the provider's implementing class.
*/
public String getProviderClassName();
/**
* Returns an instance of the provider's
* implementing class.
*
* @return instance of ICToolchainProvider.
*/
public ICToolchainProvider getProvider() throws CoreException;
}

View file

@ -0,0 +1,124 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import java.util.StringTokenizer;
import java.util.Vector;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Abstract base class that represents information
* associated with a declared extension point.
* <p>
* Derived classes are expected to implement their
* own getter functions to return data from the
* associated IConfigurationElement in a reasonable
* format.
*/
public abstract class ACExtensionPoint {
public final static String FIELD_ID = "id"; //$NON-NLS-1$
public final static String FIELD_NAME = "name"; //$NON-NLS-1$
public final static String FIELD_TYPE = "name"; //$NON-NLS-1$
public final static String FIELD_NATURES = "natures"; //$NON-NLS-1$
public final static String FIELD_CLASS = "class"; //$NON-NLS-1$
/**
* Configuration element associated with this class.
* CONSIDER: is it expensive to hold on to this?
*/
private IConfigurationElement fElement;
/**
* Constructor.
*
* @param element configuration element for the build configuration provider.
*/
public ACExtensionPoint(IConfigurationElement element) {
fElement = element;
}
/**
* Returns the configuration element for the build configuration provider.
*
* @return configuration element
*/
protected IConfigurationElement getConfigurationElement() {
return fElement;
}
/**
* Breaks up a token-delimited string into individual tokens.
*
* @param data string to tokenize.
* @param sep delimiter character(s).
* @return array of tokens extracted from the string.
*/
protected String[] parseField(String data, String sep) {
Vector res = new Vector();
StringTokenizer st = new StringTokenizer(data, sep);
while (st.hasMoreElements()) {
res.add(st.nextElement());
}
return (String[]) res.toArray(new String[res.size()]);
}
/**
* Returns the value of the named field from the configuration element.
* If the named field is not present or has no value, returns an empty
* string.
*
* @param fieldName name of field.
* @return value of named field, or "".
*/
protected String getField(String fieldName) {
return getField(fieldName, ""); //$NON-NLS-1$
}
/**
* Returns the value of the named field from the configuration element.
* If the named field is not present or has no value, returns the
* specified default value.
*
* @param fieldName name of field.
* @param defaultValue default value if field not present.
* @return value of named field, or default.
*/
protected String getField(String fieldName, String defaultValue) {
String val = getConfigurationElement().getAttribute(fieldName);
return val != null ? val : defaultValue;
}
/**
* Returns an instance of of an implementing class. This
* method uses the value of the FIELD_CLASS attribute in
* the configuration element to create the class.
*
* @return instance of provider class.
*/
protected Object getClassInstance() throws CoreException {
return getClassInstance(FIELD_CLASS);
}
/**
* Returns an instance of of an implementing class.
*
* @param fieldName name of field.
* @return instance of provider class.
*/
protected Object getClassInstance(String fieldName) throws CoreException {
return getConfigurationElement().createExecutableExtension(fieldName);
}
}

View file

@ -0,0 +1,70 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import org.eclipse.cdt.core.builder.ICBuildConfigPoint;
import org.eclipse.cdt.core.builder.model.ICBuildConfigProvider;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Simple wrapper for the data associated with an instance of
* a CBuildConfig extension point.
*/
public class CBuildConfigPoint
extends ACExtensionPoint
implements ICBuildConfigPoint {
/**
* Constructor.
*
* @param element configuration element for the build configuration provider.
*/
public CBuildConfigPoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildConfigPoint#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildConfigPoint#getName()
*/
public String getName() {
return getField(FIELD_NAME);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildConfigPoint#getNatures()
*/
public String[] getNatures() {
return parseField(getField(FIELD_NATURES, "*"), ";"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildConfigPoint#getProviderClassName()
*/
public String getProviderClassName() {
return getField(FIELD_CLASS);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildConfigPoint#getProvider()
*/
public ICBuildConfigProvider getProvider() throws CoreException {
return (ICBuildConfigProvider) getClassInstance(FIELD_CLASS);
}
}

View file

@ -0,0 +1,64 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import org.eclipse.cdt.core.builder.ICBuildVariablePoint;
import org.eclipse.cdt.core.builder.model.ICBuildVariableProvider;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Simple wrapper for the data associated with an instance of
* a CBuildVariable extension point.
*/
public class CBuildVariablePoint
extends ACExtensionPoint
implements ICBuildVariablePoint {
/**
* Constructor.
*
* @param element configuration element for the build variable provider.
*/
public CBuildVariablePoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildVariablePoint#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildVariablePoint#getNatures()
*/
public String[] getNatures() {
return parseField(getField(FIELD_NATURES, "*"), ";"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildVariablePoint#getProviderClassName()
*/
public String getProviderClassName() {
return getField(FIELD_CLASS);
}
/**
* @see org.eclipse.cdt.core.builder.ICBuildVariablePoint#getProvider()
*/
public ICBuildVariableProvider getProvider() throws CoreException {
return (ICBuildVariableProvider) getClassInstance(FIELD_CLASS);
}
}

View file

@ -0,0 +1,69 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import org.eclipse.cdt.core.builder.ICToolPoint;
import org.eclipse.cdt.core.builder.model.ICTool;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Simple wrapper for the data associated with an instance of
* a CTool extension point.
*/
public class CToolPoint extends ACExtensionPoint implements ICToolPoint {
/**
* Constructor.
*
* @param element configuration element for the tool type.
*/
public CToolPoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolPoint#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolPoint#getName()
*/
public String getName() {
return getField(FIELD_NAME);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolPoint#getType()
*/
public String getType() {
return getField(FIELD_TYPE);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolPoint#getProviderClassName()
*/
public String getProviderClassName() {
return getField(FIELD_CLASS);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolPoint#getProvider()
*/
public ICTool getProvider() throws CoreException {
return (ICTool) getClassInstance(FIELD_CLASS);
}
}

View file

@ -0,0 +1,48 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import org.eclipse.cdt.core.builder.ICToolTypePoint;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Simple wrapper for the data associated with an instance of
* a CToolType extension point.
*/
public class CToolTypePoint
extends ACExtensionPoint
implements ICToolTypePoint {
/**
* Constructor.
*
* @param element configuration element for the tool type.
*/
public CToolTypePoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolType#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolType#getName()
*/
public String getName() {
return getField(FIELD_NAME);
}
}

View file

@ -0,0 +1,64 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.internal;
import org.eclipse.cdt.core.builder.ICToolchainPoint;
import org.eclipse.cdt.core.builder.model.ICToolchainProvider;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* Simple wrapper for the data associated with an instance of
* a CToolchain extension point.
*/
public class CToolchainPoint
extends ACExtensionPoint
implements ICToolchainPoint {
/**
* Constructor.
*
* @param element configuration element for the toolchain provider.
*/
public CToolchainPoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolchainPoint#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolchainPoint#getNatures()
*/
public String[] getNatures() {
return parseField(getField(FIELD_NATURES, "*"), ";"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* @see org.eclipse.cdt.core.builder.ICToolchainPoint#getProviderClassName()
*/
public String getProviderClassName() {
return getField(FIELD_CLASS);
}
/**
* @see org.eclipse.cdt.core.builder.ICToolchainPoint#getProvider()
*/
public ICToolchainProvider getProvider() throws CoreException {
return (ICToolchainProvider) getClassInstance(FIELD_CLASS);
}
}

View file

@ -0,0 +1,138 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Default implementation of the ICBuildVariable interface.
* <p>
* This implementation is capable of handling both static
* resolution (where the variable part is fixed at generation
* time) and dynamic resolution (where the variable part
* may change over time, depending on context.)
* <p>
* @see ICBuildVariable
* @see ICBuildVariableProvider
* @see ICBuildVariableResolver
*/
public class CBuildVariable implements ICBuildVariable {
private String fFixed;
private String fVariable;
private ICBuildVariableResolver fResolver;
/**
* Default implementation of ICBuildVariableResolver that
* simply returns a previously provided string as the
* resolved value for the build variable.
*/
static private class StringResolver implements ICBuildVariableResolver {
private String fValue;
public StringResolver(String value) {
fValue = value;
}
public String resolveValue(ICBuildVariable var) {
return fValue + var.getFixed();
}
};
/**
* Create a new build variable with the given variable
* and fixed elements, and a static resolver that always
* returns the same value for the variable portion of
* the variable.
*
* @param name variable portion of build variable.
* @param fixed fixed portion of build variable.
* @param resolved resolved variable value.
*/
public CBuildVariable(String name, String fixed, String resolved) {
this(name, fixed, new StringResolver(resolved));
}
/**
* Create a new build variable with the given fixed
* and variable values, and a dynamic resolver for
* the variable portion of the variable.
*
* @param name variable portion of build variable.
* @param fixed fixed portion of build variable.
* @param resolved resolved variable value.
*/
public CBuildVariable(String name, String fixed, ICBuildVariableResolver resolver) {
fVariable = name;
fFixed = fixed;
fResolver = resolver;
}
/**
* Create a new build variable with the given fixed
* and variable values, and a dynamic resolver for
* the variable portion of the variable.
*
* @param name variable portion of build variable.
* @param fixed fixed portion of build variable.
* @param resolved resolved variable value.
*/
public CBuildVariable(String name, ICBuildVariable base) {
fVariable = name;
fFixed = base.getFixed();
fResolver = base.getResolver();
}
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildVariable#getVariable()
*/
public String getVariable() {
return fVariable;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildVariable#getFixed()
*/
public String getFixed() {
return fFixed;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildVariable#getResolver()
*/
public ICBuildVariableResolver getResolver() {
return fResolver;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildVariable#getValue()
*/
public String getValue() {
return fResolver.resolveValue(this);
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
int result = 17;
result = (result * 37) + fVariable.hashCode();
result = (result * 37) + fFixed.hashCode();
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return "[" + fVariable + "]" + fFixed;
}
}

View file

@ -0,0 +1,50 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import org.eclipse.core.resources.IFile;
/**
* A build command is generated by a tool or toolchain, and
* represents a command that must be executed in order to
* build a file.
*/
public interface ICBuildCmd {
/**
* Tool used to process the file.
*
* @return tool used to build this file.
*/
ICTool getTool();
/**
* File this build command applies to.
*
* @return file this build command applies to.
*/
IFile getFile();
/**
* Parameters that are to be passed to the tool
* when building the file.
*
* @return parameters used to build the file.
*/
String[] getParameters();
/**
* This is a convenience method that should
* simply call getTool().exec(getParameters(), workingDir);
*/
boolean exec(String workingDir);
}

View file

@ -0,0 +1,37 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Consumer of build commands.
* <br>
* "Processing" a build command might mean different
* things for different types of processors (ex,
* an incremental build processor and a makefile
* generator.)
* <br>
* @see ICBuildCmd
*/
public interface ICBuildCmdProcessor {
/**
* Process the provided build commands. This
* might me executing the associated tool, recording
* the build command in a file, handing the command
* off to a remote processor for execution on another
* machine, etc.
*
* @param cmds build commands to process.
*/
void processCommands(ICBuildCmd[] cmds);
}

View file

@ -0,0 +1,306 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Based on org.eclipse.debug.core.ILaunchConfiguration
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* A build configuration describes how to build a project. It
* is a collection of the various tool- and toolchain-specific
* settings used to process the files in a project and produce
* some end result.
* <p>
* A build configuration may be shared in a repository via
* standard VCM mechanisms.
* <p>
* A build configuration is a handle to its underlying storage.
* <p>
* A build configuration is modified by obtaining a working copy
* of a build configuration, modifying the working copy, and then
* saving the working copy.
* <p>
* This interface is not intended to be implemented by clients.
* <p>
* @see ICBuildConfigWorkingCopy
*/
public interface ICBuildConfig extends IAdaptable {
/*
* TBD: add convenience methods for accessing standard elements?
*
* String[] getIncludePaths();
* String[] getLibPaths();
* String[] getLibs();
* String[] getOptimizationFlags();
* String[] getDebugFlags();
* String[] getWarningFlags();
*/
/**
* The file extension for build configuration files
* (value <code>"config"</code>).
* <p>
* CONSIDER: perhaps better to have a ".cdtconfig" file containing
* all build configuratons for the project in one spot?
*/
public static final String BUILD_CONFIGURATION_FILE_EXTENSION = "build"; //$NON-NLS-1$
/**
* Configuration version. Text string.
*/
public final static String CONFIG_VERSION = "config.version";
/**
* Configuration name. Text string.
*/
public final static String CONFIG_NAME = "config.name";
/**
* Builds this configuration.
*
* @param monitor progress monitor, or <code>null</code>
*/
public void build(IProgressMonitor monitor) throws CoreException;
/**
* Returns the name of this build configuration.
*
* @return the name of this build configuration
*/
public String getName();
/**
* Returns the location of this build configuration as a
* path.
*
* @return the location of this build configuration as a
* path
*/
public IPath getLocation();
/**
* Returns whether this build configuration's underlying
* storage exists.
*
* @return whether this build configuration's underlying
* storage exists
*/
public boolean exists();
/**
* Returns the integer-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while retrieving the attribute from
* underlying storage.</li>
* <li>An attribute with the given name exists, but does not
* have an integer value</li>
* </ul>
*/
public int getAttribute(String attributeName, int defaultValue)
throws CoreException;
/**
* Returns the string-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while retrieving the attribute from
* underlying storage.</li>
* <li>An attribute with the given name exists, but does not
* have a String value</li>
* </ul>
*/
public String getAttribute(String attributeName, String defaultValue)
throws CoreException;
/**
* Returns the boolean-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while retrieving the attribute from
* underlying storage.</li>
* <li>An attribute with the given name exists, but does not
* have a boolean value</li>
* </ul>
*/
public boolean getAttribute(String attributeName, boolean defaultValue)
throws CoreException;
/**
* Returns the <code>java.util.List</code>-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while retrieving the attribute from
* underlying storage.</li>
* <li>An attribute with the given name exists, but does not
* have a List value</li>
* </ul>
*/
public List getAttribute(String attributeName, List defaultValue)
throws CoreException;
/**
* Returns the <code>java.util.Map</code>-valued attribute with the given name.
* Returns the given default value if the attribute is undefined.
*
* @param attributeName the name of the attribute
* @param defaultValue the value to use if no value is found
* @return the value or the default value if no value was found.
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while retrieving the attribute from
* underlying storage.</li>
* <li>An attribute with the given name exists, but does not
* have a Map value</li>
* </ul>
*/
public Map getAttribute(String attributeName, Map defaultValue)
throws CoreException;
/**
* Returns the file this build configuration is stored
* in, or <code>null</code> if this configuration is stored
* locally with the workspace.
*
* @return the file this build configuration is stored
* in, or <code>null</code> if this configuration is stored
* locally with the workspace
*/
public IFile getFile();
/**
* Returns the project this build configuration is stored
* in.
*
* @return the file this build configuration is stored in.
*/
public IProject getProject();
/**
* Returns whether this build configuration is stored
* locally with the workspace.
*
* @return whether this build configuration is stored
* locally with the workspace
*/
public boolean isLocal();
/**
* Returns a working copy of this build configuration.
* Changes to the working copy will be applied to this
* build configuration when saved. The working copy will
* refer to this build configuration as its original
* build configuration.
*
* @return a working copy of this build configuration
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while initializing the contents of the
* working copy from this configuration's underlying storage.</li>
* </ul>
* @see ICBuildConfigWorkingCopy#getOriginal()
*/
public ICBuildConfigWorkingCopy getWorkingCopy() throws CoreException;
/**
* Returns a copy of this build configuration, as a
* working copy, with the specified name. The new
* working copy does not refer back to this configuration
* as its original build configuration (the working copy
* will return <code>null</code> for <code>getOriginal()</code>).
* When the working copy is saved it will not effect this
* build configuration.
*
* @param name the name of the copy
* @return a copy of this build configuration
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while initializing the contents of the
* working copy from this configuration's underlying storage.</li>
* </ul>
* @see ICBuildConfigWorkingCopy#getOriginal()
*/
public ICBuildConfigWorkingCopy copy(String name) throws CoreException;
/**
* Returns whether this build configuration is a working
* copy.
*
* @return whether this build configuration is a working
* copy
*/
public boolean isWorkingCopy();
/**
* Deletes this build configuration. This configuration's underlying
* storage is deleted. Has no effect if this configuration
* does not exist.
*
* @exception CoreException if this method fails. Reasons include:
* <ul>
* <li>An exception occurs while deleting this configuration's
* underlying storage.</li>
* </ul>
*/
public void delete() throws CoreException;
/**
* Returns a memento for this build configuration, or <code>null</code>
* if unable to generate a memento for this configuration. A memento
* can be used to re-create a build configuration, via the
* build manager.
*
* @return a memento for this configuration
* @see ICBuildConfigManager#getConfiguration(IProject, String)
* @exception CoreException if an exception occurs generating this
* build configuration's memento
*/
public String getMemento() throws CoreException;
/**
* Returns whether the contents of this build configuration are
* equal to the contents of the given build configuration.
*
* @return whether the contents of this build configuration are equal to the contents
* of the specified build configuration.
*/
public boolean contentsEqual(ICBuildConfig configuration);
}

View file

@ -0,0 +1,47 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Based on org.eclipse.debug.core.ILaunchConfigurationListener
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* A build configuration listener is notified of build
* configurations as they are added and removed from the
* build configuration manager.
* <p>
* Clients may implement this interface.
*/
public interface ICBuildConfigListener {
/**
* Notifies this listener that the specified
* configuration has been removed.
*
* @param configuration the removed configuration
*/
public void configurationRemoved(ICBuildConfig configuration);
/**
* Notifies this listener that the specified configuration
* has been added.
*
* @param configuration the newly added configuration
*/
public void configurationAdded(ICBuildConfig configuration);
/**
* Notifies this listener that the specified configuration
* has changed.
*
* @param configuration the changed configuration
*/
public void configurationChanged(ICBuildConfig configuration);
}

View file

@ -0,0 +1,125 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Based on org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
/**
* The build configuration manager manages the set of registered build
* configurations. Clients interested in build configuration change
* notification may register with the build configuration manager.
* <p>
* Clients are not intended to implement this interface.
* </p>
* @see ICBuildConfigListener
*/
public interface ICBuildConfigManager {
/**
* Adds the given listener to the collection of registered
* configuration listeners. Has no effect if an identical
* listener is already registerd.
*
* @param listener the listener to register
*/
public void addListener(ICBuildConfigListener listener);
/**
* Removes the given listener from the collection of registered
* configuration listeners. Has no effect if an identical listener
* is not already registerd.
*
* @param listener the listener to deregister
*/
public void removeListener(ICBuildConfigListener listener);
/**
* Adds the specified configuration and notifies listeners. Has no
* effect if an identical configuration is already registered.
*
* @param configuration the configuration to add
*/
public void addConfiguration(ICBuildConfig configuration);
/**
* Removes the specified configuration and notifies listeners.
* Has no effect if an identical configuration is not already
* registered.
*
* @param configuration the configuration to remove
* @since 2.0
*/
public void removeConfiguration(ICBuildConfig configuration);
/**
* Returns all build configurations associated with a project.
* Returns an zero-length array if no configurations are associated
* with the project.
*
* @param project project to retrieve build configurations for.
* @return all build configurations of the specified type for the project.
* @exception CoreException if an error occurs while retreiving a build configuration
*/
public ICBuildConfig[] getConfigurations(IProject project) throws CoreException;
/**
* Returns a handle to the configuration contained in the specified
* file. The file is not verified to exist or contain a proper
* configuration.
*
* @param file configuration file
* @return a handle to the configuration contained in the specified file
*/
public ICBuildConfig getConfiguration(IFile file);
/**
* Returns a handle to the configuration specified by the given
* memento. The configuration may not exist.
*
* @return a handle to the configuration specified by the given memento
* @exception CoreException if the given memento is invalid or
* an exception occurs parsing the memento
*/
public ICBuildConfig getConfiguration(String memento) throws CoreException;
/**
* Returns a handle to a newly created build configuration.
*
* @param name Name of new configuration.
* @return a handle to a new configuration instance.
*/
public ICBuildConfigWorkingCopy getConfiguration(IProject project, String name);
/**
* Return <code>true</code> if there is a configuration with the specified name,
* <code>false</code> otherwise.
*
* @param name the name of the configuration whose existence is being checked
* @exception CoreException if unable to retrieve existing configuration names
*/
public boolean isExistingConfigurationName(IProject project, String name) throws CoreException;
/**
* Return a String that can be used as the name of a configuration. The name
* is guaranteed to be unique (no existing configurations will have this name).
* The name that is returned uses the <code>namePrefix</code> as a starting point.
* If there is no existing configuration with this name, then <code>namePrefix</code>
* is returned. Otherwise, the value returned consists of the specified prefix plus
* some suffix that guarantees uniqueness.
*
* @param namePrefix the String that the returned name must begin with
*/
public String generateUniqueConfigurationNameFrom(IProject project, String namePrefix);
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* ICBuildConfigProvider represents an instance of a class
* that initializes an empty build configuration with
* reasonable default values.
* <p>
* The intent is to decouple build configuration creation
* and initialization.
* <p>
* See also the <a href="../../../../../../CBuildConfig.html">CBuildConfig</a>
* extension point documentation.
*/
public interface ICBuildConfigProvider {
/**
* Set initial values in the provided build configuration
* working copy.
*
* @param config build configuration to initialize.
*/
public void setDefaults(ICBuildConfigWorkingCopy config);
}

View file

@ -0,0 +1,142 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
/**
* An editable copy of a build configuration. Attributes of a
* build configuration are modified by modifying the attributes
* of a working copy, and then saving the working copy.
* <p>
* This interface is not intended to be implemented by clients.
* <p>
* @see ICBuildConfig
*/
public interface ICBuildConfigWorkingCopy extends ICBuildConfig, IAdaptable {
/**
* Returns whether this configuration has been modified
* since it was last saved or created.
*
* @return whether this configuration has been modified
* since it was last saved or created
*/
public boolean isDirty();
/**
* Saves this working copy to its underlying file and returns
* a handle to the resulting launch configuration.
* Has no effect if this configuration does not need saving.
* Creates the underlying file if not yet created.
*
* @exception CoreException if an exception occurs while
* writing this configuration to its underlying file.
*/
public ICBuildConfig doSave() throws CoreException;
/**
* Sets the integer-valued attribute with the given name.
*
* @param attributeName the name of the attribute
* @param value the value
*/
public void setAttribute(String attributeName, int value);
/**
* Sets the String-valued attribute with the given name.
* If the value is <code>null</code>, the attribute is removed from
* this launch configuration.
*
* @param attributeName the name of the attribute
* @param value the value, or <code>null</code> if the attribute is to be undefined
*/
public void setAttribute(String attributeName, String value);
/**
* Sets the <code>java.util.List</code>-valued attribute with the given name.
* The specified List <em>must</em> contain only String-valued entries.
* If the value is <code>null</code>, the attribute is removed from
* this launch configuration.
*
* @param attributeName the name of the attribute
* @param value the value, or <code>null</code> if the attribute is to be undefined
*/
public void setAttribute(String attributeName, List value);
/**
* Sets the <code>java.util.Map</code>-valued attribute with the given name.
* The specified Map <em>must</em> contain only String keys and String values.
* If the value is <code>null</code>, the attribute is removed from
* this launch configuration.
*
* @param attributeName the name of the attribute
* @param value the value, or <code>null</code> if the attribute is to be undefined
*/
public void setAttribute(String attributeName, Map value);
/**
* Sets the boolean-valued attribute with the given name.
*
* @param attributeName the name of the attribute
* @param value the value
*/
public void setAttribute(String attributeName, boolean value);
/**
* Returns the original launch configuration this working copy
* was created from, or <code>null</code> if this is a new
* working copy created from a launch configuration type.
*
* @return the original launch configuration, or <code>null</code>
*/
public ICBuildConfig getOriginal();
/**
* Renames this build configuration to the specified name.
* The new name cannot be <code>null</code>. Has no effect if the name
* is the same as the current name. If this working copy is based
* on an existing build configuration, this will cause
* the underlying build configuration file to be renamed when
* this working copy is saved.
*
* @param name the new name for this configuration
*/
public void rename(String name);
/**
* Sets the container this build configuration will be stored
* in when saved. When set to <code>null</code>, this configuration
* will be stored locally with the workspace. The specified
* container must exist, if specified.
* <p>
* If this configuration is changed from local to non-local,
* a file will be created in the specified container when
* saved. The local file associated with this configuration
* will be deleted.
* <p>
* If this configuration is changed from non-local to local,
* a file will be created locally when saved.
* The original file associated with this configuration in
* the workspace will be deleted.
* <p>
* @param container the container in which to store this
* build configuration, or <code>null</code> if this
* configuration is to be stored locally
*/
public void setContainer(IContainer container);
}

View file

@ -0,0 +1,73 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Represents a named value that is used as a variable
* within the build process. Build variables represent
* a variable prefix coupled with an optional static suffix.
* Using Makefile syntax as an example, the following is
* an examples of build variables:
* <p>
* <code>
* $(CROSS_TOOLS)/include
* </code>
* <p>
* For this particular build variable:
* <ul>
* <li>Calling <code>getVariable()</code> would return "CROSS_TOOLS"</li>
* <li>Calling <code>getFixed()</code> would return "/include"</li>
* <li>Calling <code>getValue()</code> would return the current value
* of the variable.</li>
* </ul>
* <p>
* The intent is to introduce a mechanism similar to that
* used by the Eclipse IDE to handle ClassPath variables.
* <p>
* @see ICBuildVariableProvider
* @see ICBuildVariableResolver
* @see CBuildVariable
*/
public interface ICBuildVariable {
/**
* Get the text that makes up the variable portion
* of this build variable.
*
* @return variable portion of this build variable.
*/
String getVariable();
/**
* Get the text that makes up the fixed portion
* of this build variable.
*
* @return fixed portion of this build variable.
*/
String getFixed();
/**
* Get the current value of this build variable,
* replacing the variable portion with whatever
* value is appropriate for teh current circumstances.
*
* @return Value of this build variable.
*/
String getValue();
/**
* Get the resolver for this build variable,
*
* @return Resolver for this build variable.
*/
ICBuildVariableResolver getResolver();
}

View file

@ -0,0 +1,54 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Class that makes build variables available to the
* build process.
* <p>
* Intended for use in situations where generic build
* variables (ex, system root, etc.) can be provided
* for particular project types, or generically.
* <p>
* If possible the build variable provider should create
* a build variable that does not need to refer back to
* the provider for resolution. The default CBuildVariable
* implementation provides support for this type of
* build variable.
* </p>
* If the build variable will need information from the
* provider in order to resolve it's value, then the
* build variables will need to keep a reference to it's
* provider (or some other class that can resolve the
* variable protion of the build variable.) The default
* CBuildVariable implementation supports this type
* of build variable as well, through use of the
* ICBuildVariableResolver interface.
* <p>
* See also the <a href="../../../../../../CBuildConfig.html">CBuildConfig</a>
* extension point documentation.
* <p>
* @see ICBuildVariable
* @see ICBuildVariableResolver
* @see CBuildVariable
*/
public interface ICBuildVariableProvider {
/**
* Get the list of build variables made available
* through this provider.
*
* @return build variables.
*/
ICBuildVariable[] getVariables();
}

View file

@ -0,0 +1,37 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Interface representing a class that is capable of
* resolving the variable portion of build variables
* at run time.
* <p>
* See also the <a href="../../../../../../CBuildConfig.html">CBuildConfig</a>
* extension point documentation.
* <p>
* @see ICBuildVariable
* @see ICBuildVariableProvider
* @see CBuildVariable
*/
public interface ICBuildVariableResolver {
/**
* Given a build variable, determine what it's
* resolved value should be.
*
* @return resolved value, or <code>null</code>.
*/
public String resolveValue(ICBuildVariable var);
}

View file

@ -0,0 +1,48 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Standard build configuration constants.
*/
public interface ICPosixBuildConstants {
public final static String CPP_INCLUDES = "posix.cpp.includes"; //$NON-NLS-1$
public final static String CPP_DEFINITIONS = "posix.cpp.definitions"; //$NON-NLS-1$
public final static String CC_ENABLE_PROFILE = "posix.cc.profile"; //$NON-NLS-1$
public final static String CC_ENABLE_DEBUG = "posix.cc.debug"; //$NON-NLS-1$
public final static String CC_ENABLE_OPTIMIZE = "posix.cc.optimize"; //$NON-NLS-1$
public final static String CC_OPTIMZE_LEVEL = "posix.cc.optimize.level"; //$NON-NLS-1$
public final static String CC_USER_ARGS = "posix.cc.user"; //$NON-NLS-1$
public final static String CC_OPTIMIZE_NONE = "none"; //$NON-NLS-1$
public final static String CC_OPTIMIZE_SOME = "some"; //$NON-NLS-1$
public final static String CC_OPTIMIZE_FULL = "full"; //$NON-NLS-1$
public final static String CC_WARN_ALL = "posix.cc.warn.all"; //$NON-NLS-1$
public final static String CC_WARN_ASERROR = "posix.cc.warn.aserror"; //$NON-NLS-1$
public final static String CC_WARN_FORMAT = "posix.cc.warn.format"; //$NON-NLS-1$
public final static String CC_WARN_POINTERAR = "posix.cc.warn.pointerar"; //$NON-NLS-1$
public final static String CC_WARN_SWITCH = "posix.cc.warn.switch"; //$NON-NLS-1$
public final static String CC_WARN_UNREACH = "posix.cc.warn.unreach"; //$NON-NLS-1$
public final static String CC_WARN_UNUSED = "posix.cc.warn.unused"; //$NON-NLS-1$
public final static String LD_OUTPUT = "posix.ld.output"; //$NON-NLS-1$
public final static String LD_USER_ARGS = "posix.ld.user"; //$NON-NLS-1$
public final static String LD_LINK_STATIC = "posix.ld.link.static"; //$NON-NLS-1$
public final static String LD_LINK_AS_PROGRAM = "posix.ld.link.as.program"; //$NON-NLS-1$
public final static String LD_LINK_AS_SHARED = "posix.ld.link.as.shared"; //$NON-NLS-1$
public final static String LD_LINK_AS_ARCHIVE = "posix.ld.link.as.archive"; //$NON-NLS-1$
public final static String LD_STRIP = "posix.ld.strip"; //$NON-NLS-1$
public final static String LD_LIBS = "posix.ld.libs"; //$NON-NLS-1$
public final static String LD_LIBPATHS = "posix.ld.libpaths"; //$NON-NLS-1$
}

View file

@ -0,0 +1,96 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import java.io.ByteArrayOutputStream;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.core.runtime.IPath;
/**
* ICTool represents an instance of a tool.
* <p>
* Tools represent a particular executable (ex, "gcc", etc.)
* that can be run in order to produce some output. The
* exec() method provides a shorthand that allows a caller
* to execute the tool and gather the resultant output
* streams.
* <p>
* Toolchain providers use this interface to represent
* individual tools within a toolchain.
* <p>
* Stand-alone tool providers (flex, yacc, rpcgen, etc.) make
* use of this to define generic build tools that can be "mixed
* in" to any toolchain.
* <p>
* See also the <a href="../../../../../../CTool.html">CTool</a>
* extension point documentation.
*/
public interface ICTool {
/**
* Convenince class that just contains a reference to
* two byte array output streams named sterr and stdout.
*/
class IOResults {
public ByteArrayOutputStream stderr = new ByteArrayOutputStream();
public ByteArrayOutputStream stdout = new ByteArrayOutputStream();
}
/**
* Returns the type ID for this tool. This type ID corresponds
* to a CToolType extension ID
*
* @return the type ID for this tool.
*/
String getTypeId();
/**
* Returns a unique identifuer for this tool instance.
*
* @return the type ID for this tool.
*/
String getId();
/**
* Returns the explicit path to the executable associated
* with this tool instance..
*
* @return path to executable.
*/
IPath getPath();
/**
* Indicates whether or not the executable referenced by this
* tool instance actually exists.
*
* @return true if the associated tool executable exists.
*/
boolean exists();
/**
* Run the executable referenced by this tool, using the
* supplied parameters.
*
* @param parameters parameters to pass to tool when executing.
* @param workingDir working directory for tool execution.
*/
IOResults exec(String[] parameters, String workingDir);
/**
* Get an instance of an error parser that is capable
* of dealing with the tool's output.
*
* @return error parser for the tool.
*/
IErrorParser getErrorParser();
}

View file

@ -0,0 +1,35 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Interface representing a particular tool classification
* (ex, GNU c compiler, etc.)
* <p>
* See also the <a href="../../../../../../CToolType.html">CToolType</a>
* extension point documentation.
*/
public interface ICToolType {
/**
* Returns the unique id for the tool type.
*
* @return unique id.
*/
public String getId();
/**
* Returns the name of the tool type.
*
* @return provider name.
*/
public String getName();
}

View file

@ -0,0 +1,75 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
import org.eclipse.core.resources.IFile;
/**
* The ICToolchain interface represents a collection of
* associated tools. A typical toolchain might consist
* of a compiler, an assembler, a linker, etc.
* <p>
* Many ICToolchain operations happen in the context of
* a build configuration, and so take an ICBuildConfig
* parameter. The build configuration provides the
* toolchain with information about the parameters to
* use when generating build commands.
*/
public interface ICToolchain {
/**
* Get the build commands needed to build a file.
*
* @param file file that needs to be built.
* @param cfg build configuration context.
* @return build command(s) needed to build this file,
* or <b>null</b> the specified file cannot (or should
* not) be processed by this toolchain.
*/
ICBuildCmd[] getBuildCommands(IFile file, ICBuildConfig cfg);
/**
* Get the dependencies for a file.
*
* @param file file to compute dependencies for.
* @param cfg build configuration context.
* @return file(s) that the given file depends on,
* or <b>null</b> the specified file does not have
* any dependencies.
*/
IFile[] getDependencies(IFile file, ICBuildConfig cfg);
/**
* Get the output files generated by building a file.
*
* @param file file to compute outputs for.
* @param cfg build configuration context.
* @return file(s) that will be generated in the process
* of building the specified file.
*/
IFile[] getOutputs(IFile file, ICBuildConfig cfg);
/**
* Get the tools associated with this toolchain.
*
* @return tools associated with this toolchain
*/
ICTool[] getTools();
/**
* Indicate whether or not this toolchain is capable of and
* interested in handling the specified file.
* @param file file to examine.
* @return true if the toolchain can process the file.
*/
boolean canProcess(IFile file);
}

View file

@ -0,0 +1,48 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model;
/**
* Interface representing a class that makes one or more
* toolchains (collections of related tools) available to
* the IDE.
* <br>
* Using a toolchain provider allows clients to implement
* toolchain location logic in whatever manner suits them
* best. For example, a toolchain provider may locate a
* toolchain by examining the local filesystem, reading
* a configuration file, providing UI elements to allow
* a user to specify particular executable to use as part
* of a specialize toolchain, etc.
* <p>
* See also the <a href="../../../../../../CToolchain.html">CToolchain</a>
* extension point documentation.
*/
public interface ICToolchainProvider {
/**
* Return the ICToolchain instances managed by this provider.
*
* @return toolchain instances managed by this provider.
*/
ICToolchain[] getToolchains();
/**
* Return an ICToolchain instance managed by this provider.
*
* @param id toolchain ID.
* @return toolchain instance, or <b>null</b> if the
* provider does not recognize the toolchain ID.
*/
ICToolchain getToolchain(String id);
}

View file

@ -0,0 +1,391 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model.internal;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.xerces.dom.DocumentImpl;
import org.eclipse.cdt.core.builder.BuilderPlugin;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.core.DebugCoreMessages;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* @author sam.robb
*/
public class CBuildConfig extends PlatformObject implements ICBuildConfig {
/**
* Location this configuration is stored in. This
* is the key for a build configuration handle.
*/
private IPath fLocation;
/**
* Constructs a build configuration in the given location.
*
* @param location path to where this build configuration's
* underlying file is located
*/
protected CBuildConfig(IPath location) {
setLocation(location);
}
/**
* Constructs a launch configuration from the given
* memento.
*
* @param memento configuration memento
* @exception CoreException if the memento is invalid or
* an exception occurrs reading the memento
*/
protected CBuildConfig(String memento) throws CoreException {
Exception ex = null;
try {
Element root = null;
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
StringReader reader = new StringReader(memento);
InputSource source = new InputSource(reader);
root = parser.parse(source).getDocumentElement();
String localString = root.getAttribute("local"); //$NON-NLS-1$
String path = root.getAttribute("path"); //$NON-NLS-1$
String message = null;
if (path == null) {
message = DebugCoreMessages.getString("LaunchConfiguration.Invalid_build_configuration_memento__missing_path_attribute_3"); //$NON-NLS-1$
} else if (localString == null) {
message = DebugCoreMessages.getString("LaunchConfiguration.Invalid_build_configuration_memento__missing_local_attribute_4"); //$NON-NLS-1$
}
if (message != null) {
IStatus s = newStatus(message, DebugException.INTERNAL_ERROR, null);
throw new CoreException(s);
}
IPath location = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(path);
setLocation(location);
return;
} catch (ParserConfigurationException e) {
ex = e;
} catch (SAXException e) {
ex = e;
} catch (IOException e) {
ex = e;
}
IStatus s = newStatus(DebugCoreMessages.getString("LaunchConfiguration.Exception_occurred_parsing_memento_5"), DebugException.INTERNAL_ERROR, ex); //$NON-NLS-1$
throw new CoreException(s);
}
/**
* Creates and returns a new error status based on
* the given mesasge, code, and exception.
*
* @param message error message
* @param code error code
* @param e exception or <code>null</code>
* @return status
*/
protected IStatus newStatus(String message, int code, Throwable e) {
return new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), code, message, e);
}
/**
* @see ICBuildConfig#build(IProgressMonitor)
*/
public void build(IProgressMonitor monitor) throws CoreException {
}
/**
* A configuration's name is that of the last segment
* in it's location (subtract the ".build" extension).
*
* @see ICBuildConfig#getName()
*/
public String getName() {
return getLastLocationSegment();
}
private String getLastLocationSegment() {
String name = getLocation().lastSegment();
name = name.substring(0, name.length() - (BUILD_CONFIGURATION_FILE_EXTENSION.length() + 1));
return name;
}
/**
* @see ICBuildConfig#getLocation()
*/
public IPath getLocation() {
return fLocation;
}
/**
* Sets the location of this configuration's underlying
* file.
*
* @param location the location of this configuration's underlying
* file
*/
private void setLocation(IPath location) {
fLocation = location;
}
/**
* @see ICBuildConfig#exists()
*/
public boolean exists() {
IFile file = getFile();
if (file == null) {
return getLocation().toFile().exists();
} else {
return file.exists();
}
}
/**
* @see ICBuildConfig#getAttribute(String, int)
*/
public int getAttribute(String attributeName, int defaultValue) throws CoreException {
return getInfo().getIntAttribute(attributeName, defaultValue);
}
/**
* @see ICBuildConfig#getAttribute(String, String)
*/
public String getAttribute(String attributeName, String defaultValue) throws CoreException {
return getInfo().getStringAttribute(attributeName, defaultValue);
}
/**
* @see ICBuildConfig#getAttribute(String, boolean)
*/
public boolean getAttribute(String attributeName, boolean defaultValue) throws CoreException {
return getInfo().getBooleanAttribute(attributeName, defaultValue);
}
/**
* @see ICBuildConfig#getAttribute(String, List)
*/
public List getAttribute(String attributeName, List defaultValue) throws CoreException {
return getInfo().getListAttribute(attributeName, defaultValue);
}
/**
* @see ICBuildConfig#getAttribute(String, Map)
*/
public Map getAttribute(String attributeName, Map defaultValue) throws CoreException {
return getInfo().getMapAttribute(attributeName, defaultValue);
}
/**
* @see ICBuildConfig#isLocal()
*/
public boolean isLocal() {
return getFile() == null;
}
/**
* @see ICBuildConfig#getWorkingCopy()
*/
public ICBuildConfigWorkingCopy getWorkingCopy() throws CoreException {
return new CBuildConfigWorkingCopy(this);
}
/**
* @see ICBuildConfig#copy(String name)
*/
public ICBuildConfigWorkingCopy copy(String name) throws CoreException {
ICBuildConfigWorkingCopy copy = new CBuildConfigWorkingCopy(this, name);
return copy;
}
/**
* @see ICBuildConfig#isWorkingCopy()
*/
public boolean isWorkingCopy() {
return false;
}
/**
* @see ICBuildConfig#delete()
*/
public void delete() throws CoreException {
if (exists()) {
if (isLocal()) {
if (!(getLocation().toFile().delete())) {
throw new DebugException(
new Status(Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, DebugCoreMessages.getString("LaunchConfiguration.Failed_to_delete_build_configuration._1"), null) //$NON-NLS-1$
);
}
// manually update the build manager cache since there
// will be no resource delta
getBuildConfigurationManager().configurationDeleted(this);
} else {
// delete the resource using IFile API such that
// resource deltas are fired.
IResource file = getFile();
if (file != null) {
file.delete(true, null);
} else {
// Error - the exists test passed, but could not locate file
}
}
}
}
/**
* Returns the info object containing the attributes
* of this configuration
*
* @return info for this handle
* @exception CoreException if unable to retrieve the
* info object
*/
protected CBuildConfigInfo getInfo() throws CoreException {
return getBuildConfigurationManager().getInfo(this);
}
/**
* Returns the build manager
*
* @return build manager
*/
protected CBuildConfigManager getBuildConfigurationManager() {
return BuilderPlugin.getDefault().getBuildConfigurationManager();
}
/**
* @see ICBuildConfig#getMemento()
*/
public String getMemento() throws CoreException {
IPath relativePath = getFile().getFullPath();
relativePath = relativePath.setDevice(null);
Document doc = new DocumentImpl();
Element node = doc.createElement("buildConfiguration"); //$NON-NLS-1$
doc.appendChild(node);
node.setAttribute("local", (new Boolean(isLocal())).toString()); //$NON-NLS-1$
node.setAttribute("path", relativePath.toString()); //$NON-NLS-1$
try {
return CBuildConfigManager.serializeDocument(doc);
} catch (IOException e) {
IStatus status = newStatus(DebugCoreMessages.getString("LaunchConfiguration.Exception_occurred_creating_build_configuration_memento_9"), DebugException.INTERNAL_ERROR, e); //$NON-NLS-1$
throw new CoreException(status);
}
}
/**
* @see ICBuildConfig#getFile()
*/
public IFile getFile() {
return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(getLocation());
}
/**
* @see ICBuildConfig#getProject()
*/
public IProject getProject() {
return getFile().getProject();
}
/**
* @see ICBuildConfig#contentsEqual(ICBuildConfig)
*/
public boolean contentsEqual(ICBuildConfig object) {
try {
if (object instanceof CBuildConfig) {
CBuildConfig otherConfig = (CBuildConfig) object;
return getName().equals(otherConfig.getName())
&& getLocation().equals(otherConfig.getLocation())
&& getInfo().equals(otherConfig.getInfo());
}
return false;
} catch (CoreException ce) {
return false;
}
}
/**
* Returns whether this configuration is equal to the
* given configuration. Two configurations are equal if
* they are stored in the same location (and neither one
* is a working copy).
*
* @return whether this configuration is equal to the
* given configuration
* @see Object#equals(Object)
*/
public boolean equals(Object object) {
if (object instanceof ICBuildConfig) {
if (isWorkingCopy()) {
return this == object;
}
ICBuildConfig config = (ICBuildConfig) object;
if (!config.isWorkingCopy()) {
return config.getLocation().equals(getLocation());
}
}
return false;
}
/**
* @see Object#hashCode()
*/
public int hashCode() {
return getLocation().hashCode();
}
/**
* Returns the container this build configuration is
* stored in, or <code>null</code> if this build configuration
* is stored locally.
*
* @return the container this build configuration is
* stored in, or <code>null</code> if this build configuration
* is stored locally
*/
protected IContainer getContainer() {
IFile file = getFile();
if (file != null) {
return file.getParent();
}
return null;
}
}

View file

@ -0,0 +1,474 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model.internal;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.xerces.dom.DocumentImpl;
import org.eclipse.cdt.core.builder.BuilderPlugin;
import org.eclipse.cdt.core.builder.model.ICBuildConfigManager;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.core.DebugCoreMessages;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author sam.robb
*
* The information associated with a build configuration
* handle.
*/
public class CBuildConfigInfo {
/**
* This configurations attribute table.
* Keys are <code>String</code>s and values
* are one of <code>String</code>, <code>Integer</code>,
* or <code>Boolean</code>.
*/
private HashMap fAttributes;
/**
* Constructs a new empty info
*/
protected CBuildConfigInfo() {
setAttributeTable(new HashMap(10));
}
/**
* Returns this configuration's attribute table.
*
* @return attribute table
*/
private HashMap getAttributeTable() {
return fAttributes;
}
/**
* Sets this configuration's attribute table.
*
* @param table attribute table
*/
private void setAttributeTable(HashMap table) {
fAttributes = table;
}
/**
* Returns the <code>String</code> attribute with the
* given key or the given default value if undefined.
*
* @return attribute specified by given key or the defaultValue
* if undefined
* @exception if the attribute with the given key exists
* but is not a <code>String</code>
*/
protected String getStringAttribute(String key, String defaultValue) throws CoreException {
Object attr = getAttributeTable().get(key);
if (attr != null) {
if (attr instanceof String) {
return (String)attr;
} else {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("LaunchConfigurationInfo.Attribute_{0}_is_not_of_type_java.lang.String._1"), new String[] {key}), null //$NON-NLS-1$
)
);
}
}
return defaultValue;
}
/**
* Returns the <code>int</code> attribute with the
* given key or the given default value if undefined.
*
* @return attribute specified by given key or the defaultValue
* if undefined
* @exception if the attribute with the given key exists
* but is not an <code>int</code>
*/
protected int getIntAttribute(String key, int defaultValue) throws CoreException {
Object attr = getAttributeTable().get(key);
if (attr != null) {
if (attr instanceof Integer) {
return ((Integer)attr).intValue();
} else {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("LaunchConfigurationInfo.Attribute_{0}_is_not_of_type_int._2"), new String[] {key}), null //$NON-NLS-1$
)
);
}
}
return defaultValue;
}
/**
* Returns the <code>boolean</code> attribute with the
* given key or the given default value if undefined.
*
* @return attribute specified by given key or the defaultValue
* if undefined
* @exception if the attribute with the given key exists
* but is not a <code>boolean</code>
*/
protected boolean getBooleanAttribute(String key, boolean defaultValue) throws CoreException {
Object attr = getAttributeTable().get(key);
if (attr != null) {
if (attr instanceof Boolean) {
return ((Boolean)attr).booleanValue();
} else {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("LaunchConfigurationInfo.Attribute_{0}_is_not_of_type_boolean._3"), new String[] {key}), null //$NON-NLS-1$
)
);
}
}
return defaultValue;
}
/**
* Returns the <code>java.util.List</code> attribute with the
* given key or the given default value if undefined.
*
* @return attribute specified by given key or the defaultValue
* if undefined
* @exception if the attribute with the given key exists
* but is not a <code>java.util.List</code>
*/
protected List getListAttribute(String key, List defaultValue) throws CoreException {
Object attr = getAttributeTable().get(key);
if (attr != null) {
if (attr instanceof List) {
return (List)attr;
} else {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("LaunchConfigurationInfo.Attribute_{0}_is_not_of_type_java.util.List._1"), new String[] {key}), null //$NON-NLS-1$
)
);
}
}
return defaultValue;
}
/**
* Returns the <code>java.util.Map</code> attribute with the
* given key or the given default value if undefined.
*
* @return attribute specified by given key or the defaultValue
* if undefined
* @exception if the attribute with the given key exists
* but is not a <code>java.util.Map</code>
*/
protected Map getMapAttribute(String key, Map defaultValue) throws CoreException {
Object attr = getAttributeTable().get(key);
if (attr != null) {
if (attr instanceof Map) {
return (Map)attr;
} else {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("LaunchConfigurationInfo.Attribute_{0}_is_not_of_type_java.util.Map._1"), new String[] {key}), null //$NON-NLS-1$
)
);
}
}
return defaultValue;
}
/**
* Returns a copy of this info object
*
* @return copy of this info
*/
protected CBuildConfigInfo getCopy() {
CBuildConfigInfo copy = new CBuildConfigInfo();
copy.setAttributeTable((HashMap)getAttributeTable().clone());
return copy;
}
/**
* Sets the given attribute to the given value. Only
* working copy's should use this API.
*
* @param key attribute key
* @param value attribuet value
*/
protected void setAttribute(String key, Object value) {
if (value == null) {
getAttributeTable().remove(key);
} else {
getAttributeTable().put(key, value);
}
}
/**
* Returns the content of this info as XML
*
* @return the content of this info as XML
* @exception IOException if an exception occurs creating the XML
*/
protected String getAsXML() throws IOException {
Document doc = new DocumentImpl();
Element configRootElement = doc.createElement("buildConfiguration"); //$NON-NLS-1$
doc.appendChild(configRootElement);
Iterator keys = getAttributeTable().keySet().iterator();
while (keys.hasNext()) {
String key = (String)keys.next();
Object value = getAttributeTable().get(key);
if (value == null) {
continue;
}
Element element = null;
String valueString = null;
if (value instanceof String) {
valueString = (String)value;
element = createKeyValueElement(doc, "stringAttribute", key, valueString); //$NON-NLS-1$
} else if (value instanceof Integer) {
valueString = ((Integer)value).toString();
element = createKeyValueElement(doc, "intAttribute", key, valueString); //$NON-NLS-1$
} else if (value instanceof Boolean) {
valueString = ((Boolean)value).toString();
element = createKeyValueElement(doc, "booleanAttribute", key, valueString); //$NON-NLS-1$
} else if (value instanceof List) {
element = createListElement(doc, "listAttribute", key, (List)value); //$NON-NLS-1$
} else if (value instanceof Map) {
element = createMapElement(doc, "mapAttribute", key, (Map)value); //$NON-NLS-1$
}
configRootElement.appendChild(element);
}
return CBuildConfigManager.serializeDocument(doc);
}
/**
* Helper method that creates a 'key value' element of the specified type with the
* specified attribute values.
*/
protected Element createKeyValueElement(Document doc, String elementType, String key, String value) {
Element element = doc.createElement(elementType);
element.setAttribute("key", key); //$NON-NLS-1$
element.setAttribute("value", value); //$NON-NLS-1$
return element;
}
protected Element createListElement(Document doc, String elementType, String listKey, List list) {
Element listElement = doc.createElement(elementType);
listElement.setAttribute("key", listKey); //$NON-NLS-1$
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String value = (String) iterator.next();
Element element = doc.createElement("listEntry"); //$NON-NLS-1$
element.setAttribute("value", value); //$NON-NLS-1$
listElement.appendChild(element);
}
return listElement;
}
protected Element createMapElement(Document doc, String elementType, String mapKey, Map map) {
Element mapElement = doc.createElement(elementType);
mapElement.setAttribute("key", mapKey); //$NON-NLS-1$
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value = (String) map.get(key);
Element element = doc.createElement("mapEntry"); //$NON-NLS-1$
element.setAttribute("key", key); //$NON-NLS-1$
element.setAttribute("value", value); //$NON-NLS-1$
mapElement.appendChild(element);
}
return mapElement;
}
protected void initializeFromXML(Element root) throws CoreException {
if (!root.getNodeName().equalsIgnoreCase("buildConfiguration")) { //$NON-NLS-1$
throw getInvalidFormatDebugException();
}
NodeList list = root.getChildNodes();
int length = list.getLength();
for (int i = 0; i < length; ++i) {
Node node = list.item(i);
short type = node.getNodeType();
if (type == Node.ELEMENT_NODE) {
Element element = (Element) node;
String nodeName = element.getNodeName();
if (nodeName.equalsIgnoreCase("stringAttribute")) { //$NON-NLS-1$
setStringAttribute(element);
} else if (nodeName.equalsIgnoreCase("intAttribute")) { //$NON-NLS-1$
setIntegerAttribute(element);
} else if (nodeName.equalsIgnoreCase("booleanAttribute")) { //$NON-NLS-1$
setBooleanAttribute(element);
} else if (nodeName.equalsIgnoreCase("listAttribute")) { //$NON-NLS-1$
setListAttribute(element);
} else if (nodeName.equalsIgnoreCase("mapAttribute")) { //$NON-NLS-1$
setMapAttribute(element);
}
}
}
}
protected void setStringAttribute(Element element) throws CoreException {
String key = getKeyAttribute(element);
String value = getValueAttribute(element);
setAttribute(key, value);
}
protected void setIntegerAttribute(Element element) throws CoreException {
String key = getKeyAttribute(element);
String value = getValueAttribute(element);
setAttribute(key, new Integer(value));
}
protected void setBooleanAttribute(Element element) throws CoreException {
String key = getKeyAttribute(element);
String value = getValueAttribute(element);
setAttribute(key, new Boolean(value));
}
protected void setListAttribute(Element element) throws CoreException {
String listKey = element.getAttribute("key"); //$NON-NLS-1$
NodeList nodeList = element.getChildNodes();
int entryCount = nodeList.getLength();
List list = new ArrayList(entryCount);
for (int i = 0; i < entryCount; i++) {
Node node = nodeList.item(i);
short type = node.getNodeType();
if (type == Node.ELEMENT_NODE) {
Element subElement = (Element) node;
String nodeName = subElement.getNodeName();
if (!nodeName.equalsIgnoreCase("listEntry")) { //$NON-NLS-1$
throw getInvalidFormatDebugException();
}
String value = getValueAttribute(subElement);
list.add(value);
}
}
setAttribute(listKey, list);
}
protected void setMapAttribute(Element element) throws CoreException {
String mapKey = element.getAttribute("key"); //$NON-NLS-1$
NodeList nodeList = element.getChildNodes();
int entryCount = nodeList.getLength();
Map map = new HashMap(entryCount);
for (int i = 0; i < entryCount; i++) {
Node node = nodeList.item(i);
short type = node.getNodeType();
if (type == Node.ELEMENT_NODE) {
Element subElement = (Element) node;
String nodeName = subElement.getNodeName();
if (!nodeName.equalsIgnoreCase("mapEntry")) { //$NON-NLS-1$
throw getInvalidFormatDebugException();
}
String key = getKeyAttribute(subElement);
String value = getValueAttribute(subElement);
map.put(key, value);
}
}
setAttribute(mapKey, map);
}
protected String getKeyAttribute(Element element) throws CoreException {
String key = element.getAttribute("key"); //$NON-NLS-1$
if (key == null) {
throw getInvalidFormatDebugException();
}
return key;
}
protected String getValueAttribute(Element element) throws CoreException {
String value = element.getAttribute("value"); //$NON-NLS-1$
if (value == null) {
throw getInvalidFormatDebugException();
}
return value;
}
protected DebugException getInvalidFormatDebugException() {
return
new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, DebugCoreMessages.getString("LaunchConfigurationInfo.Invalid_launch_configuration_XML._10"), null //$NON-NLS-1$
)
);
}
/**
* Two <code>CBuildConfigInfo</code> objects are equal if and only if
* they have the same set of attributes with the same values.
*
* @see Object#equals(Object)
*/
public boolean equals(Object obj) {
// Make sure it's a LaunchConfigurationInfo object
if (!(obj instanceof CBuildConfigInfo)) {
return false;
}
CBuildConfigInfo other = (CBuildConfigInfo) obj;
// Make sure the attributes are the same
return compareAttributes(fAttributes, other.getAttributeTable());
}
/**
* Returns whether the two attribute maps are equal, consulting
* registered comparator extensions.
*
* @param map1 attribute map
* @param map2 attribute map
* @return whether the two attribute maps are equal
*/
protected boolean compareAttributes(HashMap map1, HashMap map2) {
ICBuildConfigManager manager = BuilderPlugin.getDefault().getBuildConfigurationManager();
if (map1.size() == map2.size()) {
Iterator attributes = map1.keySet().iterator();
while (attributes.hasNext()) {
String key = (String)attributes.next();
Object attr1 = map1.get(key);
Object attr2 = map2.get(key);
if (attr2 == null) {
return false;
}
if (!attr1.equals(attr2)) {
return false;
}
}
return true;
}
return false;
}
}

View file

@ -0,0 +1,415 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model.internal;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.xml.serialize.Method;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.Serializer;
import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigListener;
import org.eclipse.cdt.core.builder.model.ICBuildConfigManager;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.core.DebugCoreMessages;
import org.eclipse.debug.internal.core.ListenerList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Manages build configurations.
*
* @see ICBuildConfigManager
*/
public class CBuildConfigManager implements ICBuildConfigManager {
/**
* Collection of listeners
*/
private ListenerList fListeners = new ListenerList(5);
/**
* Types of notifications
*/
public static final int ADDED = 0;
public static final int REMOVED = 1;
public static final int CHANGED = 2;
/**
* Serializes a XML document into a string - encoded in UTF8 format,
* with platform line separators.
*
* @param doc document to serialize
* @return the document as a string
*/
public static String serializeDocument(Document doc) throws IOException {
ByteArrayOutputStream s= new ByteArrayOutputStream();
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
Serializer serializer =
SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(
new OutputStreamWriter(s, "UTF8"), //$NON-NLS-1$
format);
serializer.asDOMSerializer().serialize(doc);
return s.toString("UTF8"); //$NON-NLS-1$
}
/**
* @see ICBuildConfigManager#addListener(ICBuildConfigListener)
*/
public void addListener(ICBuildConfigListener listener) {
fListeners.add(listener);
}
/**
* @see ICBuildConfigManager#removeListener(ICBuildConfigListener)
*/
public void removeListener(ICBuildConfigListener listener) {
fListeners.remove(listener);
}
/**
* @see ICBuildConfigManager#addConfiguration(ICBuildConfig)
*/
public void addConfiguration(ICBuildConfig configuration) {
fireUpdate(configuration, ADDED);
}
/**
* @see ICBuildConfigManager#removeConfiguration(ICBuildConfig)
*/
public void removeConfiguration(ICBuildConfig configuration) {
fireUpdate(configuration, REMOVED);
}
/**
* @see ICBuildConfigManager#generateUniqueConfigurationNameFrom(IProject, String)
*/
public String generateUniqueConfigurationNameFrom(IProject project, String baseName) {
int index = 1;
int length= baseName.length();
int copyIndex = baseName.lastIndexOf(" ("); //$NON-NLS-1$
if (copyIndex > -1 && length > copyIndex + 2 && baseName.charAt(length - 1) == ')') {
String trailer = baseName.substring(copyIndex + 2, length -1);
if (isNumber(trailer)) {
try {
index = Integer.parseInt(trailer);
baseName = baseName.substring(0, copyIndex);
} catch (NumberFormatException nfe) {
}
}
}
String newName = baseName;
try {
StringBuffer buffer= null;
while (isExistingConfigurationName(project, newName)) {
buffer = new StringBuffer(baseName);
buffer.append(" ("); //$NON-NLS-1$
buffer.append(String.valueOf(index));
index++;
buffer.append(')');
newName = buffer.toString();
}
} catch (CoreException e) {
DebugPlugin.log(e);
}
return newName;
}
/**
* @see ICBuildConfigManager#getConfiguration(IFile)
*/
public ICBuildConfig getConfiguration(IFile file) {
return new CBuildConfig(file.getLocation());
}
/**
* @see ICBuildConfigManager#getConfiguration(String)
*/
public ICBuildConfig getConfiguration(String memento) throws CoreException {
return new CBuildConfig(memento);
}
public ICBuildConfigWorkingCopy getConfiguration(IProject project, String name) {
if ((name == null) || (name.length() < 1)) {
name = "New Configuration";
}
name = generateUniqueConfigurationNameFrom(project, name);
return new CBuildConfigWorkingCopy(project, name);
}
/**
* @see ICBuildConfigManager#getConfigurations(IProject)
*/
public ICBuildConfig[] getConfigurations(IProject project) throws CoreException {
List configs = findConfigurations(project, ICBuildConfig.BUILD_CONFIGURATION_FILE_EXTENSION);
return (ICBuildConfig[]) configs.toArray(new ICBuildConfig[configs.size()]);
}
/**
* @see ICBuildConfigManager#isExistingConfigurationName(IProject, String)
*/
public boolean isExistingConfigurationName(IProject project, String name) throws CoreException {
List configFiles;
int count = 0;
configFiles = findConfigurations(project, ICBuildConfig.BUILD_CONFIGURATION_FILE_EXTENSION);
count = configFiles.size();
if (count > 0) {
for (Iterator iter = configFiles.iterator(); iter.hasNext();) {
ICBuildConfig element = (ICBuildConfig) iter.next();
if (name.equals(element.getName())) {
return true;
}
}
}
return false;
}
/**
* Fires notification to the listeners that a configuration
* has been added, removed, updated, or deleted.
*/
protected void fireUpdate(ICBuildConfig configuration, int update) {
Object[] copiedListeners = fListeners.getListeners();
for (int i= 0; i < copiedListeners.length; i++) {
ICBuildConfigListener listener = (ICBuildConfigListener) copiedListeners[i];
switch (update) {
case ADDED:
listener.configurationAdded(configuration);
break;
case REMOVED:
listener.configurationRemoved(configuration);
break;
case CHANGED:
listener.configurationChanged(configuration);
break;
}
}
}
/**
* Notifies the manager that a configuration has been deleted.
*
* @param project the project containing the configuration
* @param config the configuration that was deleted
*/
protected void configurationDeleted(ICBuildConfig configuration) throws CoreException {
fireUpdate(configuration, REMOVED);
}
/**
* Notifies the manager that a configuration has been added.
*
* @param project the project containing the configuration
* @param config the configuration that was added
*/
protected void configurationAdded(ICBuildConfig configuration) throws CoreException {
if (isValid(configuration)) {
fireUpdate(configuration, ADDED);
} else {
fireUpdate(configuration, ADDED);
}
}
/**
* Notifies the manager that a configuration has been added.
*
* @param project the project containing the configuration
* @param config the launch configuration that was changed
*/
protected void configurationChanged(ICBuildConfig configuration) {
if (isValid(configuration)) {
fireUpdate(configuration, CHANGED);
} else {
fireUpdate(configuration, REMOVED);
}
}
/**
* Returns the info object for the specified launch configuration.
* If the configuration exists, but is not yet in the cache,
* an info object is built and added to the cache.
*
* @exception CoreException if an exception occurs building
* the info object
* @exception DebugException if the config does not exist
*/
protected CBuildConfigInfo getInfo(ICBuildConfig config) throws CoreException {
CBuildConfigInfo info = null;
if (config.exists()) {
InputStream stream = null;
try {
IFile file = ((CBuildConfig) config).getFile();
stream = file.getContents();
info = createInfoFromXML(stream);
} catch (FileNotFoundException e) {
throw createDebugException(MessageFormat.format(DebugCoreMessages.getString("LaunchManager.{0}_occurred_while_reading_launch_configuration_file._1"), new String[]{e.toString()}), e); //$NON-NLS-1$
} catch (SAXException e) {
throw createDebugException(MessageFormat.format(DebugCoreMessages.getString("LaunchManager.{0}_occurred_while_reading_launch_configuration_file._1"), new String[]{e.toString()}), e); //$NON-NLS-1$
} catch (ParserConfigurationException e) {
throw createDebugException(MessageFormat.format(DebugCoreMessages.getString("LaunchManager.{0}_occurred_while_reading_launch_configuration_file._1"), new String[]{e.toString()}), e); //$NON-NLS-1$
} catch (IOException e) {
throw createDebugException(MessageFormat.format(DebugCoreMessages.getString("LaunchManager.{0}_occurred_while_reading_launch_configuration_file._1"), new String[]{e.toString()}), e); //$NON-NLS-1$
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
throw createDebugException(MessageFormat.format(DebugCoreMessages.getString("LaunchManager.{0}_occurred_while_reading_launch_configuration_file._1"), new String[]{e.toString()}), e); //$NON-NLS-1$
}
}
}
} else {
throw createDebugException(DebugCoreMessages.getString("LaunchManager.Launch_configuration_does_not_exist._6"), null); //$NON-NLS-1$
}
return info;
}
/**
* Return a LaunchConfigurationInfo object initialized from XML contained in
* the specified stream. Simply pass out any exceptions encountered so that
* caller can deal with them. This is important since caller may need access to the
* actual exception.
*/
protected CBuildConfigInfo createInfoFromXML(InputStream stream)
throws CoreException, ParserConfigurationException, IOException, SAXException {
Element root = null;
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
root = parser.parse(new InputSource(stream)).getDocumentElement();
CBuildConfigInfo info = new CBuildConfigInfo();
info.initializeFromXML(root);
return info;
}
/**
* Return an instance of DebugException containing the specified message and Throwable.
*/
protected DebugException createDebugException(String message, Throwable throwable) {
return new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, message, throwable
)
);
}
/**
* Finds and returns all configurations in the given
* container (and subcontainers)
*
* @param container the container to search
* @exception CoreException an exception occurs traversing
* the container.
* @return all configurations in the given container
*/
protected List findConfigurations(IContainer container, String extension) throws CoreException {
List list = new ArrayList(10);
if (container instanceof IProject && !((IProject)container).isOpen()) {
return list;
}
searchForFiles(container, extension, list);
Iterator iter = list.iterator();
List configs = new ArrayList(list.size());
while (iter.hasNext()) {
IFile file = (IFile)iter.next();
configs.add(getConfiguration(file));
}
return configs;
}
/**
* Recursively searches the given container for files with the given
* extension.
*
* @param container the container to search in
* @param extension the file extension being searched for
* @param list the list to add the matching files to
* @exception CoreException if an exception occurs traversing
* the container
*/
protected void searchForFiles(IContainer container, String extension, List list) throws CoreException {
IResource[] members = container.members();
for (int i = 0; i < members.length; i++) {
if (members[i] instanceof IContainer) {
if (members[i] instanceof IProject && !((IProject)members[i]) .isOpen()) {
continue;
}
searchForFiles((IContainer)members[i], extension, list);
} else if (members[i] instanceof IFile) {
IFile file = (IFile)members[i];
if (extension.equalsIgnoreCase(file.getFileExtension())) {
list.add(file);
}
}
}
}
/**
* Returns whether the given String is composed solely of digits
*/
private boolean isNumber(String string) {
int numChars= string.length();
if (numChars == 0) {
return false;
}
for (int i= 0; i < numChars; i++) {
if (!Character.isDigit(string.charAt(i))) {
return false;
}
}
return true;
}
/**
* Returns whether the given configuration passes a basic
* integritiy test.
*
* @param config the configuration to verify
* @return whether the config meets basic integrity constraints
*/
protected boolean isValid(ICBuildConfig config) {
// TODO: Tests?
return (null != config);
}
}

View file

@ -0,0 +1,490 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.model.internal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.core.DebugCoreMessages;
/**
* @author sam.robb
*/
public class CBuildConfigWorkingCopy extends CBuildConfig implements ICBuildConfigWorkingCopy {
/**
* Handle of original launch configuration this
* working copy is based on
*/
private CBuildConfig fOriginal;
/**
* Working copy of attributes.
*/
private CBuildConfigInfo fInfo;
/**
* Whether this working copy has been modified since
* it was created
*/
private boolean fDirty = false;
/**
* The name for this configuration.
*/
private String fName;
/**
* Indicates whether this working copy has been explicitly renamed.
*/
private boolean fRenamed = false;
/**
* Suppress change notification until created
*/
private boolean fSuppressChange = true;
/**
* The container this working copy will be
* stored in when saved.
*/
private IContainer fContainer;
/**
* Constructs a working copy of the specified launch
* configuration.
*
* @param original launch configuration to make
* a working copy of
* @exception CoreException if unable to initialize this
* working copy's attributes based on the original configuration
*/
protected CBuildConfigWorkingCopy(CBuildConfig original) throws CoreException {
super(original.getLocation());
setName(original.getName());
copyFrom(original);
setOriginal(original);
fSuppressChange = false;
}
/**
* Constructs a copy of the specified launch
* configuration, with the given (new) name.
*
* @param original launch configuration to make
* a working copy of
* @param name the new name for the copy of the launch
* configuration
* @exception CoreException if unable to initialize this
* working copy's attributes based on the original configuration
*/
protected CBuildConfigWorkingCopy(CBuildConfig original, String name) throws CoreException {
super(original.getLocation());
copyFrom(original);
setName(name);
fSuppressChange = false;
}
/**
* Constructs a new working copy to be created in the specified
* location.
*
* @param container the container that the configuration will be created in
* or <code>null</code> if to be local
* @param name the name of the new launch configuration
* @param type the type of this working copy
*/
protected CBuildConfigWorkingCopy(IContainer container, String name) {
super((IPath)null);
setName(name);
setInfo(new CBuildConfigInfo());
setContainer(container);
fSuppressChange = false;
}
/**
* @see ICBuildConfigWorkingCopy#isDirty()
*/
public boolean isDirty() {
return fDirty;
}
/**
* @see ICBuildConfigWorkingCopy#doSave()
*/
public ICBuildConfig doSave() throws CoreException {
if (isDirty()) {
IWorkspaceRunnable wr = new IWorkspaceRunnable() {
public void run(IProgressMonitor pm) throws CoreException {
// write the new file
CBuildConfigWorkingCopy.this.writeNewFile();
// delete the old file if this is not a new configuration
// or the file was renamed/moved
if (!CBuildConfigWorkingCopy.this.isNew()) {
if (CBuildConfigWorkingCopy.this.isMoved()) {
CBuildConfigWorkingCopy.this.getOriginal().delete();
}
}
resetDirty();
}
};
ResourcesPlugin.getWorkspace().run(wr, null);
}
return new CBuildConfig(getLocation());
}
/**
* Writes the new configuration information to a file.
*
* @exception CoreException if writing the file fails
*/
protected void writeNewFile() throws CoreException {
String xml = null;
try {
xml = getInfo().getAsXML();
} catch (IOException e) {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("CBuildConfigWorkingCopy.{0}_occurred_generating_launch_configuration_XML._1"), new String[]{e.toString()}), null //$NON-NLS-1$
)
);
}
if (isLocal()) {
// use java.io to update configuration file
try {
boolean added = false;
File file = getLocation().toFile();
File dir = getLocation().removeLastSegments(1).toFile();
dir.mkdirs();
if (!file.exists()) {
added = true;
file.createNewFile();
}
FileOutputStream stream = new FileOutputStream(file);
stream.write(xml.getBytes("UTF8")); //$NON-NLS-1$
stream.close();
if (added) {
getBuildConfigurationManager().configurationAdded(new CBuildConfig(getLocation()));
} else {
getBuildConfigurationManager().configurationChanged(new CBuildConfig(getLocation()));
}
} catch (IOException e) {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, MessageFormat.format(DebugCoreMessages.getString("CBuildConfigWorkingCopy.{0}_occurred_generating_launch_configuration_XML._1"), new String[]{e.toString()}), null //$NON-NLS-1$
)
);
}
} else {
// use resource API to update configuration file
IFile file = getFile();
IContainer dir = file.getParent();
if (!dir.exists()) {
throw new DebugException(
new Status(
Status.ERROR, DebugPlugin.getUniqueIdentifier(),
DebugException.REQUEST_FAILED, DebugCoreMessages.getString("CBuildConfigWorkingCopy.Specified_container_for_launch_configuration_does_not_exist_2"), null //$NON-NLS-1$
)
);
}
ByteArrayInputStream stream = new ByteArrayInputStream(xml.getBytes());
if (!file.exists()) {
file.create(stream, false, null);
//getLaunchManager().CBuildConfigurationAdded(new CBuildConfig(getLocation()));
} else {
file.setContents(stream, false, false, null);
//getLaunchManager().CBuildConfigurationChanged(new CBuildConfig(getLocation()));
}
}
}
/**
* @see ICBuildConfigWorkingCopy#setAttribute(String, int)
*/
public void setAttribute(String attributeName, int value) {
getInfo().setAttribute(attributeName, new Integer(value));
setDirty();
}
/**
* @see ICBuildConfigWorkingCopy#setAttribute(String, String)
*/
public void setAttribute(String attributeName, String value) {
getInfo().setAttribute(attributeName, value);
setDirty();
}
/**
* @see ICBuildConfigWorkingCopy#setAttribute(String, boolean)
*/
public void setAttribute(String attributeName, boolean value) {
getInfo().setAttribute(attributeName, new Boolean(value));
setDirty();
}
/**
* @see ICBuildConfigWorkingCopy#setAttribute(String, List)
*/
public void setAttribute(String attributeName, List value) {
getInfo().setAttribute(attributeName, value);
setDirty();
}
/**
* @see ICBuildConfigWorkingCopy#setAttribute(String, Map)
*/
public void setAttribute(String attributeName, Map value) {
getInfo().setAttribute(attributeName, value);
setDirty();
}
/**
* @see ICBuildConfigWorkingCopy#getOriginal()
*/
public ICBuildConfig getOriginal() {
return fOriginal;
}
/**
* Sets the launch configuration this working copy
* is based on. Initializes the attributes of this
* working copy to the current values of the given
* configuration.
*
* @param originl the launch configuration this working
* copy is based on.
* @exception CoreException if unable to initialize this
* working copy based on the original's current attribute
* set
*/
private void copyFrom(CBuildConfig original) throws CoreException {
CBuildConfigInfo info = original.getInfo();
setInfo(info.getCopy());
setContainer(original.getContainer());
resetDirty();
}
/**
* Sets the launch configuration this working copy
* is based on.
*
* @param originl the launch configuration this working
* copy is based on.
*/
private void setOriginal(CBuildConfig original) {
fOriginal = original;
}
/**
* Sets the working copy info object for this working copy.
*
* @param info a copy of attributes from this working copy's
* original launch configuration
*/
protected void setInfo(CBuildConfigInfo info) {
fInfo = info;
}
/**
* @see ICBuildConfig#isWorkingCopy()
*/
public boolean isWorkingCopy() {
return true;
}
/**
* A working copy keeps a local info object that is not
* cached with the launch manager.
*
* @see CBuildConfig#getInfo()
*/
protected CBuildConfigInfo getInfo() {
return fInfo;
}
/**
* Sets this working copy's state to dirty.
* Notifies listeners that this working copy has
* changed.
*/
private void setDirty() {
fDirty = true;
if (!suppressChangeNotification()) {
getBuildConfigurationManager().configurationChanged(this);
}
}
/**
* Sets this working copy's state to not dirty.
*/
private void resetDirty() {
fDirty = false;
}
/**
* @see ICBuildConfigWorkingCopy#rename(String)
*/
public void rename(String name) {
if (!getName().equals(name)) {
setName(name);
fRenamed = isNew() || !(getOriginal().getName().equals(name));
}
}
/**
* Sets the new name for this configuration.
*
* @param name the new name for this configuration
*/
private void setName(String name) {
fName = name;
setDirty();
}
/**
* @see ICBuildConfig#getName()
*/
public String getName() {
return fName;
}
/**
* @see ICBuildConfig#isLocal()
*/
public boolean isLocal() {
return getContainer() == null;
}
/**
* Returns the location this launch configuration will reside at
* when saved.
*
* @see ICBuildConfig#getLocation()
*/
public IPath getLocation() {
if (isMoved()) {
IPath path = getContainer().getLocation();
path = path.append(getName() + "." + BUILD_CONFIGURATION_FILE_EXTENSION); //$NON-NLS-1$
return path;
} else {
return getOriginal().getLocation();
}
}
/**
* Returns whether this working copy is new, or is a
* working copy of another launch configuration.
*
* @return whether this working copy is new, or is a
* working copy of another launch configuration
*/
protected boolean isNew() {
return getOriginal() == null;
}
/**
* Returns whether this working copy is new or if its
* location has changed from that of its original.
*
* @return whether this working copy is new or if its
* location has changed from that of its original
*/
protected boolean isMoved() {
if (isNew() || fRenamed) {
return true;
}
IContainer newContainer = getContainer();
IContainer originalContainer = ((CBuildConfig)getOriginal()).getContainer();
if (newContainer == originalContainer) {
return false;
}
if (newContainer == null) {
return !originalContainer.equals(newContainer);
} else {
return !newContainer.equals(originalContainer);
}
}
/**
* A working copy cannot generate a memento.
*
* @see ICBuildConfig#getMemento()
*/
public String getMemento() {
return null;
}
/**
* Returns whether change notification should be
* suppressed
*/
protected boolean suppressChangeNotification() {
return fSuppressChange;
}
/**
* @see ICBuildConfigWorkingCopy#setContainer(IContainer)
*/
public void setContainer(IContainer container) {
if (container == fContainer) {
return;
}
if (container != null) {
if (container.equals(fContainer)) {
return;
}
} else {
if (fContainer.equals(container)) {
return;
}
}
fContainer = container;
setDirty();
}
/**
* Returns the container this working copy will be
* stored in when saved, or <code>null</code> if
* this working copy is local.
*
* @return the container this working copy will be
* stored in when saved, or <code>null</code> if
* this working copy is local
*/
protected IContainer getContainer() {
return fContainer;
}
}

View file

@ -0,0 +1,125 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import org.eclipse.cdt.internal.core.ProcessClosure;
import org.eclipse.cdt.utils.spawner.ProcessFactory;
/**
* Performs file path translation on a Windows + Cygwin system.
* <p>
* This allows for translation between "native" Windows path
* names and Cygwin style path names.
*/
public class CCygwinFilesystem implements IFilesystem {
private static String CONVERT_CMD = "cygpath"; //$NON-NLS-1$
private static String CONVERT_TO_UNIX = "-u"; //$NON-NLS-1$
private static String CONVERT_TO_NATIVE = "-w"; //$NON-NLS-1$
private String fHome;
public CCygwinFilesystem() {
super();
fHome =
getNativePath(IFilesystem.FILESYSTEM_ROOT)
+ IFilesystem.FILESYSTEM_ROOT;
}
/**
* Helper function for converting native (Windows) paths to Unix paths,
* and vice versa.
*
* @param path the path to covert.
* @param cmdFlags how to convert the path. Supported values for are
* CONVERT_TO_UNIX and CONVERT_TO_NATIVE.
*/
private String convertPath(String path, String cmdFlags) {
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
String[] cmds = { CONVERT_CMD, cmdFlags, path };
String newPath = path;
// In the event that cygpath is not found, or fails for some reason,
// this function will return a Cygwinized/Javaized version of the
// path (ex, "C:\foo\bar" will become "C:/foo/bar").
try {
ProcessFactory pf = ProcessFactory.getFactory();
Process pid = pf.exec(cmds);
ProcessClosure pc = new ProcessClosure(pid, stdout, stderr);
pc.runBlocking();
newPath = stdout.toString().trim();
} catch (IOException e) {
e.printStackTrace();
}
return newPath.replace(PATHSEP_WINDOWS, PATHSEP_CYGWIN);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getRoot()
*/
public String getRoot() {
return fHome;
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(String)
*/
public String getNativePath(String path) {
return convertPath(path, CONVERT_TO_NATIVE);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(File)
*/
public String getNativePath(File path) {
return getNativePath(path.toString());
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(String)
*/
public String getUnixPath(String path) {
path = convertPath(path, CONVERT_TO_UNIX);
// Make sure there are no spaces in the path and if there are, escape them.
String subString = new String(""); //$NON-NLS-1$
int len = 0;
int begin = 0;
while ((len = path.indexOf(" ")) >= 0) { //$NON-NLS-1$
subString += path.substring(begin, len);
subString += "\\ "; //$NON-NLS-1$
path = path.substring(len + 1);
}
subString += path;
return subString;
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(File)
*/
public String getUnixPath(File path) {
return getUnixPath(path.toString());
}
}

View file

@ -0,0 +1,58 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.util;
import java.io.File;
/**
* Performs file path translation on a Unix system.
* <p>
* This is essentially uninteresting, as the whole purpose of the filesystem
* abstraction is to provide for some minimal support for Unix-y file paths
* under Windows + Cygwin.
*/
public class CUnixFilesystem implements IFilesystem {
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getRoot()
*/
public String getRoot() {
return IFilesystem.FILESYSTEM_ROOT;
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(String)
*/
public String getNativePath(String path) {
return new String(path);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(File)
*/
public String getNativePath(File path) {
return path.toString();
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(String)
*/
public String getUnixPath(String path) {
return new String(path);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(File)
*/
public String getUnixPath(File path) {
return path.toString();
}
}

View file

@ -0,0 +1,50 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.util;
/**
* @author sam.robb
*
* Collection of generic utility functions.
*/
public class CUtil {
/**
* Given a name, this function will decide whether the
* name conforms to rules for naming valid C identifiers.
*/
public static boolean isValidCIdentifier(String name) {
// any sequence of letters, digits, or underscores,
// which begins with a letter or underscore
if ((name == null) || (name.length() < 1)) {
return false;
}
char c = name.charAt(0);
if ((c != '_') && !Character.isLetter(c)) {
return false;
}
for (int i = 1; i < name.length(); i++) {
c = name.charAt(i);
if ((c != '_') && !Character.isLetterOrDigit(c)) {
return false;
}
}
return true;
}
}

View file

@ -0,0 +1,161 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.eclipse.core.internal.runtime.Assert;
/**
* Singleton that wraps the concept of the current OS's
* filesystem in a way that allows us to work properly
* under Cygwin.
*/
public class Filesystem {
private static IFilesystem fInstance;
/**
* Create the IFilesystem instance appropriate for the current OS.
*
* Right now, this is based off of the speratorChar reported by
* java.io.File; there is probably a better way to deal with this.
*/
static {
// init to null, update with class reference if we can
// otherwise leave null to signal that we don't have a valid file system.
if (File.separatorChar == IFilesystem.FILESYSTEM_ROOT.charAt(0)) {
fInstance = new CUnixFilesystem();
} else {
fInstance = new CCygwinFilesystem();
}
}
private static IFilesystem getInstance() {
if (fInstance == null) {
throw new FileSystemException ("Problems encountered while searching for your file system.");
}
return fInstance;
}
public static boolean isValid() {
return (fInstance != null);
}
public static class FileSystemException extends Error {
FileSystemException (String s) {
super(s);
}
}
/**
* Private constructor to prevent instatiation.
*
* All members of this class are static, and intended to be accessed
* via "Filesystem.[method_name]".
*/
private Filesystem() {
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getRoot()
*/
public static String getRoot() {
return getInstance().getRoot();
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(String)
*/
public static String getNativePath(String path) {
return getInstance().getNativePath(path);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getNativePath(File)
*/
public static String getNativePath(File path) {
return getInstance().getNativePath(path);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(String)
*/
public static String getUnixPath(String path) {
return getInstance().getUnixPath(path);
}
/**
* @see org.eclipse.cdt.core.builder.util.IFilesystem#getUnixPath(File)
*/
public static String getUnixPath(File path) {
return getInstance().getUnixPath(path);
}
/**
* Copy a file from sourceFile to destFile. Performs a binary file copy,
* reading data from sourceFile as a byte stream, and writing it to destFile
* as a byte stream.
*
* @param sourceFile File to copy.
* @param destFile Where to copy the file to.
* @param replaceIfExists If true, if destFile exists, it is replaced.
* @return True if the file was copied; false otherwise.
*/
public static boolean copyFile(File sourceFile, File destFile, boolean replaceIfExists) {
Assert.isNotNull(sourceFile);
Assert.isNotNull(destFile);
if (!sourceFile.exists()) {
return false;
}
if (sourceFile.equals(destFile)) {
return false;
}
if (replaceIfExists && destFile.exists()) {
destFile.delete();
}
if (destFile.exists()) {
return false;
}
FileInputStream fis = null;
FileOutputStream fos = null;
byte[] buf = new byte[1024];
int i = 0;
try {
fis = new FileInputStream(sourceFile);
fos = new FileOutputStream(destFile);
while(-1 != (i = fis.read(buf))) {
fos.write(buf, 0, i);
}
fos.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
if (destFile.exists()) {
destFile.delete();
}
return false;
}
return true;
}
}

View file

@ -0,0 +1,66 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.builder.util;
import java.io.File;
/**
* Abstracts information about a filesystem in order to allow
* translation between native/unix pathnames.
*/
public interface IFilesystem {
public static String FILESYSTEM_ROOT = "/"; //$NON-NLS-1$
public static char PATHSEP_WINDOWS = '\\'; //$NON-NLS-1$
public static char PATHSEP_CYGWIN = '\\'; //$NON-NLS-1$
/**
* Get the root directory for the filesystem.
*
* The root directory is returned in native filesystem format
* (ex, "C:/cygwin/" on Windows, "/" on Unix.) The returned
* string is guaranteed to have a trailing path seperator.
*/
public String getRoot();
/**
* Convert the provided path into a native path.
*
* @param path path to convert.
* @return native representation of path.
*/
public String getNativePath(String path);
/**
* Convert the provided path into a native path.
*
* @param path path to convert.
* @return native representation of path.
*/
public String getNativePath(File path);
/**
* Convert the provided path into a unix path.
*
* @param path path to convert.
* @return unix representation of path.
*/
public String getUnixPath(String path);
/**
* Convert the provided path into a unix path.
*
* @param path path to convert.
* @return unix representation of path.
*/
public String getUnixPath(File path);
}

View file

@ -1,113 +0,0 @@
package org.eclipse.cdt.core.builder;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
public class BuilderModel {
private static BuilderModel buildModel = null;
public final static String PLUGIN_ID = "org.eclipse.cdt.core";
public final static String BUILDER_NAME = "cbuilder";
public final static String BUILDER_ID = PLUGIN_ID + "." + BUILDER_NAME;
public static String getBuilderName () {
return BUILDER_NAME;
}
public static String getBuilderId () {
return BUILDER_ID;
}
/*
public IBuildPath getBuildPath(IProject project) {
return null;
}
public void setBuildPath(IProject project, IBuildPath bp) {
}
*/
public void addBuildListener () {
}
public void removeBuildListener() {
}
public void build(IProject project, IPath workingDir, String[] args) {
}
/**
* Adds default C Builder.
*/
public void addCToBuildSpec(IProject project) throws CoreException {
addToBuildSpec(project, getBuilderId());
}
/**
* Adds a builder to the build spec for the given project.
*/
public void addToBuildSpec(IProject project, String builderID) throws CoreException {
IProjectDescription description = project.getDescription();
ICommand[] commands = description.getBuildSpec();
ICommand command = null;
for (int i = 0; i < commands.length; i++) {
if (commands[i].getBuilderName().equals(builderID)) {
command = commands[i];
break;
}
}
if (command == null) {
command = description.newCommand();
command.setBuilderName(builderID);
// Add a build spec before other builders (1FWJK7I)
ICommand[] newCommands = new ICommand[commands.length + 1];
System.arraycopy(commands, 0, newCommands, 1, commands.length);
newCommands[0] = command;
// Commit the spec change into the project
description.setBuildSpec(newCommands);
project.setDescription(description, null);
}
}
/**
* Removes the default C Builder.
*/
public void removeCFromBuildSpec(IProject project) throws CoreException {
removeFromBuildSpec(project, getBuilderId());
}
/**
* Removes the given builder from the build spec for the given project.
*/
public void removeFromBuildSpec(IProject project, String builderID) throws CoreException {
IProjectDescription description = project.getDescription();
ICommand[] commands = description.getBuildSpec();
for (int i = 0; i < commands.length; ++i) {
if (commands[i].getBuilderName().equals(builderID)) {
ICommand[] newCommands = new ICommand[commands.length - 1];
System.arraycopy(commands, 0, newCommands, 0, i);
System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1);
description.setBuildSpec(newCommands);
project.setDescription(description, null);
}
}
}
private BuilderModel() {
}
public static BuilderModel getDefault() {
if (buildModel == null) {
buildModel = new BuilderModel();
}
return buildModel;
}
}

View file

@ -1,78 +0,0 @@
package org.eclipse.cdt.core.builder;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
/**
*
* Note: This class/interface is part of an interim API that is still under development and
* expected to change significantly before reaching stability. It is being made available at
* this early stage to solicit feedback from pioneering adopters on the understanding that any
* code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
*/
public class CIncrementalBuilder extends IncrementalProjectBuilder {
int kind;
Map args;
IProgressMonitor monitor;
private ICBuilder fCurrentBuilder;
public int getkind() {
return kind;
}
public Map getMap() {
return args;
}
public IProgressMonitor monitor() {
return monitor;
}
public IConsole getConsole() {
String id = fCurrentBuilder.getID();
return CCorePlugin.getDefault().getConsole(id);
}
//FIXME: Not implemented
public IPath getBuildDirectory() {
return getProject().getLocation();
}
//FIXME: Not implemented
public String[] getBuildParameters() {
return new String[0];
}
protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
throws CoreException {
this.kind = kind;
this.args = args;
this.monitor = monitor;
// Get the ICBuilder
ICBuilder cbuilder[] = getCBuilder();
// FIXME: Check preference for non-modal builds
fCurrentBuilder = cbuilder[0];
return fCurrentBuilder.build(this);
}
//FIXME: Not implemented
private ICBuilder[] getCBuilder () throws CoreException {
return new ICBuilder[0];
}
}

View file

@ -1,80 +0,0 @@
package org.eclipse.cdt.core.builder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
/**
*
* This class provides the infrastructure for defining a builder and fulfills the contract
* specified by the org.eclipse.cdt.core.cbuilder standard extension point.
* Note: This class/interface is part of an interim API that is still under development and
* expected to change significantly before reaching stability. It is being made available at
* this early stage to solicit feedback from pioneering adopters on the understanding that any
* code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
*/
public interface ICBuilder {
/**
* return the search include path list.
* @return IPath[]
*/
IPath[] getIncludePaths();
/**
* Change the search include path lists.
* @params IPath[]
*/
void setIncludePaths(IPath[] incPaths);
/**
* return the search library path list.
* @return IPath[]
*/
IPath[] getLibraryPaths();
/**
* Change the search library path lists.
* @params IPath[]
*/
void setLibraryPaths(IPath[] libPaths);
/**
* return the list of libraries use.
* @return String[]
*/
String[] getLibraries();
/**
* Change the libraries.
* @params String[]
*/
void setLibraries(String[] libs);
/**
* Get the Optimization level.
* @return IOptimization
*/
IOptimization getOptimization();
/**
* Change the Optimization level.
* @params IOptimization
*/
void setOptimization(IOptimization o);
/**
* Build the project.
*/
IProject[] build(CIncrementalBuilder cbuilder);
/**
* Method getID.
* @return String
*/
String getID();
}

View file

@ -1,20 +0,0 @@
package org.eclipse.cdt.core.builder;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
/**
*
* Note: This class/interface is part of an interim API that is still under development and
* expected to change significantly before reaching stability. It is being made available at
* this early stage to solicit feedback from pioneering adopters on the understanding that any
* code that uses this API will almost certainly be broken (repeatedly) as the API evolves.
*/
public interface IOptimization {
String getDescription(int level);
int getCurrentLevel();
void setCurrentLevel(int level);
int[] getLevels();
}

View file

@ -31,6 +31,52 @@
<extension-point id="ProcessList" name="%ProcessList.name" schema="schema/ProcessList.exsd"/>
<extension-point id="BinaryParser" name="BinaryParser"/>
<extension-point id="CToolchain" name="C/C++ Toolchain Provider" schema="schema/CToolchain.exsd"/>
<extension-point id="CBuildConfiguration" name="C/C++ Build Configuration" schema="schema/CBuildConfiguration.exsd"/>
<extension-point id="CTool" name="C/C++ Tool" schema="schema/CTool.exsd"/>
<extension-point id="CBuildVariable" name="C/C++ Build Variable" schema="schema/CBuildVariable.exsd"/>
<extension-point id="CToolType" name="C/C++ Tool Type" schema="schema/CToolType.exsd"/>
<extension
point="org.eclipse.cdt.core.CToolType">
<type
name="C Compiler"
id="org.eclipse.cdt.core.tool.c_compiler">
</type>
<type
name="C++ Compiler"
id="org.eclipse.cdt.core.tool.c++_compiler">
</type>
<type
name="Preprocessor"
id="org.eclipse.cdt.core.tool.c_preprocessor">
</type>
<type
name="Assembler"
id="org.eclipse.cdt.core.tool.assembler">
</type>
<type
name="Linker"
id="org.eclipse.cdt.core.tool.linker">
</type>
<type
name="Archiver"
id="org.eclipse.cdt.core.tool.archiver">
</type>
<type
name="Debugger"
id="org.eclipse.cdt.core.tool.debugger">
</type>
<type
name="Profiler"
id="org.eclipse.cdt.core.tool.profiler">
</type>
<type
name="Symbol Stripper"
id="org.eclipse.cdt.core.tool.strip">
</type>
</extension>
<extension
point="org.eclipse.cdt.core.BinaryParser">
<parser

View file

@ -0,0 +1,116 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core" id="CBuildConfiguration" name="C/C++ Build Configuration"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="configuration" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
a fully qualified identifier of the target extension point
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
an optional identifier of the extension instance
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
an optional name of the extension instance
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="configuration">
<complexType>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
a translatable name that will be used to identify this build
configuration in UI elements.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
name of a Java class implementing the ICBuildConfigurationProvider interface.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.builder.model.ICBuildConfigurationProvider"/>
</appInfo>
</annotation>
</attribute>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name that will be used to idenitfy this build configuration.
</documentation>
</annotation>
</attribute>
<attribute name="natures" type="string">
<annotation>
<documentation>
project nature this build configuration is associated with.
If '*' or not specified, it is associated with all project natures.
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -0,0 +1,109 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core.builder">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core.builder" id="CBuildVariable" name="C/C++ Build Variable"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="variable" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
a fully qualified identifier of the target extension point
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
an optional identifier of the extension instance
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
an optional name of the extension instance
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="variable">
<complexType>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
name of a Java class implementing the ICBuildVariableProvider
interface.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.builder.model.ICBuildVariable"/>
</appInfo>
</annotation>
</attribute>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name that will be used to idenitfy this build variable provider.
</documentation>
</annotation>
</attribute>
<attribute name="natures" type="string">
<annotation>
<documentation>
project nature this build variable provider is associated with.
If '*' or not specified, it is associated with all project natures.
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -0,0 +1,114 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core.builder">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core.builder" id="CTool" name="C/C++ Tool"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="tool" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
a fully qualified identifier of the target extension point
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
an optional identifier of the extension instance
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
an optional name of the extension instance
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="tool">
<complexType>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
a translatable name that will be used to identify this tool in UI elements.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
name of a Java class implementing the ICTool interface.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.builder.model.ICTool"/>
</appInfo>
</annotation>
</attribute>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name that will be used to idenitfy this tool.
</documentation>
</annotation>
</attribute>
<attribute name="type" type="string" use="required">
<annotation>
<documentation>
the type of this tool (corresponds to a CToolType id).
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -0,0 +1,98 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core.builder">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core.builder" id="CToolType" name="name"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="type" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
a fully qualified identifier of the target extension point
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
an optional identifier of the extension instance
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
an optional name of the extension instance
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="type">
<complexType>
<attribute name="id" type="string">
<annotation>
<documentation>
a unique name that will be used to idenitfy this type of tool.
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
a translatable name that will be used to identify this type of
tool in UI elements.
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -0,0 +1,109 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core" id="a CToolchainProvider" name="C/C++ Toolchain Provider"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="provider" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
a fully qualified identifier of the target extension point
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
an optional identifier of the extension instance
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
an optional name of the extension instance
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="provider">
<complexType>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name that will be used to identify this toolchain provider.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
name of a Java class implementing the ICToolchainProvider
interface.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.builder.model.ICToolchainProvider"/>
</appInfo>
</annotation>
</attribute>
<attribute name="natures" type="string">
<annotation>
<documentation>
project nature this build configuration is associated with.
If '*' or not specified, it is associated with all project natures.
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -2,6 +2,7 @@
<classpath>
<classpathentry kind="src" path="src/"/>
<classpathentry kind="src" path="utils.ui/"/>
<classpathentry kind="src" path="build"/>
<classpathentry kind="src" path="/org.eclipse.ui"/>
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
<classpathentry kind="src" path="/org.apache.xerces"/>

View file

@ -1,3 +1,11 @@
2003-02-17 Doug Schaefer
Merged in Sam Robb's source for the build model. The source can be
found in the build source folder. There are new extension point schema
in the schema folder. There are build icons in the icons/full/build16
folder. As well a number of extension points and extensions have been
added to the plugin.xml file.
2003-02-17 Judy N. Green
* plugin.xml
* icons/full/ctool16/convert-normal.gif

View file

@ -0,0 +1,37 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import org.eclipse.cdt.core.builder.model.ICBuildConfigProvider;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
/**
* Default implementation of a "Debug" build configuration
* provider for GNU toolchains.
*/
public class CConfigProviderDebug implements ICBuildConfigProvider {
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildConfigProvider#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy config) {
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_DEBUG, true);
config.setAttribute(ICPosixBuildConstants.CC_WARN_ALL, true);
config.setAttribute(ICPosixBuildConstants.LD_STRIP, false);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_PROFILE, false);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_OPTIMIZE, false);
config.setAttribute(ICPosixBuildConstants.CC_OPTIMZE_LEVEL,
ICPosixBuildConstants.CC_OPTIMIZE_NONE);
}
}

View file

@ -0,0 +1,40 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import org.eclipse.cdt.core.builder.model.ICBuildConfigProvider;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
/**
* Default implementation of a "Profile" build configuration
* provider for GNU toolchains.
*/
public class CConfigProviderProfile implements ICBuildConfigProvider {
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildConfigProvider#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy config) {
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_DEBUG, false);
config.setAttribute(ICPosixBuildConstants.CC_WARN_ALL, true);
config.setAttribute(ICPosixBuildConstants.LD_STRIP, true);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_PROFILE, true);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_OPTIMIZE, true);
config.setAttribute(ICPosixBuildConstants.CC_OPTIMZE_LEVEL,
ICPosixBuildConstants.CC_OPTIMIZE_FULL);
}
}

View file

@ -0,0 +1,39 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import org.eclipse.cdt.core.builder.model.ICBuildConfigProvider;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
/**
* Default implementation of a "Release" build configuration
* provider for GNU toolchains.
*/
public class CConfigProviderRelease implements ICBuildConfigProvider {
/**
* @see org.eclipse.cdt.core.builder.model.ICBuildConfigProvider#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy config) {
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_DEBUG, false);
config.setAttribute(ICPosixBuildConstants.CC_WARN_ALL, true);
config.setAttribute(ICPosixBuildConstants.LD_STRIP, true);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_PROFILE, false);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_OPTIMIZE, true);
config.setAttribute(ICPosixBuildConstants.CC_OPTIMZE_LEVEL,
ICPosixBuildConstants.CC_OPTIMIZE_FULL);
}
}

View file

@ -0,0 +1,37 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.builder.ACTool;
/**
* Represents a generic GNU tool.
*/
public class CGnuTool extends ACTool {
private final static String TOOL_TYPE_PREFIX = "org.eclipse.cdt.core.builder.";
private final static String TOOL_ID_PREFIX = "org.eclipse.cdt.gnu.tools.";
CGnuTool(String id, String exeName) {
super(TOOL_TYPE_PREFIX + id, TOOL_ID_PREFIX + id, exeName);
};
/**
* @see org.eclipse.cdt.core.builder.model.ICTool#getErrorParser()
*/
public IErrorParser getErrorParser() {
// TODO: implementation
return null;
}
}

View file

@ -0,0 +1,142 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.builder.model.ICBuildCmd;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICTool;
import org.eclipse.cdt.core.builder.model.ICToolchain;
import org.eclipse.core.resources.IFile;
/**
* Standard GNU toolchain.
*/
public class CGnuToolchain implements ICToolchain {
private Map fToolMap;
public CGnuToolchain() {
fToolMap = new HashMap();
doRefresh();
}
protected void doRefresh() {
addTool(new CGnuTool("CC", "gcc"));
addTool(new CGnuTool("CXX", "c++"));
addTool(new CGnuTool("CPP", "gcc"));
addTool(new CGnuTool("AS", "as"));
addTool(new CGnuTool("LD", "ld"));
addTool(new CGnuTool("AR", "ar"));
addTool(new CGnuTool("DEBUGGER", "gdb"));
addTool(new CGnuTool("PROFILER", "gprof"));
addTool(new CGnuTool("STRIP", "strip"));
}
/**
* Determines if a tools exists in the internal map of
* tool instances.
*
* @param id tool identifier.
* @return true if there is a tool instances that corresponds
* to the provided id.
*/
protected boolean toolExists(String id) {
return fToolMap.containsKey(id);
}
/**
* Add a tool to the internal map of tool instances.
*
* @param id tool identifier.
* @param tc tool instance.
*/
protected void addTool(ICTool tool) {
fToolMap.put(tool.getId(), tool);
}
/**
* Helper method used to retrieve a tool from the internal
* map of tool instances.
*
* @param id tool identifier.
* @return tool instance, or null if not found.
*/
protected ICTool getToolHelper(String id) {
ICTool tool = null;
Object obj = fToolMap.get(id);
if (obj instanceof ICTool) {
tool = (ICTool) obj;
}
return tool;
}
/**
* Remove a toolchain from the internal map of toolchain instances.
*
* @param id toolchain identifier.
* @return true if toolchain is removed.
*/
protected boolean removeTool(String id) {
boolean exists = toolExists(id);
if (exists) {
Object obj = fToolMap.remove(id);
obj = null;
}
return exists;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchain#canProcess(IFile)
*/
public boolean canProcess(IFile file) {
// TODO: add logic
return true;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchain#getBuildCommands(IFile, ICBuildConfig)
*/
public ICBuildCmd[] getBuildCommands(IFile file, ICBuildConfig cfg) {
// TODO: add logic
return null;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchain#getDependencies(IFile, ICBuildConfig)
*/
public IFile[] getDependencies(IFile file, ICBuildConfig cfg) {
// TODO: add logic
// Either depend on gcc -MM, or CDOM
return null;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchain#getOutputs(IFile, ICBuildConfig)
*/
public IFile[] getOutputs(IFile file, ICBuildConfig cfg) {
// TODO: add logic
// Either depend on gcc -MM, or CDOM
return null;
}
/**
* @see org.eclipse.cdt.core.builder.model.ICToolchain#getTools()
*/
public ICTool[] getTools() {
Collection tcc = fToolMap.values();
return (ICTool[]) fToolMap.values().toArray(new ICTool[fToolMap.size()]);
}
}

View file

@ -0,0 +1,38 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import org.eclipse.cdt.core.builder.ACToolchainProvider;
/**
* Standard GNU toolchain provider.
*/
public class CGnuToolchainProvider extends ACToolchainProvider {
/**
* Prefix used to construct toolchain identifiers for this
* provider.
*/
public final static String PROVIDER_ID = "org.eclipse.cdt.gnu.tools";
/**
* This toolchain provider.
*/
public final static String NATIVE_ID = PROVIDER_ID + ".native";
/**
* @see org.eclipse.cdt.core.builder.ACToolchainProvider#doRefresh()
*/
public void doRefresh() {
addToolchain(NATIVE_ID, new CGnuToolchain());
}
}

View file

@ -0,0 +1,77 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* The main plugin class to be used in the desktop.
*/
public class ToolsPlugin extends AbstractUIPlugin {
//The shared instance.
private static ToolsPlugin plugin;
//Resource bundle.
private ResourceBundle resourceBundle;
/**
* The constructor.
*/
public ToolsPlugin(IPluginDescriptor descriptor) {
super(descriptor);
plugin = this;
try {
resourceBundle= ResourceBundle.getBundle("org.eclipse.cdt.gnu.tools.ToolsPluginResources");
} catch (MissingResourceException x) {
resourceBundle = null;
}
}
/**
* Returns the shared instance.
*/
public static ToolsPlugin getDefault() {
return plugin;
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/**
* Returns the string from the plugin's resource bundle,
* or 'key' if not found.
*/
public static String getResourceString(String key) {
ResourceBundle bundle= ToolsPlugin.getDefault().getResourceBundle();
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
/**
* Returns the plugin's resource bundle,
*/
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabgroup;
import org.eclipse.cdt.gnu.tools.tabs.CTabCompiler;
import org.eclipse.cdt.ui.builder.ACToolTabGroup;
import org.eclipse.cdt.ui.builder.ICBuildConfigDialog;
import org.eclipse.cdt.ui.builder.ICToolTab;
/**
* Tab group for gcc.
*/
public class CTabGroupCC extends ACToolTabGroup {
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#createTabs(ICBuildConfigDialog)
*/
public void createTabs(ICBuildConfigDialog dialog) {
ICToolTab[] tabs = new ICToolTab[] {
new CTabCompiler()
};
setTabs(tabs);
}
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabgroup;
import org.eclipse.cdt.gnu.tools.tabs.CTabPreprocessor;
import org.eclipse.cdt.ui.builder.ACToolTabGroup;
import org.eclipse.cdt.ui.builder.ICBuildConfigDialog;
import org.eclipse.cdt.ui.builder.ICToolTab;
/**
* Tab group for cpp.
*/
public class CTabGroupCPP extends ACToolTabGroup {
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#createTabs(ICBuildConfigDialog)
*/
public void createTabs(ICBuildConfigDialog dialog) {
ICToolTab[] tabs = new ICToolTab[] {
new CTabPreprocessor()
};
setTabs(tabs);
}
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabgroup;
import org.eclipse.cdt.gnu.tools.tabs.CTabCompiler;
import org.eclipse.cdt.ui.builder.ACToolTabGroup;
import org.eclipse.cdt.ui.builder.ICBuildConfigDialog;
import org.eclipse.cdt.ui.builder.ICToolTab;
/**
* Tab group for g++.
*/
public class CTabGroupCXX extends ACToolTabGroup {
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#createTabs(ICBuildConfigDialog)
*/
public void createTabs(ICBuildConfigDialog dialog) {
ICToolTab[] tabs = new ICToolTab[] {
new CTabCompiler()
};
setTabs(tabs);
}
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabgroup;
import org.eclipse.cdt.gnu.tools.tabs.CTabLinker;
import org.eclipse.cdt.ui.builder.ACToolTabGroup;
import org.eclipse.cdt.ui.builder.ICBuildConfigDialog;
import org.eclipse.cdt.ui.builder.ICToolTab;
/**
* Tab group for ld.
*/
public class CTabGroupLD extends ACToolTabGroup {
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#createTabs(ICBuildConfigDialog)
*/
public void createTabs(ICBuildConfigDialog dialog) {
ICToolTab[] tabs = new ICToolTab[] {
new CTabLinker()
};
setTabs(tabs);
}
}

View file

@ -0,0 +1,275 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabs;
import java.util.HashMap;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
import org.eclipse.cdt.ui.builder.ACToolTab;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
/**
* The control for editing and viewing compiler options.
*/
public class CTabCompiler extends ACToolTab {
private Combo fOptimizationLevel;
private Button btnDebugging;
private Button btnProfiling;
private Text fUserOptions;
private Table fWarningsTable;
private TableItem fWarnAll;
private TableItem fWarnAsErrors;
private TableItem fWarnFormatStrings;
private TableItem fWarnPointerArith;
private TableItem fWarnSwitch;
private TableItem fWarnUnreachable;
private TableItem fWarnUnused;
private HashMap optLevelMap = new HashMap();
private final String[] OPT_LEVELS = {"None", "Medium", "High" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private final String[] OPT_ARGS = {"-O0", "-O1", "-O2" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
/**
* Constructs the object
*/
public CTabCompiler() {
// populate hash map
for (int nIndex = 0; nIndex < OPT_LEVELS.length; nIndex++)
{
optLevelMap.put(OPT_ARGS[nIndex], OPT_LEVELS[nIndex]);
}
}
/**
* Helper to add an item to the table of compiler settings
*
* @param parent the owning control
* @param txtLabel text for the table item
*/
private TableItem createTableItem(Table parent, String txtLabel)
{
TableItem retval = new TableItem(parent, SWT.NONE);
if (retval != null) {
retval.setText(txtLabel);
}
return retval;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#createControl(Composite)
*/
public void createControl(Composite parent) {
Composite ths = new Composite(parent, SWT.NONE);
// Panel
ths.setLayout(new GridLayout(2, true));
ths.setLayoutData(new GridData(GridData.FILL_BOTH));
// --------------------------------------------------
// Left column
// --------------------------------------------------
Composite cmpLeft = new Composite(ths, SWT.NONE);
cmpLeft.setLayout(new GridLayout());
cmpLeft.setLayoutData(new GridData(GridData.FILL_BOTH));
// row 1
new Label(cmpLeft, SWT.LEFT).setText(("Optimization_Level_7")); //$NON-NLS-1$
// row 2
fOptimizationLevel = new Combo(cmpLeft, SWT.RIGHT | SWT.TOP | SWT.READ_ONLY);
fOptimizationLevel.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
// row 3
btnDebugging = new Button(cmpLeft, SWT.CHECK | SWT.LEFT);
btnDebugging.setText(("Enable_Debugging_9")); //$NON-NLS-1$
// row 4
btnProfiling = new Button(cmpLeft, SWT.CHECK | SWT.LEFT);
btnProfiling.setText(("Enable_Profiling_10")); //$NON-NLS-1$
// row 5
new Label(cmpLeft, SWT.LEFT).setText(("Additional_Options_11")); //$NON-NLS-1$
// row 6
fUserOptions = new Text(cmpLeft, SWT.BORDER | SWT.LEFT);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL);
gridData.verticalAlignment = GridData.BEGINNING;
fUserOptions.setLayoutData(gridData);
// --------------------------------------------------
// Right column
// --------------------------------------------------
Composite cmpRight = new Composite(ths, SWT.NONE);
cmpRight.setLayout(new GridLayout());
cmpRight.setLayoutData(new GridData(GridData.FILL_BOTH));
// row 1
new Label(cmpRight, SWT.LEFT).setText(("Warnings__8")); //$NON-NLS-1$
// row 2
fWarningsTable = new Table(cmpRight, SWT.BORDER | SWT.MULTI | SWT.CHECK | SWT.HIDE_SELECTION);
fWarnAll = createTableItem(fWarningsTable, "All Warnings");
fWarnAsErrors = createTableItem(fWarningsTable, "Warnings as errors");
fWarnFormatStrings = createTableItem(fWarningsTable, "Bad format strings");
fWarnPointerArith = createTableItem(fWarningsTable, "pointer aritemetic");
fWarnSwitch = createTableItem(fWarningsTable, "No default switch statement");
fWarnUnreachable = createTableItem(fWarningsTable, "Unreachable code");
fWarnUnused = createTableItem(fWarningsTable, "Unused parameter");
GridData grdWarnings = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
GC gc = new GC(fWarningsTable);
gc.setFont(fWarningsTable.getFont());
grdWarnings.widthHint = org.eclipse.jface.dialogs.Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 35);
gc.dispose();
fWarningsTable.setLayoutData(grdWarnings);
// set the size of this control
ths.setSize(ths.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#initializeFrom(ICBuildConfig)
*/
public void initializeFrom(ICBuildConfig config) {
boolean debug = false;
boolean profile = false;
boolean optimize = true;
boolean[] warn = new boolean[7];
int optLevel = 0;
String userArgs = "";
// can't populate with null data pointer
if (config == null) {
return;
}
try {
profile = config.getAttribute(ICPosixBuildConstants.CC_ENABLE_PROFILE, false);
debug = config.getAttribute(ICPosixBuildConstants.CC_ENABLE_DEBUG, false);
optimize = config.getAttribute(ICPosixBuildConstants.CC_ENABLE_OPTIMIZE, false);
optLevel = config.getAttribute(ICPosixBuildConstants.CC_OPTIMZE_LEVEL, 0);
userArgs = config.getAttribute(ICPosixBuildConstants.CC_USER_ARGS, "");
warn[0] = config.getAttribute(ICPosixBuildConstants.CC_WARN_ALL, false);
warn[1] = config.getAttribute(ICPosixBuildConstants.CC_WARN_ASERROR, false);
warn[2] = config.getAttribute(ICPosixBuildConstants.CC_WARN_FORMAT, false);
warn[3] = config.getAttribute(ICPosixBuildConstants.CC_WARN_POINTERAR, false);
warn[4] = config.getAttribute(ICPosixBuildConstants.CC_WARN_SWITCH, false);
warn[5] = config.getAttribute(ICPosixBuildConstants.CC_WARN_UNREACH, false);
warn[6] = config.getAttribute(ICPosixBuildConstants.CC_WARN_UNUSED, false);
} catch (CoreException e) {
}
btnProfiling.setSelection(profile);
btnDebugging.setSelection(debug);
if (optimize) {
fOptimizationLevel.select(optLevel);
}
fUserOptions.setText(userArgs);
// check for all of the warnings (could have been better...)
fWarnAll.setChecked(warn[0]);
fWarnAsErrors.setChecked(warn[1]);
fWarnFormatStrings.setChecked(warn[2]);
fWarnPointerArith.setChecked(warn[3]);
fWarnSwitch.setChecked(warn[4]);
fWarnUnreachable.setChecked(warn[5]);
fWarnUnused.setChecked(warn[6]);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#performApply(ICBuildConfigWorkingCopy)
*/
public void performApply(ICBuildConfigWorkingCopy config) {
boolean debug = false;
boolean profile = false;
boolean optimize = true;
boolean[] warn = new boolean[7];
int optLevel = 0;
String userArgs = "";
// can't populate with null data pointer
if (config == null) {
return;
}
profile = btnProfiling.getSelection();
debug = btnDebugging.getSelection();
// optimize = ???;
optLevel = fOptimizationLevel.getSelectionIndex();
userArgs = fUserOptions.getText();
// check for all of the warnings (could have been better...)
warn[0] = fWarnAll.getChecked();
warn[1] = fWarnAsErrors.getChecked();
warn[2] = fWarnFormatStrings.getChecked();
warn[3] = fWarnPointerArith.getChecked();
warn[4] = fWarnSwitch.getChecked();
warn[5] = fWarnUnreachable.getChecked();
warn[6] = fWarnUnused.getChecked();
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_PROFILE, profile);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_DEBUG, debug);
config.setAttribute(ICPosixBuildConstants.CC_ENABLE_OPTIMIZE, optimize);
config.setAttribute(ICPosixBuildConstants.CC_OPTIMZE_LEVEL, optLevel);
config.setAttribute(ICPosixBuildConstants.CC_USER_ARGS, userArgs);
config.setAttribute(ICPosixBuildConstants.CC_WARN_ALL, warn[0]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_ASERROR, warn[1]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_FORMAT, warn[2]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_POINTERAR, warn[3]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_SWITCH, warn[4]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_UNREACH, warn[5]);
config.setAttribute(ICPosixBuildConstants.CC_WARN_UNUSED, warn[6]);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy config) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#isValid(ICBuildConfigWorkingCopy)
*/
public boolean isValid(ICBuildConfigWorkingCopy config) {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#getName()
*/
public String getName() {
return "Compiler";
}
}

View file

@ -0,0 +1,583 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabs;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.cdt.core.builder.model.CBuildVariable;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICBuildVariable;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
import org.eclipse.cdt.core.builder.model.ICToolchain;
import org.eclipse.cdt.ui.builder.ACToolTab;
import org.eclipse.cdt.ui.builder.internal.CBuildVariableDialog;
import org.eclipse.cdt.ui.builder.internal.CLibFileDialog;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.util.Assert;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
/**
* The control for editing and viewing linker options.
*/
public class CTabLinker extends ACToolTab {
private Text fOutputFileName;
private Text fCmdLine;
private Button btnStatic;
private Button btnSharedObject;
private Button btnStripSybmols;
private List fLibPaths;
private List fLibs;
private List fLibFileList; // Used for validation.
private Button btnAddLib; // this set of buttons controls the lib of libraries
private Button btnRemoveLib;
private Button btnMoveUp;
private Button btnMoveDown;
private Button btnRemove; // set of buttons for the library paths
class addLibraryPath extends SelectionAdapter
{
public void widgetSelected(SelectionEvent sel)
{
CBuildVariableDialog selectFolder = new CBuildVariableDialog(getShell(), ("Select_Library_Path_1")); //$NON-NLS-1$
if (selectFolder.open() == selectFolder.OK) {
ICBuildVariable result = selectFolder.getSelection();
fLibPaths.add(result.toString());
}
}
};
class addLibraryFile extends SelectionAdapter
{
public void widgetSelected(SelectionEvent sel)
{
// create list of item to send to the library picker
ICBuildVariable[] libPaths = new CBuildVariable[fLibPaths.getItemCount()];
for (int nIndex = 0; nIndex < fLibPaths.getItemCount(); nIndex++) {
String item = fLibPaths.getItem(nIndex);
int nCloseBracePos = item.indexOf("]");//$NON-NLS-1$
String name = item.substring(1, nCloseBracePos);
String val = item.substring(nCloseBracePos + 2);
libPaths[nIndex] = new CBuildVariable(name, val, "");// fLibPaths.getItem(nIndex));
}
fLibFileList = fLibs;
CLibFileDialog selectFile = new CLibFileDialog(getShell(),
(ICToolchain) null /* getToolchain() */,
libPaths,
fLibFileList);
if (selectFile.open() == selectFile.OK) {
fLibs.add(selectFile.getSelection().getName());
}
// Update the move down button.
if (fLibs.getItemCount() > 1) {
btnMoveDown.setEnabled(true);
}
}
};
class delLibraryPath extends SelectionAdapter
{
public void widgetSelected(SelectionEvent sel)
{
int[] nSelItems = fLibPaths.getSelectionIndices();
if (nSelItems != null) {
fLibPaths.remove(nSelItems);
}
}
};
class delLibraryFile extends SelectionAdapter
{
public void widgetSelected(SelectionEvent sel)
{
int[] nSelItems = fLibs.getSelectionIndices();
if (nSelItems != null) {
fLibs.remove(nSelItems);
}
// Added to make sure that if nothing is selected the move up/down buttons are appropriately enabled or
// disabled.
nSelItems = fLibs.getSelectionIndices();
if ((nSelItems != null) && (nSelItems.length == 0)) {
btnMoveUp.setEnabled(false);
btnMoveDown.setEnabled(false);
}
}
};
class moveLibs extends SelectionAdapter
{
int m_nDelta;
public moveLibs(int delta) {
Assert.isTrue(delta == -1 || delta == 1, ("Delta_must_be_1_or_-1_2")); //$NON-NLS-1$
m_nDelta = delta;
}
private boolean CanMove(int selections, int delta ) {
boolean canMove = true;
// First of all check if we can even move the selected lib names up or down.
if ((selections == 0) && (delta == -1)) {
btnMoveUp.setEnabled(false);
if (fLibs.getItemCount() > 1) {
btnMoveDown.setEnabled(true);
}
canMove = false;
}
if ((selections == (fLibs.getItemCount() - 1)) && (delta == 1)) {
btnMoveDown.setEnabled(false);
if (fLibs.getItemCount() > 1) {
btnMoveUp.setEnabled(true);
}
canMove = false;
}
return canMove;
}
public void widgetSelected(SelectionEvent sel) {
int[] selections = fLibs.getSelectionIndices();
if ((selections != null) && (m_nDelta != 0)) {
int nStart = (m_nDelta < 0) ? 0 : selections.length - 1;
int nEnd = (m_nDelta < 0) ? selections.length : -1;
String strTemp;
boolean bCanMove = CanMove(selections[nStart], m_nDelta);
// this loop moves group of items based on the delta and moves them
for (int nIndex = nStart ; nIndex != nEnd && bCanMove; nIndex += (m_nDelta * -1)) {
// remove and re-add the list box
strTemp = fLibs.getItem(selections[nIndex]);
fLibs.remove(selections[nIndex]);
fLibs.add(strTemp, selections[nIndex] + m_nDelta);
// adjust the index in the selection list so we can re-highlight the block
selections[nIndex] = selections[nIndex] + m_nDelta;
bCanMove = CanMove(selections[nIndex], m_nDelta);
}
fLibs.select(selections);
}
}
};
// decl these after defining the vars
addLibraryPath m_addLibraryPath = new addLibraryPath();
delLibraryPath m_delLibraryPath = new delLibraryPath();
addLibraryFile m_addLibraryFile = new addLibraryFile();
delLibraryFile m_delLibraryFile = new delLibraryFile();
public CTabLinker() {
super();
}
class TextWidth {
private int width_ = 0;
public TextWidth(Composite composite, String[] labels) {
GC gc = new GC(composite);
gc.setFont(composite.getFont());
for (int i = 0; i < labels.length; i++) {
int newWidth = gc.textExtent(labels[i]).x + 10; //$NON-NLS-1$
if (newWidth > width_) {
width_ = newWidth;
}
}
}
public int getWidth() {
return width_;
}
}
/**
* Helper function for creating a grid layout to spec.
*
* @param columns Number of columns in layout.
* @param equalWidth True if columns are of equal width.
* @param marginHeight Margin height for layout.
* @param marginWidth Margin width for layout.
*
* @return Newly created GridLayout with the specified properties.
*/
private GridLayout createGridLayout(int columns, boolean equalWidth, int marginHeight, int marginWidth) {
GridLayout layout = new GridLayout(columns, equalWidth);
layout.marginHeight = marginHeight;
layout.marginWidth = marginWidth;
return layout;
}
/**
* helper routine for putting the values in the list box
*
* @param lstTarget the control to fill with values
* @param data linker properties data
* @param data parameter name to fetch from data
*
*/
private void setList(org.eclipse.swt.widgets.List target, java.util.List list)
{
target.removeAll();
if (null != list) {
for (Iterator iter = list.iterator(); iter.hasNext();) {
target.add((String) iter.next());
}
}
}
/**
* helper routine for getting data from a list control
* @param control contol to get data from
*/
private java.util.List getList(List control)
{
String[] items = fLibs.getItems();
Vector vec = new Vector();
for (int i = 0; i < items.length; i++) {
vec.add(items[i]);
}
return vec;
}
/**
* helper routine for getting data from a text control
* @param control contol to get data from
*/
private String readText(Text control)
{
String str = control.getText();
if (str != null) {
str.trim();
} else {
str = "";
}
return str;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#createControl(Composite)
*/
public void createControl(Composite parent) {
final String[] BUTTON_LABELS = {
("Add..._5"), //$NON-NLS-1$
("Remove_7"), //$NON-NLS-1$
("Add_12"), //$NON-NLS-1$
("Remove_13"), //$NON-NLS-1$
("Move_Up_14"), //$NON-NLS-1$
("Move_Down_15") //$NON-NLS-1$
};
Composite ths = new Composite(parent, SWT.NONE);
int BUTTON_WIDTH = new TextWidth(ths, BUTTON_LABELS).getWidth();
// Panel
ths.setLayout(new GridLayout(2, true));
ths.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_BOTH));
fLibFileList = new List(parent, SWT.NONE);
// --------------------------------------------------
// Left column
// --------------------------------------------------
Composite cmpLeft = new Composite(ths, SWT.NONE);
cmpLeft.setLayout(createGridLayout(1, true, 2, 2));
cmpLeft.setLayoutData(new GridData(GridData.FILL_BOTH));
// row 1
new Label(cmpLeft, SWT.NULL).setText(("Output_File_Name_3")); //$NON-NLS-1$
// row 2
fOutputFileName = new Text(cmpLeft, SWT.LEFT | SWT.BORDER);
fOutputFileName.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
// row 3
btnStatic = new Button(cmpLeft, SWT.CHECK | SWT.LEFT);
btnStatic.setText(("Perform_Static_Linking_6")); //$NON-NLS-1$
btnStatic.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
// row 4
btnSharedObject = new Button(cmpLeft, SWT.CHECK | SWT.LEFT);
btnSharedObject.setText(("Create_Shared_Object_8")); //$NON-NLS-1$
btnSharedObject.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
// row 5
btnStripSybmols = new Button(cmpLeft, SWT.CHECK | SWT.LEFT);
btnStripSybmols.setText(("Strip_Symbols_9")); //$NON-NLS-1$
btnStripSybmols.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
// row 6
new Label(cmpLeft, SWT.NULL).setText(("Additional_Options_11")); //$NON-NLS-1$
// row 7
fCmdLine = new Text(cmpLeft, SWT.LEFT | SWT.BORDER);
fCmdLine.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
// --------------------------------------------------
// Right column
// --------------------------------------------------
Composite cmpRight = new Composite(ths, SWT.NONE);
cmpRight.setLayout(createGridLayout(1, true, 2, 2));
cmpRight.setLayoutData(new GridData(GridData.FILL_BOTH));
// Lib paths
Group grpLibPaths = new Group(cmpRight, SWT.SHADOW_NONE);
grpLibPaths.setLayout(createGridLayout(1, true, 2, 2));
grpLibPaths.setLayoutData(new GridData(GridData.FILL_BOTH));
grpLibPaths.setText(("Library_Paths__4")); //$NON-NLS-1$
Composite cmpLibPaths = new Composite(grpLibPaths, SWT.NONE);
cmpLibPaths.setLayout(createGridLayout(1, true, 2, 2));
cmpLibPaths.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite cmpPathCtrls = new Composite(cmpLibPaths, SWT.NONE);
cmpPathCtrls.setLayout(createGridLayout(2, false, 2, 2));
cmpPathCtrls.setLayoutData(new GridData(GridData.FILL_BOTH));
fLibPaths = new List(cmpPathCtrls, SWT.LEFT | SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
fLibPaths.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite cmpPathButtons = new Composite(cmpPathCtrls, SWT.NONE);
cmpPathButtons.setLayout(createGridLayout(1, true, 2, 2));
GridData gdPathBtns = new GridData();
gdPathBtns.widthHint = BUTTON_WIDTH;
cmpPathButtons.setLayoutData(gdPathBtns);
Button btnNew = new Button(cmpPathButtons, SWT.NULL);
btnNew.setText(("Add..._5")); //$NON-NLS-1$
btnNew.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnRemove = new Button(cmpPathButtons, SWT.NULL);
btnRemove.setText(("Remove_7")); //$NON-NLS-1$
btnRemove.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Libs
Group grpLibs = new Group(cmpRight, SWT.SHADOW_NONE);
grpLibs.setLayout(createGridLayout(1, true, 2, 2));
grpLibs.setLayoutData(new GridData(GridData.FILL_BOTH));
grpLibs.setText(("Libraries_10")); //$NON-NLS-1$
Composite cmpLibs = new Composite(grpLibs, SWT.NONE);
cmpLibs.setLayout(createGridLayout(1, true, 2, 2));
cmpLibs.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite cmpLibCtrls = new Composite(cmpLibs, SWT.NONE);
cmpLibCtrls.setLayout(createGridLayout(2, false, 2, 2));
cmpLibCtrls.setLayoutData(new GridData(GridData.FILL_BOTH));
fLibs = new List(cmpLibCtrls, SWT.LEFT | SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
fLibs.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite cmpLibButtons = new Composite(cmpLibCtrls, SWT.NONE);
cmpLibButtons.setLayout(createGridLayout(1, true, 2, 2));
GridData gdLibBtns = new GridData();
gdLibBtns.widthHint = BUTTON_WIDTH;
cmpLibButtons.setLayoutData(gdLibBtns);
btnAddLib = new Button(cmpLibButtons, SWT.NULL);
btnAddLib.setText(("Add_12")); //$NON-NLS-1$
btnAddLib.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnRemoveLib = new Button(cmpLibButtons, SWT.NULL);
btnRemoveLib.setText(("Remove_13")); //$NON-NLS-1$
btnRemoveLib.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnMoveUp = new Button(cmpLibButtons, SWT.NULL);
btnMoveUp.setText(("Move_Up_14")); //$NON-NLS-1$
btnMoveUp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
btnMoveDown = new Button(cmpLibButtons, SWT.NULL);
btnMoveDown.setText(("Move_Down_15")); //$NON-NLS-1$
btnMoveDown.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
/*
* create the listener events the controls
*
*/
btnNew.addSelectionListener(m_addLibraryPath);
btnRemove.addSelectionListener(m_delLibraryPath);
fLibPaths.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e) {
int[] selection = fLibPaths.getSelectionIndices();
btnRemove.setEnabled(selection.length > 0);
}
}
);
// fLibPaths.addKeyListener(new KeyAdapter()
// {
// public void keyPressed(KeyEvent key) {}
// public void keyReleased(KeyEvent key) {}
// public void keyTyped(KeyEvent key)
// {
// if (key.keyCode == SWT.DEL) {
// m_delLibraryPath.widgetSelected(null);
// }
// else if (key.keyCode == SWT.INSERT) {
// m_addLibraryPath.widgetSelected(null);
// }
// }
//
// }
// );
btnAddLib.addSelectionListener(m_addLibraryFile);
btnRemoveLib.addSelectionListener(m_delLibraryFile);
fLibs.addFocusListener(new FocusAdapter()
{
public void focusLost(FocusEvent e) {
// btnMoveDown.setEnabled(false);
// btnMoveUp.setEnabled(false);
super.focusLost(e);
}
}
);
fLibs.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e) {
int[] selections = fLibs.getSelectionIndices();
if (selections.length > 0) {
// see if we should enable the up button
btnMoveUp.setEnabled(selections[0] > 0);
btnMoveDown.setEnabled(selections[selections.length - 1] < fLibs.getItemCount() - 1);
btnRemoveLib.setEnabled(true);
}
else {
// don't enable the buttons if the user hasn't made any selections
btnMoveUp.setEnabled(false);
btnMoveDown.setEnabled(false);
btnRemoveLib.setEnabled(false);
}
super.widgetSelected(e);
}
}
);
btnMoveDown.addSelectionListener(new moveLibs(1));
btnMoveUp.addSelectionListener(new moveLibs(-1));
// the user hasn't made selections yet, so turn these buttons off
btnMoveDown.setEnabled(false);
btnMoveUp.setEnabled(false);
btnRemoveLib.setEnabled(false);
btnRemove.setEnabled(false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#initializeFrom(ICBuildConfig)
*/
public void initializeFrom(ICBuildConfig config) {
String output = "";
String cmdLine = "";
boolean isStatic = false;
boolean isShared = false;
boolean isStrip = false;
java.util.List libs = null;
java.util.List libPaths = null;
try {
output = config.getAttribute(ICPosixBuildConstants.LD_OUTPUT, "");
cmdLine = config.getAttribute(ICPosixBuildConstants.LD_USER_ARGS, "");
isStatic = config.getAttribute(ICPosixBuildConstants.LD_LINK_STATIC, false);
isShared = config.getAttribute(ICPosixBuildConstants.LD_LINK_AS_SHARED, false);
isStrip = config.getAttribute(ICPosixBuildConstants.LD_STRIP, false);
libs = config.getAttribute(ICPosixBuildConstants.LD_LIBS, libs);
libPaths = config.getAttribute(ICPosixBuildConstants.LD_LIBPATHS, libPaths);
} catch (CoreException e) {
}
fOutputFileName.setText(output);
fCmdLine.setText(cmdLine);
btnStatic.setSelection(isStatic);
btnSharedObject.setSelection(isShared);
btnStripSybmols.setSelection(isStrip);
setList(fLibs, libs);
setList(fLibs, libPaths);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#performApply(ICBuildConfigWorkingCopy)
*/
public void performApply(ICBuildConfigWorkingCopy config) {
config.setAttribute(ICPosixBuildConstants.LD_OUTPUT, readText(fOutputFileName));
config.setAttribute(ICPosixBuildConstants.LD_USER_ARGS, readText(fCmdLine));
config.setAttribute(ICPosixBuildConstants.LD_LIBS, getList(fLibs));
config.setAttribute(ICPosixBuildConstants.LD_LIBPATHS, getList(fLibPaths));
config.setAttribute(ICPosixBuildConstants.LD_LINK_STATIC, btnStatic.getSelection());
config.setAttribute(ICPosixBuildConstants.LD_STRIP, btnStripSybmols.getSelection());
if (btnSharedObject.getSelection()) {
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_SHARED, true);
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_ARCHIVE, false);
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_PROGRAM, false);
} else {
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_SHARED, false);
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_ARCHIVE, false);
config.setAttribute(ICPosixBuildConstants.LD_LINK_AS_PROGRAM, true);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy configuration) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#isValid(ICBuildConfigWorkingCopy)
*/
public boolean isValid(ICBuildConfigWorkingCopy config) {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#getName()
*/
public String getName() {
return "Linker";
}
}

View file

@ -0,0 +1,547 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.gnu.tools.tabs;
import java.util.Iterator;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.builder.model.ICPosixBuildConstants;
import org.eclipse.cdt.ui.builder.ACToolTab;
import org.eclipse.cdt.ui.builder.internal.CBuildVariableDialog;
import org.eclipse.cdt.ui.builder.internal.CNameValueDialog;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* The control for editing and viewing compiler options.
*/
public class CTabPreprocessor extends ACToolTab {
private Table fDefineTable;
private Table fIncludeTable;
private Button btnIncludeAdd;
private Button btnIncludeRemove;
private Button btnIncludeMoveUp;
private Button btnIncludeMoveDown;
private Button btnDefineAdd;
private Button btnDefineRemove;
private Button btnDefineEdit;
private List fIncludePaths;
private List fDefineMacros;
/**
* Constructs the object
*
* @param parent owning window
* @param style modal or not
*/
public CTabPreprocessor() {
super();
}
/**
* Helper function for creating a grid layout to spec.
*
* @param columns Number of columns in layout.
* @param equalWidth True if columns are of equal width.
* @param marginHeight Margin height for layout.
* @param marginWidth Margin width for layout.
*
* @return Newly created GridLayout with the specified properties.
*/
private GridLayout createGridLayout(int columns, boolean equalWidth, int marginHeight, int marginWidth) {
GridLayout layout = new GridLayout(columns, equalWidth);
layout.marginHeight = marginHeight;
layout.marginWidth = marginWidth;
return layout;
}
/**
* "Add Include" button handler.
*/
private void handleIncludeAdd(SelectionEvent e) {
TableItem[] existingItems = fIncludeTable.getItems();
fIncludePaths.removeAll();
for (int i = 0; i < fIncludeTable.getItemCount(); i++) {
fIncludePaths.add(existingItems[i].getText());
}
CBuildVariableDialog dlg = new CBuildVariableDialog(getShell(), ("Select_Include_Path_12")); //$NON-NLS-1$
if (dlg.open() == dlg.OK) {
TableItem item = new TableItem(fIncludeTable, SWT.NONE);
item.setText(dlg.getSelection().toString());
fIncludeTable.select(fIncludeTable.indexOf(item));
fIncludeTable.setFocus();
}
handleIncludeTableSelectionChanged();
}
/**
* "Remove Include" button handler.
*/
private void handleIncludeRemove(SelectionEvent e) {
handleTableRemove(fIncludeTable);
handleIncludeTableSelectionChanged();
}
/**
* "Move Up Include" button handler.
*/
private void handleIncludeMoveUp(SelectionEvent e) {
int itemIndex = fIncludeTable.getSelectionIndex();
String itemText = fIncludeTable.getItem(itemIndex).getText();
fIncludeTable.remove(itemIndex);
new TableItem(fIncludeTable, SWT.NONE, itemIndex - 1).setText(itemText);
fIncludeTable.setFocus();
fIncludeTable.select(itemIndex - 1);
handleIncludeTableSelectionChanged();
}
/**
* "Move Down Include" button handler.
*/
private void handleIncludeMoveDown(SelectionEvent e) {
int itemIndex = fIncludeTable.getSelectionIndex();
String itemText = fIncludeTable.getItem(itemIndex).getText();
fIncludeTable.remove(itemIndex);
new TableItem(fIncludeTable, SWT.NONE, itemIndex + 1).setText(itemText);
fIncludeTable.setFocus();
fIncludeTable.select(itemIndex + 1);
handleIncludeTableSelectionChanged();
}
/**
* Include table selection change handler.
*/
private void handleIncludeTableSelectionChanged() {
int itemIndex = fIncludeTable.getSelectionIndex();
int itemCount = fIncludeTable.getItemCount();
// Add always enabled
btnIncludeAdd.setEnabled(true);
// Remove enabled if > 1 item selected
btnIncludeRemove.setEnabled(-1 != itemIndex);
// Move up/down enabled if:
// > 1 item in list
// 1 item selected
// Item is not first item (up) or last item (down)
btnIncludeMoveUp.setEnabled((-1 != itemIndex) && (itemCount > 1) && (0 != itemIndex));
btnIncludeMoveDown.setEnabled((-1 != itemIndex) && (itemCount > 1) && ((itemCount - 1) != itemIndex));
}
/**
* "Add Define" button handler.
*/
private void handleDefineAdd(SelectionEvent e) {
TableItem[] existingItems = fDefineTable.getItems();
fDefineMacros.removeAll();
for (int i =0; i < fDefineTable.getItemCount(); i++) {
fDefineMacros.add(existingItems[i].getText());
}
CNameValueDialog dlg = new CNameValueDialog(getShell(), fDefineMacros);
dlg.setTitle(("New_Preprocessor_Definition_13")); //$NON-NLS-1$
if (dlg.open() == dlg.OK) {
TableItem item = new TableItem(fDefineTable, SWT.NONE);
item.setText(0, dlg.getName());
item.setText(1, dlg.getValue());
fDefineTable.select(fDefineTable.indexOf(item));
fDefineTable.setFocus();
}
handleDefineTableSelectionChanged();
}
/**
* "Remove Define" button handler.
*/
private void handleDefineRemove(SelectionEvent e) {
handleTableRemove(fDefineTable);
handleDefineTableSelectionChanged();
}
/**
* "Edit Define" button handler.
*/
private void handleDefineEdit(SelectionEvent e) {
int itemIndex = fDefineTable.getSelectionIndex();
if (-1 != itemIndex) {
TableItem item = fDefineTable.getItem(itemIndex);
CNameValueDialog dlg = new CNameValueDialog(getShell());
dlg.setTitle(("Edit_Preprocessor_Definition_14")); //$NON-NLS-1$
dlg.setName(item.getText(0));
dlg.setValue(item.getText(1));
if (dlg.open() == dlg.OK) {
item.setText(0, dlg.getName());
item.setText(1, dlg.getValue());
}
fDefineTable.select(itemIndex);
fDefineTable.setFocus();
}
handleDefineTableSelectionChanged();
}
/**
* Define table selection change handler.
*/
private void handleDefineTableSelectionChanged() {
TableItem[] items = fDefineTable.getSelection();
// Add always enabled
btnDefineAdd.setEnabled(true);
// Remove enabled if > 1 item selected
btnDefineRemove.setEnabled((null != items) && (1 >= items.length));
// Edit enabled if exactly 1 item selected
btnDefineEdit.setEnabled((null != items) && (1 == items.length));
}
/**
* Generic "remove selected entry from table" method.
*
* @param Table to remove entry from.
*/
private void handleTableRemove(Table table) {
int itemIndex = table.getSelectionIndex();
if (-1 != itemIndex) {
TableItem item = table.getItem(itemIndex);
item.dispose();
int itemCount = table.getItemCount();
table.select(0 == itemIndex ? 0 : (itemIndex >= itemCount ? itemCount - 1 : itemIndex));
table.setFocus();
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#createControl(Composite)
*/
public void createControl(Composite parent) {
Composite cmpGroup = null;
Composite cmpCtrls = null;
Composite cmpButtons = null;
Group group = null;
Table table = null;
Button button = null;
TableColumn column = null;
GridLayout gridLayout = null;
GridData gridData = null;
GC gc = null;
Composite ths = new Composite(parent, SWT.NONE);
// Panel
ths.setLayout(new GridLayout());
ths.setLayoutData(new GridData(GridData.FILL_BOTH));
// Initialize our list containing existing paths,
fIncludePaths = new List(parent, SWT.NONE);
fDefineMacros = new List(parent, SWT.NONE);
// Includes
group = new Group(ths, SWT.SHADOW_NONE);
group.setLayout(createGridLayout(1, true, 2, 2));
group.setLayoutData(new GridData(GridData.FILL_BOTH));
group.setText(("Include_Paths_1")); //$NON-NLS-1$
cmpGroup = new Composite(group, SWT.NONE);
cmpGroup.setLayout(createGridLayout(1, true, 2, 2));
cmpGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
cmpCtrls = new Composite(cmpGroup, SWT.NONE);
cmpCtrls.setLayout(createGridLayout(2, false, 2, 2));
cmpCtrls.setLayoutData(new GridData(GridData.FILL_BOTH));
table = new Table(cmpCtrls, SWT.BORDER | SWT.SINGLE | SWT.HIDE_SELECTION);
table.setLayout(new GridLayout());
table.setLayoutData(new GridData(GridData.FILL_BOTH));
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleIncludeTableSelectionChanged();
}
});
fIncludeTable = table;
cmpButtons = new Composite(cmpCtrls, SWT.NONE);
gridLayout = createGridLayout(1, true, 2, 2);
gridData = new GridData();
gc = new GC(cmpButtons);
gc.setFont(cmpButtons.getFont());
gridData.widthHint = gc.getFontMetrics().getAverageCharWidth() * 20;
gc.dispose();
cmpButtons.setLayout(gridLayout);
cmpButtons.setLayoutData(gridData);
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Add_2")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleIncludeAdd(e);
}
});
btnIncludeAdd = button;
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Remove_3")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleIncludeRemove(e);
}
});
btnIncludeRemove = button;
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Move_Up_4")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleIncludeMoveUp(e);
}
});
btnIncludeMoveUp = button;
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Move_Down_5")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleIncludeMoveDown(e);
}
});
btnIncludeMoveDown = button;
// Defines
group = new Group(ths, SWT.SHADOW_NONE);
group.setLayout(createGridLayout(1, true, 2, 2));
group.setLayoutData(new GridData(GridData.FILL_BOTH));
group.setText(("Preprocessor_Definitions_6")); //$NON-NLS-1$
cmpGroup = new Composite(group, SWT.NONE);
cmpGroup.setLayout(createGridLayout(1, true, 2, 2));
cmpGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
cmpCtrls = new Composite(cmpGroup, SWT.NONE);
cmpCtrls.setLayout(createGridLayout(2, false, 2, 2));
cmpCtrls.setLayoutData(new GridData(GridData.FILL_BOTH));
table = new Table(cmpCtrls, SWT.BORDER | SWT.SINGLE | SWT.HIDE_SELECTION);
TableLayout tblLayout = new TableLayout();
table.setLayout(tblLayout);
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
column = new TableColumn(table, SWT.NULL);
column.setText(("Name_7")); //$NON-NLS-1$
tblLayout.addColumnData(new ColumnWeightData(30));
column = new TableColumn(table, SWT.NULL);
column.setText(("Value_8")); //$NON-NLS-1$
tblLayout.addColumnData(new ColumnWeightData(30));
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleDefineTableSelectionChanged();
}
});
fDefineTable = table;
cmpButtons = new Composite(cmpCtrls, SWT.NONE);
gridLayout = createGridLayout(1, true, 2, 2);
gridData = new GridData();
gc = new GC(cmpButtons);
gc.setFont(cmpButtons.getFont());
gridData.widthHint = gc.getFontMetrics().getAverageCharWidth() * 20;
gc.dispose();
cmpButtons.setLayout(gridLayout);
cmpButtons.setLayoutData(gridData);
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Add_9")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleDefineAdd(e);
}
});
btnDefineAdd = button;
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Remove_10")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleDefineRemove(e);
}
});
btnDefineRemove = button;
button = new Button(cmpButtons, SWT.PUSH);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setEnabled(true);
button.setText(("Edit_11")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleDefineEdit(e);
}
});
btnDefineEdit = button;
// Since no paths or macros have been added yet, disabled the following buttons.
btnDefineEdit.setEnabled(false);
btnDefineRemove.setEnabled(false);
btnIncludeMoveDown.setEnabled(false);
btnIncludeMoveUp.setEnabled(false);
btnIncludeRemove.setEnabled(false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#initializeFrom(ICBuildConfig)
*/
public void initializeFrom(ICBuildConfig config) {
java.util.List includes = null;
java.util.List defines = null;
try {
includes = config.getAttribute(ICPosixBuildConstants.CPP_INCLUDES, (java.util.List) null);
defines = config.getAttribute(ICPosixBuildConstants.CPP_DEFINITIONS, (java.util.List) null);
} catch (CoreException e) {
}
if (includes != null) {
for (Iterator iter = includes.iterator(); iter.hasNext();) {
TableItem item = new TableItem(fIncludeTable, SWT.NONE);
item.setText((String) iter.next());
}
}
if (defines != null) {
for (Iterator iter = defines.iterator(); iter.hasNext();) {
TableItem item = new TableItem(fDefineTable, SWT.NONE);
String define = (String) iter.next();
int index = define.indexOf('=');
if (-1 == index) {
item.setText(0, define.trim());
} else {
item.setText(0, define.substring(0, index).trim());
if (index < define.length()) {
item.setText(1, define.substring(index + 1).trim());
}
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#performApply(ICBuildConfigWorkingCopy)
*/
public void performApply(ICBuildConfigWorkingCopy config) {
TableItem[] includes = fIncludeTable.getItems();
TableItem[] defines = fDefineTable.getItems();
java.util.List includeList = new java.util.Vector();
java.util.List defineList = new java.util.Vector();
for (int i = 0; i < includes.length; i++) {
includeList.add(includes[i].getText());
}
for (int i = 0; i < defines.length; i++) {
String name = defines[i].getText(0);
String value = defines[i].getText(1);
if (value.length() > 0) {
defineList.add(name + "=" + value);
} else {
defineList.add(name);
}
}
config.setAttribute(ICPosixBuildConstants.CPP_INCLUDES, includeList);
config.setAttribute(ICPosixBuildConstants.CPP_DEFINITIONS, defineList);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy configuration) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#isValid(ICBuildConfigWorkingCopy)
*/
public boolean isValid(ICBuildConfigWorkingCopy config) {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.builder.ICToolTab#getName()
*/
public String getName() {
return "Preprocessor";
}
}

View file

@ -0,0 +1,195 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
import org.eclipse.debug.internal.ui.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* Base tool tab implementation.
*/
public abstract class ACToolTab implements ICToolTab {
/**
* The control for this page, or <code>null</code>
*/
private Control fControl;
/**
* The configuration dialog this tab is contained in.
*/
private ICBuildConfigDialog fConfigurationDialog;
/**
* Current error message, or <code>null</code>
*/
private String fErrorMessage;
/**
* Current message, or <code>null</code>
*/
private String fMessage;
/**
* Returns the dialog this tab is contained in, or
* <code>null</code> if not yet set.
*
* @return configuration dialog, or <code>null</code>
*/
protected ICBuildConfigDialog getConfigurationDialog() {
return fConfigurationDialog;
}
/**
* Updates the buttons and message in this page's configuration dialog.
*/
protected void updateConfigurationDialog() {
if (getConfigurationDialog() != null) {
getConfigurationDialog().updateButtons();
getConfigurationDialog().updateMessage();
}
}
/**
* @see ICToolTab#getControl()
*/
public Control getControl() {
return fControl;
}
/**
* Sets the control to be displayed in this tab.
*
* @param control the control for this tab
*/
protected void setControl(Control control) {
fControl = control;
}
/**
* @see ICToolTab#getErrorMessage()
*/
public String getErrorMessage() {
return fErrorMessage;
}
/**
* @see ICToolTab#getMessage()
*/
public String getMessage() {
return fMessage;
}
/**
* @see ICToolTab#setConfigurationDialog(ICBuildConfigDialog)
*/
public void setConfigurationDialog(ICBuildConfigDialog dialog) {
fConfigurationDialog = dialog;
}
/**
* Sets this page's error message, possibly <code>null</code>.
*
* @param errorMessage the error message or <code>null</code>
*/
protected void setErrorMessage(String errorMessage) {
fErrorMessage = errorMessage;
}
/**
* Sets this page's message, possibly <code>null</code>.
*
* @param message the message or <code>null</code>
*/
protected void setMessage(String message) {
fMessage = message;
}
/**
* By default, do nothing.
*
* @see ICToolTab#dispose()
*/
public void dispose() {
}
/**
* Returns the shell this tab is contained in, or <code>null</code>.
*
* @return the shell this tab is contained in, or <code>null</code>
*/
protected Shell getShell() {
Control control = getControl();
if (control != null) {
return control.getShell();
}
return null;
}
/**
* Creates and returns a new push button with the given
* label and/or image.
*
* @param parent parent control
* @param label button label or <code>null</code>
* @param image image of <code>null</code>
*
* @return a new push button
*/
protected Button createPushButton(Composite parent, String label, Image image) {
return SWTUtil.createPushButton(parent, label, image);
}
/**
* Creates and returns a new radio button with the given
* label and/or image.
*
* @param parent parent control
* @param label button label or <code>null</code>
*
* @return a new radio button
*/
protected Button createRadioButton(Composite parent, String label) {
return SWTUtil.createRadioButton(parent, label);
}
/**
* @see ICToolTab#canSave()
*/
public boolean canSave() {
return true;
}
/**
* Create some empty space.
*/
protected void createVerticalSpacer(Composite comp, int colSpan) {
Label label = new Label(comp, SWT.NONE);
GridData gd = new GridData();
gd.horizontalSpan = colSpan;
label.setLayoutData(gd);
}
/**
* @see ICToolTab#getImage()
*/
public Image getImage() {
return null;
}
}

View file

@ -0,0 +1,90 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
/**
* Base tool tab group implementation.
*/
public abstract class ACToolTabGroup implements ICToolTabGroup {
/**
* The tabs in this tab group, or <code>null</code> if not yet instantiated.
*/
protected ICToolTab[] fTabs = null;
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#getTabs()
*/
public ICToolTab[] getTabs() {
return fTabs;
}
/**
* Sets the tabs in this group
*
* @param tabs the tabs in this group
*/
protected void setTabs(ICToolTab[] tabs) {
fTabs = tabs;
}
/**
* By default, dispose all the tabs in this group.
*
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#dispose()
*/
public void dispose() {
ICToolTab[] tabs = getTabs();
for (int i = 0; i < tabs.length; i++) {
tabs[i].dispose();
}
}
/**
* By default, delegate to all of the tabs in this group.
*
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#setDefaults(ICBuildConfigWorkingCopy)
*/
public void setDefaults(ICBuildConfigWorkingCopy configuration) {
ICToolTab[] tabs = getTabs();
for (int i = 0; i < tabs.length; i++) {
tabs[i].setDefaults(configuration);
}
}
/**
* By default, delegate to all of the tabs in this group.
*
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#initializeFrom(ICBuildConfig)
*/
public void initializeFrom(ICBuildConfig configuration) {
ICToolTab[] tabs = getTabs();
for (int i = 0; i < tabs.length; i++) {
tabs[i].initializeFrom(configuration);
}
}
/**
* By default, delegate to all of the tabs in this group.
*
* @see org.eclipse.cdt.ui.builder.ICToolTabGroup#performApply(ICBuildConfigWorkingCopy)
*/
public void performApply(ICBuildConfigWorkingCopy configuration) {
ICToolTab[] tabs = getTabs();
for (int i = 0; i < tabs.length; i++) {
tabs[i].performApply(configuration);
}
}
}

View file

@ -0,0 +1,62 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
/**
* A tool settings dialog is used to edit/view parameters passed
* to a tool as part of a C/'C++ build step. It contains a build
* configuration tab group.
*
* @see ICToolTabGroup
* @see ICToolTab
*/
public interface ICBuildConfigDialog {
/**
* Adjusts the enable state of this dialog's buttons
* to reflect the state of the active tab group.
* <p>
* This may be called by to force a button state update.
*/
public void updateButtons();
/**
* Updates the message (or error message) shown in the message line
* to reflect the state of the currently active tab in the dialog.
* <p>
* This method may be called to force a message update.
*/
public void updateMessage();
/**
* Sets the contents of the name field to the given name.
*
* @param name new name value
*/
public void setName(String name);
/**
* Returns the tabs currently being displayed, or
* <code>null</code> if none.
*
* @return currently displayed tabs, or <code>null</code>
*/
public ICToolTab[] getTabs();
/**
* Returns the currently active <code>ICToolTab</code>
* being displayed, or <code>null</code> if there is none.
*
* @return currently active <code>ICToolTab</code>, or <code>null</code>.
*/
public ICToolTab getActiveTab();
}

View file

@ -0,0 +1,159 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* A tool settings configuration tab group is used to edit/view
* parameters passed to a tool as part of a C/'C++ build step.
* CToolPoint settings are presented in a dialog with a tab folder.
* Each tab presents UI elements appropriate for manipulating
* a set of parameters for a tool.
* <p>
* This interface is intended to be implemented by clients.
*/
public interface ICToolTab {
/**
* Creates the top level control for this settings tab under
* the given parent composite. This method is called once on
* tab creation, after <code>setConfigurationDialog</code>
* is called.
* <p>
* Implementors are responsible for ensuring that
* the created control can be accessed via <code>getControl</code>
* </p>
*
* @param parent the parent composite
*/
public void createControl(Composite parent);
/**
* Returns the top level control for this tab.
* <p>
* May return <code>null</code> if the control
* has not been created yet.
* </p>
*
* @return the top level control or <code>null</code>
*/
public Control getControl();
/**
* Initializes the given configuration with default values
* for this tab. This method is called when a new configuration
* is created such that the configuration can be initialized with
* meaningful values. This method may be called before this
* tab's control is created.
*
* @param configuration configuration
*/
public void setDefaults(ICBuildConfigWorkingCopy configuration);
/**
* Initializes this tab's controls with values from the given
* configuration. This method is called when a configuration is
* selected to view or edit, after thistab's control has been
* created.
*
* @param configuration configuration
*/
public void initializeFrom(ICBuildConfig configuration);
/**
* Notifies this configuration tab that it has been disposed. Marks
* the end of this tab's lifecycle, allowing this tab to perform any
* cleanup required.
*/
public void dispose();
/**
* Copies values from this tab into the given configuration.
*
* @param configuration configuration
*/
public void performApply(ICBuildConfigWorkingCopy configuration);
/**
* Returns the current error message for this tab.
* May be <code>null</code> to indicate no error message.
* <p>
* An error message should describe some error state,
* as opposed to a message which may simply provide instruction
* or information to the user.
* </p>
*
* @return the error message, or <code>null</code> if none
*/
public String getErrorMessage();
/**
* Returns the current message for this tab.
* <p>
* A message provides instruction or information to the
* user, as opposed to an error message which should
* describe some error state.
* </p>
*
* @return the message, or <code>null</code> if none
*/
public String getMessage();
/**
* Returns whether this tab is in a state that allows the configuration
* whose values this tab is showing to be saved.
* <p>
* This information is typically used by the configuration dialog to
* decide when it is okay to save a configuration.
* </p>
*
* @return whether this tab is in a state that allows the current
* configuration to be saved
*/
public boolean canSave();
/**
* Sets the configuration dialog that hosts this tab. This is the
* first method called on a configuration tab, and marks the beginning
* of this tab's lifecycle.
*
* @param dialog configuration dialog
*/
public void setConfigurationDialog(ICBuildConfigDialog dialog);
/**
* Returns the name of this tab.
*
* @return the name of this tab
*/
public String getName();
/**
* Returns the image for this tab, or <code>null</code> if none
*
* @return the image for this tab, or <code>null</code> if none
*/
public Image getImage();
/**
* Returns true if the current contents of a tab are valid.
*
* @param config build configuration.
* @return boolean true if tab contents are valid, fale if not.
*/
boolean isValid(ICBuildConfigWorkingCopy config);
}

View file

@ -0,0 +1,83 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
/**
* A tool settings configuration tab group is used to edit/view
* parameters passed to a tool as part of a C/'C++ build step.
* CToolPoint settings are presented in a dialog with a tab folder.
* Each tab presents UI elements appropriate for manipulating
* a set of parameters for a tool.
* <p>
* The tab group controls which tabs are displayed for a specific
* tool, and provides a mechanism for overriding configuration
* initialization performed by tabs.
* <p>
* This interface is intended to be implemented by clients.
* <p>
* (Mercilessly modeled on the Eclipse launch mechanism.)
*/
public interface ICToolTabGroup {
/**
* Creates the tabs contained in this tab group. The tabs control's
* are not created. This is the first method called in the lifecycle
* of a tab group.
*
* @param dialog the tool settings dialog this tab group is contained in
*/
public void createTabs(ICBuildConfigDialog dialog);
/**
* Returns the tabs contained in this tab group.
*
* @return the tabs contained in this tab group
*/
public ICToolTab[] getTabs();
/**
* Notifies this tab group that it has been disposed, and disposes
* of this group's tabs. Marks the end of this tab group's lifecycle,
* allowing this tab group to perform any cleanup required.
*/
public void dispose();
/**
* Initializes the given build configuration with default values
* for this tab group. This method is called when a new build
* configuration is created such that the configuration can be
* initialized with meaningful values. This method may be called
* before tab controls are created.
*
* @param configuration build configuration
*/
public void setDefaults(ICBuildConfigWorkingCopy configuration);
/**
* Initializes this group's tab controls with values from the given
* build configuration. This method is called when a configuration
* is selected to view or edit.
*
* @param configuration build configuration
*/
public void initializeFrom(ICBuildConfig configuration);
/**
* Copies values from this group's tabs into the given build configuration.
*
* @param configuration build configuration
*/
public void performApply(ICBuildConfigWorkingCopy configuration);
}

View file

@ -0,0 +1,44 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder;
import org.eclipse.core.runtime.CoreException;
/**
* Interface representing an instance of
* a CToolTabGroup extension point.
*/
public interface ICToolTabGroupPoint {
/**
* Returns the unique id for the provider.
*
* @return unique id.
*/
public String getId();
/**
* Returns the name of the provider's
* implementing class.
*
* @return name of the provider's implementing class.
*/
public String getProviderClassName();
/**
* Returns an instance of the provider's
* implementing class.
*
* @return instance of ICToolTabGroup.
*/
public ICToolTabGroup getProvider() throws CoreException;
}

View file

@ -0,0 +1,121 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import java.text.MessageFormat;
import java.util.Hashtable;
import org.eclipse.cdt.core.builder.model.ICToolType;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.builder.ICToolTabGroup;
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.IPluginDescriptor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugUIConstants;
/**
* @author sam.robb
*
* Manages contributed configuration tabs
*/
public class CBuildConfigPresentationManager {
/**
* The singleton configuration presentation manager
*/
private static CBuildConfigPresentationManager fgDefault;
/**
* Collection of configuration tab group extensions
* defined in plug-in xml. Entries are keyed by
* type identifier (<code>String</code>), and entires
* are <code>CToolTabGroupPoint</code>.
*/
private Hashtable fTabGroupExtensions;
/**
* Constructs the singleton configuration presentation manager.
*/
private CBuildConfigPresentationManager() {
fgDefault = this;
initializeTabGroupExtensions();
}
/**
* Returns the configuration presentation manager
*/
public static CBuildConfigPresentationManager getDefault() {
if (fgDefault == null) {
fgDefault = new CBuildConfigPresentationManager();
}
return fgDefault;
}
/**
* Creates launch configuration tab group extensions for each extension
* defined in XML, and adds them to the table of tab group extensions.
*/
private void initializeTabGroupExtensions() {
fTabGroupExtensions = new Hashtable();
IPluginDescriptor descriptor= CUIPlugin.getDefault().getDescriptor();
IExtensionPoint extensionPoint= descriptor.getExtensionPoint(IDebugUIConstants.EXTENSION_POINT_LAUNCH_CONFIGURATION_TAB_GROUPS);
IConfigurationElement[] groups = extensionPoint.getConfigurationElements();
for (int i = 0; i < groups.length; i++) {
CToolTabGroupPoint group = new CToolTabGroupPoint(groups[i]);
String typeId = group.getId();
if (typeId == null) {
IExtension ext = groups[i].getDeclaringExtension();
IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.STATUS_INVALID_EXTENSION_DEFINITION,
MessageFormat.format("Configuration tab group extension {0} does not specify configuration type", (new String[] {ext.getUniqueIdentifier()})), null); //$NON-NLS-1$
DebugUIPlugin.log(status);
} else {
// verify it references a valid launch configuration type
ILaunchConfigurationType lct = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(typeId);
if (lct == null) {
IExtension ext = groups[i].getDeclaringExtension();
IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.STATUS_INVALID_EXTENSION_DEFINITION,
MessageFormat.format("Launch configuration tab group extension {0} refers to non-existant launch configuration_type_{1}", (new String[] {ext.getUniqueIdentifier(), typeId})), null); //$NON-NLS-1$
DebugUIPlugin.log(status);
}
}
if (typeId != null) {
fTabGroupExtensions.put(typeId, group);
}
}
}
/**
* Returns the tab group for the given type of launch configuration.
*
* @return the tab group for the given type of launch configuration
* @exception CoreException if an exception occurrs creating the group
*/
public ICToolTabGroup getTabGroup(ICToolType type) throws CoreException {
CToolTabGroupPoint ext = (CToolTabGroupPoint)fTabGroupExtensions.get(type.getId());
if (ext == null) {
IStatus status = new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR,
MessageFormat.format("No tab group defined for configuration type {0}", (new String[] {type.getId()})), null); ; //$NON-NLS-1$
throw new CoreException(status);
} else {
return ext.getProvider();
}
}
}

View file

@ -0,0 +1,825 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.builder.BuilderPlugin;
import org.eclipse.cdt.core.builder.model.ICBuildConfig;
import org.eclipse.cdt.core.builder.model.ICBuildConfigManager;
import org.eclipse.cdt.core.builder.model.ICBuildConfigWorkingCopy;
import org.eclipse.cdt.core.resources.MakeUtil;
import org.eclipse.core.internal.runtime.Assert;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
/**
* Shows the build configuration wizard
*/
public class CBuildConfigView extends ViewPart implements IResourceChangeListener {
private TreeViewer viewer;
/**
* Configuration life cycle actions
*/
private Action actionEditConfig;
private Action actionNewConfig;
private Action actionMakePrimary;
private Action actionDeleteConfig;
private Action doubleClickAction;
//private Action actionBuild;
/**
* Message constants
*/
private final String MSG_CANDELETE = "Remove build configuration";
private final String MSG_NODELETE = "Cannot delete primary build configuration";
private final String MSG_MAKEPRIMARY = "Make this build configuration the primary configuration";
private final String MSG_ALREADYPRIMARY = "This build configuration is the primary configuration";
private final String KEY_LASTPROJECT = "LastProject";
/**
* Menu entry for the collection of CBuildConfigurationAction
* objects
*/
class CBuildAction extends Action {
private IProject m_project;
private ICBuildConfig m_config;
public CBuildAction(IProject prj, ICBuildConfig config) {
m_project = prj;
m_config = config;
setText("Build");
setToolTipText("Performing Build");
setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_BUILD_CONFIG);
setMenuCreator(new CTargetsMenuCreator(m_project, m_config));
}
}
class CTargetsMenuCreator implements IMenuCreator {
private IProject m_project;
private ICBuildConfig m_config;
public CTargetsMenuCreator(IProject prj, ICBuildConfig config) {
m_project = prj;
m_config = config;
}
private Menu createContents(Menu targets) {
// walk the list of targets in the project and add them to the target menu
String strTargets[] = MakeUtil.getPersistentTargets(m_project);
for (int nIndex = 0; nIndex < strTargets.length; nIndex++) {
MenuItem newItem = new MenuItem(targets, SWT.NONE);
newItem.setText(strTargets[nIndex]);
newItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent selEvent) {
// cheasy, but good enough for this, the name of the menu is the build target
String strConfig = ((MenuItem) selEvent.getSource()).getText();
// System.out.println("Building configuration " + strConfig + " on project " + m_project.getName() + " using configuration " + m_config.getName());
IRunnableWithProgress builder = new ConfigurationBuilder(m_project, m_config, strConfig);
try {
new ProgressMonitorDialog(getSite().getShell()).run(true, true, builder);
}
catch (InterruptedException e) {}
catch (InvocationTargetException e) {}
}
});
}
return targets;
}
/**
* @see org.eclipse.jface.action.IMenuCreator#dispose()
*/
public void dispose() {
m_project = null;
}
/**
* @see org.eclipse.jface.action.IMenuCreator#getMenu(Control)
*/
public Menu getMenu(Control parent) {
Menu theMenu = new Menu(parent);
return createContents(theMenu);
}
/**
* @see org.eclipse.jface.action.IMenuCreator#getMenu(Menu)
*/
public Menu getMenu(Menu parent) {
Menu theMenu = new Menu(parent);
return createContents(theMenu);
}
}
/**
* this class builds the selected configuration
*/
class ConfigurationBuilder implements IRunnableWithProgress {
private IProject m_prj;
private ICBuildConfig m_config;
private String m_target;
public ConfigurationBuilder(IProject prj, ICBuildConfig bldConfig, String strTarget) {
m_prj = prj;
m_config = bldConfig;
m_target = strTarget;
}
/**
* @see org.eclipse.jface.operation.IRunnableWithProgress#run(IProgressMonitor)
*/
public void run(IProgressMonitor monitor) {
Assert.isNotNull(m_prj, "Project reference cannot be null");
Assert.isNotNull(m_config, "Configuration reference cannot be null");
try {
MakeUtil.setSessionBuildDir(m_prj, m_prj.getLocation().toOSString());
MakeUtil.setSessionTarget(m_prj, m_target);
MakeUtil.setSessionConsoleMode(m_prj, true);
m_prj.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
}
catch (CoreException e) { }
}
}
/*
* The content provider class is responsible for
* providing objects to the view. It can wrap
* existing objects in adapters or simply return
* objects as-is. These objects may be sensitive
* to the current input of the view, or ignore
* it and always show the same content
* (like Task List, for example).
*/
abstract class TreeObject implements IAdaptable {
private String fName;
private TreeObject fParent;
private ArrayList fChildren;
public TreeObject(String name) {
this(name, null);
}
abstract public void doRefreshChildren();
public TreeObject(String name, TreeObject parent) {
setName(name);
setParent(parent);
fChildren = new ArrayList();
}
public void refreshChildren() {
fChildren.clear();
doRefreshChildren();
for (Iterator iter = fChildren.iterator(); iter.hasNext();) {
TreeObject element = ((TreeObject) iter.next());
element.refreshChildren();
}
}
public void addChild(TreeObject child) {
fChildren.add(child);
child.setParent(this);
}
public void removeChild(TreeObject child) {
fChildren.remove(child);
child.setParent(null);
}
public TreeObject[] getChildren() {
return (TreeObject[]) fChildren.toArray(new TreeObject[fChildren.size()]);
}
public boolean hasChildren() {
return (fChildren.size() > 0);
}
public void setName(String name) {
fName = ((name != null) ? name : "");
}
public void setParent(TreeObject parent) {
fParent = parent;
}
public String getName() {
return fName;
}
public TreeObject getParent() {
return fParent;
}
public Object getAdapter(Class key) {
return null;
}
public Image getImage() {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
public String toString() {
return getName();
}
}
/**
* The tree parent class contains a list of projects
*/
class TreeRoot extends TreeObject {
public TreeRoot() {
super("");
}
/**
* Return a list of all child objects (projects)
* that support the C project nature.
*/
public void doRefreshChildren() {
IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
if (wsRoot != null) {
IProject[] projects = wsRoot.getProjects();
if (projects != null) {
for (int i = 0; i < projects.length; i++) {
try {
if (projects[i].isOpen()) {
if (projects[i].hasNature(CProjectNature.C_NATURE_ID)) {
addChild(new TreeProject(projects[i], this));
}
}
}
catch (CoreException e) {
}
}
}
}
}
public Image getImage() {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
}
}
class TreeProject extends TreeObject {
private IProject fProject;
public TreeProject(IProject project, TreeRoot parent) {
super(project.getName(), parent);
setProject(project);
}
private void setProject(IProject project) {
fProject = project;
}
public IProject getProject() {
return fProject;
}
public void doRefreshChildren() {
try {
ICBuildConfig[] configs = getBuildConfigurationManager().getConfigurations(fProject);
for (int i = 0; i < configs.length; i++) {
addChild(new TreeConfiguration(configs[i]));
}
} catch (CoreException e) {
}
}
public Image getImage() {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
}
}
class TreeConfiguration extends TreeObject {
private ICBuildConfig fConfig;
public TreeConfiguration(ICBuildConfig config) {
super(config.getName());
fConfig = config;
}
public void doRefreshChildren() {
}
public ICBuildConfig getConfiguration() {
return fConfig;
}
public IProject getProject() {
return fConfig.getProject();
}
}
class ViewContentProvider implements IStructuredContentProvider,
ITreeContentProvider {
private TreeRoot invisibleRoot;
public ViewContentProvider() {
invisibleRoot = new TreeRoot();
invisibleRoot.refreshChildren();
}
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
invisibleRoot.refreshChildren();
}
public void dispose() {
}
public Object[] getElements(Object parent) {
if (parent.equals(ResourcesPlugin.getWorkspace())) {
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
public Object getParent(Object child) {
if (child instanceof TreeObject) {
return ((TreeObject) child).getParent();
}
return null;
}
public Object[] getChildren(Object parent) {
if (parent instanceof TreeObject) {
return ((TreeObject) parent).getChildren();
}
return new Object[0];
}
public boolean hasChildren(Object parent) {
if (parent instanceof TreeObject) {
return ((TreeObject) parent).hasChildren();
}
return false;
}
}
class ViewLabelProvider extends LabelProvider {
public String getText(Object obj) {
return obj.toString();
}
public Image getImage(Object obj) {
Image image = null; // this is the image that will represent the obj parameter
// if this is a build configuration, get the image for the build configuration
if (obj instanceof TreeObject) {
image = ((TreeObject) obj).getImage();
} else {
// er, this is a bit odd, means we're not looking at one of our own classes
image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
return image;
}
}
/**
* The constructor.
*/
public CBuildConfigView() {
}
/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*
* @param parent the owner of the control
*/
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setSorter(new ViewerSorter(){});
viewer.setInput(ResourcesPlugin.getWorkspace());
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
// register the listener for changes to the tree
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
// Set this button to disable by default since there is no valid selection at this point.
actionEditConfig.setEnabled(false);
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("_#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
CBuildConfigView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void hookDoubleClickAction() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ISelection selItem = viewer.getSelection();
Object objItem = ((IStructuredSelection) selItem).getFirstElement();
if (objItem.getClass().equals(TreeObject.class)) {
actionEditConfig.run();
}
else {
// be nice and expand or contract the tree when the user double clicks on a node
for (Iterator iter = ((IStructuredSelection) selItem).iterator(); iter.hasNext(); ) {
Object objNode = iter.next();
if (viewer.getExpandedState(objNode)) {
viewer.collapseToLevel(objNode, 1);
}
else {
viewer.expandToLevel(objNode, 1);
}
}
}
}
});
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(actionEditConfig);
manager.add(new Separator());
//manager.add(actionBuild);
}
/**
* this method populates the right-click menu
*/
private void fillContextMenu(IMenuManager manager) {
ISelection selItem = viewer.getSelection();
Object objItem = ((IStructuredSelection)selItem).getFirstElement();
if (objItem instanceof TreeProject) {
manager.add(actionNewConfig);
// manager.add(actionBuild);
} else if (objItem instanceof TreeConfiguration) {
TreeConfiguration treeConf = (TreeConfiguration) objItem;
manager.add(actionEditConfig);
manager.add(actionNewConfig);
CBuildAction build = new CBuildAction(treeConf.getProject(), treeConf.getConfiguration());
build.setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_BUILD_CONFIG);
manager.add(build);
ICBuildConfig item = treeConf.getConfiguration();
if (item != null) {
// TODO: fix this
// actionMakePrimary.setEnabled(!item.getIsPrimary());
actionMakePrimary.setDescription(actionMakePrimary.isEnabled() ? MSG_MAKEPRIMARY : MSG_ALREADYPRIMARY);
actionMakePrimary.setToolTipText(actionMakePrimary.getDescription());
// TODO: fix this
// actionDeleteConfig.setEnabled(!item.getIsPrimary());
actionDeleteConfig.setDescription(actionDeleteConfig.isEnabled() ? MSG_CANDELETE : MSG_NODELETE);
actionDeleteConfig.setToolTipText(actionDeleteConfig.getDescription());
manager.add(actionMakePrimary);
manager.add(actionDeleteConfig);
}
}
// Other plug-ins can contribute there actions here
manager.add(new Separator("Additions"));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(actionEditConfig);
//manager.add(actionBuild);
manager.add(new Separator());
}
private void updateActionEnabled () {
IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
TreeObject child = (TreeObject) sel.getFirstElement();
boolean enabled = ((sel.size() > 0) && (child instanceof TreeConfiguration));
actionEditConfig.setEnabled(enabled);
//actionBuild.setEnabled(true);
}
private ICBuildConfigManager getBuildConfigurationManager() {
return BuilderPlugin.getDefault().getBuildConfigurationManager();
}
private Shell getShell() {
return viewer.getControl().getShell();
}
private Object getElementFromSelection(ISelection sel) {
Object element = null;
if (sel instanceof IStructuredSelection) {
element = ((IStructuredSelection) sel).getFirstElement();
}
return element;
}
private void makeActions() {
//////////////////////////////////////////////
// Action: EDIT
//////////////////////////////////////////////
actionEditConfig = new Action() {
public void run() {
Object element = getElementFromSelection(viewer.getSelection());
if ((element != null) && (element instanceof TreeConfiguration)) {
TreeConfiguration treeConf = (TreeConfiguration) element;
CBuildConfigDialog dlg = null;
dlg = new CBuildConfigDialog(getShell(), treeConf.getConfiguration());
if (dlg.open() == dlg.OK) {
viewer.refresh();
}
}
}
};
actionEditConfig.setText("Edit...");
actionEditConfig.setToolTipText("Edit Configuration");
actionEditConfig.setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_EDIT_CONFIG);
//////////////////////////////////////////////
// Action: BUILD
//////////////////////////////////////////////
// actionBuild = new Action() {
// public void run() {
// IStructuredSelection selList = (IStructuredSelection) viewer.getSelection();
// for (Iterator iter = selList.iterator(); iter.hasNext();) {
// Object selItem = (Object) iter.next();
// if (selItem instanceof TreeObject) {
// TreeObject selConfig = (TreeObject) selItem;
// IRunnableWithProgress builder = new CBuildConfig(selConfig.getAssocProject(), selConfig.getBuildConfig());
// try {
// new ProgressMonitorDialog(getSite().getShell()).run(true, true, builder);
// }
// catch (InterruptedException e) {}
// catch (InvocationTargetException e) {}
// }
// }
// }
// };
//
// actionBuild.setText("Build");
// actionBuild.setToolTipText("Performing Build");
// actionBuild.setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_BUILD_CONFIG);
//
// doubleClickAction = new Action() {
// public void run() {
// ISelection selection = viewer.getSelection();
// Object obj = ((IStructuredSelection)selection).getFirstElement();
// showMessage("Try to perform a build here" + obj.toString());
// }
// };
//////////////////////////////////////////////
// Action: NEW
//////////////////////////////////////////////
actionNewConfig = new Action() {
public void run() {
Object element = getElementFromSelection(viewer.getSelection());
if ((element != null) && (element instanceof TreeProject)) {
TreeProject treeProject = (TreeProject) element;
ICBuildConfigWorkingCopy cfg = null;
CBuildConfigDialog dlg = null;
cfg = getBuildConfigurationManager().getConfiguration(treeProject.getProject(), null);
dlg = new CBuildConfigDialog(getShell(), cfg);
if (dlg.open() == dlg.OK) {
viewer.refresh();
}
}
}
};
actionNewConfig.setText("New...");
actionNewConfig.setToolTipText("Add new configuration");
actionNewConfig.setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_NEW_CONFIG);
//////////////////////////////////////////////
// Action: MAKE PRIMARY
//////////////////////////////////////////////
actionMakePrimary = new Action() {
public void run() {
Object element = getElementFromSelection(viewer.getSelection());
if ((element != null) && (element instanceof TreeConfiguration)) {
TreeConfiguration treeConfig = (TreeConfiguration) element;
// TODO: Use getBuildConfigurationManager(),
// treeConfig.getBuildConfig() to set primary config
viewer.refresh();
}
}
};
actionMakePrimary.setText("Make Primary");
actionMakePrimary.setToolTipText("Make this the primary configuration");
// actionMakePrimary.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
// getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
//////////////////////////////////////////////
// Action: DELETE
//////////////////////////////////////////////
actionDeleteConfig = new Action() {
public void run() {
Object element = getElementFromSelection(viewer.getSelection());
if ((element != null) && (element instanceof TreeConfiguration)) {
TreeConfiguration treeConfig = (TreeConfiguration) element;
if (MessageDialog.openConfirm(getShell(), "Removing build configuration", "Are you sure you want to remove this build configuration?")) {
viewer.refresh();
}
}
}
};
actionDeleteConfig.setText("Remove");
actionDeleteConfig.setToolTipText("Remove this configuration");
actionMakePrimary.setImageDescriptor(CBuilderImages.DESC_IMG_ACTION_DELETE_CONFIG);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged (SelectionChangedEvent event) {
updateActionEnabled();
}
});
}
private void showMessage(String message) {
MessageDialog.openInformation(getShell(), "Build Configuration", message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
/**
* clean-up
*/
public void dispose()
{
// remove from the workspace our listener
//getViewSite().getPage().removePostSelectionListener(this);
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
/**
* given a project, updates the view with the contents of
* the build configuration for that project
*
* @param prjTarget the new project that this view should adjust to
*/
private void updateView(IProject prjTarget)
{
Assert.isNotNull(prjTarget);
}
class CResourceDeltaVisitor implements IResourceDeltaVisitor {
private boolean bRefreshView = false;
public boolean visit(IResourceDelta delta) {
IResource resource = delta.getResource();
boolean bVisitChildren = true;
int nKind;
if (resource instanceof IProject) {
nKind = delta.getKind();
if (nKind == IResourceDelta.OPEN || nKind == IResourceDelta.ADDED || nKind == IResourceDelta.REMOVED || nKind == IResourceDelta.CHANGED) {
bRefreshView = true;
}
// don't recurse past the project level
bVisitChildren = false;
}
return bVisitChildren;
}
public boolean getRefreshView() {
return bRefreshView;
}
}
/**
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
CResourceDeltaVisitor changeVisitor = new CResourceDeltaVisitor();
try {
event.getDelta().accept(changeVisitor);
}
catch (CoreException e) {
System.err.println(e.toString());
}
// refresh the view so the user can see the changes.
if (changeVisitor.getRefreshView()) {
this.refresh();
}
}
/**
* Wrapper for users of this object to force a view refresh
*/
public void refresh() {
Display.getDefault().syncExec(new Runnable()
{
public void run() {
viewer.refresh();
}
}
);
}
}

View file

@ -0,0 +1,297 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.core.builder.BuilderPlugin;
import org.eclipse.cdt.core.builder.ICBuildVariablePoint;
import org.eclipse.cdt.core.builder.model.CBuildVariable;
import org.eclipse.cdt.core.builder.model.ICBuildVariable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
/**
* @author gene.sally
*
* This class displays the selection tool for library paths or libraries
*
*/
public class CBuildVariableDialog extends Dialog {
private static final int DLG_WIDTH = 60; // for setting the height and width of the dialog
private static final int DLG_HEIGHT = 25;
private Combo fBrowseHow; // combo control
private TreeViewer fTree; // tree view control
private String fTitle; // title for dialog
private Map fBuildVariables;
private ICBuildVariable fSelection;
private class CNoFiles implements FileFilter {
public boolean accept(File file) {
return (file.isDirectory() && !file.getName().equals(".metadata"));
}
}
private class FileLabelProvider extends LabelProvider {
private final Image IMG_FOLDER= PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
private final Image IMG_FILE= PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
public Image getImage(Object element) {
if (element instanceof File) {
File curr= (File) element;
if (curr.isDirectory()) {
return IMG_FOLDER;
} else {
return IMG_FILE;
}
}
return null;
}
public String getText(Object element) {
if (element instanceof File) {
return ((File) element).getName();
}
return super.getText(element);
}
}
private class FileContentProvider implements ITreeContentProvider {
private final Object[] EMPTY= new Object[0];
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof File) {
File[] children = ((File) parentElement).listFiles(new CNoFiles());
if (children != null) {
return children;
}
}
return EMPTY;
}
public Object getParent(Object element) {
if (element instanceof File) {
return ((File) element).getParentFile();
}
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object[] getElements(Object element) {
return getChildren(element);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class CDoubleClickInTree implements IDoubleClickListener {
public void doubleClick(DoubleClickEvent event) {
ISelection selection;
selection = fTree.getSelection();
if (selection != null) {
updateSelection();
getButton(OK).notifyListeners(SWT.Selection, new Event());
}
}
}
public CBuildVariableDialog(Shell parentShell, String title) {
super(parentShell);
fTitle = title;
fBuildVariables = getBuildVariables();
}
public ICBuildVariable getSelection() {
return fSelection;
}
protected Control createContents(Composite parent) {
super.createContents(parent);
Composite composite = (Composite) getDialogArea();
GridLayout layout = new GridLayout();
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.numColumns = 2;
layout.makeColumnsEqualWidth = false;
composite.setLayout(layout);
// row 1
new Label(composite, SWT.NULL).setText(("Starting_Point_1")); //$NON-NLS-1$
fBrowseHow = new Combo(composite, SWT.LEFT | SWT.BORDER | SWT.READ_ONLY);
fBrowseHow.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
for (Iterator iter = fBuildVariables.entrySet().iterator(); iter.hasNext();) {
Map.Entry element = (Map.Entry) iter.next();
String value = element.getValue().toString();
fBrowseHow.add(value);
}
fBrowseHow.setData(fBuildVariables);
fBrowseHow.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent sel) {
String strSelection = fBrowseHow.getText();
if (strSelection != null && fTree != null) {
IPath path = expandBuildVar(strSelection);
if (path != null) {
fTree.setInput(path.toFile());
CBuildVariableDialog.this.getButton(IDialogConstants.OK_ID).setEnabled(fTree.getTree().getItemCount() != 0);
}
}
}
}
);
fBrowseHow.select(0);
// row 2
fTree = new TreeViewer(composite, SWT.LEFT | SWT.BORDER | SWT.READ_ONLY);
GridData gdTree = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_BOTH);
gdTree.horizontalSpan = 2;
gdTree.widthHint= convertWidthInCharsToPixels(DLG_WIDTH);
gdTree.heightHint= convertHeightInCharsToPixels(DLG_HEIGHT);
fTree.getControl().setLayoutData(gdTree);
fTree.setLabelProvider(new FileLabelProvider());
fTree.setSorter(new ViewerSorter() {});
fTree.setContentProvider(new FileContentProvider());
fTree.setInput(expandBuildVar((String) fBuildVariables.keySet().iterator().next()));
fTree.addDoubleClickListener(new CDoubleClickInTree());
return composite;
}
/**
* Method expandBuildVar.
* @param string
*/
private IPath expandBuildVar(String name) {
ICBuildVariable bv = (ICBuildVariable) fBuildVariables.get(name);
return new Path((null != bv) ? bv.getValue() : "");
}
/**
* Method getBuildVariables.
* @return Map
*/
private Map getBuildVariables() {
Map vars = new HashMap();
try {
Map providers = BuilderPlugin.getDefault().getBuildVariableProviders();
for (Iterator iter = providers.entrySet().iterator(); iter.hasNext();) {
ICBuildVariablePoint expt = (ICBuildVariablePoint) iter.next();
ICBuildVariable[] bv = expt.getProvider().getVariables();
for (int i = 0; i < bv.length; i++) {
vars.put(bv[i].getFixed(), bv[i]);
}
}
} catch (CoreException e) {
vars.clear();
}
return vars;
}
/**
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
updateSelection();
super.okPressed();
}
/**
* @see org.eclipse.jface.window.Window#configureShell(Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(fTitle);
}
private void updateSelection() {
ISelection selection; // the current selection
// store the result of the user selection
selection = fTree.getSelection();
if (selection != null) {
File selectedPath = (File) ((StructuredSelection) selection).getFirstElement();
if (selectedPath != null) {
String strCurrRoot = fBrowseHow.getText();
IPath selPath = new Path(selectedPath.getAbsolutePath());
ICBuildVariable bv = (ICBuildVariable) fBuildVariables.get(strCurrRoot);
IPath currPath = new Path((null != bv) ? bv.getValue() : "");
int nMatchCount = currPath.matchingFirstSegments(selPath);
IPath delta = selPath.removeFirstSegments(nMatchCount);
delta = delta.setDevice(null);
fSelection = new CBuildVariable(delta.toString(), bv);
}
}
}
}

View file

@ -0,0 +1,149 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
/**
* @author gene.sally
*
* Container for C Builder images. Defines constants to the images in the project
* and creates the image descriptor objects for these files so we can have nice
* cached image management the way Eclipse intended.
*
* To add an image:
* 1) Place it in the icons/all folder in this project.
* 2) Create a IMG_* constant for it's name along.
* 3) Create a DESC_IMG_* constant for the image.
*/
public class CBuilderImages {
// NO I18N on these strings!!!
private static final String NAME_PREFIX = "org.eclipse.cdt.ui.builder."; //$NON-NLS-1$
private static final int NAME_PREFIX_LENGTH = NAME_PREFIX.length();
private static URL m_IconFolder = null;
private static ImageRegistry m_ImageRegistry = null;
/**
* the icon folder won't change and the other static
* methods/constants need this, so init as a static
*/
static
{
try {
m_IconFolder = new URL( CUIPlugin.getDefault().getDescriptor().getInstallURL(), "icons/"); //$NON-NLS-1$
} catch( MalformedURLException e ) {
/* do nothing right now, but we should be doing something */
}
}
// the following lists all of the images in the system,
// the constants will be expanded to something on the filesystem when converted into
// image descroptors that are later turned into real Image Objects when needed.
public final static String IMG_CONFIG_COMPILER = NAME_PREFIX + "config-compiler.gif"; //$NON-NLS-1$
public final static String IMG_CONFIG_LINKER = NAME_PREFIX + "config-linker.gif"; //$NON-NLS-1$
public final static String IMG_CONFIG_PREPOCESSOR = NAME_PREFIX + "config-preprocessor.gif"; //$NON-NLS-1$
public final static String IMG_CONFIG_DEBUG = NAME_PREFIX + "config-debug.gif"; //$NON-NLS-1$
public final static String IMG_CONFIG_PROFILE = NAME_PREFIX + "config-profile.gif"; //$NON-NLS-1$
public final static String IMG_CONFIG_RELEASE = NAME_PREFIX + "config-release.gif"; //$NON-NLS-1$
public final static String IMG_ACTION_NEW_CONFIG = NAME_PREFIX + "action-newconfig.gif"; //$NON-NLS-1$
public final static String IMG_ACTION_EDIT_CONFIG = NAME_PREFIX + "action-editconfig.gif"; //$NON-NLS-1$
public final static String IMG_ACTION_BUILD_CONFIG = NAME_PREFIX + "action-buildconfig.gif"; //$NON-NLS-1$
public final static String IMG_ACTION_DELETE_CONFIG = NAME_PREFIX + "action-deleteconfig.gif"; //$NON-NLS-1$
// image prefix. for our purposes, slam all fo these into the same folder
// but leave the opporiunity for us to create sub-folders if necessary
public final static String PREFIX_ALL = "full/build16"; //$NON-NLS-1$
// create the image descriptors from the above constants
public final static ImageDescriptor DESC_IMG_CONFIG_COMPILER = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_COMPILER);
public final static ImageDescriptor DESC_IMG_CONFIG_LINKER = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_LINKER);
public final static ImageDescriptor DESC_IMG_CONFIG_PREPOCESSOR = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_PREPOCESSOR);
public final static ImageDescriptor DESC_IMG_CONFIG_DEBUG = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_DEBUG);
public final static ImageDescriptor DESC_IMG_CONFIG_PROFILE = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_PROFILE);
public final static ImageDescriptor DESC_IMG_CONFIG_RELEASE = getImageDescriptor(PREFIX_ALL, IMG_CONFIG_RELEASE);
public final static ImageDescriptor DESC_IMG_ACTION_NEW_CONFIG = getImageDescriptor(PREFIX_ALL, IMG_ACTION_NEW_CONFIG);
public final static ImageDescriptor DESC_IMG_ACTION_EDIT_CONFIG = getImageDescriptor(PREFIX_ALL, IMG_ACTION_EDIT_CONFIG);
public final static ImageDescriptor DESC_IMG_ACTION_BUILD_CONFIG = getImageDescriptor(PREFIX_ALL, IMG_ACTION_BUILD_CONFIG);
public final static ImageDescriptor DESC_IMG_ACTION_DELETE_CONFIG = getImageDescriptor(PREFIX_ALL, IMG_ACTION_DELETE_CONFIG);
private static ImageRegistry getImageRegistry() {
if (null == m_ImageRegistry) {
Display display = (Display.getCurrent() != null) ? Display.getCurrent() : Display.getDefault();
m_ImageRegistry = new ImageRegistry(display);
}
return m_ImageRegistry;
}
/**
* Returns the image object from the image cache matching the requested name
*
* @param strImageIdent the identifier of the inmage, see one of the static IMG_ decls in this calss
* @return the image for this item, null if the image was not found
*
*/
public static Image getImage(String strImageIdent) {
return getImageRegistry().get(strImageIdent);
}
/**
* Gets the location of an image based on it's location on the file system,
*
* @param strPrefix the folder under the icon folder where this file resides
* @param strName name of the image file
*
* @return the URL to the image requested.
*/
private static URL getFilesystemName(String strPrefix, String strName) throws MalformedURLException {
if (m_IconFolder == null) {
throw new MalformedURLException();
}
StringBuffer buffer = new StringBuffer(strPrefix);
buffer.append('/');
buffer.append(strName);
return new URL(m_IconFolder, buffer.toString());
}
/**
* Creates an image descriptor for the requrested image
*
* @param strPrefix the folder under the icon folder where this file resides
* @param strName name of the image file
*
* @return the requested image descriptor, or image not found if the image could not be located on the file system.
*/
private static ImageDescriptor getImageDescriptor(String strPrefix, String strName) {
ImageDescriptor descriptor = null;
try {
descriptor = ImageDescriptor.createFromURL(getFilesystemName(strPrefix, strName.substring(NAME_PREFIX_LENGTH)));
getImageRegistry().put(strName, descriptor);
}
catch(MalformedURLException e) {
descriptor = ImageDescriptor.getMissingImageDescriptor();
}
return descriptor;
}
}

View file

@ -0,0 +1,421 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import org.eclipse.cdt.core.builder.model.ICBuildVariable;
import org.eclipse.cdt.core.builder.model.ICToolchain;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
/**
* @author gene.sally
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class CLibFileDialog extends Dialog {
private static final int DLG_WIDTH = 60;
private static final int DLG_HEIGHT = 25;
private ICBuildVariable[] fLibPaths; // the list of library paths used to populate the drop down
private ICToolchain fToolchain; // selected toolchain
private TreeViewer fFileTree; // tree control that's displayed
private File fSelection; // what the user selected in the dialog
private List fLibNames;
private class CItemSelectedIsLibrary implements ISelectionChangedListener {
/**
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
// only enable the OK button when the user is resting on a file
Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
getButton(OK).setEnabled(selection instanceof File);
}
}
private class CDoubleClickInTree implements IDoubleClickListener {
public void doubleClick(DoubleClickEvent event) {
// make sure that the user has double-clicked on a file before accepting this as the
// selection
Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
if (selection instanceof File) {
getButton(OK).notifyListeners(SWT.Selection, new Event());
}
}
}
private class FileLabelProvider extends LabelProvider {
private final Image IMG_FOLDER= PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
private final Image IMG_FILE= PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
public Image getImage(Object element) {
if (element instanceof File) {
if (((File) element).isFile()) {
return IMG_FILE;
}
}
else if (element instanceof TreeLibPathObject) {
return IMG_FOLDER;
}
return null;
}
public String getText(Object element) {
if (element instanceof File) {
return ((File) element).getName();
} else if (element instanceof TreeLibPathObject) {
return ((TreeLibPathObject) element).toString();
}
return super.getText(element);
}
}
private class CNoDirectories implements FileFilter {
/**
* @see java.io.FileFilter#accept(File)
*/
public boolean accept(File pathname) {
boolean isLibFile = false;
if (pathname.isFile()) {
String name = pathname.getName();
if ((name.endsWith(".lib")) || (name.endsWith(".a")) || (name.indexOf(".so") != -1)) {
isLibFile = true;
}
}
return (isLibFile);
}
}
private class TreeLibPathObject implements IAdaptable {
private ICBuildVariable m_location; // the location this object represents
private File m_fileSystem; // the representation of this object on the file system
private TreeParent m_parent; // parent of this object
public TreeLibPathObject(ICBuildVariable location, ICToolchain toolchain) {
if (location != null) {
m_location = location;
m_fileSystem = new File(location.getValue());
}
}
public File[] getChildren() {
// get the files in the file system matching this item
File[] children = m_fileSystem.listFiles(new CNoDirectories());
return children;
}
public boolean hasChildren() {
// ug, not the best for performance, consider caching
return getChildren().length != 0;
}
public Object getAdapter(Class key) {
return null;
}
public ICBuildVariable getBuildVar() {
return m_location;
}
public String toString() {
return m_location.toString();
}
public TreeParent getParent() {
return m_parent;
}
public void setParent(TreeParent parent) {
m_parent = parent;
}
}
private class TreeParent {
private HashMap m_children;
public TreeParent() {
m_children = new HashMap();
}
public void addChild(TreeLibPathObject child) {
m_children.put(child.m_fileSystem.getAbsolutePath(), child);
child.setParent(this);
}
public void removeChild(TreeLibPathObject child) {
m_children.remove(child.m_fileSystem.getAbsolutePath());
child.setParent(null);
}
public TreeLibPathObject[] getChildren() {
int nArraySize = m_children.entrySet().size();
TreeLibPathObject[] retval = (TreeLibPathObject[]) m_children.values().toArray(new TreeLibPathObject[nArraySize]);
return retval;
}
public boolean hasChildren() {
return m_children.entrySet().size() > 0;
}
public TreeLibPathObject matchingParent(File test) {
String parentPath = test.getParent();
if (m_children.keySet().contains(parentPath)) {
return (TreeLibPathObject) m_children.get(parentPath);
}
return null;
}
}
class ViewContentProvider implements IStructuredContentProvider,
ITreeContentProvider {
private TreeParent invisibleRoot;
public void inputChanged(Viewer v, Object oldInput, Object newInput) {}
public void dispose() {}
public Object[] getElements(Object parent) {
if (parent.equals(ResourcesPlugin.getWorkspace())) {
// if (parent instanceof TreeRoot) {
if (invisibleRoot == null) {
initialize();
}
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
public Object getParent(Object child) {
// this is where things are going to get icky.
// when the child is a file type, inspect the path and see if
// it matches any of the parents in the list
if (child instanceof File) {
File currfile = (File) child;
return invisibleRoot.matchingParent(currfile);
}
else if (child instanceof TreeLibPathObject) {
return ((TreeLibPathObject) child).getParent();
}
return null;
}
public Object [] getChildren(Object parent) {
// the root of the tree
if (parent instanceof TreeParent) {
return ((TreeParent) parent).getChildren();
// the first level
} else if (parent instanceof TreeLibPathObject) {
return ((TreeLibPathObject) parent).getChildren();
}
// since we're not showing anything past the first level,
// just return an empty array
return new Object[0];
}
public boolean hasChildren(Object parent) {
// the root of the tree
if (parent instanceof TreeParent) {
return ((TreeParent) parent).hasChildren();
// the first level
} else if (parent instanceof TreeLibPathObject) {
return ((TreeLibPathObject) parent).hasChildren();
}
// since we're not showing anything past the first level,
// just return an empty array
return false;
}
private void initialize() {
invisibleRoot = new TreeParent();
// read from the parent's list of items
for (int nIndex = 0; nIndex < fLibPaths.length; nIndex++) {
invisibleRoot.addChild(new TreeLibPathObject(fLibPaths[nIndex], fToolchain));
}
}
}
// methods for CLibFileDialog
public CLibFileDialog(Shell shell, ICToolchain toolchain, ICBuildVariable[] libPaths) {
super(shell);
fLibPaths = libPaths;
fToolchain = toolchain;
fLibNames = new List (shell, shell.getStyle());
}
// methods for CLibFileDialog
public CLibFileDialog(Shell shell, ICToolchain toolchain, ICBuildVariable[] libPaths, List libList) {
super(shell);
fLibPaths = libPaths;
fToolchain = toolchain;
fLibNames = libList;
}
protected Control createContents(Composite parent) {
super.createContents(parent);
Composite composite = (Composite) getDialogArea();
GridLayout layout = new GridLayout();
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.numColumns = 1;
composite.setLayout(layout);
// row 1
fFileTree = new TreeViewer(composite, SWT.LEFT | SWT.BORDER | SWT.READ_ONLY);
GridData gdTree = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_BOTH);
gdTree.widthHint= convertWidthInCharsToPixels(DLG_WIDTH);
gdTree.heightHint= convertHeightInCharsToPixels(DLG_HEIGHT);
fFileTree.getControl().setLayoutData(gdTree);
fFileTree.setLabelProvider(new FileLabelProvider());
fFileTree.setSorter(new ViewerSorter() {});
fFileTree.setContentProvider(new ViewContentProvider());
fFileTree.setInput(ResourcesPlugin.getWorkspace());
fFileTree.addSelectionChangedListener(new CItemSelectedIsLibrary());
fFileTree.addDoubleClickListener(new CDoubleClickInTree());
return composite;
}
/**
* @see org.eclipse.jface.window.Window#configureShell(Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(("Select_Library_1")); //$NON-NLS-1$
}
/**
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
ISelection selection; // the current selection
selection = fFileTree.getSelection();
if (selection != null) {
fSelection = (File) ((StructuredSelection) selection).getFirstElement();
}
// Let's check if this name exists or not.
if (fLibNames.getItemCount() > 0) {
boolean exists = checkExistance();
if (exists) {
return;
}
}
super.okPressed();
}
public File getSelection() {
return fSelection;
}
private boolean checkExistance () {
String[] existingItems = fLibNames.getItems();
for (int i = 0; i < existingItems.length; i++) {
if (existingItems[i].toString().equals(getSelection().getName())) {
String errorMsg = "This Identifier already exists in the Preprocessor definitions for this project";
MessageDialog.openError(this.getShell(), "Naming problems", errorMsg);
return true;
}
}
return false;
}
}

View file

@ -0,0 +1,275 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import org.eclipse.cdt.core.builder.util.CUtil;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* @author sam.robb
*
* Simple dialog for creating/editing name-value pairs.
*/
public class CNameValueDialog extends Dialog {
/**
* Dialog title.
*/
String fTitle = "Variable";
/**
* Description of property name (ex, "Definition")
*/
String fNameLabel = "Name";
/**
* Description of property value (ex, "Value")
*/
String fValueLabel = "Value";
/**
* Property name.
*/
String fName = "";
/**
* Property value.
*/
String fValue = "";
/**
* Internal list to keep track of existing macro names.
*/
private List reservedNames;
private Button btnOK = null;
private Button btnCancel = null;
private Text textName = null;
private Text textValue = null;
/**
* Constructor for CEntryDialog.
*
* @param parent
*/
public CNameValueDialog(Shell parent) {
super(parent);
reservedNames = new List (parent, parent.getStyle());
}
/**
* Second Constructor
* @param Shell parent, List list
*/
public CNameValueDialog (Shell parent, List list) {
super (parent);
reservedNames = list;
}
/**
* Set the title for the dialog.
*
* @param title Title to use for the dialog.
*/
public void setTitle(String title) {
fTitle = title;
}
/**
* Set the label for the "Name" edit field in the dialog
*
* @param nameLabel Label to use for the "Name" edit field.
*/
public void setNameLabel(String nameLabel) {
fNameLabel = nameLabel;
}
/**
* Set the label for the "Value" edit field in the dialog
*
* @param valueLabel Label to use for the "Value" edit field.
*/
public void setValueLabel(String valueLabel) {
fValueLabel = valueLabel;
}
/**
* Set the inital contents of the "Name" edit field in the dialog
*
* @param name Initial value for the "Name" edit field.
*/
public void setName(String name) {
fName = name;
}
/**
* Set the inital contents of the "Value" edit field in the dialog
*
* @param value Initial value for the "Value" edit field.
*/
public void setValue(String value) {
fValue = value;
}
/**
* Returns the contents of the "Name" edit field in the dialog.
*
* @return Property name.
*/
public String getName() {
return fName;
}
/**
* Returns the contents of the "Value" edit field in the dialog.
*
* @return Property value.
*/
public String getValue() {
return fValue;
}
protected Control createContents(Composite parent) {
Control result = super.createContents(parent);
updateButtonsState();
return result;
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(fTitle);
}
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 5;
layout.numColumns = 2;
composite.setLayout(layout);
GC gc = new GC(composite);
gc.setFont(composite.getFont());
FontMetrics metrics = gc.getFontMetrics();
gc.dispose();
int fieldWidthHint = convertWidthInCharsToPixels(metrics, 50);
GridData gd = null;
Label label = null;
label = new Label(composite, SWT.NONE);
label.setText(fNameLabel + ":");
textName = new Text(composite, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessHorizontalSpace = true;
gd.widthHint = fieldWidthHint;
textName.setLayoutData(gd);
label = new Label(composite, SWT.NONE);
label.setText(fValueLabel + ":");
textValue = new Text(composite, SWT.SINGLE | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessHorizontalSpace = true;
gd.widthHint = fieldWidthHint;
textValue.setLayoutData(gd);
textName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtonsState();
}
});
textValue.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateButtonsState();
}
});
textName.setText(fName);
textValue.setText(fValue);
return composite;
}
protected void createButtonsForButtonBar(Composite parent) {
btnOK = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
btnCancel = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
private void updateButtonsState() {
if (btnOK != null) {
btnOK.setEnabled(textName.getText().trim().length() > 0);
}
}
protected void okPressed() {
fName = textName.getText().trim();
fValue = textValue.getText().trim();
textValue.setText(fValue);
// Let's first check if this name already exists or not.
if (reservedNames.getItemCount() > 0) {
boolean exists = checkExistance();
if (exists) {
return;
}
}
// Validate the user input here.
boolean isValid = CUtil.isValidCIdentifier(fName);
if (!isValid) {
String errorMsg = fName + " is not a valid identifier name.";
MessageDialog.openError(this.getShell(), "Problem with Identifier name", errorMsg);
return;
}
setReturnCode(OK);
close();
}
private boolean checkExistance () {
String[] existingItems = reservedNames.getItems();
for (int i = 0; i < existingItems.length; i++) {
if (existingItems[i].toString().equals(fName)) {
String errorMsg = "This Identifier already exists in the Preprocessor definitions for this project";
MessageDialog.openError(this.getShell(), "Naming problems", errorMsg);
return true;
}
}
return false;
}
}

View file

@ -0,0 +1,57 @@
/**********************************************************************
* Copyright (c) 2002,2003 Timesys Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Timesys - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.builder.internal;
import org.eclipse.cdt.core.builder.internal.ACExtensionPoint;
import org.eclipse.cdt.ui.builder.ICToolTabGroup;
import org.eclipse.cdt.ui.builder.ICToolTabGroupPoint;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
* @author sam.robb
*/
public class CToolTabGroupPoint
extends ACExtensionPoint
implements ICToolTabGroupPoint {
/**
* Constructor.
*
* @param element configuration element for the build configuration provider.
*/
public CToolTabGroupPoint(IConfigurationElement element) {
super(element);
}
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroupPoint#getId()
*/
public String getId() {
return getField(FIELD_ID);
}
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroupPoint#getProviderClassName()
*/
public String getProviderClassName() {
return getField(FIELD_CLASS);
}
/**
* @see org.eclipse.cdt.ui.builder.ICToolTabGroupPoint#getProvider()
*/
public ICToolTabGroup getProvider() throws CoreException {
return (ICToolTabGroup) getClassInstance(FIELD_CLASS);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

View file

@ -424,4 +424,92 @@
</CBuildConsole>
</extension>
<extension-point id="CToolTabGroup" name="C/C++ Tool Configuration Tabs" schema="schema/CToolTabGroup.exsd"/>
<extension
point="org.eclipse.ui.views">
<view
name="Build Configurations"
icon="icons/full/build16/build_configs.gif"
category="org.eclipse.cdt.ui.views"
class="org.eclipse.cdt.ui.builder.internal.CBuildConfigView"
id="org.eclipse.cdt.ui.builder.internal.BuildConfigView">
</view>
</extension>
<extension
point="org.eclipse.cdt.core.CBuildConfiguration">
<configuration
natures="*"
name="Debug"
class="org.eclipse.cdt.core.builder.CDebugBuildConfigurationProvider"
id="org.eclipse.cdt.core.builder.debugBuildConfiguration">
</configuration>
<configuration
natures="*"
name="Release"
class="org.eclipse.cdt.core.builder.CReleaseBuildConfigurationProvider"
id="org.eclipse.cdt.core.builder.releaseBuildConfiguration">
</configuration>
<configuration
natures="*"
name="Profile"
class="org.eclipse.cdt.core.builder.CProfileBuildConfigurationProvider"
id="org.eclipse.cdt.core.builder.profileBuildConfiguration">
</configuration>
</extension>
<extension
point="org.eclipse.cdt.core.CToolchain">
<provider
natures="*"
class="org.eclipse.cdt.gnu.tools.CGnuToolchainProvider"
id="org.eclipse.cdt.gnu.tools.native">
</provider>
</extension>
<extension
point="org.eclipse.cdt.core.CToolType">
<type
name="RPC Protocol Compiler"
id="org.eclipse.cdt.core.tool.rpcgen">
</type>
</extension>
<extension
point="org.eclipse.cdt.core.CTool">
<tool
name="RPC Protocol Compiler"
type="org.eclipse.cdt.gnu.tools.rpcgen"
class="org.eclipse.cdt.gnu.tools.CToolRpcgen"
id="org.eclipse.cdt.gnu.tool.rpcgen">
</tool>
</extension>
<extension
point="org.eclipse.cdt.core.CBuildVariable">
<variable
class="org.eclipse.cdt.gnu.tools.CStandardCVars"
id="org.eclipse.cdt.gnu.tools.stdCVars">
</variable>
</extension>
<extension
point="org.eclipse.cdt.ui.CToolTabGroup">
<toolTabGroup
toolId="org.eclipse.cdt.gnu.tools.cc"
class="org.eclipse.cdt.gnu.tools.CTabGroupCC"
id="org.eclipse.cdt.gnu.tools.tabGroupCC">
</toolTabGroup>
<toolTabGroup
toolId="org.eclipse.cdt.gnu.tools.cxx"
class="org.eclipse.cdt.gnu.tools.CTabGroupCXX"
id="org.eclipse.cdt.gnu.tools.tabGroupCXX">
</toolTabGroup>
<toolTabGroup
toolId="org.eclipse.cdt.gnu.tools.cpp"
class="org.eclipse.cdt.gnu.tools.CTabGroupCPP"
id="org.eclipse.cdt.gnu.tools.tabGroupCPP">
</toolTabGroup>
<toolTabGroup
toolId="org.eclipse.cdt.gnu.tools.ld"
class="org.eclipse.cdt.gnu.tools.CTabGroupLD"
id="org.eclipse.cdt.gnu.tools.tabGroupLD">
</toolTabGroup>
</extension>
</plugin>

View file

@ -0,0 +1,101 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core.builder">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core.builder" id="CToolConfigurationTabGroup" name="C/C++ Tool Configuration Tab Group"/>
</appInfo>
<documentation>
[Enter description of this extension point]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="toolTabGroup"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="toolTabGroup">
<complexType>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name that will be used to idenitfy this tab group.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
name of a Java class implementing the ICToolConfigurationTabGroup
interface.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.ui.builder.ICToolConfigurationTabGroup"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>