diff options
author | sarsenau | 2002-07-29 15:06:09 +0000 |
---|---|---|
committer | sarsenau | 2002-07-29 15:06:09 +0000 |
commit | a0799ce975d23441a4bb3cea68a87f17c48f963f (patch) | |
tree | 197b147b486a892b958a35f90f95d20dea1f3b43 | |
parent | 5539bd91d48212539a480101453cc4eea0f7dbf3 (diff) | |
download | eclipse.platform.debug-a0799ce975d23441a4bb3cea68a87f17c48f963f.tar.gz eclipse.platform.debug-a0799ce975d23441a4bb3cea68a87f17c48f963f.tar.xz eclipse.platform.debug-a0799ce975d23441a4bb3cea68a87f17c48f963f.zip |
Fix for PR 21775 - [External Tools] Allow external tool builders to run on specific build type(s)
7 files changed, 163 insertions, 23 deletions
diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/DefaultRunnerContext.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/DefaultRunnerContext.java index f19e18537..2f5aa6ea4 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/DefaultRunnerContext.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/DefaultRunnerContext.java @@ -30,7 +30,7 @@ public final class DefaultRunnerContext implements IRunnerContext { private String expandedLocation; private String expandedArguments; private String expandedDirectory; - private String buildType = ToolUtil.BUILD_TYPE_NONE; + private String buildType = ExternalTool.BUILD_TYPE_NONE; /** * Create a new context @@ -483,12 +483,12 @@ public final class DefaultRunnerContext implements IRunnerContext { */ /*package*/ void setBuildType(int kind) { if (kind == IncrementalProjectBuilder.INCREMENTAL_BUILD) - buildType = ToolUtil.BUILD_TYPE_INCREMENTAL; + buildType = ExternalTool.BUILD_TYPE_INCREMENTAL; else if (kind == IncrementalProjectBuilder.FULL_BUILD) - buildType = ToolUtil.BUILD_TYPE_FULL; + buildType = ExternalTool.BUILD_TYPE_FULL; else if (kind == IncrementalProjectBuilder.AUTO_BUILD) - buildType = ToolUtil.BUILD_TYPE_AUTO; + buildType = ExternalTool.BUILD_TYPE_AUTO; else - buildType = ToolUtil.BUILD_TYPE_NONE; + buildType = ExternalTool.BUILD_TYPE_NONE; } }
\ No newline at end of file diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalTool.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalTool.java index ddc315a6d..4ab3599f0 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalTool.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalTool.java @@ -11,6 +11,7 @@ Contributors: **********************************************************************/ import java.util.HashMap; import java.util.Map; +import java.util.StringTokenizer; import org.eclipse.core.resources.ICommand; @@ -36,6 +37,7 @@ public class ExternalTool { private static final String TAG_TOOL_DIRECTORY = "!{tool_dir}"; //$NON-NLS-1$ private static final String TAG_TOOL_REFRESH = "!{tool_refresh}"; //$NON-NLS-1$ private static final String TAG_TOOL_SHOW_LOG = "!{tool_show_log}"; //$NON-NLS-1$ + private static final String TAG_TOOL_BUILD_TYPES = "!{tool_build_types}"; //$NON-NLS-1$ // Known kind of tools public static final String TOOL_TYPE_PROGRAM = "org.eclipse.ui.externaltools.type.program"; //$NON-NLS-1$ @@ -62,7 +64,17 @@ public class ExternalTool { public static final String VAR_ANT_TARGET = "ant_target"; //$NON-NLS-1$ public static final String VAR_BUILD_TYPE = "build_type"; //$NON-NLS-1$ - + + /** + * Build types (what type of build is occuring when a tool is run) + */ + public static final String BUILD_TYPE_INCREMENTAL = "incremental"; //$NON-NLS-1$ + public static final String BUILD_TYPE_FULL = "full"; //$NON-NLS-1$ + public static final String BUILD_TYPE_AUTO = "auto"; //$NON-NLS-1$ + public static final String BUILD_TYPE_NONE = "none"; //$NON-NLS-1$ + + private static final String SEPERATOR = ";"; //$NON-NLS-1$ + // Known refresh scopes public static final String REFRESH_SCOPE_NONE = "none"; //$NON-NLS-1$; public static final String REFRESH_SCOPE_WORKSPACE = "workspace"; //$NON-NLS-1$; @@ -80,6 +92,7 @@ public class ExternalTool { private String directory = EMPTY_VALUE; private String refreshScope = EMPTY_VALUE; private boolean showLog = true; + private String[] buildTypes; /** * Creates an empty initialized external tool. @@ -129,7 +142,7 @@ public class ExternalTool { else showLog = true; - return new ExternalTool( + ExternalTool tool = new ExternalTool( type, name, location, @@ -137,6 +150,9 @@ public class ExternalTool { (String)args.get(TAG_TOOL_DIRECTORY), (String)args.get(TAG_TOOL_REFRESH), showLog); + tool.buildTypes = toBuildTypesArray((String)args.get(TAG_TOOL_BUILD_TYPES)); + + return tool; } /** @@ -173,6 +189,80 @@ public class ExternalTool { public String getWorkingDirectory() { return directory; } + + /** + * Returns whether the tool runs for the given build kind. + * + * @param kind The kind of build. Either + * ExternalToolsBuilder.FULL_BUILD, + * ExternalToolsBuilder.INCREMENTAL_BUILD, + * or ExternalToolsBuilder.AUTO_BUILD. + */ + public boolean runForBuildKind(int kind) { + return runForBuildType(convertToType(kind)); + } + + /** + * Returns whether the tool runs for the given build type. + * + * @param type The type of build. Either + * BUILD_TYPE_FULL, BUILD_TYPE_INCREMENTAL, or BUILD_TYPE_AUTO. + */ + public boolean runForBuildType(String type) { + for (int i=0; i<buildTypes.length; i++) { + if (buildTypes[i].equals(type)) + return true; + } + return false; + } + + /** + * Converts a build kind (either ExternalToolBuilder.FULL_BUILD, + * ExternalToolBuilder.INCREMENTAL_BUILD, or + * ExternalToolBuilder.AUTO_BUILD) to a build type (either + * BUILD_TYPE_FULL, BUILD_TYPE_INCREMENTAL, or BUILD_TYPE_AUTO). + */ + private String convertToType(int kind) { + if (kind == ExternalToolsBuilder.FULL_BUILD) + return BUILD_TYPE_FULL; + if (kind == ExternalToolsBuilder.INCREMENTAL_BUILD) + return BUILD_TYPE_INCREMENTAL; + if (kind == ExternalToolsBuilder.AUTO_BUILD) + return BUILD_TYPE_AUTO; + // Should never reach here. + return null; + } + + /** + * Translates an array of build types to a single String + * representation for storage in an argument map. + */ + private static String toBuildTypesString(String[] array) { + String s = ""; + for (int i=0; i < array.length; i++) + s = s + array[i] + SEPERATOR; + return s; + } + + /** + * Translates a single String representation of build types + * used for storage in an argument map to an array of build + * types. + */ + private static String[] toBuildTypesArray(String string) { + if (string==null) + return new String[0]; + StringTokenizer tokenizer = + new StringTokenizer(string, SEPERATOR); + int tokenCount = tokenizer.countTokens(); + String[] elements = new String[tokenCount]; + + for (int i = 0; i < tokenCount; i++) { + elements[i] = tokenizer.nextToken(); + } + + return elements; + } /** * Returns the scope of resources to refresh after @@ -260,6 +350,14 @@ public class ExternalTool { } /** + * Sets the types of builds for which this external tool runs if it + * is a builder on a project. + */ + public void setBuildTypes(String[] buildTypes) { + this.buildTypes = buildTypes; + } + + /** * Stores the external tool as an argument map that can be * used later on to recreate this external tool. * @@ -277,6 +375,7 @@ public class ExternalTool { args.put(TAG_TOOL_SHOW_LOG, TRUE); else args.put(TAG_TOOL_SHOW_LOG, FALSE); + args.put(TAG_TOOL_BUILD_TYPES, toBuildTypesString(buildTypes)); return args; } diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalToolsBuilder.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalToolsBuilder.java index 0f8895f11..f636051bd 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalToolsBuilder.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ExternalToolsBuilder.java @@ -46,7 +46,8 @@ public final class ExternalToolsBuilder extends IncrementalProjectBuilder { DefaultRunnerContext context = new DefaultRunnerContext(tool, getProject(), PlatformUI.getWorkbench().getWorkingSetManager()); context.setBuildType(kind); try { - context.run(monitor); + if (tool.runForBuildKind(kind)) + context.run(monitor); } catch (InterruptedException e) { // Do nothing, the operation was cancelled by the user } finally { diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ToolUtil.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ToolUtil.java index a9d2b6f95..062769689 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ToolUtil.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/core/ToolUtil.java @@ -27,14 +27,6 @@ public final class ToolUtil { /*package*/ static final String VAR_TAG_START = "${"; //$NON-NLS-1$ /*package*/ static final String VAR_TAG_END = "}"; //$NON-NLS-1$ /*package*/ static final String VAR_TAG_SEP = ":"; //$NON-NLS-1$ - - /** - * Build types (what type of build is occuring when a tool is run) - */ - public static final String BUILD_TYPE_INCREMENTAL = "incremental"; //$NON-NLS-1$ - public static final String BUILD_TYPE_FULL = "full"; //$NON-NLS-1$ - public static final String BUILD_TYPE_AUTO = "auto"; //$NON-NLS-1$ - public static final String BUILD_TYPE_NONE = "none"; //$NON-NLS-1$ private static final ToolUtil instance = new ToolUtil(); diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/BuilderPropertyPage.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/BuilderPropertyPage.java index 11657747a..78ba8ee9c 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/BuilderPropertyPage.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/BuilderPropertyPage.java @@ -89,8 +89,7 @@ public final class BuilderPropertyPage extends PropertyPage { */ private ICommand createTool() { try { - EditDialog dialog; - dialog = new EditDialog(getShell(), null); + EditDialog dialog = new EditDialog(getShell(), null, true); if (dialog.open() == Window.OK) { ExternalTool tool = dialog.getExternalTool(); ICommand command = getInputProject().getDescription().newCommand(); @@ -111,8 +110,7 @@ public final class BuilderPropertyPage extends PropertyPage { ExternalTool tool = ExternalTool.fromArgumentMap(command.getArguments()); if (tool == null) return; - EditDialog dialog; - dialog = new EditDialog(getShell(), tool); + EditDialog dialog = new EditDialog(getShell(), tool, true); if (dialog.open() == Window.OK) { tool = dialog.getExternalTool(); tool.toBuildCommand(command); diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/ConfigurationDialog.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/ConfigurationDialog.java index 64b9ed7e8..67c9c0407 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/ConfigurationDialog.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/ConfigurationDialog.java @@ -185,7 +185,7 @@ public class ConfigurationDialog extends TitleAreaDialog { newButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { EditDialog dialog; - dialog = new EditDialog(getShell(), null); + dialog = new EditDialog(getShell(), null, false); if (dialog.open() == Window.OK) { ExternalTool tool = dialog.getExternalTool(); tools.add(tool); @@ -274,7 +274,7 @@ public class ConfigurationDialog extends TitleAreaDialog { if (currentSelection == null) return; EditDialog dialog; - dialog = new EditDialog(getShell(), currentSelection); + dialog = new EditDialog(getShell(), currentSelection, false); dialog.open(); listViewer.update(currentSelection, null); updateDetails(); diff --git a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/EditDialog.java b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/EditDialog.java index 999753aae..6ae4ea148 100644 --- a/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/EditDialog.java +++ b/org.eclipse.ui.externaltools/External Tools/org/eclipse/ui/externaltools/internal/ui/EditDialog.java @@ -62,8 +62,12 @@ public class EditDialog extends TitleAreaDialog { private Button directoryBrowseButton; private Button refreshOptionButton; private Button showLog; + private Button fullBuild; + private Button incrementalBuild; + private Button autoBuild; private boolean editMode = false; + private boolean toolIsBuilder; private ExternalTool tool; private String refreshScope; @@ -78,7 +82,7 @@ public class EditDialog extends TitleAreaDialog { * @param parentShell the parent SWT shell * @param tool the tool tool to edit, <code>null</code> if new */ - public EditDialog(Shell parentShell, ExternalTool tool) { + public EditDialog(Shell parentShell, ExternalTool tool, boolean isBuilderTool) { super(parentShell); if (tool == null) { this.tool = new ExternalTool(); @@ -87,6 +91,7 @@ public class EditDialog extends TitleAreaDialog { this.tool = tool; this.editMode = true; } + this.toolIsBuilder = isBuilderTool; } /* (non-Javadoc) @@ -282,6 +287,35 @@ public class EditDialog extends TitleAreaDialog { data.top = new FormAttachment(refreshField, GROUP_SPACE, SWT.BOTTOM); showLog.setLayoutData(data); + if (toolIsBuilder) { + // Create checkboxes for which build types to run on. + Composite buildComp = new Composite(topComp, SWT.NONE); + data = new FormData(); + data.left = new FormAttachment(0,0); + data.top = new FormAttachment(showLog, GROUP_SPACE, SWT.BOTTOM); + buildComp.setLayoutData(data); + + GridLayout gridLayout = new GridLayout(4, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + buildComp.setLayout(gridLayout); + + Label buildLabel = new Label(buildComp, SWT.NONE); + buildLabel.setText("Run on:\t"); + + fullBuild = new Button(buildComp, SWT.CHECK); + fullBuild.setText("Full build"); + fullBuild.setSelection(true); + + incrementalBuild = new Button(buildComp, SWT.CHECK); + incrementalBuild.setText("Incremental build"); + incrementalBuild.setSelection(true); + + autoBuild = new Button(buildComp, SWT.CHECK); + autoBuild.setText("Auto-build"); + autoBuild.setSelection(true); + } + // give all the buttons the same width for (int i=0; i<buttonData.length; i++) { buttonData[i].width = maxButtonWidth; @@ -298,6 +332,11 @@ public class EditDialog extends TitleAreaDialog { argumentsField.setText(tool.getArguments()); directoryField.setText(tool.getWorkingDirectory()); showLog.setSelection(tool.getShowLog()); + if (toolIsBuilder) { + fullBuild.setSelection(tool.runForBuildType(tool.BUILD_TYPE_FULL)); + incrementalBuild.setSelection(tool.runForBuildType(tool.BUILD_TYPE_INCREMENTAL)); + autoBuild.setSelection(tool.runForBuildType(tool.BUILD_TYPE_AUTO)); + } } refreshScope = tool.getRefreshScope(); updateRefreshField(); @@ -520,6 +559,17 @@ public class EditDialog extends TitleAreaDialog { tool.setRefreshScope(refreshScope); tool.setShowLog(showLog.getSelection()); + ArrayList list = new ArrayList(); + if (toolIsBuilder) { + if (fullBuild.getSelection()) + list.add(tool.BUILD_TYPE_FULL); + if (incrementalBuild.getSelection()) + list.add(tool.BUILD_TYPE_INCREMENTAL); + if (autoBuild.getSelection()) + list.add(tool.BUILD_TYPE_AUTO); + } + tool.setBuildTypes((String[])list.toArray(new String[list.size()])); + super.okPressed(); } |