1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

added environment and variable support to standard make builder

bug #47241 & bug #48009
This commit is contained in:
David Inglis 2005-04-11 01:09:27 +00:00
parent db68d20348
commit ddbea8806c
20 changed files with 1909 additions and 279 deletions

View file

@ -14,9 +14,9 @@
</runtime>
<requires>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.cdt.core"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.variables"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.cdt.core"/>
</requires>

View file

@ -10,57 +10,53 @@
*******************************************************************************/
package org.eclipse.cdt.make.core;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
public interface IMakeBuilderInfo {
IPath getBuildLocation();
void setBuildLocation(IPath location) throws CoreException;
public interface IMakeBuilderInfo extends IMakeCommonBuildInfo {
boolean isStopOnError();
void setStopOnError(boolean on) throws CoreException;
boolean isDefaultBuildCmd();
void setUseDefaultBuildCmd(boolean on) throws CoreException;
IPath getBuildCommand();
void setBuildCommand(IPath command) throws CoreException;
String getBuildArguments();
void setBuildArguments(String args) throws CoreException;
public final static String BUILD_TARGET_FULL = ARGS_PREFIX + ".build.target.full"; //$NON-NLS-1$
public final static String BUILD_TARGET_INCREAMENTAL = ARGS_PREFIX + ".build.target.inc"; //$NON-NLS-1$
public final static String BUILD_TARGET_AUTO = ARGS_PREFIX + ".build.target.auto"; //$NON-NLS-1$
public final static String BUILD_TARGET_CLEAN = ARGS_PREFIX + ".build.target.clean"; //$NON-NLS-1$
boolean isAutoBuildEnable();
void setAutoBuildEnable(boolean enabled) throws CoreException;
String getAutoBuildTarget();
/**
* @deprecated
*/
void setAutoBuildTarget(String target) throws CoreException;
boolean isIncrementalBuildEnabled();
void setIncrementalBuildEnable(boolean enabled) throws CoreException;
String getIncrementalBuildTarget();
/**
* @deprecated
*/
void setIncrementalBuildTarget(String target) throws CoreException;
boolean isFullBuildEnabled();
void setFullBuildEnable(boolean enabled) throws CoreException;
String getFullBuildTarget();
/**
* @deprecated
*/
void setFullBuildTarget(String target) throws CoreException;
String getCleanBuildTarget();
/**
* @deprecated
*/
void setCleanBuildTarget(String target) throws CoreException;
boolean isCleanBuildEnabled();
void setCleanBuildEnable(boolean enabled) throws CoreException;
String[] getErrorParsers();
void setErrorParsers(String[] parsers) throws CoreException;
Map getEnvironment();
void setEnvironment(Map env) throws CoreException;
boolean appendEnvironment();
void setAppendEnvironment(boolean append) throws CoreException;
}

View file

@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2004 QNX Software Systems 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: QNX Software Systems - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.make.core;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
public interface IMakeCommonBuildInfo {
public final static String ARGS_PREFIX = MakeCorePlugin.getUniqueIdentifier();
public final static String BUILD_LOCATION = ARGS_PREFIX + ".build.location"; //$NON-NLS-1$
public final static String BUILD_COMMAND = ARGS_PREFIX + ".build.command"; //$NON-NLS-1$
public final static String BUILD_ARGUMENTS = ARGS_PREFIX + ".build.arguments"; //$NON-NLS-1$
void setBuildAttribute(String name, String value) throws CoreException;
String getBuildAttribute(String name, String defaultValue);
IPath getBuildLocation();
/**
* @deprecated - use setBuildString(BUILD_LOCATION...)
*/
void setBuildLocation(IPath location) throws CoreException;
boolean isStopOnError();
void setStopOnError(boolean on) throws CoreException;
boolean isDefaultBuildCmd();
void setUseDefaultBuildCmd(boolean on) throws CoreException;
IPath getBuildCommand();
/**
* @deprecated - use setBuildString(BUILD_COMMAND...)
*/
void setBuildCommand(IPath command) throws CoreException;
String getBuildArguments();
/**
* @deprecated - use setBuildString(BUILD_ARGUMENTS...)
*/
void setBuildArguments(String args) throws CoreException;
String[] getErrorParsers();
void setErrorParsers(String[] parsers) throws CoreException;
Map getExpandedEnvironment();
Map getEnvironment();
void setEnvironment(Map env) throws CoreException;
boolean appendEnvironment();
void setAppendEnvironment(boolean append) throws CoreException;
}

View file

@ -10,42 +10,32 @@
*******************************************************************************/
package org.eclipse.cdt.make.core;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
public interface IMakeTarget extends IAdaptable {
public interface IMakeTarget extends IAdaptable, IMakeCommonBuildInfo {
public final static String BUILD_TARGET = ARGS_PREFIX + ".build.target"; //$NON-NLS-1$
String getName();
String getTargetBuilderID();
boolean isStopOnError();
void setStopOnError(boolean stopOnError) throws CoreException;
boolean isDefaultBuildCmd();
void setUseDefaultBuildCmd(boolean useDefault) throws CoreException;
/**
* @deprecated
*/
void setBuildTarget(String target) throws CoreException;
/**
* @deprecated
*/
String getBuildTarget() ;
IPath getBuildCommand();
void setBuildCommand(IPath command) throws CoreException;
String getBuildArguments();
void setBuildArguments(String arguments) throws CoreException;
void setRunAllBuilders(boolean runAllBuilders);
void setRunAllBuilders(boolean runAllBuilders) throws CoreException;
boolean runAllBuilders();
void setBuildEnvironment(Map env) throws CoreException;
Map getBuildEnvironment();
void setAppendEnvironment(boolean append) throws CoreException;
boolean isAppendEnvironment();
/**
* Get the target build container.
*

View file

@ -33,21 +33,22 @@ import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceRuleFactory;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.IncrementalProjectBuilder;
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.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.osgi.service.environment.Constants;
public class MakeBuilder extends ACBuilder {
@ -90,12 +91,23 @@ public class MakeBuilder extends ACBuilder {
protected void clean(IProgressMonitor monitor) throws CoreException {
final IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(getProject(), BUILDER_ID);
if (shouldBuild(CLEAN_BUILD, info)) {
IResourceRuleFactory ruleFactory= ResourcesPlugin.getWorkspace().getRuleFactory();
final ISchedulingRule rule = ruleFactory.modifyRule(getProject());
Job backgroundJob = new Job("Standard Make Builder"){ //$NON-NLS-1$
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
protected IStatus run(IProgressMonitor monitor) {
try {
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) {
invokeMake(CLEAN_BUILD, info, monitor);
}
}, rule, IWorkspace.AVOID_UPDATE, monitor);
} catch (CoreException e) {
return e.getStatus();
}
IStatus returnStatus = Status.OK_STATUS;
return returnStatus;
}
@ -103,7 +115,7 @@ public class MakeBuilder extends ACBuilder {
};
backgroundJob.setRule(getProject());
backgroundJob.setRule(rule);
backgroundJob.schedule();
}
}
@ -138,6 +150,7 @@ public class MakeBuilder extends ACBuilder {
if (workingDirectory == null) {
workingDirectory = currProject.getLocation();
}
String[] targets = getTargets(kind, info);
if (targets.length != 0 && targets[targets.length - 1].equals(info.getCleanBuildTarget())) //$NON-NLS-1$
isClean = true;
@ -155,24 +168,8 @@ public class MakeBuilder extends ACBuilder {
envMap.put("CWD", workingDirectory.toOSString()); //$NON-NLS-1$
envMap.put("PWD", workingDirectory.toOSString()); //$NON-NLS-1$
// Add variables from build info
Map userEnv = info.getEnvironment();
Iterator iter= userEnv.entrySet().iterator();
boolean win32= Platform.getOS().equals(Constants.OS_WIN32);
while (iter.hasNext()) {
Map.Entry entry= (Map.Entry) iter.next();
String key= (String) entry.getKey();
if (win32) {
// Win32 vars are case insensitive. Uppercase everything so
// that (for example) "pAtH" will correctly replace "PATH"
key= key.toUpperCase();
}
String value = (String) entry.getValue();
// translate any string substitution variables
String translated = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(value);
envMap.put(key, translated);
}
iter= envMap.entrySet().iterator();
envMap.putAll(info.getExpandedEnvironment());
Iterator iter = envMap.entrySet().iterator();
List strings= new ArrayList(envMap.size());
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
@ -191,8 +188,7 @@ public class MakeBuilder extends ACBuilder {
} else {
String args = info.getBuildArguments();
if (args != null && !args.equals("")) { //$NON-NLS-1$
String translated = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(args);
String[] newArgs = makeArray(translated);
String[] newArgs = makeArray(args);
buildArguments = new String[targets.length + newArgs.length];
System.arraycopy(newArgs, 0, buildArguments, 0, newArgs.length);
System.arraycopy(targets, 0, buildArguments, newArgs.length, targets.length);
@ -297,7 +293,7 @@ public class MakeBuilder extends ACBuilder {
return true;
}
protected String[] getTargets(int kind, IMakeBuilderInfo info) throws CoreException {
protected String[] getTargets(int kind, IMakeBuilderInfo info) {
String targets = ""; //$NON-NLS-1$
switch (kind) {
case IncrementalProjectBuilder.AUTO_BUILD :
@ -313,8 +309,7 @@ public class MakeBuilder extends ACBuilder {
targets = info.getCleanBuildTarget();
break;
}
String translated = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(targets);
return makeArray(translated);
return makeArray(targets);
}
// Turn the string into an array.

View file

@ -130,23 +130,24 @@ public class MakeProjectNature implements IProjectNature {
addBuildSpec();
IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID, false);
IMakeBuilderInfo projectInfo = MakeCorePlugin.createBuildInfo(getProject(), MakeBuilder.BUILDER_ID);
projectInfo.setBuildLocation(info.getBuildLocation());
projectInfo.setBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, info.getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, "")); //$NON-NLS-1$
projectInfo.setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, info.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make")); //$NON-NLS-1$
projectInfo.setUseDefaultBuildCmd(info.isDefaultBuildCmd());
projectInfo.setStopOnError(info.isStopOnError());
projectInfo.setBuildCommand(info.getBuildCommand());
projectInfo.setAutoBuildEnable(info.isAutoBuildEnable());
projectInfo.setAutoBuildTarget(info.getAutoBuildTarget());
projectInfo.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, info.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, "")); //$NON-NLS-1$
projectInfo.setIncrementalBuildEnable(info.isIncrementalBuildEnabled());
projectInfo.setIncrementalBuildTarget(info.getIncrementalBuildTarget());
projectInfo.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, info.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, "")); //$NON-NLS-1$
projectInfo.setFullBuildEnable(info.isFullBuildEnabled());
projectInfo.setFullBuildTarget(info.getFullBuildTarget());
projectInfo.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, info.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, "")); //$NON-NLS-1$
projectInfo.setCleanBuildEnable(info.isCleanBuildEnabled());
projectInfo.setCleanBuildTarget(info.getCleanBuildTarget());
projectInfo.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, info.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, "")); //$NON-NLS-1$
projectInfo.setErrorParsers(info.getErrorParsers());
projectInfo.setAppendEnvironment(info.appendEnvironment());
projectInfo.setEnvironment(info.getEnvironment());

View file

@ -19,6 +19,7 @@ import java.util.StringTokenizer;
import java.util.Map.Entry;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeProjectNature;
@ -36,6 +37,8 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.osgi.service.environment.*;
public class BuildInfoFactory {
@ -55,24 +58,77 @@ public class BuildInfoFactory {
static final String BUILD_AUTO_ENABLED = PREFIX + ".enableAutoBuild"; //$NON-NLS-1$
static final String BUILD_ARGUMENTS = PREFIX + ".buildArguments"; //$NON-NLS-1$
static final String ENVIRONMENT = PREFIX + ".environment"; //$NON-NLS-1$
static final String BUILD_APPEND_ENVIRONMENT = ".append_environment"; //$NON-NLS-1$
static final String BUILD_APPEND_ENVIRONMENT = PREFIX + ".append_environment"; //$NON-NLS-1$
private abstract static class AbstractBuildInfo implements IMakeBuilderInfo {
public void setUseDefaultBuildCmd(boolean on) throws CoreException {
putString(USE_DEFAULT_BUILD_CMD, new Boolean(on).toString());
}
public boolean isDefaultBuildCmd() {
if (getString(USE_DEFAULT_BUILD_CMD) == null) { // if no property then default to true
if (getString(USE_DEFAULT_BUILD_CMD) == null) { // if no property
// then default to
// true
return true;
}
return getBoolean(USE_DEFAULT_BUILD_CMD);
}
public String getBuildAttribute(String name, String defaultValue) {
String value = getString(name);
if (value == null ) {
if (IMakeCommonBuildInfo.BUILD_COMMAND.equals(name)) {
value = getString(BuildInfoFactory.BUILD_COMMAND);
} else if (IMakeCommonBuildInfo.BUILD_ARGUMENTS.equals(name)) {
value = getString(BuildInfoFactory.BUILD_ARGUMENTS);
} else if (IMakeCommonBuildInfo.BUILD_LOCATION.equals(name)) {
value = getString(BuildInfoFactory.BUILD_LOCATION);
} else if (IMakeBuilderInfo.BUILD_TARGET_AUTO.equals(name)) {
value = getString(BuildInfoFactory.BUILD_TARGET_AUTO);
} else if (IMakeBuilderInfo.BUILD_TARGET_CLEAN.equals(name)) {
value = getString(BuildInfoFactory.BUILD_TARGET_CLEAN);
} else if (IMakeBuilderInfo.BUILD_TARGET_FULL.equals(name)) {
value = getString(BuildInfoFactory.BUILD_TARGET_FULL);
} else if (IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL.equals(name)) {
value = getString(BuildInfoFactory.BUILD_TARGET_INCREMENTAL);
}
}
return value != null ? value : defaultValue != null ? defaultValue : ""; //$NON-NLS-1$
}
public void setBuildAttribute(String name, String value) throws CoreException {
putString(name, value);
}
public Map getExpandedEnvironment() {
Map env = getEnvironment();
HashMap envMap = new HashMap(env.entrySet().size());
Iterator iter = env.entrySet().iterator();
boolean win32 = Platform.getOS().equals(Constants.OS_WIN32);
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
String key = (String)entry.getKey();
if (win32) {
// Win32 vars are case insensitive. Uppercase everything so
// that (for example) "pAtH" will correctly replace "PATH"
key = key.toUpperCase();
}
String value = (String)entry.getValue();
// translate any string substitution variables
String translated = value;
try {
translated = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(value, false);
} catch (CoreException e) {
}
envMap.put(key, translated);
}
return envMap;
}
public void setBuildCommand(IPath location) throws CoreException {
putString(BUILD_COMMAND, location.toString());
putString(IMakeCommonBuildInfo.BUILD_COMMAND, null);
putString(BuildInfoFactory.BUILD_COMMAND, location.toString());
}
public IPath getBuildCommand() {
@ -83,15 +139,17 @@ public class BuildInfoFactory {
}
return new Path(command);
}
return new Path(getString(BUILD_COMMAND));
String result = getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, getString(BuildInfoFactory.BUILD_COMMAND));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return new Path(result);
}
protected String getBuildParameter(String name) {
IExtension extension =
Platform.getExtensionRegistry().getExtension(
ResourcesPlugin.PI_RESOURCES,
ResourcesPlugin.PT_BUILDERS,
getBuilderID());
IExtension extension = Platform.getExtensionRegistry().getExtension(ResourcesPlugin.PI_RESOURCES,
ResourcesPlugin.PT_BUILDERS, getBuilderID());
if (extension == null)
return null;
IConfigurationElement[] configs = extension.getConfigurationElements();
@ -111,12 +169,34 @@ public class BuildInfoFactory {
protected abstract String getBuilderID();
public void setBuildLocation(IPath location) throws CoreException {
putString(BUILD_LOCATION, location.toString());
putString(IMakeCommonBuildInfo.BUILD_LOCATION, null);
putString(BuildInfoFactory.BUILD_LOCATION, location.toString());
}
public IPath getBuildLocation() {
String location = getString(BUILD_LOCATION);
return new Path(location == null ? "" : location); //$NON-NLS-1$
String result = getBuildAttribute(IMakeCommonBuildInfo.BUILD_LOCATION, getString(BuildInfoFactory.BUILD_LOCATION));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return new Path(result);
}
public String getBuildArguments() {
String result = getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, getString(BuildInfoFactory.BUILD_ARGUMENTS));
if (result == null) {
return ""; //$NON-NLS-1$
}
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setBuildArguments(String args) throws CoreException {
putString(IMakeCommonBuildInfo.BUILD_ARGUMENTS, null);
putString(BuildInfoFactory.BUILD_ARGUMENTS, args);
}
public void setStopOnError(boolean enabled) throws CoreException {
@ -128,44 +208,62 @@ public class BuildInfoFactory {
}
public void setAutoBuildTarget(String target) throws CoreException {
putString(BUILD_TARGET_AUTO, target);
putString(IMakeBuilderInfo.BUILD_TARGET_AUTO, null);
putString(BuildInfoFactory.BUILD_TARGET_AUTO, target);
}
public String getAutoBuildTarget() {
return getString(BUILD_TARGET_AUTO);
String result = getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, getString(BuildInfoFactory.BUILD_TARGET_AUTO));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setIncrementalBuildTarget(String target) throws CoreException {
putString(BUILD_TARGET_INCREMENTAL, target);
putString(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, null);
putString(BuildInfoFactory.BUILD_TARGET_INCREMENTAL, target);
}
public String getIncrementalBuildTarget() {
return getString(BUILD_TARGET_INCREMENTAL);
String result = getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL,
getString(BuildInfoFactory.BUILD_TARGET_INCREMENTAL));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setFullBuildTarget(String target) throws CoreException {
putString(BUILD_TARGET_FULL, target);
putString(IMakeBuilderInfo.BUILD_TARGET_FULL, null);
putString(BuildInfoFactory.BUILD_TARGET_FULL, target);
}
public String getFullBuildTarget() {
return getString(BUILD_TARGET_FULL);
String result = getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, getString(BuildInfoFactory.BUILD_TARGET_FULL));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setCleanBuildTarget(String target) throws CoreException {
putString(BUILD_TARGET_CLEAN, target);
putString(IMakeBuilderInfo.BUILD_TARGET_CLEAN, null);
putString(BuildInfoFactory.BUILD_TARGET_CLEAN, target);
}
public String getCleanBuildTarget() {
return getString(BUILD_TARGET_CLEAN);
String result = getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, getString(BuildInfoFactory.BUILD_TARGET_CLEAN));
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
public boolean getBoolean(String property) {
return Boolean.valueOf(getString(property)).booleanValue();
return result;
}
protected abstract void putString(String name, String value) throws CoreException;
protected abstract String getString(String property);
public void setAutoBuildEnable(boolean enabled) throws CoreException {
putString(BUILD_AUTO_ENABLED, new Boolean(enabled).toString());
}
@ -198,14 +296,6 @@ public class BuildInfoFactory {
return getBoolean(BUILD_CLEAN_ENABLED);
}
public String getBuildArguments() {
return getString(BUILD_ARGUMENTS);
}
public void setBuildArguments(String args) throws CoreException {
putString(BUILD_ARGUMENTS, args);
}
public String[] getErrorParsers() {
String parsers = getString(ErrorParserManager.PREF_ERROR_PARSER);
if (parsers != null && parsers.length() > 0) {
@ -236,7 +326,7 @@ public class BuildInfoFactory {
}
public boolean appendEnvironment() {
if (getString(BUILD_APPEND_ENVIRONMENT).length() > 0) {
if (getString(BUILD_APPEND_ENVIRONMENT) != null) {
return getBoolean(BUILD_APPEND_ENVIRONMENT);
}
return true;
@ -246,8 +336,13 @@ public class BuildInfoFactory {
putString(BUILD_APPEND_ENVIRONMENT, new Boolean(append).toString());
}
public boolean getBoolean(String property) {
return Boolean.valueOf(getString(property)).booleanValue();
}
protected Map decodeMap(String value) {
Map map = new HashMap();
if (value != null) {
StringBuffer envStr = new StringBuffer(value);
String escapeChars = "|\\"; //$NON-NLS-1$
char escapeChar = '\\';
@ -256,7 +351,8 @@ public class BuildInfoFactory {
int ndx = 0;
while (ndx < envStr.length()) {
if (escapeChars.indexOf(envStr.charAt(ndx)) != -1) {
if (envStr.charAt(ndx - 1) == escapeChar) { // escaped '|' - remove '\' and continue on.
if (envStr.charAt(ndx - 1) == escapeChar) {
// escaped '|' - remove '\' and continue on.
envStr.deleteCharAt(ndx - 1);
if (ndx == envStr.length()) {
break;
@ -271,7 +367,8 @@ public class BuildInfoFactory {
int lndx = 0;
while (lndx < line.length()) {
if (line.charAt(lndx) == '=') {
if (line.charAt(lndx - 1) == escapeChar) { // escaped '=' - remove '\' and continue on.
if (line.charAt(lndx - 1) == escapeChar) {
// escaped '=' - remove '\' and continue on.
line.deleteCharAt(lndx - 1);
} else {
break;
@ -284,6 +381,7 @@ public class BuildInfoFactory {
}
} catch (StringIndexOutOfBoundsException e) {
}
}
return map;
}
@ -310,9 +408,13 @@ public class BuildInfoFactory {
}
return str.toString();
}
protected abstract void putString(String name, String value) throws CoreException;
protected abstract String getString(String property);
}
private static class BuildInfoPreference extends AbstractBuildInfo {
private Preferences prefs;
private String builderID;
private boolean useDefaults;
@ -325,13 +427,22 @@ public class BuildInfoFactory {
protected void putString(String name, String value) {
if (useDefaults) {
if (value != null) {
prefs.setDefault(name, value);
}
} else {
if (value == null) {
prefs.setValue(name, prefs.getDefaultString(name));
return;
}
prefs.setValue(name, value);
}
}
protected String getString(String property) {
if (!prefs.contains(property)) {
return null;
}
if (useDefaults) {
return prefs.getDefaultString(property);
}
@ -344,6 +455,7 @@ public class BuildInfoFactory {
}
private static class BuildInfoProject extends AbstractBuildInfo {
private IProject project;
private String builderID;
private Map args;
@ -354,7 +466,8 @@ public class BuildInfoFactory {
ICommand builder;
builder = MakeProjectNature.getBuildSpec(project.getDescription(), builderID);
if (builder == null) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeMessages.getString("BuildInfoFactory.Missing_Builder") + builderID, null)); //$NON-NLS-1$
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
MakeMessages.getString("BuildInfoFactory.Missing_Builder") + builderID, null)); //$NON-NLS-1$
}
args = builder.getArguments();
}
@ -364,9 +477,13 @@ public class BuildInfoFactory {
if (curValue != null && curValue.equals(value)) {
return;
}
if (value == null) {
args.remove(name);
} else {
args.put(name, value);
}
IProjectDescription description = project.getDescription();
ICommand builder = MakeProjectNature.getBuildSpec(description, builderID);
args.put(name, value);
builder.setArguments(args);
builder.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, isAutoBuildEnable());
builder.setBuilding(IncrementalProjectBuilder.FULL_BUILD, isFullBuildEnabled());
@ -377,8 +494,7 @@ public class BuildInfoFactory {
}
protected String getString(String name) {
String value = (String) args.get(name);
return value == null ? "" : value; //$NON-NLS-1$
return (String)args.get(name);
}
protected String getBuilderID() {
@ -387,6 +503,7 @@ public class BuildInfoFactory {
}
private static class BuildInfoMap extends AbstractBuildInfo {
private Map args;
private String builderID;
@ -396,11 +513,15 @@ public class BuildInfoFactory {
}
protected void putString(String name, String value) {
if (value == null) {
args.remove(name);
} else {
args.put(name, value);
}
}
protected String getString(String name) {
return args.get(name) != null ? (String)args.get(name) : ""; //$NON-NLS-1$
return (String)args.get(name);
}
protected String getBuilderID() {

View file

@ -11,9 +11,11 @@
package org.eclipse.cdt.make.internal.core;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.IMakeTarget;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.core.resources.ICommand;
@ -27,16 +29,16 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.osgi.service.environment.Constants;
public class MakeTarget extends PlatformObject implements IMakeTarget {
private final MakeTargetManager manager;
private String name;
private String target;
private String buildArguments;
private IPath buildCommand;
private boolean isDefaultBuildCmd;
private boolean isStopOnError;
boolean runAllBuidlers = true;
@ -44,14 +46,15 @@ public class MakeTarget extends PlatformObject implements IMakeTarget {
private IContainer container;
private boolean appendEnvironment;
private Map buildEnvironment;
private Map targetAttributes = new HashMap();
MakeTarget(MakeTargetManager manager, IProject project, String targetBuilderID, String name) throws CoreException {
this.manager = manager;
this.targetBuilderID = targetBuilderID;
this.name = name;
IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(project, manager.getBuilderID(targetBuilderID));
buildCommand = info.getBuildCommand();
buildArguments = info.getBuildArguments();
setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, info.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make")); //$NON-NLS-1$
setBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, info.getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, "")); //$NON-NLS-1$
isDefaultBuildCmd = info.isDefaultBuildCmd();
isStopOnError = info.isStopOnError();
appendEnvironment = info.appendEnvironment();
@ -66,6 +69,10 @@ public class MakeTarget extends PlatformObject implements IMakeTarget {
this.name = name;
}
Map getAttributeMap() {
return targetAttributes;
}
public String getName() {
return name;
}
@ -93,41 +100,136 @@ public class MakeTarget extends PlatformObject implements IMakeTarget {
}
public IPath getBuildCommand() {
return buildCommand != null ? buildCommand : new Path(""); //$NON-NLS-1$
if (isDefaultBuildCmd()) {
IMakeBuilderInfo info;
try {
info = MakeCorePlugin.createBuildInfo(container.getProject(), manager.getBuilderID(targetBuilderID));
return info.getBuildCommand();
} catch (CoreException e) {
}
}
String result = getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make"); //$NON-NLS-1$
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return new Path(result);
}
public void setBuildCommand(IPath command) throws CoreException {
buildCommand = command;
manager.updateTarget(this);
setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, command.toString());
}
public String getBuildArguments() {
return buildArguments != null ? buildArguments : ""; //$NON-NLS-1$
String result = getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, ""); //$NON-NLS-1$
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setBuildArguments(String arguments) throws CoreException {
buildArguments = arguments;
setBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, arguments);
}
public void setBuildTarget(String target) throws CoreException {
setBuildAttribute(IMakeTarget.BUILD_TARGET, target);
}
public String getBuildTarget() {
String result = getBuildAttribute(IMakeTarget.BUILD_TARGET, ""); //$NON-NLS-1$
try {
result = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(result, false);
} catch (CoreException e) {
}
return result;
}
public void setRunAllBuilders(boolean runAllBuilders) throws CoreException {
this.runAllBuidlers = runAllBuilders;
manager.updateTarget(this);
}
public Map getBuildEnvironment() {
public boolean runAllBuilders() {
return runAllBuidlers;
}
public void setBuildAttribute(String name, String value) throws CoreException {
targetAttributes.put(name, value);
manager.updateTarget(this);
}
public String getBuildAttribute(String name, String defaultValue) {
String value = (String)targetAttributes.get(name);
return value != null ? value : defaultValue;
}
public IPath getBuildLocation() {
return container.getLocation();
}
public void setBuildLocation(IPath location) throws CoreException {
throw new UnsupportedOperationException();
}
public String[] getErrorParsers() {
IMakeBuilderInfo projectInfo;
try {
projectInfo = MakeCorePlugin.createBuildInfo(container.getProject(), manager.getBuilderID(targetBuilderID));
return projectInfo.getErrorParsers();
} catch (CoreException e) {
}
return new String[0];
}
public void setErrorParsers(String[] parsers) throws CoreException {
throw new UnsupportedOperationException();
}
public Map getExpandedEnvironment() {
Map env = getEnvironment();
HashMap envMap = new HashMap(env.entrySet().size());
Iterator iter = env.entrySet().iterator();
boolean win32 = Platform.getOS().equals(Constants.OS_WIN32);
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
String key = (String)entry.getKey();
if (win32) {
// Win32 vars are case insensitive. Uppercase everything so
// that (for example) "pAtH" will correctly replace "PATH"
key = key.toUpperCase();
}
String value = (String)entry.getValue();
// translate any string substitution variables
String translated = value;
try {
translated = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(value, false);
} catch (CoreException e) {
}
envMap.put(key, translated);
}
return envMap;
}
public Map getEnvironment() {
return buildEnvironment;
}
public void setBuildEnvironment(Map env) throws CoreException {
public void setEnvironment(Map env) throws CoreException {
buildEnvironment = new HashMap(env);
manager.updateTarget(this);
}
public boolean isAppendEnvironment() {
return appendEnvironment;
}
public void setAppendEnvironment(boolean append) throws CoreException {
appendEnvironment = append;
manager.updateTarget(this);
}
public boolean appendEnvironment() {
return appendEnvironment;
}
public IContainer getContainer() {
return container;
}
@ -152,20 +254,16 @@ public class MakeTarget extends PlatformObject implements IMakeTarget {
final HashMap infoMap = new HashMap();
IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(infoMap, builderID);
if (buildArguments != null) {
info.setBuildArguments(buildArguments);
}
if (buildCommand != null) {
info.setBuildCommand(buildCommand);
}
info.setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make")); //$NON-NLS-1$
info.setBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, "")); //$NON-NLS-1$
info.setUseDefaultBuildCmd(isDefaultBuildCmd);
info.setStopOnError(isStopOnError);
info.setFullBuildEnable(true);
info.setFullBuildTarget(target);
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, getBuildAttribute(IMakeTarget.BUILD_TARGET, "")); //$NON-NLS-1$
info.setEnvironment(buildEnvironment);
info.setAppendEnvironment(appendEnvironment);
if (container != null) {
info.setBuildLocation(container.getFullPath());
info.setBuildAttribute(IMakeCommonBuildInfo.BUILD_LOCATION, container.getFullPath().toString());
}
IMakeBuilderInfo projectInfo = MakeCorePlugin.createBuildInfo(project, builderID);
info.setErrorParsers(projectInfo.getErrorParsers());
@ -201,38 +299,6 @@ public class MakeTarget extends PlatformObject implements IMakeTarget {
}
}
public void setBuildTarget(String target) throws CoreException {
this.target = target;
manager.updateTarget(this);
}
public String getBuildTarget() {
return target != null ? target : ""; //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.make.core.IMakeTarget#setRunAllBuilders(boolean)
*/
public void setRunAllBuilders(boolean runAllBuilders) {
this.runAllBuidlers = runAllBuilders;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.make.core.IMakeTarget#runAllBuilders()
*/
public boolean runAllBuilders() {
return runAllBuidlers;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter.equals(IProject.class)) {
return container.getProject();

View file

@ -9,6 +9,7 @@
package org.eclipse.cdt.make.internal.core;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.MakeBuilder;
import org.eclipse.cdt.make.core.MakeCorePlugin;
@ -29,18 +30,18 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer {
public void initializeDefaultPreferences() {
IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID, true);
try {
info.setBuildCommand(new Path("make")); //$NON-NLS-1$
info.setBuildLocation(new Path("")); //$NON-NLS-1$
info.setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make"); //$NON-NLS-1$
info.setBuildAttribute(IMakeCommonBuildInfo.BUILD_LOCATION, ""); //$NON-NLS-1$
info.setStopOnError(false);
info.setUseDefaultBuildCmd(true);
info.setAutoBuildEnable(false);
info.setAutoBuildTarget("all"); //$NON-NLS-1$
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, "all"); //$NON-NLS-1$
info.setIncrementalBuildEnable(true);
info.setIncrementalBuildTarget("all"); //$NON-NLS-1$
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, "all"); //$NON-NLS-1$
info.setFullBuildEnable(true);
info.setFullBuildTarget("clean all"); //$NON-NLS-1$
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, "clean all"); //$NON-NLS-1$
info.setCleanBuildEnable(true);
info.setCleanBuildTarget("clean"); //$NON-NLS-1$
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, "clean"); //$NON-NLS-1$
info.setAppendEnvironment(true);
info.setErrorParsers(CCorePlugin.getDefault().getAllErrorParsersIDs());
} catch (CoreException e) {

View file

@ -32,6 +32,7 @@ import javax.xml.transform.stream.StreamResult;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.IMakeTarget;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.core.resources.IContainer;
@ -39,7 +40,6 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@ -209,17 +209,19 @@ public class ProjectTargets {
targetElem.setAttribute(TARGET_ATTR_PATH, target.getContainer().getProjectRelativePath().toString());
Element elem = doc.createElement(TARGET_COMMAND);
targetElem.appendChild(elem);
elem.appendChild(doc.createTextNode(target.getBuildCommand().toString()));
elem.appendChild(doc.createTextNode(target.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "make"))); //$NON-NLS-1$
if (target.getBuildArguments().length() > 0) {
String targetAttr = target.getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, null);
if ( targetAttr != null) {
elem = doc.createElement(TARGET_ARGUMENTS);
elem.appendChild(doc.createTextNode(target.getBuildArguments()));
elem.appendChild(doc.createTextNode(targetAttr));
targetElem.appendChild(elem);
}
if (target.getBuildTarget().length() > 0) {
targetAttr = target.getBuildAttribute(IMakeTarget.BUILD_TARGET, null);
if (targetAttr != null) {
elem = doc.createElement(TARGET);
elem.appendChild(doc.createTextNode(target.getBuildTarget()));
elem.appendChild(doc.createTextNode(targetAttr));
targetElem.appendChild(elem);
}
@ -363,19 +365,19 @@ public class ProjectTargets {
}
option = getString(node, TARGET_COMMAND);
if (option != null) {
target.setBuildCommand(new Path(option));
target.setBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, option);
}
option = getString(node, TARGET_ARGUMENTS);
if (option != null) {
target.setBuildArguments(option);
target.setBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, option);
}
option = getString(node, BAD_TARGET);
if (option != null) {
target.setBuildTarget(option);
target.setBuildAttribute(IMakeTarget.BUILD_TARGET, option);
}
option = getString(node, TARGET);
if (option != null) {
target.setBuildTarget(option);
target.setBuildAttribute(IMakeTarget.BUILD_TARGET, option);
}
add(target);
} catch (CoreException e) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

View file

@ -0,0 +1,88 @@
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.internal.ui;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
/**
* Helper class for dealing with setting and restoring dialog settings.
*/
public class DialogSettingsHelper {
/**
* Persists the location and dimensions of the shell in the
* Debug UI Plugin dialog settings under the provided dialog settings section name
*
* @param shell The shell whose geometry is to be stored
* @param dialogSettingsSectionName The name of the dialog settings section
*/
public static void persistShellGeometry(Shell shell, String dialogSettingsSectionName) {
Point shellLocation = shell.getLocation();
Point shellSize = shell.getSize();
IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
settings.put(IMakeUIPreferenceConstants.DIALOG_ORIGIN_X, shellLocation.x);
settings.put(IMakeUIPreferenceConstants.DIALOG_ORIGIN_Y, shellLocation.y);
settings.put(IMakeUIPreferenceConstants.DIALOG_WIDTH, shellSize.x);
settings.put(IMakeUIPreferenceConstants.DIALOG_HEIGHT, shellSize.y);
}
private static IDialogSettings getDialogSettings(String dialogSettingsSectionName) {
IDialogSettings settings = MakeUIPlugin.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(dialogSettingsSectionName);
if (section == null) {
section = settings.addNewSection(dialogSettingsSectionName);
}
return section;
}
/**
* Returns the initial size which is the larger of the <code>initialSize</code> or
* the size persisted in the Debug UI Plugin dialog settings under the provided dialog setttings section name.
* If no size is persisted in the settings, the <code>initialSize</code> is returned.
*
* @param initialSize The initialSize to compare against
* @param dialogSettingsSectionName The name of the dialog settings section
* @return the initial size
*/
public static Point getInitialSize(String dialogSettingsSectionName, Point initialSize) {
IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
try {
int x, y;
x = settings.getInt(IMakeUIPreferenceConstants.DIALOG_WIDTH);
y = settings.getInt(IMakeUIPreferenceConstants.DIALOG_HEIGHT);
return new Point(Math.max(x, initialSize.x), Math.max(y, initialSize.y));
} catch (NumberFormatException e) {
}
return initialSize;
}
/**
* Returns the initial location which is persisted in the Debug UI Plugin dialog settings
* under the provided dialog setttings section name.
* If location is not persisted in the settings, the <code>null</code> is returned.
*
* @param dialogSettingsSectionName The name of the dialog settings section
* @return The initial location or <code>null</code>
*/
public static Point getInitialLocation(String dialogSettingsSectionName) {
IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
try {
int x= settings.getInt(IMakeUIPreferenceConstants.DIALOG_ORIGIN_X);
int y= settings.getInt(IMakeUIPreferenceConstants.DIALOG_ORIGIN_Y);
return new Point(x,y);
} catch (NumberFormatException e) {
}
return null;
}
}

View file

@ -0,0 +1,23 @@
/*******************************************************************************
* Copyright (c) 2004 QNX Software Systems 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: QNX Software Systems - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.make.internal.ui;
public interface IMakeUIPreferenceConstants {
/**
* Common dialog settings
*/
public static final String DIALOG_ORIGIN_X = MakeUIPlugin.getPluginId() + ".DIALOG_ORIGIN_X"; //$NON-NLS-1$
public static final String DIALOG_ORIGIN_Y = MakeUIPlugin.getPluginId() + ".DIALOG_ORIGIN_Y"; //$NON-NLS-1$
public static final String DIALOG_WIDTH = MakeUIPlugin.getPluginId() + ".DIALOG_WIDTH"; //$NON-NLS-1$
public static final String DIALOG_HEIGHT = MakeUIPlugin.getPluginId() + ".DIALOG_HEIGHT"; //$NON-NLS-1$
public static final String DIALOG_SASH_WEIGHTS_1 = MakeUIPlugin.getPluginId() + ".DIALOG_SASH_WEIGHTS_1"; //$NON-NLS-1$
public static final String DIALOG_SASH_WEIGHTS_2 = MakeUIPlugin.getPluginId() + ".DIALOG_SASH_WEIGHTS_2"; //$NON-NLS-1$
}

View file

@ -0,0 +1,808 @@
/*******************************************************************************
* Copyright (c) 2004 QNX Software Systems 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: QNX Software Systems - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.make.internal.ui;
import java.text.MessageFormat;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.spawner.EnvironmentReader;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.dialogs.ListSelectionDialog;
public class MakeEnvironmentBlock extends AbstractCOptionPage {
Preferences fPrefs;
String fBuilderID;
IMakeBuilderInfo fBuildInfo;
protected TableViewer environmentTable;
protected String[] envTableColumnHeaders = {MakeUIPlugin.getResourceString("MakeEnvironmentBlock.0"), MakeUIPlugin.getResourceString("MakeEnvironmentBlock.1")}; //$NON-NLS-1$ //$NON-NLS-2$
protected ColumnLayoutData[] envTableColumnLayouts = {new ColumnWeightData(50), new ColumnWeightData(50)};
private static final String NAME_LABEL = MakeUIPlugin.getResourceString("MakeEnvironmentBlock.2"); //$NON-NLS-1$
private static final String VALUE_LABEL = MakeUIPlugin.getResourceString("MakeEnvironmentBlock.3"); //$NON-NLS-1$
protected static final String P_VARIABLE = "variable"; //$NON-NLS-1$
protected static final String P_VALUE = "value"; //$NON-NLS-1$
protected static String[] envTableColumnProperties = {P_VARIABLE, P_VALUE};
protected Button envAddButton;
protected Button envEditButton;
protected Button envRemoveButton;
protected Button appendEnvironment;
protected Button replaceEnvironment;
protected Button envSelectButton;
class EnvironmentVariable {
// The name of the environment variable
private String name;
// The value of the environment variable
private String value;
EnvironmentVariable(String name, String value) {
this.name = name;
this.value = value;
}
/**
* Returns this variable's name, which serves as the key in the
* key/value pair this variable represents
*
* @return this variable's name
*/
public String getName() {
return name;
}
/**
* Returns this variables value.
*
* @return this variable's value
*/
public String getValue() {
return value;
}
/**
* Sets this variable's value
*
* @param value
*/
public void setValue(String value) {
this.value = value;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
return getName();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
boolean equal = false;
if (obj instanceof EnvironmentVariable) {
EnvironmentVariable var = (EnvironmentVariable)obj;
equal = var.getName().equals(name);
}
return equal;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return name.hashCode();
}
}
/**
* Content provider for the environment table
*/
protected class EnvironmentVariableContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
EnvironmentVariable[] elements = new EnvironmentVariable[0];
IMakeBuilderInfo info = (IMakeBuilderInfo)inputElement;
Map m = info.getEnvironment();
if (m != null && !m.isEmpty()) {
elements = new EnvironmentVariable[m.size()];
String[] varNames = new String[m.size()];
m.keySet().toArray(varNames);
for (int i = 0; i < m.size(); i++) {
elements[i] = new EnvironmentVariable(varNames[i], (String)m.get(varNames[i]));
}
}
return elements;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput == null) {
return;
}
if (viewer instanceof TableViewer) {
TableViewer tableViewer = (TableViewer)viewer;
if (tableViewer.getTable().isDisposed()) {
return;
}
tableViewer.setSorter(new ViewerSorter() {
public int compare(Viewer iviewer, Object e1, Object e2) {
if (e1 == null) {
return -1;
} else if (e2 == null) {
return 1;
} else {
return ((EnvironmentVariable)e1).getName().compareToIgnoreCase( ((EnvironmentVariable)e2).getName());
}
}
});
}
}
}
/**
* Label provider for the environment table
*/
public class EnvironmentVariableLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
String result = null;
if (element != null) {
EnvironmentVariable var = (EnvironmentVariable)element;
switch (columnIndex) {
case 0 : // variable
result = var.getName();
break;
case 1 : // value
result = var.getValue();
break;
}
}
return result;
}
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_ENV_VAR);
}
return null;
}
}
public MakeEnvironmentBlock(Preferences prefs, String builderID) {
super(MakeUIPlugin.getResourceString("MakeEnvironmentBlock.4")); //$NON-NLS-1$
setDescription(MakeUIPlugin.getResourceString("MakeEnvironmentBlock.5")); //$NON-NLS-1$
fPrefs = prefs;
fBuilderID = builderID;
}
public void setContainer(ICOptionContainer container) {
super.setContainer(container);
if (getContainer().getProject() != null) {
try {
fBuildInfo = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID);
} catch (CoreException e) {
}
} else {
fBuildInfo = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
}
}
public void performApply(IProgressMonitor monitor) throws CoreException {
// Missing builder info
if (fBuildInfo == null) {
return;
}
if (monitor == null) {
monitor = new NullProgressMonitor();
}
IWorkspace workspace = MakeUIPlugin.getWorkspace();
// To avoid multi-build
IWorkspaceRunnable operation = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(MakeUIPlugin.getResourceString("SettingsBlock.monitor.applyingSettings"), 1); //$NON-NLS-1$
IMakeBuilderInfo info = null;
if (getContainer().getProject() != null) {
try {
info = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID);
} catch (CoreException e) {
// disabled builder... just log it
MakeCorePlugin.log(e);
return;
}
} else {
info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
}
// Convert the table's items into a Map so that this can be saved in the
// configuration's attributes.
TableItem[] items = environmentTable.getTable().getItems();
Map map = new HashMap(items.length);
for (int i = 0; i < items.length; i++)
{
EnvironmentVariable var = (EnvironmentVariable) items[i].getData();
map.put(var.getName(), var.getValue());
}
info.setEnvironment(map);
info.setAppendEnvironment(appendEnvironment.getSelection());
}
};
if (getContainer().getProject() != null) {
workspace.run(operation, monitor);
} else {
operation.run(monitor);
}
}
/**
* Updates the environment table for the given launch configuration
*
* @param configuration
*/
protected void updateEnvironment(IMakeBuilderInfo info) {
environmentTable.setInput(info);
}
public void performDefaults() {
// Missing builder info
if (fBuildInfo == null) {
return;
}
IMakeBuilderInfo info;
if (getContainer().getProject() != null) {
info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
} else {
info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, true);
}
boolean append = info.appendEnvironment();
if (append) {
appendEnvironment.setSelection(true);
replaceEnvironment.setSelection(false);
} else {
replaceEnvironment.setSelection(true);
appendEnvironment.setSelection(false);
}
updateEnvironment(info);
updateAppendReplace();
}
public void createControl(Composite parent) {
Composite composite = ControlFactory.createComposite(parent, 1);
setControl(composite);
MakeUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(), IMakeHelpContextIds.MAKE_BUILDER_SETTINGS);
if (fBuildInfo == null) {
ControlFactory.createEmptySpace(composite);
ControlFactory.createLabel(composite, MakeUIPlugin.getResourceString("SettingsBlock.label.missingBuilderInformation")); //$NON-NLS-1$
return;
}
GridLayout layout = new GridLayout();
layout.numColumns = 2;
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayout(layout);
composite.setLayoutData(gridData);
composite.setFont(parent.getFont());
createBuildEnvironmentControls(composite);
createTableButtons(composite);
createAppendReplace(composite);
boolean append = fBuildInfo.appendEnvironment();
if (append) {
appendEnvironment.setSelection(true);
replaceEnvironment.setSelection(false);
} else {
replaceEnvironment.setSelection(true);
appendEnvironment.setSelection(false);
}
updateEnvironment(fBuildInfo);
updateAppendReplace();
}
private void createBuildEnvironmentControls(Composite parent) {
Font font = parent.getFont();
// Create table composite
Composite tableComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 1;
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.heightHint = 150;
tableComposite.setLayout(layout);
tableComposite.setLayoutData(gridData);
tableComposite.setFont(font);
// Create label
Label label = new Label(tableComposite, SWT.NONE);
label.setFont(font);
label.setText(MakeUIPlugin.getResourceString("MakeEnvironmentBlock.6")); //$NON-NLS-1$
// Create table
environmentTable = new TableViewer(tableComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI
| SWT.FULL_SELECTION);
Table table = environmentTable.getTable();
TableLayout tableLayout = new TableLayout();
table.setLayout(tableLayout);
table.setHeaderVisible(true);
table.setFont(font);
gridData = new GridData(GridData.FILL_BOTH);
environmentTable.getControl().setLayoutData(gridData);
environmentTable.setContentProvider(new EnvironmentVariableContentProvider());
environmentTable.setLabelProvider(new EnvironmentVariableLabelProvider());
environmentTable.setColumnProperties(envTableColumnProperties);
environmentTable.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleTableSelectionChanged(event);
}
});
environmentTable.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if (!environmentTable.getSelection().isEmpty()) {
handleEnvEditButtonSelected();
}
}
});
// Create columns
for (int i = 0; i < envTableColumnHeaders.length; i++) {
tableLayout.addColumnData(envTableColumnLayouts[i]);
TableColumn tc = new TableColumn(table, SWT.NONE, i);
tc.setResizable(envTableColumnLayouts[i].resizable);
tc.setText(envTableColumnHeaders[i]);
}
}
/**
* Responds to a selection changed event in the environment table
*
* @param event
* the selection change event
*/
protected void handleTableSelectionChanged(SelectionChangedEvent event) {
int size = ((IStructuredSelection)event.getSelection()).size();
envEditButton.setEnabled(size == 1);
envRemoveButton.setEnabled(size > 0);
}
/**
* 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);
label.setFont(comp.getFont());
}
/**
* Creates the add/edit/remove buttons for the environment table
*
* @param parent
* the composite in which the buttons should be created
*/
protected void createTableButtons(Composite parent) {
// Create button composite
Composite buttonComposite = new Composite(parent, SWT.NONE);
GridLayout glayout = new GridLayout();
glayout.marginHeight = 0;
glayout.marginWidth = 0;
glayout.numColumns = 1;
GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END);
buttonComposite.setLayout(glayout);
buttonComposite.setLayoutData(gdata);
buttonComposite.setFont(parent.getFont());
createVerticalSpacer(buttonComposite, 1);
// Create buttons
envAddButton = createPushButton(buttonComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.7"), null); //$NON-NLS-1$
envAddButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleEnvAddButtonSelected();
}
});
envSelectButton = createPushButton(buttonComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.8"), null); //$NON-NLS-1$
envSelectButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleEnvSelectButtonSelected();
}
});
envEditButton = createPushButton(buttonComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.9"), null); //$NON-NLS-1$
envEditButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleEnvEditButtonSelected();
}
});
envEditButton.setEnabled(false);
envRemoveButton = createPushButton(buttonComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.10"), null); //$NON-NLS-1$
envRemoveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleEnvRemoveButtonSelected();
}
});
envRemoveButton.setEnabled(false);
}
/**
* Adds a new environment variable to the table.
*/
protected void handleEnvAddButtonSelected() {
MultipleInputDialog dialog = new MultipleInputDialog(getShell(), MakeUIPlugin.getResourceString("MakeEnvironmentBlock.11")); //$NON-NLS-1$
dialog.addTextField(NAME_LABEL, null, false);
dialog.addVariablesField(VALUE_LABEL, null, true);
if (dialog.open() != Window.OK) {
return;
}
String name = dialog.getStringValue(NAME_LABEL);
String value = dialog.getStringValue(VALUE_LABEL);
if (name != null && value != null && name.length() > 0 && value.length() > 0) {
addVariable(new EnvironmentVariable(name.trim(), value.trim()));
updateAppendReplace();
}
}
/**
* Updates the enablement of the append/replace widgets. The widgets should
* disable when there are no environment variables specified.
*/
protected void updateAppendReplace() {
boolean enable = environmentTable.getTable().getItemCount() > 0;
appendEnvironment.setEnabled(enable);
replaceEnvironment.setEnabled(enable);
}
/**
* Attempts to add the given variable. Returns whether the variable was
* added or not (as when the user answers not to overwrite an existing
* variable).
*
* @param variable
* the variable to add
* @return whether the variable was added
*/
protected boolean addVariable(EnvironmentVariable variable) {
String name = variable.getName();
TableItem[] items = environmentTable.getTable().getItems();
for (int i = 0; i < items.length; i++) {
EnvironmentVariable existingVariable = (EnvironmentVariable)items[i].getData();
if (existingVariable.getName().equals(name)) {
boolean overWrite = MessageDialog.openQuestion(getShell(), MakeUIPlugin.getResourceString("MakeEnvironmentBlock.12"), MessageFormat.format( //$NON-NLS-1$
MakeUIPlugin.getResourceString("MakeEnvironmentBlock.13"), new String[]{name})); //$NON-NLS-1$
if (!overWrite) {
return false;
}
environmentTable.remove(existingVariable);
break;
}
}
environmentTable.add(variable);
getContainer().updateContainer();
return true;
}
/**
* Gets native environment variable. Creates EnvironmentVariable objects.
*
* @return Map of name - EnvironmentVariable pairs based on native
* environment.
*/
private Map getNativeEnvironment() {
Map stringVars = EnvironmentReader.getEnvVars();
HashMap vars = new HashMap();
for (Iterator i = stringVars.keySet().iterator(); i.hasNext();) {
String key = (String)i.next();
String value = (String)stringVars.get(key);
vars.put(key, new EnvironmentVariable(key, value));
}
return vars;
}
/**
* Displays a dialog that allows user to select native environment variables
* to add to the table.
*/
protected void handleEnvSelectButtonSelected() {
// get Environment Variables from the OS
Map envVariables = getNativeEnvironment();
// get Environment Variables from the table
TableItem[] items = environmentTable.getTable().getItems();
for (int i = 0; i < items.length; i++) {
EnvironmentVariable var = (EnvironmentVariable)items[i].getData();
envVariables.remove(var.getName());
}
ListSelectionDialog dialog = new NativeEnvironmentDialog(getShell(), envVariables, createSelectionDialogContentProvider(),
createSelectionDialogLabelProvider(), MakeUIPlugin.getResourceString("MakeEnvironmentBlock.14")); //$NON-NLS-1$
dialog.setTitle(MakeUIPlugin.getResourceString("MakeEnvironmentBlock.15")); //$NON-NLS-1$
int button = dialog.open();
if (button == Window.OK) {
Object[] selected = dialog.getResult();
for (int i = 0; i < selected.length; i++) {
environmentTable.add(selected[i]);
}
}
updateAppendReplace();
getContainer().updateContainer();
}
/**
* Creates a label provider for the native native environment variable
* selection dialog.
*
* @return A label provider for the native native environment variable
* selection dialog.
*/
private ILabelProvider createSelectionDialogLabelProvider() {
return new ILabelProvider() {
public Image getImage(Object element) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_ENVIRONMNET);
}
public String getText(Object element) {
EnvironmentVariable var = (EnvironmentVariable)element;
return var.getName() + " [" + var.getValue() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
};
}
/**
* Creates a content provider for the native native environment variable
* selection dialog.
*
* @return A content provider for the native native environment variable
* selection dialog.
*/
private IStructuredContentProvider createSelectionDialogContentProvider() {
return new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
EnvironmentVariable[] elements = null;
if (inputElement instanceof Map) {
Comparator comparator = new Comparator() {
public int compare(Object o1, Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
return s1.compareTo(s2);
}
};
TreeMap envVars = new TreeMap(comparator);
envVars.putAll((Map)inputElement);
elements = new EnvironmentVariable[envVars.size()];
int index = 0;
for (Iterator iterator = envVars.keySet().iterator(); iterator.hasNext(); index++) {
Object key = iterator.next();
elements[index] = (EnvironmentVariable)envVars.get(key);
}
}
return elements;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
};
}
/**
* Creates an editor for the value of the selected environment variable.
*/
protected void handleEnvEditButtonSelected() {
IStructuredSelection sel = (IStructuredSelection)environmentTable.getSelection();
EnvironmentVariable var = (EnvironmentVariable)sel.getFirstElement();
if (var == null) {
return;
}
String originalName = var.getName();
String value = var.getValue();
MultipleInputDialog dialog = new MultipleInputDialog(getShell(), MakeUIPlugin.getResourceString("MakeEnvironmentBlock.16")); //$NON-NLS-1$
dialog.addTextField(NAME_LABEL, originalName, false);
dialog.addVariablesField(VALUE_LABEL, value, true);
if (dialog.open() != Window.OK) {
return;
}
String name = dialog.getStringValue(NAME_LABEL);
value = dialog.getStringValue(VALUE_LABEL);
if (!originalName.equals(name)) {
if (addVariable(new EnvironmentVariable(name, value))) {
environmentTable.remove(var);
}
} else {
var.setValue(value);
environmentTable.update(var, null);
getContainer().updateContainer();
}
}
/**
* Removes the selected environment variable from the table.
*/
protected void handleEnvRemoveButtonSelected() {
IStructuredSelection sel = (IStructuredSelection)environmentTable.getSelection();
environmentTable.getControl().setRedraw(false);
for (Iterator i = sel.iterator(); i.hasNext();) {
EnvironmentVariable var = (EnvironmentVariable)i.next();
environmentTable.remove(var);
}
environmentTable.getControl().setRedraw(true);
updateAppendReplace();
getContainer().updateContainer();
}
private class NativeEnvironmentDialog extends ListSelectionDialog {
public NativeEnvironmentDialog(Shell parentShell, Object input, IStructuredContentProvider contentProvider,
ILabelProvider labelProvider, String message) {
super(parentShell, input, contentProvider, labelProvider, message);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = MakeUIPlugin.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
if (section == null) {
section = settings.addNewSection(getDialogSettingsSectionName());
}
return section;
}
/**
* Returns the name of the section that this dialog stores its settings
* in
*
* @return String
*/
protected String getDialogSettingsSectionName() {
return MakeUIPlugin.getPluginId() + ".ENVIRONMENT_TAB.NATIVE_ENVIROMENT_DIALOG"; //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
*/
protected Point getInitialLocation(Point initialSize) {
Point initialLocation = DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName());
if (initialLocation != null) {
return initialLocation;
}
return super.getInitialLocation(initialSize);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#getInitialSize()
*/
protected Point getInitialSize() {
Point size = super.getInitialSize();
return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#close()
*/
public boolean close() {
DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName());
return super.close();
}
}
/**
* Creates and configures the widgets which allow the user to choose whether
* the specified environment should be appended to the native environment or
* if it should completely replace it.
*
* @param parent
* the composite in which the widgets should be created
*/
protected void createAppendReplace(Composite parent) {
Composite appendReplaceComposite = new Composite(parent, SWT.NONE);
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
GridLayout layout = new GridLayout();
appendReplaceComposite.setLayoutData(gridData);
appendReplaceComposite.setLayout(layout);
appendReplaceComposite.setFont(parent.getFont());
appendEnvironment = createRadioButton(appendReplaceComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.17")); //$NON-NLS-1$
appendEnvironment.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
getContainer().updateContainer();
}
});
replaceEnvironment = createRadioButton(appendReplaceComposite, MakeUIPlugin.getResourceString("MakeEnvironmentBlock.18")); //$NON-NLS-1$
}
}

View file

@ -40,6 +40,7 @@ public class MakeProjectOptionBlock extends TabFolderOptionBlock {
protected void addTabs() {
addTab(new SettingsBlock(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID));
addTab(new MakeEnvironmentBlock(MakeCorePlugin.getDefault().getPluginPreferences(), MakeBuilder.BUILDER_ID));
addTab(new ErrorParserBlock(MakeCorePlugin.getDefault().getPluginPreferences()));
addTab(new BinaryParserBlock());
addTab(new DiscoveryOptionsBlock());

View file

@ -11,11 +11,49 @@
MakeCWizard.title=C/Make Project
MakeCWizard.description=Create a New C Project using 'make' to build it
MakeEnvironmentBlock.10=&Remove
MakeEnvironmentBlock.10=&Remove
MakeEnvironmentBlock.11=New Environment Variable
MakeEnvironmentBlock.11=New Environment Variable
MakeEnvironmentBlock.12=Overwrite variable?
MakeEnvironmentBlock.12=Overwrite variable?
MakeEnvironmentBlock.13=A variable named {0} already exists. Overwrite?
MakeEnvironmentBlock.13=A variable named {0} already exists. Overwrite?
MakeEnvironmentBlock.14=Select &environment variables to add:
MakeEnvironmentBlock.14=Select &environment variables to add:
MakeEnvironmentBlock.15=Select Environment Variables
MakeEnvironmentBlock.15=Select Environment Variables
MakeEnvironmentBlock.16=Edit Environment Variable
MakeEnvironmentBlock.16=Edit Environment Variable
MakeEnvironmentBlock.17=&Append environment to native environment
MakeEnvironmentBlock.17=&Append environment to native environment
MakeEnvironmentBlock.18=Re&place native environment with specified environment
MakeEnvironmentBlock.18=Re&place native environment with specified environment
MakeCWizard.task_name=Creating C project with Make builder...
MakeCCWizard.title=C++/Make Project
MakeCCWizard.description=Create a New C++ Project using 'make' to build it
MakeCCWizard.task_name=Creating C++ project with Make builder...
MakeEnvironmentBlock.0=Variable
MakeEnvironmentBlock.0=Variable
MakeEnvironmentBlock.1=Value
MakeEnvironmentBlock.1=Value
MakeEnvironmentBlock.2=&Name:
MakeEnvironmentBlock.2=&Name:
MakeEnvironmentBlock.3=&Value:
MakeEnvironmentBlock.3=&Value:
MakeEnvironmentBlock.4=Environment
MakeEnvironmentBlock.4=Environment
MakeEnvironmentBlock.5=Environment used for make builder
MakeEnvironmentBlock.5=Environment used for make builder
MakeEnvironmentBlock.6=Environment variables to set
MakeEnvironmentBlock.6=Environment variables to set
MakeEnvironmentBlock.7=N&ew...
MakeEnvironmentBlock.7=N&ew...
MakeEnvironmentBlock.8=Se&lect...
MakeEnvironmentBlock.8=Se&lect...
MakeEnvironmentBlock.9=E&dit...
MakeEnvironmentBlock.9=E&dit...
MakeCWizardSettings.title=C/Make Project Settings
MakeCWizardSettings.description=Define the project and 'make' builder settings
@ -250,3 +288,6 @@ DiscoveredScannerConfigurationContainerPage.list.title=Discovered include paths
CopyDiscoveredPathAction.title=Copy
CopyDiscoveredPathAction.description=Copy as text
CopyDiscoveredPathAction.tooltip=Copy as text
MultipleInputDialog.0=&Browse...
MultipleInputDialog.1=Select a file:
MultipleInputDialog.2=Varia&bles...

View file

@ -73,13 +73,15 @@ public class MakeUIImages {
public static final String IMG_OBJS_MAKEFILE_INCLUDE = NAME_PREFIX + "include_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_INCLUDE = createManaged(OBJ, IMG_OBJS_MAKEFILE_INCLUDE);
public static final String IMG_TOOLS_ALPHA_SORTING= NAME_PREFIX + "alphab_sort_co.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_ENVIRONMNET = NAME_PREFIX + "environment_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_ENVIRONMENT = createManaged(OBJ, IMG_OBJS_ENVIRONMNET);
public static final String IMG_TOOLS_MAKEFILE_SEGMENT_EDIT= NAME_PREFIX + "segment_edit.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_ENV_VAR = NAME_PREFIX + "environment_obj.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_ENV_VAR = NAME_PREFIX + "envvar_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_ENV_VAR = createManaged(OBJ, IMG_OBJS_ENV_VAR);
public static final String IMG_TOOLS_ALPHA_SORTING= NAME_PREFIX + "alphab_sort_co.gif"; //$NON-NLS-1$
public static final String IMG_TOOLS_MAKEFILE_SEGMENT_EDIT= NAME_PREFIX + "segment_edit.gif"; //$NON-NLS-1$
private static ImageDescriptor createManaged(String prefix, String name) {
return createManaged(imageRegistry, prefix, name);
}

View file

@ -0,0 +1,372 @@
/*******************************************************************************
* Copyright (c) 2003, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.internal.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class MultipleInputDialog extends Dialog {
protected static final String FIELD_NAME = "FIELD_NAME"; //$NON-NLS-1$
protected static final int TEXT = 100;
protected static final int BROWSE = 101;
protected static final int VARIABLE = 102;
protected Composite panel;
protected List fieldList = new ArrayList();
protected List controlList = new ArrayList();
protected List validators = new ArrayList();
protected Map valueMap = new HashMap();
private String title;
public MultipleInputDialog(Shell shell, String title) {
super(shell);
this.title = title;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (title != null) {
shell.setText(title);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected Control createButtonBar(Composite parent) {
Control bar = super.createButtonBar(parent);
validateFields();
return bar;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite container = (Composite)super.createDialogArea(parent);
container.setLayout(new GridLayout(2, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
panel = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
panel.setLayout(layout);
panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
for (Iterator i = fieldList.iterator(); i.hasNext();) {
FieldSummary field = (FieldSummary)i.next();
switch(field.type) {
case TEXT:
createTextField(field.name, field.initialValue, field.allowsEmpty);
break;
case BROWSE:
createBrowseField(field.name, field.initialValue, field.allowsEmpty);
break;
case VARIABLE:
createVariablesField(field.name, field.initialValue, field.allowsEmpty);
break;
}
}
fieldList = null; // allow it to be gc'd
Dialog.applyDialogFont(container);
return container;
}
public void addBrowseField(String labelText, String initialValue, boolean allowsEmpty) {
fieldList.add(new FieldSummary(BROWSE, labelText, initialValue, allowsEmpty));
}
public void addTextField(String labelText, String initialValue, boolean allowsEmpty) {
fieldList.add(new FieldSummary(TEXT, labelText, initialValue, allowsEmpty));
}
public void addVariablesField(String labelText, String initialValue, boolean allowsEmpty) {
fieldList.add(new FieldSummary(VARIABLE, labelText, initialValue, allowsEmpty));
}
protected void createTextField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
final Text text = new Text(panel, SWT.SINGLE | SWT.BORDER);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.setData(FIELD_NAME, labelText);
// make sure rows are the same height on both panels.
label.setSize(label.getSize().x, text.getSize().y);
if (initialValue != null) {
text.setText(initialValue);
}
if (!allowEmpty) {
validators.add(new Validator() {
public boolean validate() {
return !text.getText().equals(""); //$NON-NLS-1$
}
});
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateFields();
}
});
}
controlList.add(text);
}
protected void createBrowseField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
Composite comp = new Composite(panel, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight=0;
layout.marginWidth=0;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 200;
text.setLayoutData(data);
text.setData(FIELD_NAME, labelText);
// make sure rows are the same height on both panels.
label.setSize(label.getSize().x, text.getSize().y);
if (initialValue != null) {
text.setText(initialValue);
}
if (!allowEmpty) {
validators.add(new Validator() {
public boolean validate() {
return !text.getText().equals(""); //$NON-NLS-1$
}
});
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateFields();
}
});
}
Button button = createButton(comp, IDialogConstants.IGNORE_ID, MakeUIPlugin.getResourceString("MultipleInputDialog.0"), false); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell());
dialog.setMessage(MakeUIPlugin.getResourceString("MultipleInputDialog.1")); //$NON-NLS-1$
String currentWorkingDir = text.getText();
if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$
File path = new File(currentWorkingDir);
if (path.exists()) {
dialog.setFilterPath(currentWorkingDir);
}
}
String selectedDirectory = dialog.open();
if (selectedDirectory != null) {
text.setText(selectedDirectory);
}
}
});
controlList.add(text);
}
public void createVariablesField(String labelText, String initialValue, boolean allowEmpty) {
Label label = new Label(panel, SWT.NONE);
label.setText(labelText);
label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
Composite comp = new Composite(panel, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight=0;
layout.marginWidth=0;
comp.setLayout(layout);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Text text = new Text(comp, SWT.SINGLE | SWT.BORDER);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 200;
text.setLayoutData(data);
text.setData(FIELD_NAME, labelText);
// make sure rows are the same height on both panels.
label.setSize(label.getSize().x, text.getSize().y);
if (initialValue != null) {
text.setText(initialValue);
}
if (!allowEmpty) {
validators.add(new Validator() {
public boolean validate() {
return !text.getText().equals(""); //$NON-NLS-1$
}
});
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validateFields();
}
});
}
Button button = createButton(comp, IDialogConstants.IGNORE_ID, MakeUIPlugin.getResourceString("MultipleInputDialog.2"), false); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
int code = dialog.open();
if (code == IDialogConstants.OK_ID) {
String variable = dialog.getVariableExpression();
if (variable != null) {
text.insert(variable);
}
}
}
});
controlList.add(text);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
for (Iterator i = controlList.iterator(); i.hasNext(); ) {
Control control = (Control)i.next();
if (control instanceof Text) {
valueMap.put(control.getData(FIELD_NAME), ((Text)control).getText());
}
}
controlList = null;
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#open()
*/
public int open() {
applyDialogFont(panel);
return super.open();
}
public Object getValue(String key) {
return valueMap.get(key);
}
public String getStringValue(String key) {
return (String) getValue(key);
}
public void validateFields() {
for(Iterator i = validators.iterator(); i.hasNext(); ) {
Validator validator = (Validator) i.next();
if (!validator.validate()) {
getButton(IDialogConstants.OK_ID).setEnabled(false);
return;
}
}
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
*/
protected Point getInitialLocation(Point initialSize) {
Point initialLocation= DialogSettingsHelper.getInitialLocation(getDialogSettingsSectionName());
if (initialLocation != null) {
return initialLocation;
}
return super.getInitialLocation(initialSize);
}
protected String getDialogSettingsSectionName() {
return MakeUIPlugin.getPluginId() + ".MULTIPLE_INPUT_DIALOG_2"; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#getInitialSize()
*/
protected Point getInitialSize() {
Point size = super.getInitialSize();
return DialogSettingsHelper.getInitialSize(getDialogSettingsSectionName(), size);
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#close()
*/
public boolean close() {
DialogSettingsHelper.persistShellGeometry(getShell(), getDialogSettingsSectionName());
return super.close();
}
protected class FieldSummary {
int type;
String name;
String initialValue;
boolean allowsEmpty;
public FieldSummary(int type, String name, String initialValue, boolean allowsEmpty) {
this.type = type;
this.name = name;
this.initialValue = initialValue;
this.allowsEmpty = allowsEmpty;
}
}
protected class Validator {
boolean validate() {
return true;
}
}
}

View file

@ -9,6 +9,7 @@
package org.eclipse.cdt.make.ui.dialogs;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
@ -21,8 +22,8 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
@ -78,21 +79,28 @@ public class SettingsBlock extends AbstractCOptionPage {
private static final String MAKE_BUILD_CLEAN_TARGET = PREFIX + ".makeWorkbench.cleanTarget"; //$NON-NLS-1$
Button stopOnErrorButton;
Button defButton;
Text buildCommand;
Button argumentVariablesButton;
Text buildLocation;
Button locationVariablesButton;
Text targetFull;
Text targetIncr;
Text targetAuto;
Text targetClean;
Button fullButton;
Button incrButton;
Button autoButton;
Button cleanButton;
Button fullVariableButton;
Button incrVariableButton;
Button autoVariableButton;
Button cleanVariableButton;
IMakeBuilderInfo fBuildInfo;
Preferences fPrefs;
String fBuilderID;
@ -117,9 +125,8 @@ public class SettingsBlock extends AbstractCOptionPage {
protected void createBuildCmdControls(Composite parent) {
Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_CMD_GROUP), 1);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.numColumns = 3;
layout.makeColumnsEqualWidth = false;
layout.horizontalSpacing = 0;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
defButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_CMD_USE_DEFAULT));
@ -128,17 +135,19 @@ public class SettingsBlock extends AbstractCOptionPage {
public void widgetSelected(SelectionEvent e) {
if (defButton.getSelection() == true) {
buildCommand.setEnabled(false);
argumentVariablesButton.setEnabled(false);
stopOnErrorButton.setEnabled(true);
getContainer().updateContainer();
} else {
buildCommand.setEnabled(true);
argumentVariablesButton.setEnabled(true);
stopOnErrorButton.setEnabled(false);
getContainer().updateContainer();
}
}
});
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.horizontalSpan = 3;
defButton.setLayoutData(gd);
Label label = ControlFactory.createLabel(group, MakeUIPlugin.getResourceString(MAKE_CMD_LABEL));
((GridData) (label.getLayoutData())).horizontalAlignment = GridData.BEGINNING;
@ -153,10 +162,10 @@ public class SettingsBlock extends AbstractCOptionPage {
getContainer().updateContainer();
}
});
if (fBuildInfo.getBuildCommand() != null) {
StringBuffer cmd = new StringBuffer(fBuildInfo.getBuildCommand().toOSString());
if (fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, null) != null) {
StringBuffer cmd = new StringBuffer(fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "")); //$NON-NLS-1$
if (!fBuildInfo.isDefaultBuildCmd()) {
String args = fBuildInfo.getBuildArguments();
String args = fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, "");
if (args != null && !args.equals("")) { //$NON-NLS-1$
cmd.append(" "); //$NON-NLS-1$
cmd.append(args);
@ -164,8 +173,10 @@ public class SettingsBlock extends AbstractCOptionPage {
}
buildCommand.setText(cmd.toString());
}
argumentVariablesButton = addVariablesButton(group, buildCommand);
if (fBuildInfo.isDefaultBuildCmd()) {
buildCommand.setEnabled(false);
argumentVariablesButton.setEnabled(false);
}
defButton.setSelection(fBuildInfo.isDefaultBuildCmd());
}
@ -175,16 +186,20 @@ public class SettingsBlock extends AbstractCOptionPage {
public void widgetSelected(SelectionEvent e) {
targetAuto.setEnabled(autoButton.getSelection());
autoVariableButton.setEnabled(autoButton.getSelection());
targetFull.setEnabled(fullButton.getSelection());
fullVariableButton.setEnabled(fullButton.getSelection());
targetIncr.setEnabled(incrButton.getSelection());
incrVariableButton.setEnabled(incrButton.getSelection());
targetClean.setEnabled(cleanButton.getSelection());
cleanVariableButton.setEnabled(cleanButton.getSelection());
getContainer().updateContainer();
}
};
Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_GROUP), 1);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.numColumns = 3;
layout.makeColumnsEqualWidth = false;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@ -192,49 +207,70 @@ public class SettingsBlock extends AbstractCOptionPage {
label.setText(MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_TYPE));
label = new Label(group, SWT.NONE);
label.setText(MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_TARGET));
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
label.setLayoutData(gd);
autoButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_AUTO));
autoButton.addSelectionListener(selectionAdapter);
autoButton.setSelection(fBuildInfo.isAutoBuildEnable());
// if (!MakeUIPlugin.getWorkspace().isAutoBuilding()) {
// autoButton.setEnabled(false);
// }
targetAuto = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
targetAuto.setText(fBuildInfo.getAutoBuildTarget());
targetAuto.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, "")); //$NON-NLS-1$
((GridData) (targetAuto.getLayoutData())).horizontalAlignment = GridData.FILL;
((GridData) (targetAuto.getLayoutData())).grabExcessHorizontalSpace = true;
addControlAccessibleListener(targetAuto, MakeUIPlugin.getResourceString(MAKE_BUILD_AUTO_TARGET));
autoVariableButton = addVariablesButton(group, targetAuto);
String noteTitle = MakeUIPlugin.getResourceString("SettingsBlock.makeWorkbench.note"); //$NON-NLS-1$
String noteMessage = MakeUIPlugin.getResourceString("SettingsBlock.makeWorkbench.autobuildMessage"); //$NON-NLS-1$
Composite noteControl = createNoteComposite(JFaceResources.getDialogFont(), group, noteTitle, noteMessage);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 3;
noteControl.setLayoutData(gd);
incrButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_INCR));
incrButton.addSelectionListener(selectionAdapter);
incrButton.setSelection(fBuildInfo.isIncrementalBuildEnabled());
targetIncr = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
targetIncr.setText(fBuildInfo.getIncrementalBuildTarget());
targetIncr.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, "")); //$NON-NLS-1$
((GridData) (targetIncr.getLayoutData())).horizontalAlignment = GridData.FILL;
((GridData) (targetIncr.getLayoutData())).grabExcessHorizontalSpace = true;
addControlAccessibleListener(targetIncr, MakeUIPlugin.getResourceString(MAKE_BUILD_INCREMENTAL_TARGET));
incrVariableButton = addVariablesButton(group, targetIncr);
fullButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_FULL));
fullButton.addSelectionListener(selectionAdapter);
fullButton.setSelection(fBuildInfo.isFullBuildEnabled());
targetFull = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
targetFull.setText(fBuildInfo.getFullBuildTarget());
targetFull.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, "")); //$NON-NLS-1$
((GridData) (targetFull.getLayoutData())).horizontalAlignment = GridData.FILL;
((GridData) (targetFull.getLayoutData())).grabExcessHorizontalSpace = true;
addControlAccessibleListener(targetFull, MakeUIPlugin.getResourceString(MAKE_BUILD_FULL_TARGET));
fullVariableButton = addVariablesButton(group, targetFull);
cleanButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_CLEAN));
cleanButton.addSelectionListener(selectionAdapter);
cleanButton.setSelection(fBuildInfo.isCleanBuildEnabled());
targetClean = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
targetClean.setText(fBuildInfo.getCleanBuildTarget());
targetClean.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, ""));
((GridData) (targetClean.getLayoutData())).horizontalAlignment = GridData.FILL;
((GridData) (targetClean.getLayoutData())).grabExcessHorizontalSpace = true;
addControlAccessibleListener(targetClean, MakeUIPlugin.getResourceString(MAKE_BUILD_CLEAN_TARGET));
cleanVariableButton = addVariablesButton(group, targetClean);
selectionAdapter.widgetSelected(null);
}
private Button addVariablesButton(Composite parent, final Text control) {
Button variablesButton = createPushButton(parent, "Variables...", null);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
variablesButton.setLayoutData(gd);
variablesButton.addSelectionListener(new SelectionAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent arg0) {
handleVariablesButtonSelected(control);
}
});
return variablesButton;
}
protected Composite createNoteComposite(Font font, Composite composite, String title, String message) {
@ -289,7 +325,7 @@ public class SettingsBlock extends AbstractCOptionPage {
protected void createBuilderWorkingDirControls(Composite parent) {
Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_BUILD_DIR_GROUP), 1);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.numColumns = 4;
layout.makeColumnsEqualWidth = false;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@ -320,9 +356,30 @@ public class SettingsBlock extends AbstractCOptionPage {
}
}
});
buildLocation.setText(fBuildInfo.getBuildLocation().toOSString());
buildLocation.setText(fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_LOCATION, ""));
locationVariablesButton = addVariablesButton(group, buildLocation);
}
/**
* A variable entry button has been pressed for the given text field. Prompt
* the user for a variable and enter the result in the given field.
*/
private void handleVariablesButtonSelected(Text textField) {
String variable = getVariable();
if (variable != null) {
textField.append(variable);
}
}
/**
* Prompts the user to choose and configure a variable and returns the
* resulting string, suitable to be used as an attribute.
*/
private String getVariable() {
StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
dialog.open();
return dialog.getVariableExpression();
}
public void createControl(Composite parent) {
Composite composite = ControlFactory.createComposite(parent, 1);
setControl(composite);
@ -392,29 +449,29 @@ public class SettingsBlock extends AbstractCOptionPage {
start = 1;
end = bldLine.indexOf('"', 1);
}
IPath path;
String path;
if (end == -1) {
path = new Path(bldLine);
path = bldLine;
} else {
path = new Path(bldLine.substring(start, end));
path = bldLine.substring(start, end);
}
info.setBuildCommand(path);
info.setBuildAttribute(IMakeBuilderInfo.BUILD_COMMAND, path);
String args = ""; //$NON-NLS-1$
if (end != -1) {
args = bldLine.substring(end + 1);
}
info.setBuildArguments(args);
info.setBuildAttribute(IMakeBuilderInfo.BUILD_ARGUMENTS, args);
}
info.setAutoBuildEnable(autoButton.getSelection());
info.setAutoBuildTarget(targetAuto.getText().trim());
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, targetAuto.getText().trim());
info.setIncrementalBuildEnable(incrButton.getSelection());
info.setIncrementalBuildTarget(targetIncr.getText().trim());
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREAMENTAL, targetIncr.getText().trim());
info.setFullBuildEnable(fullButton.getSelection());
info.setFullBuildTarget(targetFull.getText().trim());
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_FULL, targetFull.getText().trim());
info.setCleanBuildEnable(cleanButton.getSelection());
info.setCleanBuildTarget(targetClean.getText().trim());
info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, targetClean.getText().trim());
if (buildLocation != null) {
info.setBuildLocation(new Path(buildLocation.getText().trim()));
info.setBuildAttribute(IMakeBuilderInfo.BUILD_LOCATION, buildLocation.getText().trim());
}
}
};
@ -453,9 +510,11 @@ public class SettingsBlock extends AbstractCOptionPage {
}
if (info.isDefaultBuildCmd()) {
buildCommand.setEnabled(false);
argumentVariablesButton.setEnabled(false);
stopOnErrorButton.setEnabled(true);
} else {
buildCommand.setEnabled(true);
argumentVariablesButton.setEnabled(true);
stopOnErrorButton.setEnabled(false);
}
defButton.setSelection(info.isDefaultBuildCmd());